Pārlūkot izejas kodu

Update API according to milvus v1.1.0 (#173)

Signed-off-by: yhmo <yihua.mo@zilliz.com>
groot 4 gadi atpakaļ
vecāks
revīzija
26a2a5fb39

+ 11 - 0
CHANGELOG.md

@@ -1,5 +1,16 @@
 # Changelog   
 
+## milvus-sdk-java 1.1.0 (2021-04-23)
+
+### Feature
+
+- \#4564 - get_entity_by_id with partition_name
+- \#4806 - API for deleting an entity in specific partition
+- \#4905 - Add the operation to unload collection from the memory
+
+## milvus-sdk-java 1.0.0 (2021-03-08)
+(derived from 0.8.5)
+
 ## milvus-sdk-java 0.8.5 (2020-08-26)
 
 ### Feature

+ 7 - 6
examples/pom.xml

@@ -25,11 +25,7 @@
 
     <groupId>io.milvus</groupId>
     <artifactId>milvus-sdk-java-examples</artifactId>
-<<<<<<< HEAD
-    <version>1.0.0-SNAPSHOT</version>
-=======
-    <version>1.0.0</version>
->>>>>>> 1.0.0
+    <version>1.1.0</version>
     <build>
         <plugins>
             <plugin>
@@ -67,7 +63,7 @@
         <dependency>
             <groupId>io.milvus</groupId>
             <artifactId>milvus-sdk-java</artifactId>
-            <version>1.0.0-SNAPSHOT</version>
+            <version>1.1.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
@@ -79,6 +75,11 @@
             <artifactId>slf4j-api</artifactId>
             <version>1.7.30</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>28.2-android</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 2 - 2
examples/src/main/java/MilvusClientExample.java

@@ -185,12 +185,12 @@ public class MilvusClientExample {
 
     // Delete the first 5 vectors you just searched
     Response deleteByIdsResponse =
-        client.deleteEntityByID(collectionName, vectorIds.subList(0, searchBatchSize));
+        client.deleteEntityByID(collectionName, "", vectorIds.subList(0, searchBatchSize));
     flushResponse = client.flush(collectionName);
 
     // Try to get the corresponding vector of the first id you just deleted.
     GetEntityByIDResponse getEntityByIDResponse =
-        client.getEntityByID(collectionName, vectorIds.subList(0, searchBatchSize));
+        client.getEntityByID(collectionName, "", vectorIds.subList(0, searchBatchSize));
     // Obviously you won't get anything
     if (!getEntityByIDResponse.getFloatVectors().get(0).isEmpty()) {
       throw new AssertionError("This can never happen!");

+ 1 - 5
pom.xml

@@ -25,11 +25,7 @@
 
     <groupId>io.milvus</groupId>
     <artifactId>milvus-sdk-java</artifactId>
-<<<<<<< HEAD
-    <version>1.0.0-SNAPSHOT</version>
-=======
-    <version>1.0.0</version>
->>>>>>> 1.0.0
+    <version>1.1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>io.milvus:milvus-sdk-java</name>

+ 23 - 2
src/main/java/io/milvus/client/MilvusClient.java

@@ -357,6 +357,25 @@ public interface MilvusClient {
    */
   Response loadCollection(String collectionName, List<String> partitionTags);
 
+  /**
+   * Release collection from memory
+   *
+   * @param collectionName collection to release
+   * @return <code>Response</code>
+   * @see Response
+   */
+  Response releaseCollection(String collectionName);
+
+  /**
+   * Release collection/partitions from memory
+   *
+   * @param collectionName collection to release
+   * @param partitionTags partitions to release
+   * @return <code>Response</code>
+   * @see Response
+   */
+  Response releaseCollection(String collectionName, List<String> partitionTags);
+
   /**
    * Gets collection index information
    *
@@ -392,12 +411,13 @@ public interface MilvusClient {
    * Gets vectors data by id array
    *
    * @param collectionName collection to get vectors from
+   * @param partitionTag partition to get vectors from
    * @param ids a <code>List</code> of vector ids
    * @return <code>GetEntityByIDResponse</code>
    * @see GetEntityByIDResponse
    * @see Response
    */
-  GetEntityByIDResponse getEntityByID(String collectionName, List<Long> ids);
+  GetEntityByIDResponse getEntityByID(String collectionName, String partitionTag, List<Long> ids);
 
   /**
    * Gets all vector ids in a segment
@@ -414,11 +434,12 @@ public interface MilvusClient {
    * Deletes data in a collection by a list of ids
    *
    * @param collectionName collection to delete ids from
+   * @param partitionTag partition to delete ids from
    * @param ids a <code>List</code> of vector ids to delete
    * @return <code>Response</code>
    * @see Response
    */
-  Response deleteEntityByID(String collectionName, List<Long> ids);
+  Response deleteEntityByID(String collectionName, String partitionTag, List<Long> ids);
 
   /**
    * Flushes data in a list collections. Newly inserted or modifications on data will be visible

+ 49 - 5
src/main/java/io/milvus/client/MilvusGrpcClient.java

@@ -47,7 +47,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class MilvusGrpcClient extends AbstractMilvusGrpcClient {
-  private static String SUPPORTED_SERVER_VERSION = "1.0";
+  private static String SUPPORTED_SERVER_VERSION = "1.1";
   private final ManagedChannel channel;
   private final MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub;
   private final MilvusServiceGrpc.MilvusServiceFutureStub futureStub;
@@ -940,6 +940,43 @@ abstract class AbstractMilvusGrpcClient implements MilvusClient {
     }
   }
 
+  @Override
+  public Response releaseCollection(String collectionName) {
+    return releaseCollection(collectionName, new ArrayList<>());
+  }
+
+  @Override
+  public Response releaseCollection(String collectionName, List<String> partitionTags) {
+
+    if (!maybeAvailable()) {
+      logWarning("You are not connected to Milvus server");
+      return new Response(Response.Status.CLIENT_NOT_CONNECTED);
+    }
+
+    PreloadCollectionParam request =
+            PreloadCollectionParam.newBuilder()
+                    .setCollectionName(collectionName)
+                    .addAllPartitionTagArray(partitionTags)
+                    .build();
+    Status response;
+
+    try {
+      response = blockingStub().releaseCollection(request);
+
+      if (response.getErrorCode() == ErrorCode.SUCCESS) {
+        logInfo("Release collection `{}` successfully!", collectionName);
+        return new Response(Response.Status.SUCCESS);
+      } else {
+        logError("Release collection `{}` failed:\n{}", collectionName, response.toString());
+        return new Response(
+                Response.Status.valueOf(response.getErrorCodeValue()), response.getReason());
+      }
+    } catch (StatusRuntimeException e) {
+      logError("releaseCollection RPC failed:\n{}", e.getStatus().toString());
+      return new Response(Response.Status.RPC_ERROR, e.toString());
+    }
+  }
+
   @Override
   public GetIndexInfoResponse getIndexInfo(@Nonnull String collectionName) {
 
@@ -1046,7 +1083,7 @@ abstract class AbstractMilvusGrpcClient implements MilvusClient {
   }
 
   @Override
-  public GetEntityByIDResponse getEntityByID(String collectionName, List<Long> ids) {
+  public GetEntityByIDResponse getEntityByID(String collectionName, String partitionTag, List<Long> ids) {
     if (!maybeAvailable()) {
       logWarning("You are not connected to Milvus server");
       return new GetEntityByIDResponse(
@@ -1054,7 +1091,11 @@ abstract class AbstractMilvusGrpcClient implements MilvusClient {
     }
 
     VectorsIdentity request =
-        VectorsIdentity.newBuilder().setCollectionName(collectionName).addAllIdArray(ids).build();
+        VectorsIdentity.newBuilder()
+                .setCollectionName(collectionName)
+                .setPartitionTag(partitionTag)
+                .addAllIdArray(ids)
+                .build();
     VectorsData response;
 
     try {
@@ -1138,14 +1179,17 @@ abstract class AbstractMilvusGrpcClient implements MilvusClient {
   }
 
   @Override
-  public Response deleteEntityByID(String collectionName, List<Long> ids) {
+  public Response deleteEntityByID(String collectionName, String partitionTag, List<Long> ids) {
     if (!maybeAvailable()) {
       logWarning("You are not connected to Milvus server");
       return new Response(Response.Status.CLIENT_NOT_CONNECTED);
     }
 
     DeleteByIDParam request =
-        DeleteByIDParam.newBuilder().setCollectionName(collectionName).addAllIdArray(ids).build();
+        DeleteByIDParam.newBuilder()
+                .setCollectionName(collectionName)
+                .setPartitionTag(partitionTag)
+                .addAllIdArray(ids).build();
     Status response;
 
     try {

+ 11 - 0
src/main/proto/milvus.proto

@@ -197,6 +197,7 @@ message FlushParam {
  */
 message DeleteByIDParam {
     string collection_name = 1;
+    string partition_tag = 3;
     repeated int64 id_array = 2;
 }
 
@@ -213,6 +214,7 @@ message CollectionInfo {
  */
 message VectorsIdentity {
     string collection_name = 1;
+    string partition_tag = 3;
     repeated int64 id_array = 2;
 }
 
@@ -440,6 +442,15 @@ service MilvusService {
      */
     rpc PreloadCollection(PreloadCollectionParam) returns (Status) {}
 
+    /**
+     * @brief This method is used to release collection/partitions
+     *
+     * @param PreloadCollectionParam, target collection/partitions.
+     *
+     * @return Status
+     */
+    rpc ReleaseCollection(PreloadCollectionParam) returns (Status) {}
+
     /**
      * @brief This method is used to reload collection segments
      *

+ 116 - 6
src/test/java/io/milvus/client/MilvusGrpcClientTest.java

@@ -45,12 +45,12 @@ import static org.junit.jupiter.api.Assertions.*;
 class ContainerMilvusClientTest extends MilvusClientTest {
   @Container
   private static GenericContainer milvusContainer =
-      new GenericContainer("milvusdb/milvus:0.10.5-cpu-d010621-4eda95")
+      new GenericContainer("milvusdb/milvus:1.0.0-cpu-d030521-1ea92e")
           .withExposedPorts(19530);
 
   @Container
   private static GenericContainer unsupportedMilvusContainer =
-      new GenericContainer("milvusdb/milvus:0.9.1-cpu-d052920-e04ed5")
+      new GenericContainer("milvusdb/milvus:0.10.5-cpu-d010621-4eda95")
           .withExposedPorts(19530);
 
   @Override
@@ -584,6 +584,63 @@ class MilvusClientTest {
     assertTrue(loadCollectionResponse.ok());
   }
 
+  @org.junit.jupiter.api.Test
+  void loadCollectionPartiton() {
+    String partitionTag = "p1";
+    Response createPartitionResponse = client.createPartition(randomCollectionName, partitionTag);
+    assertTrue(createPartitionResponse.ok());
+
+    List<List<Float>> vectors = generateFloatVectors(size, dimension);
+    InsertParam insertParam =
+            new InsertParam.Builder(randomCollectionName)
+                    .withPartitionTag(partitionTag)
+                    .withFloatVectors(vectors)
+                    .build();
+    InsertResponse insertResponse = client.insert(insertParam);
+    assertTrue(insertResponse.ok());
+
+    List<String> partitionTags = new ArrayList<>();
+    partitionTags.add(partitionTag);
+    Response loadCollectionResponse = client.loadCollection(randomCollectionName, partitionTags);
+    assertTrue(loadCollectionResponse.ok());
+  }
+
+  @org.junit.jupiter.api.Test
+  void releaseCollection() {
+    insert();
+    assertTrue(client.flush(randomCollectionName).ok());
+
+    Response loadCollectionResponse = client.loadCollection(randomCollectionName);
+    assertTrue(loadCollectionResponse.ok());
+
+    Response releaseCollectionResponse = client.releaseCollection(randomCollectionName);
+    assertTrue(releaseCollectionResponse.ok());
+  }
+
+  @org.junit.jupiter.api.Test
+  void releaseCollectionPartition() {
+    String partitionTag = "p1";
+    Response createPartitionResponse = client.createPartition(randomCollectionName, partitionTag);
+    assertTrue(createPartitionResponse.ok());
+
+    List<List<Float>> vectors = generateFloatVectors(size, dimension);
+    InsertParam insertParam =
+            new InsertParam.Builder(randomCollectionName)
+                    .withPartitionTag(partitionTag)
+                    .withFloatVectors(vectors)
+                    .build();
+    InsertResponse insertResponse = client.insert(insertParam);
+    assertTrue(insertResponse.ok());
+
+    List<String> partitionTags = new ArrayList<>();
+    partitionTags.add(partitionTag);
+    Response loadCollectionResponse = client.loadCollection(randomCollectionName, partitionTags);
+    assertTrue(loadCollectionResponse.ok());
+
+    Response releaseCollectionResponse = client.releaseCollection(randomCollectionName, partitionTags);
+    assertTrue(releaseCollectionResponse.ok());
+  }
+
   @org.junit.jupiter.api.Test
   void getIndexInfo() {
     createIndex();
@@ -638,7 +695,7 @@ class MilvusClientTest {
     assertTrue(client.flush(randomCollectionName).ok());
 
     GetEntityByIDResponse getEntityByIDResponse =
-        client.getEntityByID(randomCollectionName, vectorIds.subList(0, 100));
+        client.getEntityByID(randomCollectionName, "", vectorIds.subList(0, 100));
     assertTrue(getEntityByIDResponse.ok());
     ByteBuffer bb = getEntityByIDResponse.getBinaryVectors().get(0);
     assertTrue(bb == null || bb.remaining() == 0);
@@ -647,6 +704,35 @@ class MilvusClientTest {
         getEntityByIDResponse.getFloatVectors().get(0).toArray(), vectors.get(0).toArray());
   }
 
+  @org.junit.jupiter.api.Test
+  void getEntityByIDinPartition() {
+    String partitionTag = "p1";
+    Response createPartitionResponse = client.createPartition(randomCollectionName, partitionTag);
+    assertTrue(createPartitionResponse.ok());
+
+    List<List<Float>> vectors = generateFloatVectors(size, dimension);
+    InsertParam insertParam =
+            new InsertParam.Builder(randomCollectionName)
+                    .withPartitionTag(partitionTag)
+                    .withFloatVectors(vectors)
+                    .build();
+    InsertResponse insertResponse = client.insert(insertParam);
+    assertTrue(insertResponse.ok());
+    List<Long> vectorIds = insertResponse.getVectorIds();
+    assertEquals(size, vectorIds.size());
+
+    assertTrue(client.flush(randomCollectionName).ok());
+
+    GetEntityByIDResponse getEntityByIDResponse =
+            client.getEntityByID(randomCollectionName, partitionTag, vectorIds.subList(0, 100));
+    assertTrue(getEntityByIDResponse.ok());
+    ByteBuffer bb = getEntityByIDResponse.getBinaryVectors().get(0);
+    assertTrue(bb == null || bb.remaining() == 0);
+
+    assertArrayEquals(
+            getEntityByIDResponse.getFloatVectors().get(0).toArray(), vectors.get(0).toArray());
+  }
+
   @org.junit.jupiter.api.Test
   void getVectorIds() {
     insert();
@@ -682,7 +768,31 @@ class MilvusClientTest {
 
     assertTrue(client.flush(randomCollectionName).ok());
 
-    assertTrue(client.deleteEntityByID(randomCollectionName, vectorIds.subList(0, 100)).ok());
+    assertTrue(client.deleteEntityByID(randomCollectionName, "", vectorIds.subList(0, 100)).ok());
+    assertTrue(client.flush(randomCollectionName).ok());
+    assertEquals(client.countEntities(randomCollectionName).getCollectionEntityCount(), size - 100);
+  }
+
+  @org.junit.jupiter.api.Test
+  void deleteEntityByIDinPartition() {
+    String partitionTag = "p1";
+    Response createPartitionResponse = client.createPartition(randomCollectionName, partitionTag);
+    assertTrue(createPartitionResponse.ok());
+
+    List<List<Float>> vectors = generateFloatVectors(size, dimension);
+    InsertParam insertParam =
+            new InsertParam.Builder(randomCollectionName)
+                    .withPartitionTag(partitionTag)
+                    .withFloatVectors(vectors)
+                    .build();
+    InsertResponse insertResponse = client.insert(insertParam);
+    assertTrue(insertResponse.ok());
+    List<Long> vectorIds = insertResponse.getVectorIds();
+    assertEquals(size, vectorIds.size());
+
+    assertTrue(client.flush(randomCollectionName).ok());
+
+    assertTrue(client.deleteEntityByID(randomCollectionName, partitionTag, vectorIds.subList(0, 100)).ok());
     assertTrue(client.flush(randomCollectionName).ok());
     assertEquals(client.countEntities(randomCollectionName).getCollectionEntityCount(), size - 100);
   }
@@ -723,7 +833,7 @@ class MilvusClientTest {
     long previousSegmentSize = segmentInfo.getLong("data_size");
 
     assertTrue(
-        client.deleteEntityByID(randomCollectionName, vectorIds.subList(0, (int) size / 2)).ok());
+        client.deleteEntityByID(randomCollectionName, "", vectorIds.subList(0, (int) size / 2)).ok());
     assertTrue(client.flush(randomCollectionName).ok());
     assertTrue(client.compact(randomCollectionName).ok());
 
@@ -767,7 +877,7 @@ class MilvusClientTest {
     long previousSegmentSize = segmentInfo.getLong("data_size");
 
     assertTrue(
-        client.deleteEntityByID(randomCollectionName, vectorIds.subList(0, (int) size / 2)).ok());
+        client.deleteEntityByID(randomCollectionName, "", vectorIds.subList(0, (int) size / 2)).ok());
     assertTrue(client.flush(randomCollectionName).ok());
     assertTrue(client.compactAsync(randomCollectionName).get().ok());