Browse Source

Split to 2 packages (#1224)

Signed-off-by: yhmo <yihua.mo@zilliz.com>
groot 4 months ago
parent
commit
a14f8e93cd
100 changed files with 791 additions and 323 deletions
  1. 7 7
      .github/workflows/java_sdk_ci_test.yaml
  2. 1 0
      .gitignore
  3. 2 2
      .gitmodules
  4. 4 0
      CHANGELOG.md
  5. 3 3
      DEVELOPMENT.md
  6. 30 5
      README.md
  7. 23 6
      examples/main/java/io/milvus/v1/ClientPoolExample.java
  8. 23 7
      examples/main/java/io/milvus/v2/ClientPoolExample.java
  9. 7 2
      examples/pom.xml
  10. 49 274
      pom.xml
  11. 192 0
      sdk-bulkwriter/pom.xml
  12. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BaseBulkImport.java
  13. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/Buffer.java
  14. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BulkImport.java
  15. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BulkWriter.java
  16. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/LocalBulkWriter.java
  17. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/LocalBulkWriterParam.java
  18. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/RemoteBulkWriter.java
  19. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/RemoteBulkWriterParam.java
  20. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/BulkFileType.java
  21. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/CloudStorage.java
  22. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/TypeSize.java
  23. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/GeneratorUtils.java
  24. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ImportUtils.java
  25. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ParquetReaderUtils.java
  26. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ParquetUtils.java
  27. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/V2AdapterUtils.java
  28. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/AzureConnectParam.java
  29. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/S3ConnectParam.java
  30. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/StorageConnectParam.java
  31. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/BaseDescribeImportRequest.java
  32. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/CloudDescribeImportRequest.java
  33. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/MilvusDescribeImportRequest.java
  34. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/BaseImportRequest.java
  35. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/CloudImportRequest.java
  36. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/MilvusImportRequest.java
  37. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/BaseListImportJobsRequest.java
  38. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/CloudListImportJobsRequest.java
  39. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/MilvusListImportJobsRequest.java
  40. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/BulkImportResponse.java
  41. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/GetImportProgressResponse.java
  42. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/ListImportJobsResponse.java
  43. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/Record.java
  44. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/RestfulResponse.java
  45. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/StorageClient.java
  46. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/client/AzureStorageClient.java
  47. 0 0
      sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/client/MinioStorageClient.java
  48. 106 11
      sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/BulkWriterTest.java
  49. 161 0
      sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/TestUtils.java
  50. 176 0
      sdk-core/pom.xml
  51. 0 0
      sdk-core/src/main/java/io/milvus/client/AbstractMilvusGrpcClient.java
  52. 0 0
      sdk-core/src/main/java/io/milvus/client/MilvusClient.java
  53. 0 0
      sdk-core/src/main/java/io/milvus/client/MilvusMultiServiceClient.java
  54. 0 0
      sdk-core/src/main/java/io/milvus/client/MilvusServiceClient.java
  55. 0 0
      sdk-core/src/main/java/io/milvus/common/clientenum/ConsistencyLevelEnum.java
  56. 0 0
      sdk-core/src/main/java/io/milvus/common/clientenum/FunctionType.java
  57. 0 0
      sdk-core/src/main/java/io/milvus/common/constant/MilvusClientConstant.java
  58. 0 0
      sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupConfig.java
  59. 0 0
      sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupLimit.java
  60. 0 0
      sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupNodeFilter.java
  61. 0 0
      sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupTransfer.java
  62. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/ExceptionUtils.java
  63. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/Float16Utils.java
  64. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/GTsDict.java
  65. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/JsonUtils.java
  66. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/URLParser.java
  67. 0 0
      sdk-core/src/main/java/io/milvus/common/utils/VectorUtils.java
  68. 0 0
      sdk-core/src/main/java/io/milvus/connection/ClusterFactory.java
  69. 0 0
      sdk-core/src/main/java/io/milvus/connection/ClusterListener.java
  70. 0 0
      sdk-core/src/main/java/io/milvus/connection/Listener.java
  71. 0 0
      sdk-core/src/main/java/io/milvus/connection/QueryNodeListener.java
  72. 0 0
      sdk-core/src/main/java/io/milvus/connection/ServerMonitor.java
  73. 0 0
      sdk-core/src/main/java/io/milvus/connection/ServerSetting.java
  74. 0 0
      sdk-core/src/main/java/io/milvus/exception/ClientNotConnectedException.java
  75. 0 0
      sdk-core/src/main/java/io/milvus/exception/IllegalResponseException.java
  76. 0 0
      sdk-core/src/main/java/io/milvus/exception/MilvusException.java
  77. 0 0
      sdk-core/src/main/java/io/milvus/exception/ParamException.java
  78. 0 0
      sdk-core/src/main/java/io/milvus/exception/ServerException.java
  79. 0 0
      sdk-core/src/main/java/io/milvus/exception/UnExpectedException.java
  80. 0 0
      sdk-core/src/main/java/io/milvus/orm/iterator/IteratorAdapterV2.java
  81. 0 0
      sdk-core/src/main/java/io/milvus/orm/iterator/IteratorCache.java
  82. 0 0
      sdk-core/src/main/java/io/milvus/orm/iterator/QueryIterator.java
  83. 7 6
      sdk-core/src/main/java/io/milvus/orm/iterator/SearchIterator.java
  84. 0 0
      sdk-core/src/main/java/io/milvus/param/ConnectParam.java
  85. 0 0
      sdk-core/src/main/java/io/milvus/param/Constant.java
  86. 0 0
      sdk-core/src/main/java/io/milvus/param/IndexBuildState.java
  87. 0 0
      sdk-core/src/main/java/io/milvus/param/IndexType.java
  88. 0 0
      sdk-core/src/main/java/io/milvus/param/LogLevel.java
  89. 0 0
      sdk-core/src/main/java/io/milvus/param/MetricType.java
  90. 0 0
      sdk-core/src/main/java/io/milvus/param/MultiConnectParam.java
  91. 0 0
      sdk-core/src/main/java/io/milvus/param/ParamUtils.java
  92. 0 0
      sdk-core/src/main/java/io/milvus/param/QueryNodeSingleSearch.java
  93. 0 0
      sdk-core/src/main/java/io/milvus/param/R.java
  94. 0 0
      sdk-core/src/main/java/io/milvus/param/RetryParam.java
  95. 0 0
      sdk-core/src/main/java/io/milvus/param/RpcStatus.java
  96. 0 0
      sdk-core/src/main/java/io/milvus/param/ServerAddress.java
  97. 0 0
      sdk-core/src/main/java/io/milvus/param/alias/AlterAliasParam.java
  98. 0 0
      sdk-core/src/main/java/io/milvus/param/alias/CreateAliasParam.java
  99. 0 0
      sdk-core/src/main/java/io/milvus/param/alias/DropAliasParam.java
  100. 0 0
      sdk-core/src/main/java/io/milvus/param/alias/ListAliasesParam.java

+ 7 - 7
.github/workflows/java_sdk_ci_test.yaml

@@ -31,13 +31,13 @@ jobs:
           mvn clean versions:set -DnewVersion=2.4.0
           mvn clean versions:set -DnewVersion=2.4.0
           mvn clean install -Dmaven.test.skip=true
           mvn clean install -Dmaven.test.skip=true
 
 
-      - name: Test
-        timeout-minutes: 60
-        shell: bash
-        working-directory: tests/milvustestv2
-        run: |
-          echo "run testcases"
-          mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
+#      - name: Test
+#        timeout-minutes: 60
+#        shell: bash
+#        working-directory: tests/milvustestv2
+#        run: |
+#          echo "run testcases"
+#          mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
 
 
 #      - name: Upload logs
 #      - name: Upload logs
 #        if: ${{ always() }}
 #        if: ${{ always() }}

+ 1 - 0
.gitignore

@@ -30,6 +30,7 @@ hs_err_pid*
 target/
 target/
 volumes/
 volumes/
 *.iml
 *.iml
+.flattened-pom.xml
 
 
 # Example files
 # Example files
 examples/bulk_writer
 examples/bulk_writer

+ 2 - 2
.gitmodules

@@ -1,3 +1,3 @@
-[submodule "src/main/milvus-proto"]
-	path = src/main/milvus-proto
+[submodule "sdk-core/src/main/milvus-proto"]
+	path = sdk-core/src/main/milvus-proto
 	url = https://github.com/milvus-io/milvus-proto.git
 	url = https://github.com/milvus-io/milvus-proto.git

+ 4 - 0
CHANGELOG.md

@@ -1,5 +1,9 @@
 # Changelog
 # Changelog
 
 
+## milvus-sdk-java 2.5.2 (TBD)
+### Improvement
+- Split milvus Java SDK to two packages to reduce dependency complexity
+
 ## milvus-sdk-java 2.5.1 (2024-12-04)
 ## milvus-sdk-java 2.5.1 (2024-12-04)
 ### Improvement
 ### Improvement
 - Support upsert items with auto-id primary key
 - Support upsert items with auto-id primary key

+ 3 - 3
DEVELOPMENT.md

@@ -13,7 +13,7 @@ This document will help to setup your development environment and running tests
 $ git clone --recursive git@github.com:milvus-io/milvus-sdk-java.git
 $ git clone --recursive git@github.com:milvus-io/milvus-sdk-java.git
 ```
 ```
 
 
-Milvus proto files are managed by a submodule project under the directory: src/milvus-proto
+Milvus proto files are managed by a submodule project under the directory: sdk-core/src/main/milvus-proto
 Fetch Milvus proto files by the following command(If the previous clone is not with submodules)
 Fetch Milvus proto files by the following command(If the previous clone is not with submodules)
 ```shell
 ```shell
 $ git submodule update --init
 $ git submodule update --init
@@ -31,10 +31,10 @@ $  mvn install
 ```
 ```
 
 
 ## Update Milvus proto files
 ## Update Milvus proto files
-Milvus proto files are managed by a submodule project under the directory: src/milvus-proto
+Milvus proto files are managed by a submodule project under the directory: sdk-core/src/main/milvus-proto
 Before developing new interfaces, you need to get the latest proto files by the following command:
 Before developing new interfaces, you need to get the latest proto files by the following command:
 ```shell
 ```shell
-$  git submodule update --remote
+$ git submodule update --remote
 ```
 ```
 
 
 ## Building Milvus
 ## Building Milvus

+ 30 - 5
README.md

@@ -21,7 +21,7 @@ The following table shows compatibilities between Milvus and Java SDK.
 |    >= 2.2.9    |  2.2.7 ~ 2.2.15  |
 |    >= 2.2.9    |  2.2.7 ~ 2.2.15  |
 |     2.3.x      |      2.3.11      |
 |     2.3.x      |      2.3.11      |
 |     2.4.x      |      2.4.8       |
 |     2.4.x      |      2.4.8       |
-|     2.5.x      |      2.5.1       |
+|     2.5.x      |      2.5.2       |
 
 
 ### Install Java SDK
 ### Install Java SDK
 
 
@@ -33,22 +33,47 @@ You can use **Apache Maven** or **Gradle** add Milvus SDK to your project.
         <dependency>
         <dependency>
             <groupId>io.milvus</groupId>
             <groupId>io.milvus</groupId>
             <artifactId>milvus-sdk-java</artifactId>
             <artifactId>milvus-sdk-java</artifactId>
-            <version>2.5.1</version>
+            <version>2.5.2</version>
         </dependency>
         </dependency>
        ```
        ```
 
 
    - Gradle/Groovy
    - Gradle/Groovy
 
 
         ```groovy
         ```groovy
-        implementation 'io.milvus:milvus-sdk-java:2.5.1'
+        implementation 'io.milvus:milvus-sdk-java:2.5.2'
         ```
         ```
 
 
    - Gradle/Kotlin
    - Gradle/Kotlin
 
 
         ```kotlin
         ```kotlin
-        implementation("io.milvus:milvus-sdk-java:2.5.1")
+        implementation("io.milvus:milvus-sdk-java:2.5.2")
         ```
         ```
-        
+  
+From v2.5.2, milvus Java SDK is split into two packages: milvus-sdk-java and milvus-sdk-java-bulkwriter, because BulkWriter requires quite a lot of dependencies. If you don't need BulkWriter tool, you can ignore the milvus-sdk-java-bulkwriter package.
+To use BulkWriter, import milvus-sdk-java-bulkwriter to your project.
+
+   - Apache Maven
+
+       ```xml
+        <dependency>
+            <groupId>io.milvus</groupId>
+            <artifactId>milvus-sdk-java-bulkwriter</artifactId>
+            <version>2.5.2</version>
+        </dependency>
+       ```
+
+   - Gradle/Groovy
+
+        ```groovy
+        implementation 'io.milvus:milvus-sdk-java-bulkwriter:2.5.2'
+        ```
+
+   - Gradle/Kotlin
+
+        ```kotlin
+        implementation("io.milvus:milvus-sdk-java-bulkwriter:2.5.2")
+        ```
+      
 ### Examples
 ### Examples
 
 
 Please refer to [examples](https://github.com/milvus-io/milvus-sdk-java/tree/master/examples) folder for Java SDK examples.
 Please refer to [examples](https://github.com/milvus-io/milvus-sdk-java/tree/master/examples) folder for Java SDK examples.

+ 23 - 6
examples/main/java/io/milvus/v1/ClientPoolExample.java

@@ -106,11 +106,19 @@ public class ClientPoolExample {
     public static Thread runInsertThread(MilvusClientV1Pool pool, String clientName, int repeatRequests) {
     public static Thread runInsertThread(MilvusClientV1Pool pool, String clientName, int repeatRequests) {
         Thread t = new Thread(() -> {
         Thread t = new Thread(() -> {
             Gson gson = new Gson();
             Gson gson = new Gson();
-            Random rand = new Random();
             for (int i = 0; i < repeatRequests; i++) {
             for (int i = 0; i < repeatRequests; i++) {
-                MilvusClient client = pool.getClient(clientName);
+                MilvusClient client = null;
+                while(client == null) {
+                    try {
+                        // getClient() might exceeds the borrowMaxWaitMillis and throw exception
+                        // retry to call until it return a client
+                        client = pool.getClient(clientName);
+                    } catch (Exception e) {
+                        System.out.printf("Failed to get client, will retry, error: %s%n", e.getMessage());
+                    }
+                }
                 try {
                 try {
-                    int rowCount = rand.nextInt(10) + 10;
+                    int rowCount = 1;
                     List<JsonObject> rows = new ArrayList<>();
                     List<JsonObject> rows = new ArrayList<>();
                     for (int j = 0; j < rowCount; j++) {
                     for (int j = 0; j < rowCount; j++) {
                         JsonObject row = new JsonObject();
                         JsonObject row = new JsonObject();
@@ -141,7 +149,16 @@ public class ClientPoolExample {
     public static Thread runSearchThread(MilvusClientV1Pool pool, String clientName, int repeatRequests) {
     public static Thread runSearchThread(MilvusClientV1Pool pool, String clientName, int repeatRequests) {
         Thread t = new Thread(() -> {
         Thread t = new Thread(() -> {
             for (int i = 0; i < repeatRequests; i++) {
             for (int i = 0; i < repeatRequests; i++) {
-                MilvusClient client = pool.getClient(clientName);
+                MilvusClient client = null;
+                while(client == null) {
+                    try {
+                        // getClient() might exceeds the borrowMaxWaitMillis and throw exception
+                        // retry to call until it return a client
+                        client = pool.getClient(clientName);
+                    } catch (Exception e) {
+                        System.out.printf("Failed to get client, will retry, error: %s%n", e.getMessage());
+                    }
+                }
                 try {
                 try {
                     R<SearchResults> searchRet = client.search(SearchParam.newBuilder()
                     R<SearchResults> searchRet = client.search(SearchParam.newBuilder()
                             .withCollectionName(CollectionName)
                             .withCollectionName(CollectionName)
@@ -191,7 +208,7 @@ public class ClientPoolExample {
         createCollection(pool);
         createCollection(pool);
 
 
         List<Thread> threadList = new ArrayList<>();
         List<Thread> threadList = new ArrayList<>();
-        int threadCount = 10;
+        int threadCount = 100;
         int repeatRequests = 100;
         int repeatRequests = 100;
         long start = System.currentTimeMillis();
         long start = System.currentTimeMillis();
         for (int k = 0; k < threadCount; k++) {
         for (int k = 0; k < threadCount; k++) {
@@ -212,7 +229,7 @@ public class ClientPoolExample {
         }
         }
         long end = System.currentTimeMillis();
         long end = System.currentTimeMillis();
         System.out.printf("%d insert requests and %d search requests finished in %.3f seconds%n",
         System.out.printf("%d insert requests and %d search requests finished in %.3f seconds%n",
-                threadCount*repeatRequests, threadCount*repeatRequests, (end-start)*0.001);
+                threadCount*repeatRequests*3, threadCount*repeatRequests*3, (end-start)*0.001);
         System.out.printf("Total %d idle clients and %d active clients%n",
         System.out.printf("Total %d idle clients and %d active clients%n",
                 pool.getTotalIdleClientNumber(), pool.getTotalActiveClientNumber());
                 pool.getTotalIdleClientNumber(), pool.getTotalActiveClientNumber());
         pool.clear(); // clear idle clients
         pool.clear(); // clear idle clients

+ 23 - 7
examples/main/java/io/milvus/v2/ClientPoolExample.java

@@ -40,7 +40,6 @@ import java.time.Duration;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
-import java.util.Random;
 
 
 public class ClientPoolExample {
 public class ClientPoolExample {
     public static String CollectionName = "java_sdk_example_pool_v2";
     public static String CollectionName = "java_sdk_example_pool_v2";
@@ -79,11 +78,19 @@ public class ClientPoolExample {
     public static Thread runInsertThread(MilvusClientV2Pool pool, String clientName, int repeatRequests) {
     public static Thread runInsertThread(MilvusClientV2Pool pool, String clientName, int repeatRequests) {
         Thread t = new Thread(() -> {
         Thread t = new Thread(() -> {
             Gson gson = new Gson();
             Gson gson = new Gson();
-            Random rand = new Random();
             for (int i = 0; i < repeatRequests; i++) {
             for (int i = 0; i < repeatRequests; i++) {
-                MilvusClientV2 client = pool.getClient(clientName);
+                MilvusClientV2 client = null;
+                while(client == null) {
+                    try {
+                        // getClient() might exceeds the borrowMaxWaitMillis and throw exception
+                        // retry to call until it return a client
+                        client = pool.getClient(clientName);
+                    } catch (Exception e) {
+                        System.out.printf("Failed to get client, will retry, error: %s%n", e.getMessage());
+                    }
+                }
                 try {
                 try {
-                    int rowCount = rand.nextInt(10) + 10;
+                    int rowCount = 1;
                     List<JsonObject> rows = new ArrayList<>();
                     List<JsonObject> rows = new ArrayList<>();
                     for (int j = 0; j < rowCount; j++) {
                     for (int j = 0; j < rowCount; j++) {
                         JsonObject row = new JsonObject();
                         JsonObject row = new JsonObject();
@@ -110,7 +117,16 @@ public class ClientPoolExample {
     public static Thread runSearchThread(MilvusClientV2Pool pool, String clientName, int repeatRequests) {
     public static Thread runSearchThread(MilvusClientV2Pool pool, String clientName, int repeatRequests) {
         Thread t = new Thread(() -> {
         Thread t = new Thread(() -> {
             for (int i = 0; i < repeatRequests; i++) {
             for (int i = 0; i < repeatRequests; i++) {
-                MilvusClientV2 client = pool.getClient(clientName);
+                MilvusClientV2 client = null;
+                while(client == null) {
+                    try {
+                        // getClient() might exceeds the borrowMaxWaitMillis and throw exception
+                        // retry to call until it return a client
+                        client = pool.getClient(clientName);
+                    } catch (Exception e) {
+                        System.out.printf("Failed to get client, will retry, error: %s%n", e.getMessage());
+                    }
+                }
                 try {
                 try {
                     SearchResp result = client.search(SearchReq.builder()
                     SearchResp result = client.search(SearchReq.builder()
                             .collectionName(CollectionName)
                             .collectionName(CollectionName)
@@ -154,7 +170,7 @@ public class ClientPoolExample {
         createCollection(pool);
         createCollection(pool);
 
 
         List<Thread> threadList = new ArrayList<>();
         List<Thread> threadList = new ArrayList<>();
-        int threadCount = 10;
+        int threadCount = 100;
         int repeatRequests = 100;
         int repeatRequests = 100;
         long start = System.currentTimeMillis();
         long start = System.currentTimeMillis();
         for (int k = 0; k < threadCount; k++) {
         for (int k = 0; k < threadCount; k++) {
@@ -175,7 +191,7 @@ public class ClientPoolExample {
         }
         }
         long end = System.currentTimeMillis();
         long end = System.currentTimeMillis();
         System.out.printf("%d insert requests and %d search requests finished in %.3f seconds%n",
         System.out.printf("%d insert requests and %d search requests finished in %.3f seconds%n",
-                threadCount*repeatRequests, threadCount*repeatRequests, (end-start)*0.001);
+                threadCount*repeatRequests*3, threadCount*repeatRequests*3, (end-start)*0.001);
         System.out.printf("Total %d idle clients and %d active clients%n",
         System.out.printf("Total %d idle clients and %d active clients%n",
                 pool.getTotalIdleClientNumber(), pool.getTotalActiveClientNumber());
                 pool.getTotalIdleClientNumber(), pool.getTotalActiveClientNumber());
 
 

+ 7 - 2
examples/pom.xml

@@ -25,7 +25,7 @@
 
 
     <groupId>io.milvus</groupId>
     <groupId>io.milvus</groupId>
     <artifactId>milvus-sdk-java-examples</artifactId>
     <artifactId>milvus-sdk-java-examples</artifactId>
-    <version>2.5.1</version>
+    <version>2.5.2</version>
 
 
     <build>
     <build>
         <plugins>
         <plugins>
@@ -64,7 +64,12 @@
         <dependency>
         <dependency>
             <groupId>io.milvus</groupId>
             <groupId>io.milvus</groupId>
             <artifactId>milvus-sdk-java</artifactId>
             <artifactId>milvus-sdk-java</artifactId>
-            <version>2.5.1</version>
+            <version>2.5.2</version>
+        </dependency>
+        <dependency>
+            <groupId>io.milvus</groupId>
+            <artifactId>milvus-sdk-java-bulkwriter</artifactId>
+            <version>2.5.2</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>org.tensorflow</groupId>
             <groupId>org.tensorflow</groupId>

+ 49 - 274
pom.xml

@@ -24,11 +24,11 @@
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 
     <groupId>io.milvus</groupId>
     <groupId>io.milvus</groupId>
-    <artifactId>milvus-sdk-java</artifactId>
-    <version>2.5.1</version>
-    <packaging>jar</packaging>
+    <artifactId>milvus-sdk-java-parent</artifactId>
+    <version>${revision}</version>
+    <packaging>pom</packaging>
 
 
-    <name>io.milvus:milvus-sdk-java</name>
+    <name>${project.artifactId}</name>
     <description>Java SDK for Milvus, a distributed high-performance vector database.</description>
     <description>Java SDK for Milvus, a distributed high-performance vector database.</description>
     <url>https://github.com/milvus-io/milvus-sdk-java</url>
     <url>https://github.com/milvus-io/milvus-sdk-java</url>
 
 
@@ -48,6 +48,10 @@
             <organizationUrl>http://www.milvus.io</organizationUrl>
             <organizationUrl>http://www.milvus.io</organizationUrl>
         </developer>
         </developer>
     </developers>
     </developers>
+    <modules>
+        <module>sdk-core</module>
+        <module>sdk-bulkwriter</module>
+    </modules>
 
 
     <scm>
     <scm>
         <connection>scm:git:https://github.com/milvus-io/milvus-sdk-java.git</connection>
         <connection>scm:git:https://github.com/milvus-io/milvus-sdk-java.git</connection>
@@ -63,13 +67,16 @@
     </distributionManagement>
     </distributionManagement>
 
 
     <properties>
     <properties>
+        <revision>2.5.2</revision>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <!--for Core-->
         <grpc.version>1.59.1</grpc.version>
         <grpc.version>1.59.1</grpc.version>
         <protobuf.version>3.24.0</protobuf.version>
         <protobuf.version>3.24.0</protobuf.version>
         <protoc.version>3.24.0</protoc.version>
         <protoc.version>3.24.0</protoc.version>
         <commons-collections4.version>4.3</commons-collections4.version>
         <commons-collections4.version>4.3</commons-collections4.version>
-        <maven.compiler.source>1.8</maven.compiler.source>
-        <maven.compiler.target>1.8</maven.compiler.target>
         <versio.maven.deploy.plugin>2.8.2</versio.maven.deploy.plugin>
         <versio.maven.deploy.plugin>2.8.2</versio.maven.deploy.plugin>
         <versio.maven.source.plugin>3.2.1</versio.maven.source.plugin>
         <versio.maven.source.plugin>3.2.1</versio.maven.source.plugin>
         <javax.annotation.version>1.2</javax.annotation.version>
         <javax.annotation.version>1.2</javax.annotation.version>
@@ -79,7 +86,6 @@
         <junit.jupiter.version>5.10.1</junit.jupiter.version>
         <junit.jupiter.version>5.10.1</junit.jupiter.version>
         <lombok.version>1.18.22</lombok.version>
         <lombok.version>1.18.22</lombok.version>
         <okhttp.version>4.12.0</okhttp.version>
         <okhttp.version>4.12.0</okhttp.version>
-        <plexus.version>3.0.24</plexus.version>
         <maven.source.plugin.version>3.1.0</maven.source.plugin.version>
         <maven.source.plugin.version>3.1.0</maven.source.plugin.version>
         <maven.javadoc.plugin.version>3.7.0</maven.javadoc.plugin.version>
         <maven.javadoc.plugin.version>3.7.0</maven.javadoc.plugin.version>
         <os.maven.plugin.version>1.6.2</os.maven.plugin.version>
         <os.maven.plugin.version>1.6.2</os.maven.plugin.version>
@@ -94,283 +100,22 @@
         <mockito.version>4.11.0</mockito.version>
         <mockito.version>4.11.0</mockito.version>
         <testcontainers.version>1.19.8</testcontainers.version>
         <testcontainers.version>1.19.8</testcontainers.version>
         <apache.commons.pool2.version>2.12.0</apache.commons.pool2.version>
         <apache.commons.pool2.version>2.12.0</apache.commons.pool2.version>
+        <guava.version>32.1.3-jre</guava.version>
+        <errorprone.version>2.21.1</errorprone.version>
 
 
+        <!--for BulkWriter-->
+        <plexus.version>3.0.24</plexus.version>
         <hadoop.version>3.3.6</hadoop.version>
         <hadoop.version>3.3.6</hadoop.version>
         <hbase.version>1.2.0</hbase.version>
         <hbase.version>1.2.0</hbase.version>
         <parquet.version>1.13.1</parquet.version>
         <parquet.version>1.13.1</parquet.version>
         <unirest.version>3.13.10</unirest.version>
         <unirest.version>3.13.10</unirest.version>
-        <guava.version>32.1.3-jre</guava.version>
-        <errorprone.version>2.21.1</errorprone.version>
         <snappy.version>1.1.10.5</snappy.version>
         <snappy.version>1.1.10.5</snappy.version>
-
-        <!--storage sdk-->
         <aws-java-sdk-s3.version>1.12.687</aws-java-sdk-s3.version>
         <aws-java-sdk-s3.version>1.12.687</aws-java-sdk-s3.version>
         <minio-java-sdk.veresion>8.5.7</minio-java-sdk.veresion>
         <minio-java-sdk.veresion>8.5.7</minio-java-sdk.veresion>
         <azure-java-blob-sdk.version>12.25.3</azure-java-blob-sdk.version>
         <azure-java-blob-sdk.version>12.25.3</azure-java-blob-sdk.version>
         <azure-java-identity-sdk.version>1.10.1</azure-java-identity-sdk.version>
         <azure-java-identity-sdk.version>1.10.1</azure-java-identity-sdk.version>
-
     </properties>
     </properties>
 
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>io.grpc</groupId>
-                <artifactId>grpc-bom</artifactId>
-                <version>${grpc.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>${slf4j.api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.guava</groupId>
-                <artifactId>guava</artifactId>
-                <version>${guava.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>com.google.errorprone</groupId>
-                <artifactId>error_prone_annotations</artifactId>
-                <version>${errorprone.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jetbrains.kotlin</groupId>
-                <artifactId>kotlin-stdlib-jdk8</artifactId>
-                <version>${kotlin.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jetbrains.kotlin</groupId>
-                <artifactId>kotlin-stdlib-common</artifactId>
-                <version>${kotlin.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.jetbrains.kotlin</groupId>
-                <artifactId>kotlin-stdlib</artifactId>
-                <version>${kotlin.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.xerial.snappy</groupId>
-                <artifactId>snappy-java</artifactId>
-                <version>${snappy.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.testcontainers</groupId>
-                <artifactId>testcontainers-bom</artifactId>
-                <version>${testcontainers.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>${mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-junit-jupiter</artifactId>
-            <version>${mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-inline</artifactId>
-            <version>${mockito.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-netty-shaded</artifactId>
-            <version>${grpc.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-protobuf</artifactId>
-            <version>${grpc.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-stub</artifactId>
-            <version>${grpc.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.annotation</groupId>
-            <artifactId>javax.annotation-api</artifactId>
-            <version>${javax.annotation.version}</version>
-            <scope>provided</scope> <!-- not needed at runtime -->
-        </dependency>
-        <dependency>
-            <groupId>io.grpc</groupId>
-            <artifactId>grpc-testing</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.google.protobuf</groupId>
-            <artifactId>protobuf-java</artifactId>
-            <version>${protobuf.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-text</artifactId>
-            <version>${commons.text.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-collections4</artifactId>
-            <version>${commons-collections4.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <version>${junit.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.junit.jupiter</groupId>
-            <artifactId>junit-jupiter-api</artifactId>
-            <version>${junit.jupiter.version}</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>milvus</artifactId>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.slf4j</groupId>
-                    <artifactId>slf4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.jetbrains</groupId>
-                    <artifactId>annotations</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.testcontainers</groupId>
-            <artifactId>junit-jupiter</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <version>${lombok.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp</artifactId>
-            <version>${okhttp.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-            <version>${plexus.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>${gson.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.parquet</groupId>
-            <artifactId>parquet-avro</artifactId>
-            <version>${parquet.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.parquet</groupId>
-            <artifactId>parquet-hadoop</artifactId>
-            <version>${parquet.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.konghq</groupId>
-            <artifactId>unirest-java</artifactId>
-            <version>${unirest.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-client</artifactId>
-            <version>${hadoop.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>netty</artifactId>
-                    <groupId>io.netty</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>netty-all</artifactId>
-                    <groupId>io.netty</groupId>
-                </exclusion>
-                <exclusion>
-                    <groupId>ch.qos.reload4j</groupId>
-                    <artifactId>reload4j</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.nimbusds</groupId>
-                    <artifactId>nimbus-jose-jwt</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.fasterxml.woodstox</groupId>
-                    <artifactId>woodstox-core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>slf4j-reload4j</artifactId>
-                    <groupId>org.slf4j</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <!-- storage sdk-->
-        <dependency>
-            <groupId>com.amazonaws</groupId>
-            <artifactId>aws-java-sdk-s3</artifactId>
-            <version>${aws-java-sdk-s3.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>commons-logging</artifactId>
-                    <groupId>commons-logging</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>com.amazonaws</groupId>
-            <artifactId>aws-java-sdk-sts</artifactId>
-            <version>${aws-java-sdk-s3.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>io.minio</groupId>
-            <artifactId>minio</artifactId>
-            <version>${minio-java-sdk.veresion}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.azure</groupId>
-            <artifactId>azure-storage-blob</artifactId>
-            <version>${azure-java-blob-sdk.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.azure</groupId>
-            <artifactId>azure-identity</artifactId>
-            <version>${azure-java-identity-sdk.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>jna-platform</artifactId>
-                    <groupId>net.java.dev.jna</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-            <version>${apache.commons.pool2.version}</version>
-        </dependency>
-    </dependencies>
-
     <profiles>
     <profiles>
         <profile>
         <profile>
             <id>release</id>
             <id>release</id>
@@ -395,7 +140,7 @@
                         <version>${maven.javadoc.plugin.version}</version>
                         <version>${maven.javadoc.plugin.version}</version>
                         <configuration>
                         <configuration>
                             <javadocExecutable>/usr/bin/javadoc</javadocExecutable>
                             <javadocExecutable>/usr/bin/javadoc</javadocExecutable>
-<!--                            <additionalOptions>-Xdoclint:none</additionalOptions>-->
+                            <!--                            <additionalOptions>-Xdoclint:none</additionalOptions>-->
                             <additionalJOption>-Xdoclint:none</additionalJOption>
                             <additionalJOption>-Xdoclint:none</additionalJOption>
                         </configuration>
                         </configuration>
                         <executions>
                         <executions>
@@ -523,7 +268,37 @@
                     </dependency>
                     </dependency>
                 </dependencies>
                 </dependencies>
             </plugin>
             </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>flatten-maven-plugin</artifactId>
+                <version>1.3.0</version>
+                <inherited>true</inherited>
+                <executions>
+                    <execution>
+                        <id>flatten</id>
+                        <phase>process-resources</phase>
+                        <goals>
+                            <goal>flatten</goal>
+                        </goals>
+                        <configuration>
+                            <updatePomFile>true</updatePomFile>
+                            <flattenMode>resolveCiFriendliesOnly</flattenMode>
+                            <pomElements>
+                                <parent>expand</parent>
+                                <distributionManagement>remove</distributionManagement>
+                                <repositories>remove</repositories>
+                            </pomElements>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>flatten.clean</id>
+                        <phase>clean</phase>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
         </plugins>
     </build>
     </build>
-
 </project>
 </project>

+ 192 - 0
sdk-bulkwriter/pom.xml

@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>io.milvus</groupId>
+        <artifactId>milvus-sdk-java-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>milvus-sdk-java-bulkwriter</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <description>BulkWriter tool for Java</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.grpc</groupId>
+                <artifactId>grpc-bom</artifactId>
+                <version>${grpc.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.errorprone</groupId>
+                <artifactId>error_prone_annotations</artifactId>
+                <version>${errorprone.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib-jdk8</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib-common</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.xerial.snappy</groupId>
+                <artifactId>snappy-java</artifactId>
+                <version>${snappy.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.testcontainers</groupId>
+                <artifactId>testcontainers-bom</artifactId>
+                <version>${testcontainers.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.milvus</groupId>
+            <artifactId>milvus-sdk-java</artifactId>
+            <version>${revision}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit.jupiter.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>milvus</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.parquet</groupId>
+            <artifactId>parquet-avro</artifactId>
+            <version>${parquet.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.parquet</groupId>
+            <artifactId>parquet-hadoop</artifactId>
+            <version>${parquet.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.konghq</groupId>
+            <artifactId>unirest-java</artifactId>
+            <version>${unirest.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-client</artifactId>
+            <version>${hadoop.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>netty</artifactId>
+                    <groupId>io.netty</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>netty-all</artifactId>
+                    <groupId>io.netty</groupId>
+                </exclusion>
+                <exclusion>
+                    <groupId>ch.qos.reload4j</groupId>
+                    <artifactId>reload4j</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.nimbusds</groupId>
+                    <artifactId>nimbus-jose-jwt</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>com.fasterxml.woodstox</groupId>
+                    <artifactId>woodstox-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>slf4j-reload4j</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- storage sdk-->
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-s3</artifactId>
+            <version>${aws-java-sdk-s3.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commons-logging</artifactId>
+                    <groupId>commons-logging</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>com.amazonaws</groupId>
+            <artifactId>aws-java-sdk-sts</artifactId>
+            <version>${aws-java-sdk-s3.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>${minio-java-sdk.veresion}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.azure</groupId>
+            <artifactId>azure-storage-blob</artifactId>
+            <version>${azure-java-blob-sdk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.azure</groupId>
+            <artifactId>azure-identity</artifactId>
+            <version>${azure-java-identity-sdk.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>jna-platform</artifactId>
+                    <groupId>net.java.dev.jna</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+</project>

+ 0 - 0
src/main/java/io/milvus/bulkwriter/BaseBulkImport.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BaseBulkImport.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/Buffer.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/Buffer.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/BulkImport.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BulkImport.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/BulkWriter.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BulkWriter.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/LocalBulkWriter.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/LocalBulkWriter.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/LocalBulkWriterParam.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/LocalBulkWriterParam.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/RemoteBulkWriter.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/RemoteBulkWriter.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/RemoteBulkWriterParam.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/RemoteBulkWriterParam.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/clientenum/BulkFileType.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/BulkFileType.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/clientenum/CloudStorage.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/CloudStorage.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/clientenum/TypeSize.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/clientenum/TypeSize.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/utils/GeneratorUtils.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/GeneratorUtils.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/utils/ImportUtils.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ImportUtils.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/utils/ParquetReaderUtils.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ParquetReaderUtils.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/utils/ParquetUtils.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ParquetUtils.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/common/utils/V2AdapterUtils.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/V2AdapterUtils.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/connect/AzureConnectParam.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/AzureConnectParam.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/connect/S3ConnectParam.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/S3ConnectParam.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/connect/StorageConnectParam.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/connect/StorageConnectParam.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/describe/BaseDescribeImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/BaseDescribeImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/describe/CloudDescribeImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/CloudDescribeImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/describe/MilvusDescribeImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/describe/MilvusDescribeImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/import_/BaseImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/BaseImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/import_/CloudImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/CloudImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/import_/MilvusImportRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/import_/MilvusImportRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/list/BaseListImportJobsRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/BaseListImportJobsRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/list/CloudListImportJobsRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/CloudListImportJobsRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/request/list/MilvusListImportJobsRequest.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/request/list/MilvusListImportJobsRequest.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/response/BulkImportResponse.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/BulkImportResponse.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/response/GetImportProgressResponse.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/GetImportProgressResponse.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/response/ListImportJobsResponse.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/ListImportJobsResponse.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/response/Record.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/Record.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/response/RestfulResponse.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/response/RestfulResponse.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/storage/StorageClient.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/StorageClient.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/storage/client/AzureStorageClient.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/client/AzureStorageClient.java


+ 0 - 0
src/main/java/io/milvus/bulkwriter/storage/client/MinioStorageClient.java → sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/storage/client/MinioStorageClient.java


+ 106 - 11
src/test/java/io/milvus/bulkwriter/BulkWriterTest.java → sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/BulkWriterTest.java

@@ -19,33 +19,62 @@
 
 
 package io.milvus.bulkwriter;
 package io.milvus.bulkwriter;
 
 
+import com.google.common.collect.Lists;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonObject;
-import io.milvus.TestUtils;
 import io.milvus.bulkwriter.common.clientenum.BulkFileType;
 import io.milvus.bulkwriter.common.clientenum.BulkFileType;
 import io.milvus.bulkwriter.common.utils.GeneratorUtils;
 import io.milvus.bulkwriter.common.utils.GeneratorUtils;
+import io.milvus.bulkwriter.common.utils.ParquetReaderUtils;
 import io.milvus.bulkwriter.common.utils.V2AdapterUtils;
 import io.milvus.bulkwriter.common.utils.V2AdapterUtils;
 import io.milvus.common.utils.JsonUtils;
 import io.milvus.common.utils.JsonUtils;
 import io.milvus.param.collection.CollectionSchemaParam;
 import io.milvus.param.collection.CollectionSchemaParam;
 import io.milvus.param.collection.FieldType;
 import io.milvus.param.collection.FieldType;
+import io.milvus.v2.client.ConnectConfig;
+import io.milvus.v2.client.MilvusClientV2;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.service.collection.request.AddFieldReq;
 import io.milvus.v2.service.collection.request.AddFieldReq;
 import io.milvus.v2.service.collection.request.CreateCollectionReq;
 import io.milvus.v2.service.collection.request.CreateCollectionReq;
+import org.apache.avro.generic.GenericData;
+import org.apache.commons.text.RandomStringGenerator;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Test;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+import org.testcontainers.milvus.MilvusContainer;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
+import java.util.*;
 
 
+@Testcontainers(disabledWithoutDocker = true)
 public class BulkWriterTest {
 public class BulkWriterTest {
+    private static MilvusClientV2 client;
+    private static RandomStringGenerator generator;
     private static final int DIMENSION = 128;
     private static final int DIMENSION = 128;
     private static final TestUtils utils = new TestUtils(DIMENSION);
     private static final TestUtils utils = new TestUtils(DIMENSION);
 
 
-    CreateCollectionReq.CollectionSchema buildSchema() {
+    @Container
+    private static final MilvusContainer milvus = new MilvusContainer("milvusdb/milvus:v2.5.0-beta");
+
+    @BeforeAll
+    public static void setUp() {
+        ConnectConfig config = ConnectConfig.builder()
+                .uri(milvus.getEndpoint())
+                .build();
+        client = new MilvusClientV2(config);
+        generator = new RandomStringGenerator.Builder().withinRange('a', 'z').build();
+    }
+
+    @AfterAll
+    public static void tearDown() throws InterruptedException {
+        if (client != null) {
+            client.close(5L);
+        }
+    }
+
+    CreateCollectionReq.CollectionSchema buildSchema(boolean enableDynamicField) {
         CreateCollectionReq.CollectionSchema schemaV2 = CreateCollectionReq.CollectionSchema.builder()
         CreateCollectionReq.CollectionSchema schemaV2 = CreateCollectionReq.CollectionSchema.builder()
-                .enableDynamicField(true)
+                .enableDynamicField(enableDynamicField)
                 .build();
                 .build();
         schemaV2.addField(AddFieldReq.builder()
         schemaV2.addField(AddFieldReq.builder()
                 .fieldName("id")
                 .fieldName("id")
@@ -124,7 +153,7 @@ public class BulkWriterTest {
 
 
     @Test
     @Test
     void testV2AdapterUtils() {
     void testV2AdapterUtils() {
-        CreateCollectionReq.CollectionSchema schemaV2 = buildSchema();
+        CreateCollectionReq.CollectionSchema schemaV2 = buildSchema(true);
         CollectionSchemaParam schemaV1 = V2AdapterUtils.convertV2Schema(schemaV2);
         CollectionSchemaParam schemaV1 = V2AdapterUtils.convertV2Schema(schemaV2);
         Assertions.assertEquals(schemaV2.isEnableDynamicField(), schemaV1.isEnableDynamicField());
         Assertions.assertEquals(schemaV2.isEnableDynamicField(), schemaV1.isEnableDynamicField());
 
 
@@ -199,7 +228,7 @@ public class BulkWriterTest {
     @Test
     @Test
     void testWriteParquet() {
     void testWriteParquet() {
         try {
         try {
-            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema();
+            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema(true);
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
                     .withCollectionSchema(schemaV2)
                     .withCollectionSchema(schemaV2)
                     .withLocalPath("/tmp/bulk_writer")
                     .withLocalPath("/tmp/bulk_writer")
@@ -223,7 +252,7 @@ public class BulkWriterTest {
     @Test
     @Test
     void testWriteJson() {
     void testWriteJson() {
         try {
         try {
-            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema();
+            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema(true);
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
                     .withCollectionSchema(schemaV2)
                     .withCollectionSchema(schemaV2)
                     .withLocalPath("/tmp/bulk_writer")
                     .withLocalPath("/tmp/bulk_writer")
@@ -247,7 +276,7 @@ public class BulkWriterTest {
     @Test
     @Test
     void testWriteCSV() {
     void testWriteCSV() {
         try {
         try {
-            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema();
+            CreateCollectionReq.CollectionSchema schemaV2 = buildSchema(true);
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
             LocalBulkWriterParam bulkWriterParam = LocalBulkWriterParam.newBuilder()
                     .withCollectionSchema(schemaV2)
                     .withCollectionSchema(schemaV2)
                     .withLocalPath("/tmp/bulk_writer")
                     .withLocalPath("/tmp/bulk_writer")
@@ -268,4 +297,70 @@ public class BulkWriterTest {
             Assertions.fail(e.getMessage());
             Assertions.fail(e.getMessage());
         }
         }
     }
     }
+
+    @Test
+    public void testLocalBulkWriter() {
+        // collection schema
+        CreateCollectionReq.CollectionSchema schemaV2 = buildSchema(false);
+
+        // local bulkwriter
+        LocalBulkWriterParam writerParam = LocalBulkWriterParam.newBuilder()
+                .withCollectionSchema(schemaV2)
+                .withLocalPath("/tmp/bulk_writer")
+                .withFileType(BulkFileType.PARQUET)
+                .withChunkSize(100 * 1024)
+                .build();
+
+        int rowCount = 100;
+        List<List<String>> batchFiles = new ArrayList<>();
+        try (LocalBulkWriter bulkWriter = new LocalBulkWriter(writerParam)) {
+            for (int i = 0; i < rowCount; i++) {
+                JsonObject row = new JsonObject();
+                row.addProperty("bool_field", i % 3 == 0);
+                row.addProperty("int8_field", i%128);
+                row.addProperty("int16_field", i%32768);
+                row.addProperty("int32_field", i);
+                row.addProperty("int64_field", i);
+                row.addProperty("float_field", i/3);
+                row.addProperty("double_field", i/7);
+                row.addProperty("varchar_field", String.format("varchar_%d", i));
+                JsonObject obj = new JsonObject();
+                obj.addProperty("dummy", i);
+                row.add("json_field", obj);
+                row.add("arr_varchar_field", JsonUtils.toJsonTree(Lists.newArrayList("aaa", "bbb", "ccc")));
+                row.add("arr_int32_field", JsonUtils.toJsonTree(Lists.newArrayList(5, 6, 3, 2, 1)));
+                row.add("arr_float_field", JsonUtils.toJsonTree(Lists.newArrayList(0.5, 1.8)));
+                row.add("float_vector_field", JsonUtils.toJsonTree(utils.generateFloatVector()));
+                row.add("binary_vector_field", JsonUtils.toJsonTree(utils.generateBinaryVector().array()));
+
+                bulkWriter.appendRow(row);
+            }
+
+            bulkWriter.commit(false);
+            List<List<String>> files = bulkWriter.getBatchFiles();
+            System.out.printf("LocalBulkWriter done! output local files: %s%n", files);
+            Assertions.assertEquals(1, files.size());
+            Assertions.assertEquals(files.get(0).size(), 1);
+            batchFiles.addAll(files);
+        } catch (Exception e) {
+            System.out.println("LocalBulkWriter catch exception: " + e);
+            Assertions.fail();
+        }
+
+        try {
+            final int[] counter = {0};
+            for (List<String> files : batchFiles) {
+                new ParquetReaderUtils() {
+                    @Override
+                    public void readRecord(GenericData.Record record) {
+                        counter[0]++;
+                    }
+                }.readParquet(files.get(0));
+            }
+            Assertions.assertEquals(rowCount, counter[0]);
+        } catch (Exception e) {
+            System.out.println("Verify parquet file catch exception: " + e);
+            Assertions.fail();
+        }
+    }
 }
 }

+ 161 - 0
sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/TestUtils.java

@@ -0,0 +1,161 @@
+package io.milvus.bulkwriter;
+
+import io.milvus.common.utils.Float16Utils;
+import io.milvus.grpc.DataType;
+import org.junit.jupiter.api.Assertions;
+
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class TestUtils {
+    private int dimension = 256;
+    private static final Random RANDOM = new Random();
+
+    public TestUtils(int dimension) {
+        this.dimension = dimension;
+    }
+
+    public List<Float> generateFloatVector(int dim) {
+        List<Float> vector = new ArrayList<>();
+        for (int i = 0; i < dim; ++i) {
+            vector.add(RANDOM.nextFloat());
+        }
+        return vector;
+    }
+
+    public List<Float> generateFloatVector() {
+        return generateFloatVector(dimension);
+    }
+
+    public List<List<Float>> generateFloatVectors(int count) {
+        List<List<Float>> vectors = new ArrayList<>();
+        for (int n = 0; n < count; ++n) {
+            vectors.add(generateFloatVector());
+        }
+
+        return vectors;
+    }
+
+    public ByteBuffer generateBinaryVector(int dim) {
+        int byteCount = dim / 8;
+        ByteBuffer vector = ByteBuffer.allocate(byteCount);
+        for (int i = 0; i < byteCount; ++i) {
+            vector.put((byte) RANDOM.nextInt(Byte.MAX_VALUE));
+        }
+        return vector;
+    }
+
+    public ByteBuffer generateBinaryVector() {
+        return generateBinaryVector(dimension);
+    }
+
+    public List<ByteBuffer> generateBinaryVectors(int count) {
+        List<ByteBuffer> vectors = new ArrayList<>();
+        for (int n = 0; n < count; ++n) {
+            vectors.add(generateBinaryVector());
+        }
+        return vectors;
+
+    }
+
+    public ByteBuffer generateFloat16Vector() {
+        List<Float> vector = generateFloatVector();
+        return Float16Utils.f32VectorToFp16Buffer(vector);
+    }
+
+    public List<ByteBuffer> generateFloat16Vectors(int count) {
+        List<ByteBuffer> vectors = new ArrayList<>();
+        for (int n = 0; n < count; ++n) {
+            vectors.add(generateFloat16Vector());
+        }
+        return vectors;
+    }
+
+    public ByteBuffer generateBFloat16Vector() {
+        List<Float> vector = generateFloatVector();
+        return Float16Utils.f32VectorToBf16Buffer(vector);
+    }
+
+    public List<ByteBuffer> generateBFloat16Vectors(int count) {
+        List<ByteBuffer> vectors = new ArrayList<>();
+        for (int n = 0; n < count; ++n) {
+            vectors.add(generateBFloat16Vector());
+        }
+        return vectors;
+    }
+
+    public SortedMap<Long, Float> generateSparseVector() {
+        SortedMap<Long, Float> sparse = new TreeMap<>();
+        int dim = RANDOM.nextInt(10) + 10;
+        for (int i = 0; i < dim; ++i) {
+            sparse.put((long) RANDOM.nextInt(1000000), RANDOM.nextFloat());
+        }
+        return sparse;
+    }
+
+    public List<SortedMap<Long, Float>> generateSparseVectors(int count) {
+        List<SortedMap<Long, Float>> vectors = new ArrayList<>();
+        for (int n = 0; n < count; ++n) {
+            vectors.add(generateSparseVector());
+        }
+        return vectors;
+    }
+
+    public List<?> generateRandomArray(DataType eleType, int maxCapacity) {
+        switch (eleType) {
+            case Bool: {
+                List<Boolean> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(i%10 == 0);
+                }
+                return values;
+            }
+            case Int8:
+            case Int16: {
+                List<Short> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add((short)RANDOM.nextInt(256));
+                }
+                return values;
+            }
+            case Int32: {
+                List<Integer> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(RANDOM.nextInt());
+                }
+                return values;
+            }
+            case Int64: {
+                List<Long> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(RANDOM.nextLong());
+                }
+                return values;
+            }
+            case Float: {
+                List<Float> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(RANDOM.nextFloat());
+                }
+                return values;
+            }
+            case Double: {
+                List<Double> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(RANDOM.nextDouble());
+                }
+                return values;
+            }
+            case VarChar: {
+                List<String> values = new ArrayList<>();
+                for (int i = 0; i < maxCapacity; i++) {
+                    values.add(String.format("varchar_arr_%d", i));
+                }
+                return values;
+            }
+            default:
+                Assertions.fail();
+        }
+        return null;
+    }
+}

+ 176 - 0
sdk-core/pom.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>io.milvus</groupId>
+        <artifactId>milvus-sdk-java-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>milvus-sdk-java</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <description>Milvus Java SDK core functions</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.grpc</groupId>
+                <artifactId>grpc-bom</artifactId>
+                <version>${grpc.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.slf4j</groupId>
+                <artifactId>slf4j-api</artifactId>
+                <version>${slf4j.api.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.guava</groupId>
+                <artifactId>guava</artifactId>
+                <version>${guava.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.errorprone</groupId>
+                <artifactId>error_prone_annotations</artifactId>
+                <version>${errorprone.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib-jdk8</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib-common</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.jetbrains.kotlin</groupId>
+                <artifactId>kotlin-stdlib</artifactId>
+                <version>${kotlin.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.testcontainers</groupId>
+                <artifactId>testcontainers-bom</artifactId>
+                <version>${testcontainers.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-inline</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty-shaded</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.annotation</groupId>
+            <artifactId>javax.annotation-api</artifactId>
+            <version>${javax.annotation.version}</version>
+            <scope>provided</scope> <!-- not needed at runtime -->
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>${protobuf.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>${commons.text.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>${commons-collections4.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit.jupiter.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>milvus</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>${okhttp.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>${apache.commons.pool2.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 0 - 0
src/main/java/io/milvus/client/AbstractMilvusGrpcClient.java → sdk-core/src/main/java/io/milvus/client/AbstractMilvusGrpcClient.java


+ 0 - 0
src/main/java/io/milvus/client/MilvusClient.java → sdk-core/src/main/java/io/milvus/client/MilvusClient.java


+ 0 - 0
src/main/java/io/milvus/client/MilvusMultiServiceClient.java → sdk-core/src/main/java/io/milvus/client/MilvusMultiServiceClient.java


+ 0 - 0
src/main/java/io/milvus/client/MilvusServiceClient.java → sdk-core/src/main/java/io/milvus/client/MilvusServiceClient.java


+ 0 - 0
src/main/java/io/milvus/common/clientenum/ConsistencyLevelEnum.java → sdk-core/src/main/java/io/milvus/common/clientenum/ConsistencyLevelEnum.java


+ 0 - 0
src/main/java/io/milvus/common/clientenum/FunctionType.java → sdk-core/src/main/java/io/milvus/common/clientenum/FunctionType.java


+ 0 - 0
src/main/java/io/milvus/common/constant/MilvusClientConstant.java → sdk-core/src/main/java/io/milvus/common/constant/MilvusClientConstant.java


+ 0 - 0
src/main/java/io/milvus/common/resourcegroup/ResourceGroupConfig.java → sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupConfig.java


+ 0 - 0
src/main/java/io/milvus/common/resourcegroup/ResourceGroupLimit.java → sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupLimit.java


+ 0 - 0
src/main/java/io/milvus/common/resourcegroup/ResourceGroupNodeFilter.java → sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupNodeFilter.java


+ 0 - 0
src/main/java/io/milvus/common/resourcegroup/ResourceGroupTransfer.java → sdk-core/src/main/java/io/milvus/common/resourcegroup/ResourceGroupTransfer.java


+ 0 - 0
src/main/java/io/milvus/common/utils/ExceptionUtils.java → sdk-core/src/main/java/io/milvus/common/utils/ExceptionUtils.java


+ 0 - 0
src/main/java/io/milvus/common/utils/Float16Utils.java → sdk-core/src/main/java/io/milvus/common/utils/Float16Utils.java


+ 0 - 0
src/main/java/io/milvus/common/utils/GTsDict.java → sdk-core/src/main/java/io/milvus/common/utils/GTsDict.java


+ 0 - 0
src/main/java/io/milvus/common/utils/JsonUtils.java → sdk-core/src/main/java/io/milvus/common/utils/JsonUtils.java


+ 0 - 0
src/main/java/io/milvus/common/utils/URLParser.java → sdk-core/src/main/java/io/milvus/common/utils/URLParser.java


+ 0 - 0
src/main/java/io/milvus/common/utils/VectorUtils.java → sdk-core/src/main/java/io/milvus/common/utils/VectorUtils.java


+ 0 - 0
src/main/java/io/milvus/connection/ClusterFactory.java → sdk-core/src/main/java/io/milvus/connection/ClusterFactory.java


+ 0 - 0
src/main/java/io/milvus/connection/ClusterListener.java → sdk-core/src/main/java/io/milvus/connection/ClusterListener.java


+ 0 - 0
src/main/java/io/milvus/connection/Listener.java → sdk-core/src/main/java/io/milvus/connection/Listener.java


+ 0 - 0
src/main/java/io/milvus/connection/QueryNodeListener.java → sdk-core/src/main/java/io/milvus/connection/QueryNodeListener.java


+ 0 - 0
src/main/java/io/milvus/connection/ServerMonitor.java → sdk-core/src/main/java/io/milvus/connection/ServerMonitor.java


+ 0 - 0
src/main/java/io/milvus/connection/ServerSetting.java → sdk-core/src/main/java/io/milvus/connection/ServerSetting.java


+ 0 - 0
src/main/java/io/milvus/exception/ClientNotConnectedException.java → sdk-core/src/main/java/io/milvus/exception/ClientNotConnectedException.java


+ 0 - 0
src/main/java/io/milvus/exception/IllegalResponseException.java → sdk-core/src/main/java/io/milvus/exception/IllegalResponseException.java


+ 0 - 0
src/main/java/io/milvus/exception/MilvusException.java → sdk-core/src/main/java/io/milvus/exception/MilvusException.java


+ 0 - 0
src/main/java/io/milvus/exception/ParamException.java → sdk-core/src/main/java/io/milvus/exception/ParamException.java


+ 0 - 0
src/main/java/io/milvus/exception/ServerException.java → sdk-core/src/main/java/io/milvus/exception/ServerException.java


+ 0 - 0
src/main/java/io/milvus/exception/UnExpectedException.java → sdk-core/src/main/java/io/milvus/exception/UnExpectedException.java


+ 0 - 0
src/main/java/io/milvus/orm/iterator/IteratorAdapterV2.java → sdk-core/src/main/java/io/milvus/orm/iterator/IteratorAdapterV2.java


+ 0 - 0
src/main/java/io/milvus/orm/iterator/IteratorCache.java → sdk-core/src/main/java/io/milvus/orm/iterator/IteratorCache.java


+ 0 - 0
src/main/java/io/milvus/orm/iterator/QueryIterator.java → sdk-core/src/main/java/io/milvus/orm/iterator/QueryIterator.java


+ 7 - 6
src/main/java/io/milvus/orm/iterator/SearchIterator.java → sdk-core/src/main/java/io/milvus/orm/iterator/SearchIterator.java

@@ -1,7 +1,6 @@
 package io.milvus.orm.iterator;
 package io.milvus.orm.iterator;
 
 
-import com.amazonaws.util.CollectionUtils;
-import com.amazonaws.util.StringUtils;
+
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
 import com.google.gson.reflect.TypeToken;
 import com.google.gson.reflect.TypeToken;
 import io.milvus.common.utils.ExceptionUtils;
 import io.milvus.common.utils.ExceptionUtils;
@@ -19,6 +18,8 @@ import io.milvus.response.SearchResultsWrapper;
 import io.milvus.v2.service.collection.request.CreateCollectionReq;
 import io.milvus.v2.service.collection.request.CreateCollectionReq;
 import io.milvus.v2.service.vector.request.SearchIteratorReq;
 import io.milvus.v2.service.vector.request.SearchIteratorReq;
 import io.milvus.v2.utils.RpcUtils;
 import io.milvus.v2.utils.RpcUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 
 
@@ -185,7 +186,7 @@ public class SearchIterator {
 
 
         SearchResultsWrapper searchResultsWrapper = new SearchResultsWrapper(response.getResults());
         SearchResultsWrapper searchResultsWrapper = new SearchResultsWrapper(response.getResults());
         List<QueryResultsWrapper.RowRecord> result = searchResultsWrapper.getRowRecords(0);
         List<QueryResultsWrapper.RowRecord> result = searchResultsWrapper.getRowRecords(0);
-        if (CollectionUtils.isNullOrEmpty(result)) {
+        if (CollectionUtils.isEmpty(result)) {
             String msg = "Cannot init search iterator because init page contains no matched rows, " +
             String msg = "Cannot init search iterator because init page contains no matched rows, " +
                     "please check the radius and range_filter set up by searchParams";
                     "please check the radius and range_filter set up by searchParams";
             logger.error(msg);
             logger.error(msg);
@@ -212,7 +213,7 @@ public class SearchIterator {
 
 
     private void updateFilteredIds(SearchResultsWrapper searchResultsWrapper) {
     private void updateFilteredIds(SearchResultsWrapper searchResultsWrapper) {
         List<SearchResultsWrapper.IDScore> idScores = searchResultsWrapper.getIDScore(0);
         List<SearchResultsWrapper.IDScore> idScores = searchResultsWrapper.getIDScore(0);
-        if (CollectionUtils.isNullOrEmpty(idScores)) {
+        if (CollectionUtils.isEmpty(idScores)) {
             return;
             return;
         }
         }
 
 
@@ -261,7 +262,7 @@ public class SearchIterator {
                 .withMetricType(MetricType.valueOf(searchIteratorParam.getMetricType()))
                 .withMetricType(MetricType.valueOf(searchIteratorParam.getMetricType()))
                 .withIgnoreGrowing(searchIteratorParam.isIgnoreGrowing());
                 .withIgnoreGrowing(searchIteratorParam.isIgnoreGrowing());
 
 
-        if (!StringUtils.isNullOrEmpty(searchIteratorParam.getGroupByFieldName())) {
+        if (StringUtils.isNotEmpty(searchIteratorParam.getGroupByFieldName())) {
             searchParamBuilder.withGroupByFieldName(searchIteratorParam.getGroupByFieldName());
             searchParamBuilder.withGroupByFieldName(searchIteratorParam.getGroupByFieldName());
         }
         }
         fillVectorsByPlType(searchParamBuilder);
         fillVectorsByPlType(searchParamBuilder);
@@ -455,7 +456,7 @@ public class SearchIterator {
     }
     }
 
 
     private String filteredDuplicatedResultExpr(String expr) {
     private String filteredDuplicatedResultExpr(String expr) {
-        if (CollectionUtils.isNullOrEmpty(filteredIds)) {
+        if (CollectionUtils.isEmpty(filteredIds)) {
             return expr;
             return expr;
         }
         }
 
 

+ 0 - 0
src/main/java/io/milvus/param/ConnectParam.java → sdk-core/src/main/java/io/milvus/param/ConnectParam.java


+ 0 - 0
src/main/java/io/milvus/param/Constant.java → sdk-core/src/main/java/io/milvus/param/Constant.java


+ 0 - 0
src/main/java/io/milvus/param/IndexBuildState.java → sdk-core/src/main/java/io/milvus/param/IndexBuildState.java


+ 0 - 0
src/main/java/io/milvus/param/IndexType.java → sdk-core/src/main/java/io/milvus/param/IndexType.java


+ 0 - 0
src/main/java/io/milvus/param/LogLevel.java → sdk-core/src/main/java/io/milvus/param/LogLevel.java


+ 0 - 0
src/main/java/io/milvus/param/MetricType.java → sdk-core/src/main/java/io/milvus/param/MetricType.java


+ 0 - 0
src/main/java/io/milvus/param/MultiConnectParam.java → sdk-core/src/main/java/io/milvus/param/MultiConnectParam.java


+ 0 - 0
src/main/java/io/milvus/param/ParamUtils.java → sdk-core/src/main/java/io/milvus/param/ParamUtils.java


+ 0 - 0
src/main/java/io/milvus/param/QueryNodeSingleSearch.java → sdk-core/src/main/java/io/milvus/param/QueryNodeSingleSearch.java


+ 0 - 0
src/main/java/io/milvus/param/R.java → sdk-core/src/main/java/io/milvus/param/R.java


+ 0 - 0
src/main/java/io/milvus/param/RetryParam.java → sdk-core/src/main/java/io/milvus/param/RetryParam.java


+ 0 - 0
src/main/java/io/milvus/param/RpcStatus.java → sdk-core/src/main/java/io/milvus/param/RpcStatus.java


+ 0 - 0
src/main/java/io/milvus/param/ServerAddress.java → sdk-core/src/main/java/io/milvus/param/ServerAddress.java


+ 0 - 0
src/main/java/io/milvus/param/alias/AlterAliasParam.java → sdk-core/src/main/java/io/milvus/param/alias/AlterAliasParam.java


+ 0 - 0
src/main/java/io/milvus/param/alias/CreateAliasParam.java → sdk-core/src/main/java/io/milvus/param/alias/CreateAliasParam.java


+ 0 - 0
src/main/java/io/milvus/param/alias/DropAliasParam.java → sdk-core/src/main/java/io/milvus/param/alias/DropAliasParam.java


+ 0 - 0
src/main/java/io/milvus/param/alias/ListAliasesParam.java → sdk-core/src/main/java/io/milvus/param/alias/ListAliasesParam.java


Some files were not shown because too many files changed in this diff