zhiru 5 years ago
parent
commit
06662cf991
29 changed files with 656 additions and 351 deletions
  1. 49 0
      src/main/java/io/milvus/client/ConnectParam.java
  2. 1 1
      src/main/java/io/milvus/client/DateRange.java
  3. 18 3
      src/main/java/io/milvus/client/DeleteByRangeParam.java
  4. 24 0
      src/main/java/io/milvus/client/DescribeIndexResponse.java
  5. 24 0
      src/main/java/io/milvus/client/DescribeTableResponse.java
  6. 22 0
      src/main/java/io/milvus/client/GetTableRowCountResponse.java
  7. 22 0
      src/main/java/io/milvus/client/HasTableResponse.java
  8. 1 1
      src/main/java/io/milvus/client/Index.java
  9. 15 3
      src/main/java/io/milvus/client/IndexParam.java
  10. 1 1
      src/main/java/io/milvus/client/IndexType.java
  11. 13 1
      src/main/java/io/milvus/client/InsertParam.java
  12. 25 0
      src/main/java/io/milvus/client/InsertResponse.java
  13. 1 1
      src/main/java/io/milvus/client/MetricType.java
  14. 53 0
      src/main/java/io/milvus/client/MilvusClient.java
  15. 225 152
      src/main/java/io/milvus/client/MilvusGrpcClient.java
  16. 1 1
      src/main/java/io/milvus/client/Response.java
  17. 15 1
      src/main/java/io/milvus/client/SearchInFilesParam.java
  18. 13 2
      src/main/java/io/milvus/client/SearchParam.java
  19. 8 12
      src/main/java/io/milvus/client/SearchResponse.java
  20. 24 0
      src/main/java/io/milvus/client/ShowTablesResponse.java
  21. 50 0
      src/main/java/io/milvus/client/TableParam.java
  22. 1 1
      src/main/java/io/milvus/client/TableSchema.java
  23. 50 0
      src/main/java/io/milvus/client/TableSchemaParam.java
  24. 0 26
      src/main/java/io/milvus/client/response/CountTableResponse.java
  25. 0 30
      src/main/java/io/milvus/client/response/DescribeIndexResponse.java
  26. 0 30
      src/main/java/io/milvus/client/response/DescribeTableResponse.java
  27. 0 26
      src/main/java/io/milvus/client/response/HasTableResponse.java
  28. 0 31
      src/main/java/io/milvus/client/response/InsertResponse.java
  29. 0 28
      src/main/java/io/milvus/client/response/ShowTablesResponse.java

+ 49 - 0
src/main/java/io/milvus/client/ConnectParam.java

@@ -0,0 +1,49 @@
+package io.milvus.client;
+
+import javax.annotation.Nonnull;
+
+public class ConnectParam {
+    private final String host;
+    private final String port;
+
+    public static class Builder {
+        // Optional parameters - initialized to default values
+        private String host = "127.0.0.1";
+        private String port = "19530";
+
+        public Builder withHost(String host) {
+            this.host = host;
+            return this;
+        }
+
+        public Builder withPort(String port) {
+            this.port = port;
+            return this;
+        }
+
+        public ConnectParam build() {
+            return new ConnectParam(this);
+        }
+    }
+
+    private ConnectParam(@Nonnull Builder builder) {
+        this.host = builder.host;
+        this.port = builder.port;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public String getPort() {
+        return port;
+    }
+
+    @Override
+    public String toString() {
+        return "ConnectParam{" +
+                "host='" + host + '\'' +
+                ", port='" + port + '\'' +
+                '}';
+    }
+}

+ 1 - 1
src/main/java/io/milvus/client/params/DateRange.java → src/main/java/io/milvus/client/DateRange.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import java.util.Date;
 

+ 18 - 3
src/main/java/io/milvus/client/params/DeleteByRangeParam.java → src/main/java/io/milvus/client/DeleteByRangeParam.java

@@ -1,21 +1,30 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 
 public class DeleteByRangeParam {
     private final DateRange dateRange;
     private final String tableName;
+    private final long timeout;
 
     public static final class Builder {
         // Required parameters
         private final DateRange dateRange;
         private final String tableName;
 
+        // Optional parameters - initialized to default values
+        private long timeout = 10;
+
         public Builder(DateRange dateRange, String tableName) {
             this.dateRange = dateRange;
             this.tableName = tableName;
         }
 
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
         public DeleteByRangeParam build() {
             return new DeleteByRangeParam(this);
         }
@@ -24,6 +33,7 @@ public class DeleteByRangeParam {
     private DeleteByRangeParam(@Nonnull Builder builder) {
         this.dateRange = builder.dateRange;
         this.tableName = builder.tableName;
+        this.timeout = builder.timeout;
     }
 
     public DateRange getDateRange() {
@@ -34,11 +44,16 @@ public class DeleteByRangeParam {
         return tableName;
     }
 
+    public long getTimeout() {
+        return timeout;
+    }
+
     @Override
     public String toString() {
         return "DeleteByRangeParam {" +
-                "dateRange=" + dateRange +
-                ", tableName='" + tableName + '\'' +
+                "dateRange = " + dateRange.toString() +
+                ", tableName = '" + tableName + '\'' +
+                ", timeout = " + timeout +
                 '}';
     }
 }

+ 24 - 0
src/main/java/io/milvus/client/DescribeIndexResponse.java

@@ -0,0 +1,24 @@
+package io.milvus.client;
+
+import javax.annotation.Nullable;
+import java.util.Optional;
+
+public class DescribeIndexResponse {
+    private final Response response;
+    private final IndexParam indexParam;
+
+    public DescribeIndexResponse(Response response, @Nullable IndexParam indexParam) {
+        this.response = response;
+        this.indexParam = indexParam;
+    }
+
+    public Optional<IndexParam> getIndexParam() {
+        return Optional.ofNullable(indexParam);
+    }
+
+    @Override
+    public String toString() {
+        return String.format("DescribeIndexResponse {%s, %s}", response.toString(),
+                              indexParam == null ? "Index param = None" : indexParam.toString());
+    }
+}

+ 24 - 0
src/main/java/io/milvus/client/DescribeTableResponse.java

@@ -0,0 +1,24 @@
+package io.milvus.client;
+
+import javax.annotation.Nullable;
+import java.util.Optional;
+
+public class DescribeTableResponse {
+    private final Response response;
+    private final TableSchema tableSchema;
+
+    public DescribeTableResponse(Response response, @Nullable TableSchema tableSchema) {
+        this.response = response;
+        this.tableSchema = tableSchema;
+    }
+
+    public Optional<TableSchema> getTableSchema() {
+        return Optional.ofNullable(tableSchema);
+    }
+
+    @Override
+    public String toString() {
+        return String.format("DescribeTableResponse {%s, %s}", response.toString(),
+                              tableSchema == null ? "Table schema = None" : tableSchema.toString());
+    }
+}

+ 22 - 0
src/main/java/io/milvus/client/GetTableRowCountResponse.java

@@ -0,0 +1,22 @@
+package io.milvus.client;
+
+public class GetTableRowCountResponse {
+    private final Response response;
+    private final long tableRowCount;
+
+    public GetTableRowCountResponse(Response response, long tableRowCount) {
+        this.response = response;
+        this.tableRowCount = tableRowCount;
+    }
+
+    public long getTableRowCount() {
+        return tableRowCount;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("CountTableResponse {%s, table row count = %d}",
+                              response.toString(),
+                              tableRowCount);
+    }
+}

+ 22 - 0
src/main/java/io/milvus/client/HasTableResponse.java

@@ -0,0 +1,22 @@
+package io.milvus.client;
+
+public class HasTableResponse {
+    private final Response response;
+    private final boolean hasTable;
+
+    public HasTableResponse(Response response, boolean hasTable) {
+        this.response = response;
+        this.hasTable = hasTable;
+    }
+
+    public boolean hasTable() {
+        return hasTable;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("HasTableResponse {%s, has table = %s}",
+                              response.toString(),
+                              hasTable);
+    }
+}

+ 1 - 1
src/main/java/io/milvus/client/params/Index.java → src/main/java/io/milvus/client/Index.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 

+ 15 - 3
src/main/java/io/milvus/client/params/IndexParam.java → src/main/java/io/milvus/client/IndexParam.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 
@@ -6,6 +6,7 @@ public class IndexParam {
 
     private final String tableName;
     private final Index index;
+    private final long timeout;
 
     public static class Builder {
         // Required parameters
@@ -13,6 +14,7 @@ public class IndexParam {
 
         // Optional parameters - initialized to default values
         private Index index;
+        private long timeout = 10;
 
         public Builder(String tableName) {
             this.tableName = tableName;
@@ -23,6 +25,11 @@ public class IndexParam {
             return this;
         }
 
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
         public IndexParam build() {
             return new IndexParam(this);
         }
@@ -31,6 +38,7 @@ public class IndexParam {
     private IndexParam(@Nonnull Builder builder) {
         this.tableName = builder.tableName;
         this.index = builder.index;
+        this.timeout = builder.timeout;
     }
 
     public String getTableName() {
@@ -41,9 +49,13 @@ public class IndexParam {
         return index;
     }
 
+    public long getTimeout() {
+        return timeout;
+    }
+
     @Override
     public String toString() {
-        return String.format("IndexParam = {tableName = %s, index = {indexType = %s, nList = %d}",
-                                tableName, index.getIndexType().name(), index.getNList());
+        return String.format("IndexParam = {tableName = %s, index = {indexType = %s, nList = %d}, timeout = %d}",
+                                tableName, index.getIndexType().name(), index.getNList(), timeout);
     }
 }

+ 1 - 1
src/main/java/io/milvus/client/params/IndexType.java → src/main/java/io/milvus/client/IndexType.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import java.util.Arrays;
 import java.util.Optional;

+ 13 - 1
src/main/java/io/milvus/client/params/InsertParam.java → src/main/java/io/milvus/client/InsertParam.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 import java.util.ArrayList;
@@ -8,6 +8,7 @@ public class InsertParam {
     private final String tableName;
     private final List<List<Float>> vectors;
     private final List<Long> vectorIds;
+    private final long timeout;
 
     public static class Builder {
         // Required parameters
@@ -16,6 +17,7 @@ public class InsertParam {
 
         // Optional parameters - initialized to default values
         private List<Long> vectorIds = new ArrayList<>();
+        private long timeout = 10;
 
         public Builder(String tableName, List<List<Float>> vectors) {
             this.tableName = tableName;
@@ -27,6 +29,11 @@ public class InsertParam {
             return this;
         }
 
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
         public InsertParam build() {
             return new InsertParam(this);
         }
@@ -36,6 +43,7 @@ public class InsertParam {
         this.tableName = builder.tableName;
         this.vectors = builder.vectors;
         this.vectorIds = builder.vectorIds;
+        this.timeout = builder.timeout;
     }
 
     public String getTableName() {
@@ -49,4 +57,8 @@ public class InsertParam {
     public List<Long> getVectorIds() {
         return vectorIds;
     }
+
+    public long getTimeout() {
+        return timeout;
+    }
 }

+ 25 - 0
src/main/java/io/milvus/client/InsertResponse.java

@@ -0,0 +1,25 @@
+package io.milvus.client;
+
+import java.util.List;
+
+public class InsertResponse {
+    private final Response response;
+    private final List<Long> vectorIds;
+
+    public InsertResponse(Response response, List<Long> vectorIds) {
+        this.response = response;
+        this.vectorIds = vectorIds;
+    }
+
+    public List<Long> getVectorIds() {
+        return vectorIds;
+    }
+
+    //TODO: iterator
+
+    @Override
+    public String toString() {
+        return String.format("InsertResponse {%s, returned %d vector ids}",
+                              response.toString(), this.vectorIds.size());
+    }
+}

+ 1 - 1
src/main/java/io/milvus/client/params/MetricType.java → src/main/java/io/milvus/client/MetricType.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import java.util.Arrays;
 import java.util.Optional;

+ 53 - 0
src/main/java/io/milvus/client/MilvusClient.java

@@ -0,0 +1,53 @@
+package io.milvus.client;
+
+public interface MilvusClient {
+
+    String clientVersion = "0.1.0";
+    default String clientVersion() {
+        return clientVersion;
+    }
+
+    Response connect(ConnectParam connectParam);
+
+    boolean connected();
+
+    Response disconnect();
+
+    Response createTable(TableSchemaParam tableSchemaParam);
+
+    HasTableResponse hasTable(TableParam tableParam);
+
+    Response dropTable(TableParam tableParam);
+
+    Response createIndex(IndexParam indexParam);
+
+    InsertResponse insert(InsertParam insertParam);
+
+    SearchResponse search(SearchParam searchParam);
+
+    SearchResponse searchInFiles(SearchInFilesParam searchInFilesParam);
+
+    DescribeTableResponse describeTable(TableParam tableParam);
+
+    ShowTablesResponse showTables();
+
+    GetTableRowCountResponse getTableRowCount(TableParam tableParam);
+
+//    ClientResponse serverVersion() {
+//
+//    }
+//
+//    ClientResponse serverStatus() {
+//
+//    }
+
+    //Cmd(Command) not implemented
+
+    Response deleteByRange(DeleteByRangeParam deleteByRangeParam);
+
+    Response preloadTable(TableParam tableParam);
+
+    DescribeIndexResponse describeIndex(TableParam tableParam);
+
+    Response dropIndex(TableParam tableParam);
+}

+ 225 - 152
src/main/java/io/milvus/client/MilvusGrpcClient.java

@@ -1,11 +1,6 @@
 package io.milvus.client;
 
-import io.grpc.ManagedChannel;
-import io.grpc.ManagedChannelBuilder;
-import io.grpc.StatusRuntimeException;
-
-import io.milvus.client.params.*;
-import io.milvus.client.response.*;
+import io.grpc.*;
 
 import javax.annotation.Nonnull;
 import java.text.SimpleDateFormat;
@@ -14,25 +9,21 @@ import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-public class MilvusGrpcClient {
+public class MilvusGrpcClient implements MilvusClient {
 
     private static final Logger logger = Logger.getLogger(MilvusGrpcClient.class.getName());
 
-    private final ManagedChannel channel;
-    private final io.milvus.client.grpc.MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub;
-    private final io.milvus.client.grpc.MilvusServiceGrpc.MilvusServiceFutureStub futureStub;
-    private final io.milvus.client.grpc.MilvusServiceGrpc.MilvusServiceStub asyncStub;
+    private ManagedChannel channel = null;
+    private io.milvus.client.grpc.MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub;
 
-    public MilvusGrpcClient(String host, int port) {
-        this(ManagedChannelBuilder.forAddress(host, port).usePlaintext());
-    }
-
-    public MilvusGrpcClient(ManagedChannelBuilder<?> channelBuilder) {
-        channel = channelBuilder.build();
-        blockingStub = io.milvus.client.grpc.MilvusServiceGrpc.newBlockingStub(channel);
-        futureStub = io.milvus.client.grpc.MilvusServiceGrpc.newFutureStub(channel);
-        asyncStub = io.milvus.client.grpc.MilvusServiceGrpc.newStub(channel);
-    }
+//    public MilvusGrpcClient(String host, int port) {
+//        this(ManagedChannelBuilder.forAddress(host, port).usePlaintext());
+//    }
+//
+//    public MilvusGrpcClient(ManagedChannelBuilder<?> channelBuilder) {
+//        channel = channelBuilder.build();
+//        blockingStub = io.milvus.client.grpc.MilvusServiceGrpc.newBlockingStub(channel);
+//    }
 
     public void shutdown() throws InterruptedException {
         channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
@@ -41,20 +32,56 @@ public class MilvusGrpcClient {
 
     ///////////////////////Client Calls///////////////////////
 
-    public Response createTable(@Nonnull TableSchema tableSchema) {
+    @Override
+    public Response connect(ConnectParam connectParam) {
+        if (channel != null) {
+            logWarning("You have already connected!");
+            return new Response(Response.Status.CONNECT_FAILED, "You have already connected!");
+        } else {
+            channel = ManagedChannelBuilder
+                      .forAddress(connectParam.getHost(), Integer.parseInt(connectParam.getPort()))
+                      .usePlaintext()
+                      .build();
+        }
+
+        blockingStub = io.milvus.client.grpc.MilvusServiceGrpc.newBlockingStub(channel);
+        logInfo("Connected successfully!\n{0}", connectParam.toString());
+        return new Response(Response.Status.SUCCESS);
+    }
+
+    @Override
+    public boolean connected() {
+        return channel != null && !channel.isShutdown() && !channel.isTerminated();
+    }
+
+    @Override
+    public Response disconnect() {
+        if (!connected()) {
+            logWarning("You are not connected");
+        }
+        else {
+            channel.shutdown();
+        }
+        return new Response(Response.Status.SUCCESS);
+    }
 
+    @Override
+    public Response createTable(@Nonnull TableSchemaParam tableSchemaParam) {
+        TableSchema tableSchema = tableSchemaParam.getTableSchema();
         io.milvus.client.grpc.TableSchema request = io.milvus.client.grpc.TableSchema
-                                                     .newBuilder()
-                                                     .setTableName(tableSchema.getTableName())
-                                                     .setDimension(tableSchema.getDimension())
-                                                     .setIndexFileSize(tableSchema.getIndexFileSize())
-                                                     .setMetricType(tableSchema.getMetricType().getVal())
-                                                     .build();
+                                                    .newBuilder()
+                                                    .setTableName(tableSchema.getTableName())
+                                                    .setDimension(tableSchema.getDimension())
+                                                    .setIndexFileSize(tableSchema.getIndexFileSize())
+                                                    .setMetricType(tableSchema.getMetricType().getVal())
+                                                    .build();
 
         io.milvus.client.grpc.Status response;
 
         try {
-            response = blockingStub.createTable(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableSchemaParam.getTimeout(), TimeUnit.SECONDS)
+                       .createTable(request);
 
             if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Created table successfully!\n{0}", tableSchema.toString());
@@ -72,32 +99,38 @@ public class MilvusGrpcClient {
         }
     }
 
-    public HasTableResponse hasTable(@Nonnull String tableName) {
+    @Override
+    public HasTableResponse hasTable(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
         io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
-                                                 .newBuilder()
-                                                 .setTableName(tableName)
-                                                 .build();
+                                                  .newBuilder()
+                                                  .setTableName(tableName)
+                                                  .build();
         io.milvus.client.grpc.BoolReply response;
 
         try {
-            response = blockingStub.hasTable(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .hasTable(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("hasTable `{0}` = {1}", tableName, response.getBoolReply());
-                return new HasTableResponse(Response.Status.SUCCESS, response.getBoolReply());
+                return new HasTableResponse(new Response(Response.Status.SUCCESS), response.getBoolReply());
             } else {
                 logSevere("hasTable `{0}` failed:\n{1}", tableName, response.toString());
-                return new HasTableResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                            response.getStatus().getReason(),
-                                            false);
+                return new HasTableResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                         response.getStatus().getReason()),
+                                    false);
             }
         } catch (StatusRuntimeException e) {
             logSevere("hasTable RPC failed:\n{0}", e.getStatus().toString());
-            return new HasTableResponse(Response.Status.RPC_ERROR, e.toString(), false);
+            return new HasTableResponse(new Response(Response.Status.RPC_ERROR, e.toString()), false);
         }
     }
 
-    public Response dropTable(@Nonnull String tableName) {
+    @Override
+    public Response dropTable(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
         io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
                                                   .newBuilder()
                                                   .setTableName(tableName)
@@ -105,7 +138,9 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.Status response;
 
         try {
-            response = blockingStub.dropTable(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .dropTable(request);
 
             if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Dropped table `{0}` successfully!", tableName);
@@ -120,6 +155,7 @@ public class MilvusGrpcClient {
         }
     }
 
+    @Override
     public Response createIndex(@Nonnull IndexParam indexParam) {
         io.milvus.client.grpc.Index index = io.milvus.client.grpc.Index
                                             .newBuilder()
@@ -135,7 +171,9 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.Status response;
 
         try {
-            response = blockingStub.createIndex(request);
+            response = blockingStub
+                       .withDeadlineAfter(indexParam.getTimeout(), TimeUnit.SECONDS)
+                       .createIndex(request);
 
             if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Created index successfully!\n{0}", indexParam.toString());
@@ -150,8 +188,8 @@ public class MilvusGrpcClient {
         }
     }
 
+    @Override
     public InsertResponse insert(@Nonnull InsertParam insertParam) {
-
         List<io.milvus.client.grpc.RowRecord> rowRecordList = new ArrayList<>();
         for (List<Float> vectors : insertParam.getVectors()) {
             io.milvus.client.grpc.RowRecord rowRecord = io.milvus.client.grpc.RowRecord
@@ -170,24 +208,27 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.VectorIds response;
 
         try {
-            response = blockingStub.insert(request);
+            response = blockingStub
+                       .withDeadlineAfter(insertParam.getTimeout(), TimeUnit.SECONDS)
+                       .insert(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Inserted vectors successfully!");
                 Optional<List<Long>> resultVectorIds = Optional.ofNullable(response.getVectorIdArrayList());
-                return new InsertResponse(Response.Status.SUCCESS, resultVectorIds.orElse(new ArrayList<>()));
+                return new InsertResponse(new Response(Response.Status.SUCCESS), resultVectorIds.orElse(new ArrayList<>()));
             } else {
                 logSevere("Insert vectors failed");
-                return new InsertResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                          response.getStatus().getReason(),
+                return new InsertResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                       response.getStatus().getReason()),
                                           new ArrayList<>());
             }
         } catch (StatusRuntimeException e) {
             logSevere("insert RPC failed:\n{0}", e.getStatus().toString());
-            return new InsertResponse(Response.Status.RPC_ERROR, e.toString(), new ArrayList<>());
+            return new InsertResponse(new Response(Response.Status.RPC_ERROR, e.toString()), new ArrayList<>());
         }
     }
 
+    @Override
     public SearchResponse search(@Nonnull SearchParam searchParam) {
 
         List<io.milvus.client.grpc.RowRecord> queryRowRecordList = getQueryRowRecordList(searchParam);
@@ -206,25 +247,28 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.TopKQueryResultList response;
 
         try {
-            response = blockingStub.search(request);
+            response = blockingStub
+                       .withDeadlineAfter(searchParam.getTimeout(), TimeUnit.SECONDS)
+                       .search(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Search completed successfully!");
 
                 List<List<SearchResponse.QueryResult>> queryResultsList = getQueryResultsList(response);
-                return new SearchResponse(Response.Status.SUCCESS, queryResultsList);
+                return new SearchResponse(new Response(Response.Status.SUCCESS), queryResultsList);
             } else {
                 logSevere("Search failed");
-                return new SearchResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                          response.getStatus().getReason(),
+                return new SearchResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                       response.getStatus().getReason()),
                                           new ArrayList<>());
             }
         } catch (StatusRuntimeException e) {
             logSevere("search RPC failed:\n{0}", e.getStatus().toString());
-            return new SearchResponse(Response.Status.RPC_ERROR, e.toString(), new ArrayList<>());
+            return new SearchResponse(new Response(Response.Status.RPC_ERROR, e.toString()), new ArrayList<>());
         }
     }
 
+    @Override
     public SearchResponse searchInFiles(@Nonnull SearchInFilesParam searchInFilesParam) {
 
         SearchParam searchParam = searchInFilesParam.getSearchParam();
@@ -251,26 +295,30 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.TopKQueryResultList response;
 
         try {
-            response = blockingStub.searchInFiles(request);
+            response = blockingStub
+                       .withDeadlineAfter(searchInFilesParam.getTimeout(), TimeUnit.SECONDS)
+                       .searchInFiles(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Search in files {0} completed successfully!", searchInFilesParam.getFileIds());
 
                 List<List<SearchResponse.QueryResult>> queryResultsList = getQueryResultsList(response);
-                return new SearchResponse(Response.Status.SUCCESS, queryResultsList);
+                return new SearchResponse(new Response(Response.Status.SUCCESS), queryResultsList);
             } else {
                 logSevere("Search in files {0} failed", searchInFilesParam.getFileIds());
-                return new SearchResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                          response.getStatus().getReason(),
+                return new SearchResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                       response.getStatus().getReason()),
                                           new ArrayList<>());
             }
         } catch (StatusRuntimeException e) {
             logSevere("searchInFiles RPC failed:\n{0}", e.getStatus().toString());
-            return new SearchResponse(Response.Status.RPC_ERROR, e.toString(), new ArrayList<>());
+            return new SearchResponse(new Response(Response.Status.RPC_ERROR, e.toString()), new ArrayList<>());
         }
     }
 
-    public DescribeTableResponse describeTable(@Nonnull String tableName) {
+    @Override
+    public DescribeTableResponse describeTable(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
         io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
                                                   .newBuilder()
                                                   .setTableName(tableName)
@@ -278,53 +326,30 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.TableSchema response;
 
         try {
-            response = blockingStub.describeTable(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .describeTable(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 TableSchema tableSchema = new TableSchema.Builder(response.getTableName(), response.getDimension())
-                                                         .withIndexFileSize(response.getIndexFileSize())
-                                                         .withMetricType(MetricType.valueOf(response.getMetricType()))
-                                                         .build();
+                        .withIndexFileSize(response.getIndexFileSize())
+                        .withMetricType(MetricType.valueOf(response.getMetricType()))
+                        .build();
                 logInfo("Describe Table `{0}` returned:\n{1}", tableName, tableSchema);
-                return new DescribeTableResponse(Response.Status.SUCCESS, tableSchema);
+                return new DescribeTableResponse(new Response(Response.Status.SUCCESS), tableSchema);
             } else {
                 logSevere("Describe Table `{0}` failed:\n{1}", tableName, response.toString());
-                return new DescribeTableResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                                 response.getStatus().getReason(),
-                                                 null);
+                return new DescribeTableResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                              response.getStatus().getReason()),
+                                      null);
             }
         } catch (StatusRuntimeException e) {
             logSevere("describeTable RPC failed:\n{0}", e.getStatus().toString());
-            return new DescribeTableResponse(Response.Status.RPC_ERROR, e.toString(), null);
-        }
-    }
-
-    public CountTableResponse countTable(@Nonnull String tableName) {
-        io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
-                                                  .newBuilder()
-                                                  .setTableName(tableName)
-                                                  .build();
-        io.milvus.client.grpc.TableRowCount response;
-
-        try {
-            response = blockingStub.countTable(request);
-
-            if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
-                long tableRowCount = response.getTableRowCount();
-                logInfo("Table `{0}` has {1} rows", tableName, tableRowCount);
-                return new CountTableResponse(Response.Status.SUCCESS, tableRowCount);
-            } else {
-                logSevere("Count Table `{0}` failed:\n{1}", tableName, response.toString());
-                return new CountTableResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                              response.getStatus().getReason(),
-                                              0);
-            }
-        } catch (StatusRuntimeException e) {
-            logSevere("countTable RPC failed:\n{0}", e.getStatus().toString());
-            return new CountTableResponse(Response.Status.RPC_ERROR, e.toString(), 0);
+            return new DescribeTableResponse(new Response(Response.Status.RPC_ERROR, e.toString()), null);
         }
     }
 
+    @Override
     public ShowTablesResponse showTables() {
         io.milvus.client.grpc.Command request = io.milvus.client.grpc.Command
                                                 .newBuilder()
@@ -333,27 +358,59 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.TableNameList response;
 
         try {
-            response = blockingStub.showTables(request);
+            response = blockingStub
+                       .withDeadlineAfter(10, TimeUnit.SECONDS)
+                       .showTables(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 List<String> tableNames = response.getTableNamesList();
                 logInfo("Current tables: {0}", tableNames.toString());
-                return new ShowTablesResponse(Response.Status.SUCCESS, tableNames);
+                return new ShowTablesResponse(new Response(Response.Status.SUCCESS), tableNames);
             } else {
                 logSevere("Show tables failed:\n{1}", response.toString());
-                return new ShowTablesResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                              response.getStatus().getReason(),
+                return new ShowTablesResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                           response.getStatus().getReason()),
                                               new ArrayList<>());
             }
         } catch (StatusRuntimeException e) {
             logSevere("showTables RPC failed:\n{0}", e.getStatus().toString());
-            return new ShowTablesResponse(Response.Status.RPC_ERROR, e.toString(), new ArrayList<>());
+            return new ShowTablesResponse(new Response(Response.Status.RPC_ERROR, e.toString()), new ArrayList<>());
+        }
+    }
+
+    @Override
+    public GetTableRowCountResponse getTableRowCount(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
+        io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
+                                                  .newBuilder()
+                                                  .setTableName(tableName)
+                                                  .build();
+        io.milvus.client.grpc.TableRowCount response;
+
+        try {
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .countTable(request);
+
+            if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
+                long tableRowCount = response.getTableRowCount();
+                logInfo("Table `{0}` has {1} rows", tableName, tableRowCount);
+                return new GetTableRowCountResponse(new Response(Response.Status.SUCCESS), tableRowCount);
+            } else {
+                logSevere("Count Table `{0}` failed:\n{1}", tableName, response.toString());
+                return new GetTableRowCountResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                                 response.getStatus().getReason()),
+                                        0);
+            }
+        } catch (StatusRuntimeException e) {
+            logSevere("countTable RPC failed:\n{0}", e.getStatus().toString());
+            return new GetTableRowCountResponse(new Response(Response.Status.RPC_ERROR, e.toString()), 0);
         }
     }
 
     //Cmd(Command) not implemented
 
-    public Response deleteByRange(DeleteByRangeParam deleteByRangeParam) {
+    public Response deleteByRange(@Nonnull DeleteByRangeParam deleteByRangeParam) {
         io.milvus.client.grpc.DeleteByRangeParam request = io.milvus.client.grpc.DeleteByRangeParam
                                                            .newBuilder()
                                                            .setRange(getRange(deleteByRangeParam.getDateRange()))
@@ -362,7 +419,9 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.Status response;
 
         try {
-            response = blockingStub.deleteByRange(request);
+            response = blockingStub
+                       .withDeadlineAfter(deleteByRangeParam.getTimeout(), TimeUnit.SECONDS)
+                       .deleteByRange(request);
 
             if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Deleted vectors from table `{0}` in range {1} successfully!",
@@ -378,15 +437,19 @@ public class MilvusGrpcClient {
         }
     }
 
-    public Response preloadTable(String tableName) {
+    @Override
+    public Response preloadTable(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
         io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
-                                                 .newBuilder()
-                                                 .setTableName(tableName)
-                                                 .build();
+                .newBuilder()
+                .setTableName(tableName)
+                .build();
         io.milvus.client.grpc.Status response;
 
         try {
-            response = blockingStub.preloadTable(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .preloadTable(request);
 
             if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 logInfo("Preloaded table `{0}` successfully!", tableName);
@@ -401,7 +464,9 @@ public class MilvusGrpcClient {
         }
     }
 
-    public DescribeIndexResponse describeIndex(@Nonnull String tableName) {
+    @Override
+    public DescribeIndexResponse describeIndex(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
         io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
                                                   .newBuilder()
                                                   .setTableName(tableName)
@@ -409,27 +474,54 @@ public class MilvusGrpcClient {
         io.milvus.client.grpc.IndexParam response;
 
         try {
-            response = blockingStub.describeIndex(request);
+            response = blockingStub
+                       .withDeadlineAfter(tableParam.getTimeout(), TimeUnit.SECONDS)
+                       .describeIndex(request);
 
             if (response.getStatus().getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
                 Index index = new Index.Builder()
-                                       .withIndexType(IndexType.valueOf(response.getIndex().getIndexType()))
-                                       .withNList(response.getIndex().getNlist())
-                                       .build();
+                        .withIndexType(IndexType.valueOf(response.getIndex().getIndexType()))
+                        .withNList(response.getIndex().getNlist())
+                        .build();
                 IndexParam indexParam = new IndexParam.Builder(response.getTableName())
-                                                      .withIndex(index)
-                                                      .build();
+                        .withIndex(index)
+                        .build();
                 logInfo("Describe index for table `{0}` returned:\n{1}", tableName, indexParam);
-                return new DescribeIndexResponse(Response.Status.SUCCESS, indexParam);
+                return new DescribeIndexResponse(new Response(Response.Status.SUCCESS), indexParam);
             } else {
                 logSevere("Describe index for table `{0}` failed:\n{1}", tableName, response.toString());
-                return new DescribeIndexResponse(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
-                                                response.getStatus().getReason(),
-                                                null);
+                return new DescribeIndexResponse(new Response(Response.Status.valueOf(response.getStatus().getErrorCodeValue()),
+                                                              response.getStatus().getReason()),
+                                       null);
             }
         } catch (StatusRuntimeException e) {
             logSevere("describeIndex RPC failed:\n{0}", e.getStatus().toString());
-            return new DescribeIndexResponse(Response.Status.RPC_ERROR, e.toString(), null);
+            return new DescribeIndexResponse(new Response(Response.Status.RPC_ERROR, e.toString()), null);
+        }
+    }
+
+    @Override
+    public Response dropIndex(@Nonnull TableParam tableParam) {
+        String tableName = tableParam.getTableName();
+        io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
+                .newBuilder()
+                .setTableName(tableName)
+                .build();
+        io.milvus.client.grpc.Status response;
+
+        try {
+            response = blockingStub.dropIndex(request);
+
+            if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
+                logInfo("Dropped index for table `{0}` successfully!", tableName);
+                return new Response(Response.Status.SUCCESS);
+            } else {
+                logSevere("Drop index for table `{0}` failed", tableName);
+                return new Response(Response.Status.valueOf(response.getErrorCodeValue()), response.getReason());
+            }
+        } catch (StatusRuntimeException e) {
+            logSevere("dropIndex RPC failed:\n{0}", e.getStatus().toString());
+            return new Response(Response.Status.RPC_ERROR, e.toString());
         }
     }
 
@@ -492,29 +584,6 @@ public class MilvusGrpcClient {
         return queryResultsList;
     }
 
-    public Response dropIndex(@Nonnull String tableName) {
-        io.milvus.client.grpc.TableName request = io.milvus.client.grpc.TableName
-                                                  .newBuilder()
-                                                  .setTableName(tableName)
-                                                  .build();
-        io.milvus.client.grpc.Status response;
-
-        try {
-            response = blockingStub.dropIndex(request);
-
-            if (response.getErrorCode() == io.milvus.client.grpc.ErrorCode.SUCCESS) {
-                logInfo("Dropped index for table `{0}` successfully!", tableName);
-                return new Response(Response.Status.SUCCESS);
-            } else {
-                logSevere("Drop index for table `{0}` failed", tableName);
-                return new Response(Response.Status.valueOf(response.getErrorCodeValue()), response.getReason());
-            }
-        } catch (StatusRuntimeException e) {
-            logSevere("dropIndex RPC failed:\n{0}", e.getStatus().toString());
-            return new Response(Response.Status.RPC_ERROR, e.toString());
-        }
-    }
-
     /////////////////////Log Functions//////////////////////
 
     private static final String ANSI_RESET = "\u001B[0m";
@@ -550,19 +619,23 @@ public class MilvusGrpcClient {
 
     //////////////////////////Main///////////////////////////
     public static void main(String[] args) throws InterruptedException {
-        MilvusGrpcClient client = new MilvusGrpcClient("192.168.1.188", 19531);
+        MilvusClient client = new MilvusGrpcClient();
+        ConnectParam connectParam = new ConnectParam.Builder().withHost("192.168.1.188").withPort("19530").build();
+        client.connect(connectParam);
 
         try {
             String tableName = "test_zhiru";
+            TableParam tableParam = new TableParam.Builder(tableName).withTimeout(20).build();
             long dimension = 128;
             TableSchema tableSchema = new TableSchema.Builder(tableName, dimension)
                                                                .withIndexFileSize(1024)
                                                                .withMetricType(MetricType.L2)
                                                                .build();
-            Response createTableResponse = client.createTable(tableSchema);
+            TableSchemaParam tableSchemaParam = new TableSchemaParam.Builder(tableSchema).withTimeout(20).build();
+            Response createTableResponse = client.createTable(tableSchemaParam);
             System.out.println(createTableResponse);
 
-            HasTableResponse hasTableResponse = client.hasTable(tableName);
+            HasTableResponse hasTableResponse = client.hasTable(tableParam);
             System.out.println(hasTableResponse);
 
             Random random = new Random();
@@ -610,11 +683,11 @@ public class MilvusGrpcClient {
             searchResponse = client.searchInFiles(searchInFilesParam);
             System.out.println(searchResponse);
 
-            DescribeTableResponse describeTableResponse = client.describeTable(tableName);
+            DescribeTableResponse describeTableResponse = client.describeTable(tableParam);
             describeTableResponse.getTableSchema().ifPresent(System.out::println);
 
-            CountTableResponse countTableResponse = client.countTable(tableName);
-            System.out.println(countTableResponse);
+            GetTableRowCountResponse getTableRowCountResponse = client.getTableRowCount(tableParam);
+            System.out.println(getTableRowCountResponse);
 
             ShowTablesResponse showTablesResponse = client.showTables();
             System.out.println(showTablesResponse);
@@ -624,20 +697,20 @@ public class MilvusGrpcClient {
             Response deleteByRangeResponse = client.deleteByRange(deleteByRangeParam);
             System.out.println(deleteByRangeResponse);
 
-            Response preloadTableResponse = client.preloadTable(tableName);
+            Response preloadTableResponse = client.preloadTable(tableParam);
             System.out.println(preloadTableResponse);
 
-            DescribeIndexResponse describeIndexResponse = client.describeIndex(tableName);
+            DescribeIndexResponse describeIndexResponse = client.describeIndex(tableParam);
             describeIndexResponse.getIndexParam().ifPresent(System.out::println);
 
-            Response dropIndexResponse = client.dropIndex(tableName);
+            Response dropIndexResponse = client.dropIndex(tableParam);
             System.out.println(dropIndexResponse);
 
-            Response dropTableResponse = client.dropTable(tableName);
+            Response dropTableResponse = client.dropTable(tableParam);
             System.out.println(dropTableResponse);
 
         } finally {
-            client.shutdown();
+            client.disconnect();
         }
     }
 }

+ 1 - 1
src/main/java/io/milvus/client/response/Response.java → src/main/java/io/milvus/client/Response.java

@@ -1,4 +1,4 @@
-package io.milvus.client.response;
+package io.milvus.client;
 
 import java.util.Arrays;
 import java.util.Optional;

+ 15 - 1
src/main/java/io/milvus/client/params/SearchInFilesParam.java → src/main/java/io/milvus/client/SearchInFilesParam.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 import java.util.List;
@@ -6,17 +6,26 @@ import java.util.List;
 public class SearchInFilesParam {
     private final List<String> fileIds;
     private final SearchParam searchParam;
+    private final long timeout;
 
     public static class Builder {
         // Required parameters
         private final List<String> fileIds;
         private final SearchParam searchParam;
 
+        // Optional parameters - initialized to default values
+        private long timeout = 10;
+
         public Builder(List<String> fileIds, SearchParam searchParam) {
             this.fileIds = fileIds;
             this.searchParam = searchParam;
         }
 
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
         public SearchInFilesParam build() {
             return new SearchInFilesParam(this);
         }
@@ -25,6 +34,7 @@ public class SearchInFilesParam {
     private SearchInFilesParam(@Nonnull Builder builder) {
         this.fileIds = builder.fileIds;
         this.searchParam = builder.searchParam;
+        this.timeout = builder.timeout;
     }
 
     public List<String> getFileIds() {
@@ -34,4 +44,8 @@ public class SearchInFilesParam {
     public SearchParam getSearchParam() {
         return searchParam;
     }
+
+    public long getTimeout() {
+        return timeout;
+    }
 }

+ 13 - 2
src/main/java/io/milvus/client/params/SearchParam.java → src/main/java/io/milvus/client/SearchParam.java

@@ -1,8 +1,7 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.Nonnull;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 public class SearchParam {
@@ -12,6 +11,7 @@ public class SearchParam {
     private final List<DateRange> queryRanges;
     private final long topK;
     private final long nProbe;
+    private final long timeout;
 
     public static class Builder {
         // Required parameters
@@ -22,6 +22,7 @@ public class SearchParam {
         private List<DateRange> queryRanges = new ArrayList<>();
         private long topK = 1;
         private long nProbe = 10;
+        private long timeout = 10;
 
         public Builder(String tableName, List<List<Float>> queryVectors) {
             this.tableName = tableName;
@@ -43,6 +44,11 @@ public class SearchParam {
             return this;
         }
 
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
         public SearchParam build() {
             return new SearchParam(this);
         }
@@ -54,6 +60,7 @@ public class SearchParam {
         this.queryRanges = builder.queryRanges;
         this.nProbe = builder.nProbe;
         this.topK = builder.topK;
+        this.timeout = builder.timeout;
     }
 
     public String getTableName() {
@@ -75,4 +82,8 @@ public class SearchParam {
     public long getNProbe() {
         return nProbe;
     }
+
+    public long getTimeout() {
+        return timeout;
+    }
 }

+ 8 - 12
src/main/java/io/milvus/client/response/SearchResponse.java → src/main/java/io/milvus/client/SearchResponse.java

@@ -1,9 +1,10 @@
-package io.milvus.client.response;
+package io.milvus.client;
 
 import java.util.List;
-import java.util.Optional;
 
-public class SearchResponse extends Response {
+public class SearchResponse {
+
+    private final Response response;
 
     public static class QueryResult {
         private final long vectorId;
@@ -25,13 +26,8 @@ public class SearchResponse extends Response {
 
     private final List<List<QueryResult>> queryResultsList;
 
-    public SearchResponse(Status status, String message, List<List<QueryResult>> queryResultsList) {
-        super(status, message);
-        this.queryResultsList = queryResultsList;
-    }
-
-    public SearchResponse(Status status, List<List<QueryResult>> queryResultsList) {
-        super(status);
+    public SearchResponse(Response response, List<List<QueryResult>> queryResultsList) {
+        this.response = response;
         this.queryResultsList = queryResultsList;
     }
 
@@ -43,7 +39,7 @@ public class SearchResponse extends Response {
 
     @Override
     public String toString() {
-        return String.format("SearchResponse {code = %s, message = %s, returned results for %d queries}",
-                this.getStatus().name(), this.getMessage(), this.queryResultsList.size());
+        return String.format("SearchResponse {%s, returned results for %d queries}",
+                              response.toString(), this.queryResultsList.size());
     }
 }

+ 24 - 0
src/main/java/io/milvus/client/ShowTablesResponse.java

@@ -0,0 +1,24 @@
+package io.milvus.client;
+
+import java.util.List;
+
+public class ShowTablesResponse {
+    private final Response response;
+    private final List<String> tableNames;
+
+    public ShowTablesResponse(Response response, List<String> tableNames) {
+        this.response = response;
+        this.tableNames = tableNames;
+    }
+
+    public List<String> getTableNames() {
+        return tableNames;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("ShowTablesResponse {%s, table names = %s}",
+                              response,
+                              tableNames.toString());
+    }
+}

+ 50 - 0
src/main/java/io/milvus/client/TableParam.java

@@ -0,0 +1,50 @@
+package io.milvus.client;
+
+import javax.annotation.Nonnull;
+
+public class TableParam {
+    private final String tableName;
+    private final long timeout;
+
+    public static class Builder {
+        // Required parameters
+        private final String tableName;
+
+        // Optional parameters - initialized to default values
+        private long timeout = 10;
+
+        public Builder(String tableName) {
+            this.tableName = tableName;
+        }
+
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
+        public TableParam build() {
+            return new TableParam(this);
+        }
+    }
+
+    private TableParam(@Nonnull Builder builder) {
+        this.tableName = builder.tableName;
+        this.timeout = builder.timeout;
+    }
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public long getTimeout() {
+        return timeout;
+    }
+
+    @Override
+    public String toString() {
+        return "TableParam {" +
+                "tableName = '" + tableName + '\'' +
+                ", timeout = " + timeout +
+                '}';
+    }
+}

+ 1 - 1
src/main/java/io/milvus/client/params/TableSchema.java → src/main/java/io/milvus/client/TableSchema.java

@@ -1,4 +1,4 @@
-package io.milvus.client.params;
+package io.milvus.client;
 
 import javax.annotation.*;
 

+ 50 - 0
src/main/java/io/milvus/client/TableSchemaParam.java

@@ -0,0 +1,50 @@
+package io.milvus.client;
+
+import javax.annotation.Nonnull;
+
+public class TableSchemaParam {
+    private final TableSchema tableSchema;
+    private final long timeout;
+
+    public static class Builder {
+        // Required parameters
+        private final TableSchema tableSchema;
+
+        // Optional parameters - initialized to default values
+        private long timeout = 10;
+
+        public Builder(TableSchema tableSchema) {
+            this.tableSchema = tableSchema;
+        }
+
+        public Builder withTimeout(long timeout) {
+            this.timeout = timeout;
+            return this;
+        }
+
+        public TableSchemaParam build() {
+            return new TableSchemaParam(this);
+        }
+    }
+
+    private TableSchemaParam(@Nonnull Builder builder) {
+        this.tableSchema = builder.tableSchema;
+        this.timeout = builder.timeout;
+    }
+
+    public TableSchema getTableSchema() {
+        return tableSchema;
+    }
+
+    public long getTimeout() {
+        return timeout;
+    }
+
+    @Override
+    public String toString() {
+        return "CreateTableParam {" +
+                tableSchema +
+                ", timeout = " + timeout +
+                '}';
+    }
+}

+ 0 - 26
src/main/java/io/milvus/client/response/CountTableResponse.java

@@ -1,26 +0,0 @@
-package io.milvus.client.response;
-
-public class CountTableResponse extends Response {
-    private final long tableRowCount;
-
-    public CountTableResponse(Status status, String message, long tableRowCount) {
-        super(status, message);
-        this.tableRowCount = tableRowCount;
-    }
-
-    public CountTableResponse(Status status, long tableRowCount) {
-        super(status);
-        this.tableRowCount = tableRowCount;
-    }
-
-    public long getTableRowCount() {
-        return tableRowCount;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("CountTableResponse {code = %s, message = %s, table row count = %d}",
-                              this.getStatus(), this.getMessage(),
-                              tableRowCount);
-    }
-}

+ 0 - 30
src/main/java/io/milvus/client/response/DescribeIndexResponse.java

@@ -1,30 +0,0 @@
-package io.milvus.client.response;
-
-import io.milvus.client.params.IndexParam;
-
-import javax.annotation.Nullable;
-import java.util.Optional;
-
-public class DescribeIndexResponse extends Response {
-    private final IndexParam indexParam;
-
-    public DescribeIndexResponse(Status status, String message, @Nullable IndexParam indexParam) {
-        super(status, message);
-        this.indexParam = indexParam;
-    }
-
-    public DescribeIndexResponse(Status status, @Nullable IndexParam indexParam) {
-        super(status);
-        this.indexParam = indexParam;
-    }
-
-    public Optional<IndexParam> getIndexParam() {
-        return Optional.ofNullable(indexParam);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("DescribeIndexResponse {code = %s, message = %s, %s}", this.getStatus(), this.getMessage(),
-                              indexParam == null ? "Index param = None" : indexParam.toString());
-    }
-}

+ 0 - 30
src/main/java/io/milvus/client/response/DescribeTableResponse.java

@@ -1,30 +0,0 @@
-package io.milvus.client.response;
-
-import io.milvus.client.params.TableSchema;
-
-import javax.annotation.Nullable;
-import java.util.Optional;
-
-public class DescribeTableResponse extends Response {
-    private final TableSchema tableSchema;
-
-    public DescribeTableResponse(Status status, String message, @Nullable TableSchema tableSchema) {
-        super(status, message);
-        this.tableSchema = tableSchema;
-    }
-
-    public DescribeTableResponse(Status status, @Nullable TableSchema tableSchema) {
-        super(status);
-        this.tableSchema = tableSchema;
-    }
-
-    public Optional<TableSchema> getTableSchema() {
-        return Optional.ofNullable(tableSchema);
-    }
-
-    @Override
-    public String toString() {
-        return String.format("DescribeTableResponse {code = %s, message = %s, %s}", this.getStatus(), this.getMessage(),
-                             tableSchema == null ? "Table schema = None" : tableSchema.toString());
-    }
-}

+ 0 - 26
src/main/java/io/milvus/client/response/HasTableResponse.java

@@ -1,26 +0,0 @@
-package io.milvus.client.response;
-
-public class HasTableResponse extends Response {
-    private final boolean hasTable;
-
-    public HasTableResponse(Status status, String message, boolean hasTable) {
-        super(status, message);
-        this.hasTable = hasTable;
-    }
-
-    public HasTableResponse(Status status, boolean hasTable) {
-        super(status);
-        this.hasTable = hasTable;
-    }
-
-    public boolean hasTable() {
-        return hasTable;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("HasTableResponse {code = %s, message = %s, has table = %s}",
-                              this.getStatus(), this.getMessage(),
-                              hasTable);
-    }
-}

+ 0 - 31
src/main/java/io/milvus/client/response/InsertResponse.java

@@ -1,31 +0,0 @@
-package io.milvus.client.response;
-
-import java.util.List;
-import java.util.Optional;
-
-public class InsertResponse extends Response {
-
-    private final List<Long> vectorIds;
-
-    public InsertResponse(Status status, String message, List<Long> vectorIds) {
-        super(status, message);
-        this.vectorIds = vectorIds;
-    }
-
-    public InsertResponse(Status status, List<Long> vectorIds) {
-        super(status);
-        this.vectorIds = vectorIds;
-    }
-
-    public List<Long> getVectorIds() {
-        return vectorIds;
-    }
-
-    //TODO: iterator
-
-    @Override
-    public String toString() {
-        return String.format("InsertResponse {code = %s, message = %s, returned %d vector ids}",
-                             this.getStatus().name(), this.getMessage(), this.vectorIds.size());
-    }
-}

+ 0 - 28
src/main/java/io/milvus/client/response/ShowTablesResponse.java

@@ -1,28 +0,0 @@
-package io.milvus.client.response;
-
-import java.util.List;
-
-public class ShowTablesResponse extends Response {
-    private final List<String> tableNames;
-
-    public ShowTablesResponse(Status status, String message, List<String> tableNames) {
-        super(status, message);
-        this.tableNames = tableNames;
-    }
-
-    public ShowTablesResponse(Status status, List<String> tableNames) {
-        super(status);
-        this.tableNames = tableNames;
-    }
-
-    public List<String> getTableNames() {
-        return tableNames;
-    }
-
-    @Override
-    public String toString() {
-        return String.format("ShowTablesResponse {code = %s, message = %s, table names = %s}",
-                              this.getStatus(), this.getMessage(),
-                              tableNames.toString());
-    }
-}