Browse Source

modify generate bf16 and f16 vector. (#1039)

Signed-off-by: yongpengli-z <yongpeng.li@zilliz.com>
yongpengli-z 10 months ago
parent
commit
c91e884caf
37 changed files with 1255 additions and 97 deletions
  1. 5 5
      .github/workflows/java_sdk_ci_test.yaml
  2. 1 1
      tests/milvustestv2/pom.xml
  3. 4 4
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/BaseTest.java
  4. 5 0
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonData.java
  5. 86 41
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonFunction.java
  6. 2 1
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/params/FieldParam.java
  7. 245 0
      tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/utils/Float16Utils.java
  8. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/alias/CreateAliasTest.java
  9. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/CreateCollectionTest.java
  10. 3 3
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/GetCollectionStatsTest.java
  11. 41 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/AlterDatabaseTest.java
  12. 54 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/CreateDatabaseTest.java
  13. 33 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DescribeDatabaseTest.java
  14. 30 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DropDatabaseTest.java
  15. 70 11
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/CreateIndexTest.java
  16. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DescribeIndexTest.java
  17. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DropIndexTest.java
  18. 9 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/ListIndexesTest.java
  19. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadCollectionTest.java
  20. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadPartitionsTest.java
  21. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleaseCollectionTest.java
  22. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleasePartitionsTest.java
  23. 63 0
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/DeleteTest.java
  24. 1 1
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/GetTest.java
  25. 2 2
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/InsertTest.java
  26. 82 10
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/SearchTest.java
  27. 12 8
      tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/UpsertTest.java
  28. 127 0
      tests/milvustestv2/src/test/java/resources/cluster-values.yaml
  29. 52 0
      tests/milvustestv2/src/test/java/resources/docker-compose.yml
  30. 230 0
      tests/milvustestv2/src/test/java/resources/scripts/docker_image_find_tag.sh
  31. 8 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus.sh
  32. 13 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus_cluster.sh
  33. 12 0
      tests/milvustestv2/src/test/java/resources/scripts/install_milvus_standalone.sh
  34. 25 0
      tests/milvustestv2/src/test/java/resources/scripts/modify_config.sh
  35. 8 0
      tests/milvustestv2/src/test/java/resources/scripts/uninstall_milvus.sh
  36. 23 0
      tests/milvustestv2/src/test/java/resources/standalone-values.yaml
  37. 1 1
      tests/milvustestv2/src/test/resources/run.properties

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

@@ -15,7 +15,7 @@ jobs:
       - name: Deploy Milvus
         timeout-minutes: 15
         shell: bash
-        working-directory: tests/milvustest/src/test/java/resources
+        working-directory: tests/milvustestv2/src/test/java/resources
         run: |
           echo "deploy milvus"
           ls
@@ -34,10 +34,10 @@ jobs:
       - name: Test
         timeout-minutes: 60
         shell: bash
-        working-directory: tests/milvustest
+        working-directory: tests/milvustestv2
         run: |
           echo "run testcases"
-          mvn clean test -DsuiteXmlFile=testng.xml
+          mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
 
       - name: Upload logs
         if: ${{ always() }}
@@ -45,5 +45,5 @@ jobs:
         with:
           name: logs-java-sdk-ci-test
           path: |
-            tests/milvustest/target/surefire-reports
-            tests/milvustest/target/allure-results 
+            tests/milvustestv2/target/surefire-reports
+            tests/milvustestv2/target/allure-results 

+ 1 - 1
tests/milvustestv2/pom.xml

@@ -107,7 +107,7 @@
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>2.6.7</version>
+                <version>2.7.10</version>
                 <configuration>
                     <excludes>
                         <exclude>

+ 4 - 4
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/BaseTest.java

@@ -73,7 +73,7 @@ public class BaseTest extends AbstractTestNGSpringContextTests {
         CommonFunction.createNewCollection(CommonData.dim,CommonData.defaultFloatVectorCollection, DataType.FloatVector);
         milvusClientV2.createAlias(CreateAliasReq.builder().collectionName(CommonData.defaultFloatVectorCollection).alias(CommonData.alias).build());
         // insert data
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).data(jsonObjects).build());
         CommonFunction.createVectorIndex(CommonData.defaultFloatVectorCollection,CommonData.fieldFloatVector, IndexParam.IndexType.AUTOINDEX, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(CommonData.defaultFloatVectorCollection).build());
@@ -82,9 +82,9 @@ public class BaseTest extends AbstractTestNGSpringContextTests {
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameA);
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameB);
        CommonFunction.createPartition(CommonData.defaultFloatVectorCollection,CommonData.partitionNameC);
-        List<JsonObject> jsonObjectsA = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
-        List<JsonObject> jsonObjectsB = CommonFunction.generateDefaultData(CommonData.numberEntities*2, CommonData.dim,DataType.FloatVector);
-        List<JsonObject> jsonObjectsC = CommonFunction.generateDefaultData(CommonData.numberEntities*3, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsA = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsB = CommonFunction.generateDefaultData(0,CommonData.numberEntities*2, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjectsC = CommonFunction.generateDefaultData(0,CommonData.numberEntities*3, CommonData.dim,DataType.FloatVector);
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameA).data(jsonObjectsA).build());
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameB).data(jsonObjectsB).build());
        milvusClientV2.insert(InsertReq.builder().collectionName(CommonData.defaultFloatVectorCollection).partitionName(CommonData.partitionNameC).data(jsonObjectsC).build());

+ 5 - 0
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonData.java

@@ -6,6 +6,7 @@ package com.zilliz.milvustestv2.common;
  */
 public class CommonData {
     public static long numberEntities=2000;
+    public static long batchSize=1000;
     public static int dim=128;
     public static String defaultFloatVectorCollection="FloatVectorCollection";
     public static String defaultBinaryVectorCollection="BinaryVectorCollection";
@@ -48,6 +49,10 @@ public class CommonData {
 
     public static String roleName="role02";
 
+    public static String databaseName="database01";
+    public static String databaseName2="database02";
+
+
 
 
 }

+ 86 - 41
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/common/CommonFunction.java

@@ -8,6 +8,7 @@ import com.zilliz.milvustestv2.utils.GenerateUtil;
 
 import com.zilliz.milvustestv2.utils.JsonObjectUtil;
 import com.zilliz.milvustestv2.utils.MathUtil;
+import io.milvus.common.utils.Float16Utils;
 import io.milvus.v2.common.ConsistencyLevel;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
@@ -16,6 +17,7 @@ import io.milvus.v2.service.collection.request.DescribeCollectionReq;
 import io.milvus.v2.service.collection.request.LoadCollectionReq;
 import io.milvus.v2.service.collection.response.DescribeCollectionResp;
 import io.milvus.v2.service.index.request.CreateIndexReq;
+import io.milvus.v2.service.index.request.DropIndexReq;
 import io.milvus.v2.service.partition.request.CreatePartitionReq;
 import io.milvus.v2.service.vector.request.AnnSearchReq;
 import io.milvus.v2.service.vector.request.InsertReq;
@@ -29,6 +31,7 @@ import lombok.extern.slf4j.Slf4j;
 import javax.annotation.Nullable;
 import java.nio.ByteBuffer;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Author yongpeng.li
@@ -160,11 +163,11 @@ public class CommonFunction {
      * @param dim 维度
      * @return List<JsonObject>
      */
-    public static List<JsonObject> generateDefaultData(long num, int dim, DataType vectorType) {
+    public static List<JsonObject> generateDefaultData(long startId,long num, int dim, DataType vectorType) {
         List<JsonObject> jsonList = new ArrayList<>();
         Random ran = new Random();
         Gson gson = new Gson();
-        for (long i = 0; i < num; i++) {
+        for (long i = startId; i < (num+startId); i++) {
             JsonObject row = new JsonObject();
             row.addProperty(CommonData.fieldInt64, i);
             row.addProperty(CommonData.fieldInt32, (int) i % 32767);
@@ -341,6 +344,20 @@ public class CommonFunction {
                 .build());
     }
 
+    /**
+     *  创建一条float32的向量
+     * @param dimension 维度
+     * @return List<Float>
+     */
+    public static List<Float> generateFloatVector(int dimension) {
+        Random ran = new Random();
+        List<Float> vector = new ArrayList<>();
+        for (int i = 0; i < dimension; ++i) {
+            vector.add(ran.nextFloat());
+        }
+        return vector;
+    }
+
     /**
      * 创建一条Sparse向量数据
      *
@@ -378,18 +395,8 @@ public class CommonFunction {
      * @return ByteBuffer
      */
     public static ByteBuffer generateFloat16Vector(int dim) {
-        Random ran = new Random();
-        int byteCount = dim * 2;
-        ByteBuffer vector = ByteBuffer.allocate(byteCount);
-        for (int i = 0; i < dim; ++i) {
-            short halfFloatValue = MathUtil.floatToFloat16(ran.nextInt(100) + 0.1f);
-            ByteBuffer buffer = ByteBuffer.allocate(2);
-            buffer.putShort(halfFloatValue);
-            buffer.flip();
-            vector.put(buffer.get(0));
-            vector.put(buffer.get(1));
-        }
-        return vector;
+        List<Float> originalVector = generateFloatVector(dim);
+        return Float16Utils.f32VectorToFp16Buffer(originalVector);
     }
 
     /**
@@ -414,22 +421,8 @@ public class CommonFunction {
      * @return ByteBuffer
      */
     public static ByteBuffer generateBF16Vector(int dim) {
-        Random ran = new Random();
-        float randomFloat;
-        int byteCount = dim * 2;
-        ByteBuffer vector = ByteBuffer.allocate(byteCount);
-        for (int i = 0; i < dim; ++i) {
-            do {
-                randomFloat = ran.nextFloat();
-            } while (Float.isInfinite(randomFloat));
-            short halfFloatValue = MathUtil.floatToBF16(randomFloat);
-            ByteBuffer buffer = ByteBuffer.allocate(2);
-            buffer.putShort(halfFloatValue);
-            buffer.flip();
-            vector.put(buffer.get(0));
-            vector.put(buffer.get(1));
-        }
-        return vector;
+        List<Float> originalVector = generateFloatVector(dim);
+        return Float16Utils.f32VectorToBf16Buffer(originalVector);
     }
 
     /**
@@ -571,12 +564,19 @@ public class CommonFunction {
         if (ifLoad) {
             BaseTest.milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(collectionName).build());
         }
-        List<JsonObject> jsonObjects = generateDefaultData(numberEntities, CommonData.dim, vectorType);
-        InsertResp insert = BaseTest.milvusClientV2.insert(InsertReq.builder().collectionName(collectionName).data(jsonObjects).build());
-        System.out.println(insert);
+        insertIntoCollectionByBatch(collectionName,numberEntities,CommonData.dim,vectorType);
 
     }
 
+    public static void insertIntoCollectionByBatch(String collectionName,long num,int dim,DataType vectorType){
+        long insertRounds = (num / CommonData.batchSize) ==0?1:(num / CommonData.batchSize);
+        for (int i = 0; i < insertRounds; i++) {
+            System.out.println("insert batch:"+(i+1));
+            List<JsonObject> jsonObjects = generateDefaultData(i*CommonData.batchSize, CommonData.batchSize, dim, vectorType);
+            InsertResp insert = BaseTest.milvusClientV2.insert(InsertReq.builder().collectionName(collectionName).data(jsonObjects).build());
+        }
+    }
+
     /**
      * 提供search时候的向量参数
      *
@@ -647,6 +647,7 @@ public class CommonFunction {
 
     /**
      * 创建通用的collection方法,支持多个filed,多个向量
+     *
      * @param collectionName collection 可不传
      * @param pkDataType     主键类型
      * @param enableDynamic  是否开启动态列
@@ -683,6 +684,7 @@ public class CommonFunction {
 
     /**
      * 遍历fieldParamList生成对应的schema
+     *
      * @param fieldParamList field字段集合
      * @return List<CreateCollectionReq.FieldSchema> 给创建collection提供
      */
@@ -838,7 +840,8 @@ public class CommonFunction {
 
     /**
      * 创建通用索引
-     * @param collection   collection name
+     *
+     * @param collection     collection name
      * @param fieldParamList field集合
      */
     public static void createCommonIndex(String collection, List<FieldParam> fieldParamList) {
@@ -863,13 +866,54 @@ public class CommonFunction {
                 .build());
     }
 
+    /**
+     * Create Scalar Indexes
+     *
+     * @param collection     collection name
+     * @param fieldParamList scalar fields
+     */
+    public static void createScalarCommonIndex(String collection, List<FieldParam> fieldParamList) {
+        List<IndexParam> indexParamList = new ArrayList<>();
+        for (FieldParam fieldParam : fieldParamList) {
+            IndexParam.IndexType indexType = fieldParam.getIndextype();
+            String fieldName = fieldParam.getFieldName();
+
+            IndexParam indexParam = IndexParam.builder()
+                    .fieldName(fieldName)
+                    .indexType(indexType)
+                    .indexName(fieldName)
+                    .build();
+            indexParamList.add(indexParam);
+        }
+
+        BaseTest.milvusClientV2.createIndex(CreateIndexReq.builder()
+                .collectionName(collection)
+                .indexParams(indexParamList)
+                .build());
+    }
+
+    /** Drop Scalar Indexes
+     *
+     * @param collection collection name
+     * @param fieldParamList FieldParamList
+     */
+    public static void dropScalarCommonIndex(String collection, List<FieldParam> fieldParamList) {
+        List<String> fieldNames = fieldParamList.stream().map(FieldParam::getFieldName).collect(Collectors.toList());
+        fieldNames.forEach(x -> BaseTest.milvusClientV2.dropIndex(DropIndexReq.builder()
+                .collectionName(collection)
+                .fieldName(x)
+                .indexName(x)
+                .build()));
+    }
+
 
     /**
      * 为多向量查询提供AnnSearch
+     *
      * @param fieldParam 字段参数
-     * @param nq 传入的向量数
-     * @param topK 查询数量
-     * @param expr 表达式
+     * @param nq         传入的向量数
+     * @param topK       查询数量
+     * @param expr       表达式
      * @return AnnSearchReq
      */
     public static AnnSearchReq provideAnnSearch(FieldParam fieldParam, int nq, int topK, String expr) {
@@ -885,6 +929,7 @@ public class CommonFunction {
 
     /**
      * 根据索引类型提供查询参数
+     *
      * @param indexType index type
      * @return String 查询参数
      */
@@ -910,17 +955,17 @@ public class CommonFunction {
                 extraParam = "{\"nlist\": 128}";
                 break;
             case SCANN:
-                extraParam="{\"nlist\":1024,\"with_raw_data\":"+true+"}";
+                extraParam = "{\"nlist\":1024,\"with_raw_data\":" + true + "}";
                 break;
             case GPU_IVF_FLAT:
-                extraParam="{\"nlist\": 64}";
+                extraParam = "{\"nlist\": 64}";
                 break;
             case GPU_IVF_PQ:
-                extraParam="{\"nlist\": 64, \"m\": 16, \"nbits\": 8}";
+                extraParam = "{\"nlist\": 64, \"m\": 16, \"nbits\": 8}";
                 break;
             case SPARSE_INVERTED_INDEX:
             case SPARSE_WAND:
-                extraParam="{\"drop_ratio_search\":0.2}";
+                extraParam = "{\"drop_ratio_search\":0.2}";
                 break;
             default:
                 extraParam = "{\"nlist\":128}";

+ 2 - 1
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/params/FieldParam.java

@@ -1,6 +1,7 @@
 package com.zilliz.milvustestv2.params;
 
 import io.milvus.v2.common.DataType;
+import io.milvus.v2.common.IndexParam;
 import lombok.Builder;
 import lombok.Data;
 
@@ -13,5 +14,5 @@ public class FieldParam {
     int maxLength;
     int maxCapacity;
     DataType elementType;
-
+    IndexParam.IndexType indextype;
 }

+ 245 - 0
tests/milvustestv2/src/main/java/com/zilliz/milvustestv2/utils/Float16Utils.java

@@ -0,0 +1,245 @@
+package com.zilliz.milvustestv2.utils;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.ShortBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Float16Utils {
+    /**
+     * Converts a float32 into bf16. May not produce correct values for subnormal floats.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a standard float32 value which will be converted to a bfloat16 value
+     * @return a short value to store the bfloat16 value
+     */
+    public static short floatToBf16(float input) {
+        int bits = Float.floatToIntBits(input);
+        int lsb = (bits >> 16) & 1;
+        int roundingBias = 0x7fff + lsb;
+        bits += roundingBias;
+        return (short) (bits >> 16);
+    }
+
+    /**
+     * Upcasts a bf16 value stored in a short into a float32 value.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a bfloat16 value which will be converted to a float32 value
+     * @return a float32 value converted from a bfloat16
+     */
+    public static float bf16ToFloat(short input) {
+        int bits = input << 16;
+        return Float.intBitsToFloat(bits);
+    }
+
+    /**
+     * Rounds a float32 value to a fp16 stored in a short.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a standard float32 value which will be converted to a float16 value
+     * @return a short value to store the float16 value
+     */
+    public static short floatToFp16(float input) {
+        // Port of MLAS_Float2Half from onnxruntime/core/mlas/inc/mlas_float16.h
+        int bits = Float.floatToIntBits(input);
+        final int F32_INFINITY = Float.floatToIntBits(Float.POSITIVE_INFINITY);
+        final int F16_MAX = (127 + 16) << 23;
+        final int DENORM_MAGIC = ((127 - 15) + (23 - 10) + 1) << 23;
+        final int SIGN_MASK = 0x80000000;
+        final int ROUNDING_CONST = ((15 - 127) << 23) + 0xfff;
+
+        int sign = bits & SIGN_MASK;
+        // mask out sign bit
+        bits ^= sign;
+
+        short output;
+        if (bits >= F16_MAX) {
+            // Inf or NaN (all exponent bits set)
+            output = (bits > F32_INFINITY) ? (short) 0x7e00 : (short) 0x7c00;
+        } else {
+            if (bits < (113 << 23)) {
+                // Subnormal or zero
+                // use a magic value to align our 10 mantissa bits at the bottom of
+                // the float. as long as FP addition is round-to-nearest-even this
+                // just works.
+                float tmp = Float.intBitsToFloat(bits) + Float.intBitsToFloat(DENORM_MAGIC);
+
+                // and one integer subtract of the bias later, we have our final float!
+                output = (short) (Float.floatToIntBits(tmp) - DENORM_MAGIC);
+            } else {
+                int mant_odd = (bits >> 13) & 1; // resulting mantissa is odd
+
+                // update exponent, rounding bias part 1
+                bits += ROUNDING_CONST;
+                // rounding bias part 2
+                bits += mant_odd;
+                // take the bits!
+                output = (short) (bits >> 13);
+            }
+        }
+
+        // Add the sign back in
+        output = (short) (output | ((short) (sign >> 16)));
+
+        return output;
+    }
+
+    /**
+     * Upcasts a fp16 value stored in a short to a float32 value.
+     *
+     * This method is copied from microsoft ONNX Runtime:
+     * https://github.com/microsoft/onnxruntime/blob/main/java/src/main/jvm/ai/onnxruntime/platform/Fp16Conversions.java
+     *
+     * @param input a float16 value which will be converted to a float32 value
+     * @return a float32 value converted from a float16 value
+     */
+    public static float fp16ToFloat(short input) {
+        // Port of MLAS_Half2Float from onnxruntime/core/mlas/inc/mlas_float16.h
+        final int MAGIC = 113 << 23;
+        // exponent mask after shift
+        final int SHIFTED_EXP = 0x7c00 << 13;
+
+        // exponent/mantissa bits
+        int bits = (input & 0x7fff) << 13;
+        // just the exponent
+        final int exp = SHIFTED_EXP & bits;
+        // exponent adjust
+        bits += (127 - 15) << 23;
+
+        // handle exponent special cases
+        if (exp == SHIFTED_EXP) {
+            // Inf/NaN?
+            // extra exp adjust
+            bits += (128 - 16) << 23;
+        } else if (exp == 0) {
+            // Zero/Denormal?
+            // extra exp adjust
+            bits += (1 << 23);
+            // renormalize
+            float tmp = Float.intBitsToFloat(bits) - Float.intBitsToFloat(MAGIC);
+            bits = Float.floatToIntBits(tmp);
+        }
+
+        // sign bit
+        bits |= (input & 0x8000) << 16;
+
+        return Float.intBitsToFloat(bits);
+    }
+
+    /**
+     * Rounds a float32 vector to bf16 values, and stores into a ByteBuffer.
+     *
+     * @param vector a float32 vector
+     * @return <code>ByteBuffer</code> the vector is converted to bfloat16 values and stored into a ByteBuffer
+     */
+    public static ByteBuffer f32VectorToBf16Buffer(List<Float> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Float val : vector) {
+            short bf16 = floatToBf16(val);
+            buf.putShort(bf16);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to fp16 vector upcasts to float32 array.
+     *
+     * @param buf a buffer to store a float16 vector
+     * @return List of Float a float32 vector
+     */
+    public static List<Float> fp16BufferToVector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Float> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            float val = fp16ToFloat(sbuf.get(i));
+            vector.add(val);
+        }
+        return vector;
+    }
+
+    /**
+     * Rounds a float32 vector to fp16 values, and stores into a ByteBuffer.
+     *
+     * @param vector a float32 vector
+     * @return <code>ByteBuffer</code> the vector is converted to float16 values and stored in a ByteBuffer
+     */
+    public static ByteBuffer f32VectorToFp16Buffer(List<Float> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Float val : vector) {
+            short bf16 = floatToFp16(val);
+            buf.putShort(bf16);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to bf16 vector upcasts to float32 array.
+     *
+     * @param buf a buffer to store a bfloat16 vector
+     * @return List of Float the vector is converted to float32 values
+     */
+    public static List<Float> bf16BufferToVector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Float> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            float val = bf16ToFloat(sbuf.get(i));
+            vector.add(val);
+        }
+        return vector;
+    }
+
+    /**
+     * Stores a fp16/bf16 vector into a ByteBuffer.
+     *
+     * @param vector a float16 vector stored in a list of Short
+     * @return <code>ByteBuffer</code> a buffer to store the float16 vector
+     */
+    public static ByteBuffer f16VectorToBuffer(List<Short> vector) {
+        if (vector.isEmpty()) {
+            return null;
+        }
+
+        ByteBuffer buf = ByteBuffer.allocate(2 * vector.size());
+        buf.order(ByteOrder.LITTLE_ENDIAN); // milvus server stores fp16/bf16 vector as little endian
+        for (Short val : vector) {
+            buf.putShort(val);
+        }
+        return buf;
+    }
+
+    /**
+     * Converts a ByteBuffer to a fp16/bf16 vector stored in short array.
+     *
+     * @param buf a buffer to store a float16 vector
+     * @return List of Short the vector is converted to a list of Short, each Short value is a float16 value
+     */
+    public static List<Short> bufferToF16Vector(ByteBuffer buf) {
+        buf.rewind(); // reset the read position
+        List<Short> vector = new ArrayList<>();
+        ShortBuffer sbuf = buf.asShortBuffer();
+        for (int i = 0; i < sbuf.limit(); i++) {
+            vector.add(sbuf.get(i));
+        }
+        return vector;
+    }
+}

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/alias/CreateAliasTest.java

@@ -33,7 +33,7 @@ public class CreateAliasTest extends BaseTest {
     public void providerCollection(){
         aliasName="a_"+ GenerateUtil.getRandomString(10);
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/CreateCollectionTest.java

@@ -170,7 +170,7 @@ public class CreateCollectionTest extends BaseTest {
         ListCollectionsResp listCollectionsResp = milvusClientV2.listCollections();
         Assert.assertTrue(listCollectionsResp.getCollectionNames().contains(collectionNameWithIndex));
         //insert
-        CommonFunction.generateDefaultData(100,CommonData.dim,DataType.FloatVector);
+        CommonFunction.generateDefaultData(0,100,CommonData.dim,DataType.FloatVector);
         // search
         SearchResp searchResp = CommonFunction.defaultSearch(collectionNameWithIndex);
         Assert.assertEquals(searchResp.getSearchResults().size(),10);

+ 3 - 3
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/collection/GetCollectionStatsTest.java

@@ -7,6 +7,7 @@ import com.zilliz.milvustestv2.common.CommonFunction;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
 import io.milvus.v2.service.collection.request.GetCollectionStatsReq;
+import io.milvus.v2.service.collection.request.LoadCollectionReq;
 import io.milvus.v2.service.collection.response.GetCollectionStatsResp;
 import io.milvus.v2.service.vector.request.InsertReq;
 import org.testng.Assert;
@@ -26,8 +27,7 @@ public class GetCollectionStatsTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
-        milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
+        CommonFunction.createIndexAndInsertAndLoad(newCollectionName,DataType.FloatVector,true,CommonData.numberEntities);
     }
 
     @AfterClass(alwaysRun = true)
@@ -35,7 +35,7 @@ public class GetCollectionStatsTest extends BaseTest {
         milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(newCollectionName).build());
     }
 
-    @Test(description = "Get collection stats", groups = {"Smoke"})
+    @Test(description = "Get collection stats", groups = {"Smoke"},enabled = false)
     public void getCollectionStats(){
         GetCollectionStatsResp collectionStats = milvusClientV2.getCollectionStats(GetCollectionStatsReq.builder()
                 .collectionName(newCollectionName)

+ 41 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/AlterDatabaseTest.java

@@ -0,0 +1,41 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.param.Constant;
+import io.milvus.v2.service.database.request.AlterDatabaseReq;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class AlterDatabaseTest extends BaseTest {
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "alter database",groups = {"Smoke"})
+    public void alterDatabase(){
+        Map<String,String> map1=new HashMap<>();
+        map1.put(Constant.DATABASE_REPLICA_NUMBER,"2");
+        milvusClientV2.alterDatabase(AlterDatabaseReq.builder()
+                .databaseName(CommonData.databaseName)
+                .properties(map1).build());
+        DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        Assert.assertEquals(describeDatabaseResp.getDatabaseName(),CommonData.databaseName);
+        Assert.assertEquals(describeDatabaseResp.getProperties().get(Constant.DATABASE_REPLICA_NUMBER),"2");
+    }
+}

+ 54 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/CreateDatabaseTest.java

@@ -0,0 +1,54 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import com.zilliz.milvustestv2.common.CommonFunction;
+import io.milvus.v2.common.DataType;
+import io.milvus.v2.service.collection.request.DropCollectionReq;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.ListDatabasesResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+
+public class CreateDatabaseTest extends BaseTest {
+
+    @DataProvider(name = "differentCollection")
+    public Object[][] providerVectorType() {
+        return new Object[][]{
+                { DataType.FloatVector},
+                { DataType.BinaryVector},
+                { DataType.Float16Vector},
+                { DataType.BFloat16Vector},
+                { DataType.SparseFloatVector},
+        };
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "Create database",groups = {"Smoke"})
+    public void createDatabase(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        ListDatabasesResp listDatabasesResp = milvusClientV2.listDatabases();
+        Assert.assertTrue(listDatabasesResp.getDatabaseNames().contains(CommonData.databaseName));
+    }
+
+    @Test(description = "Create database with same name repeatedly ",groups = {"Smoke"},dependsOnMethods = {"createDatabase"})
+    public void createDatabaseRepeatedly(){
+        try {
+            milvusClientV2.createDatabase(CreateDatabaseReq.builder()
+                    .databaseName(CommonData.databaseName).build());
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("database already exist"));
+        }
+
+
+    }
+}

+ 33 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DescribeDatabaseTest.java

@@ -0,0 +1,33 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class DescribeDatabaseTest extends BaseTest {
+
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "describe database",groups = {"Smoke"})
+    public void describeDatabase(){
+        DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                .databaseName(CommonData.databaseName).build());
+        Assert.assertEquals(describeDatabaseResp.getDatabaseName(),CommonData.databaseName);
+    }
+}

+ 30 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/database/DropDatabaseTest.java

@@ -0,0 +1,30 @@
+package com.zilliz.milvustestv2.database;
+
+import com.zilliz.milvustestv2.common.BaseTest;
+import com.zilliz.milvustestv2.common.CommonData;
+import io.milvus.v2.service.database.request.CreateDatabaseReq;
+import io.milvus.v2.service.database.request.DescribeDatabaseReq;
+import io.milvus.v2.service.database.request.DropDatabaseReq;
+import io.milvus.v2.service.database.response.DescribeDatabaseResp;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class DropDatabaseTest extends BaseTest {
+    @BeforeClass(alwaysRun = true)
+    public void initTestData(){
+        milvusClientV2.createDatabase(CreateDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+    }
+
+    @Test(description = "drop database",groups = {"Smoke"})
+    public void dropDatabase(){
+        milvusClientV2.dropDatabase(DropDatabaseReq.builder().databaseName(CommonData.databaseName).build());
+        try {
+            DescribeDatabaseResp describeDatabaseResp = milvusClientV2.describeDatabase(DescribeDatabaseReq.builder()
+                    .databaseName(CommonData.databaseName).build());
+        } catch (Exception e) {
+            Assert.assertTrue(e.getMessage().contains("database not found"));
+        }
+    }
+
+}

+ 70 - 11
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/CreateIndexTest.java

@@ -5,6 +5,7 @@ import com.google.common.collect.Lists;
 import com.zilliz.milvustestv2.common.BaseTest;
 import com.zilliz.milvustestv2.common.CommonData;
 import com.zilliz.milvustestv2.common.CommonFunction;
+import com.zilliz.milvustestv2.params.FieldParam;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
@@ -15,7 +16,10 @@ import io.milvus.v2.service.vector.request.InsertReq;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
+import lombok.extern.slf4j.Slf4j;
+import org.testng.annotations.*;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -23,26 +27,63 @@ import java.util.List;
  * @Author yongpeng.li
  * @Date 2024/2/20 16:34
  */
+@Slf4j
 public class CreateIndexTest extends BaseTest {
     String newCollectionName;
+
+    @DataProvider(name = "multiScalar")
+    public Object[][] providerScalarIndex() {
+        return new Object[][]{
+                {new ArrayList<FieldParam>() {{
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.STL_SORT).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.INVERTED).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.TRIE).build());
+                }}
+                },
+                {new ArrayList<FieldParam>() {{
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
+                }}
+                },
+                {new ArrayList<FieldParam>() {{
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
+                }}
+                },
+                {new ArrayList<FieldParam>() {{
+//                    add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
+                }}
+                },
+/*                {new ArrayList<FieldParam>() {{
+                    add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldBool).indextype(IndexParam.IndexType.BITMAP).build());
+                    add(FieldParam.builder().fieldName(CommonData.fieldArray).indextype(IndexParam.IndexType.BITMAP).build());
+                }}
+                },*/
+        };
+    }
+
     @BeforeClass(alwaysRun = true)
-    public void providerCollection(){
+    public void providerCollection() {
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
     }
 
     @AfterClass(alwaysRun = true)
-    public void cleanTestData(){
+    public void cleanTestData() {
         milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(newCollectionName).build());
     }
 
-    @Test(description = "Create vector index",groups = {"Smoke"})
-    public void createVectorIndex(){
+    @Test(description = "Create vector index", groups = {"Smoke"})
+    public void createVectorIndex() {
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)
                 .indexType(IndexParam.IndexType.AUTOINDEX)
-               .extraParams(CommonFunction.provideExtraParam(IndexParam.IndexType.AUTOINDEX))
+                .extraParams(CommonFunction.provideExtraParam(IndexParam.IndexType.AUTOINDEX))
                 .metricType(IndexParam.MetricType.L2)
                 .build();
         milvusClientV2.createIndex(CreateIndexReq.builder()
@@ -53,8 +94,8 @@ public class CreateIndexTest extends BaseTest {
 
     }
 
-    @Test(description = "Create scalar index",groups = {"Smoke"},dependsOnMethods = {"createVectorIndex"})
-    public void createScalarIndex(){
+    @Test(description = "Create scalar index", groups = {"Smoke"}, dependsOnMethods = {"createVectorIndex"})
+    public void createScalarIndex() {
         milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldVarchar)
@@ -69,8 +110,8 @@ public class CreateIndexTest extends BaseTest {
                 .build());
     }
 
-    @Test(description = "Create scalar index",groups = {"Smoke"},dependsOnMethods = {"createVectorIndex"})
-    public void createMultiScalarIndex(){
+    @Test(description = "Create scalar index", groups = {"Smoke"}, dependsOnMethods = {"createVectorIndex"}, enabled = false)
+    public void createMultiScalarIndex() {
         milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
         IndexParam indexParam1 = IndexParam.builder()
                 .fieldName(CommonData.fieldVarchar)
@@ -84,12 +125,30 @@ public class CreateIndexTest extends BaseTest {
                 .fieldName(CommonData.fieldInt8)
                 .indexType(IndexParam.IndexType.STL_SORT)
                 .build();
+        IndexParam indexParam4 = IndexParam.builder()
+                .fieldName(CommonData.fieldInt16)
+//                .indexType(IndexParam.IndexType.BITMAP)
+                .build();
         milvusClientV2.createIndex(CreateIndexReq.builder()
                 .collectionName(newCollectionName)
-                .indexParams(Lists.newArrayList(indexParam1,indexParam2,indexParam3))
+                .indexParams(Lists.newArrayList(indexParam1, indexParam2, indexParam3, indexParam4))
                 .build());
         milvusClientV2.loadCollection(LoadCollectionReq.builder()
                 .collectionName(newCollectionName)
                 .build());
     }
+
+    @Test(description = "Create scalar index",
+            groups = {"Smoke"},
+            dependsOnMethods = {"createVectorIndex"},
+            dataProvider = "multiScalar",
+            enabled = false)
+    public void createAllBitmapIndex(List<FieldParam> FieldParamList) {
+        milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
+        CommonFunction.dropScalarCommonIndex(newCollectionName, FieldParamList);
+        CommonFunction.createScalarCommonIndex(newCollectionName, FieldParamList);
+        milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(newCollectionName).build());
+        milvusClientV2.releaseCollection(ReleaseCollectionReq.builder().collectionName(newCollectionName).build());
+        CommonFunction.dropScalarCommonIndex(newCollectionName, FieldParamList);
+    }
 }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DescribeIndexTest.java

@@ -28,7 +28,7 @@ public class DescribeIndexTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/DropIndexTest.java

@@ -26,7 +26,7 @@ public class DropIndexTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 9 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/index/ListIndexesTest.java

@@ -28,7 +28,7 @@ public class ListIndexesTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)
@@ -54,4 +54,12 @@ public class ListIndexesTest extends BaseTest {
         Assert.assertEquals(strings.get(0),CommonData.fieldFloatVector);
 
     }
+
+    @Test(description = "List index empty if no index exists",groups = {"Smoke"})
+    public void listIndexEmpty(){
+        String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
+        List<String> strings = milvusClientV2.listIndexes(ListIndexesReq.builder()
+                .collectionName(newCollection).build());
+        Assert.assertEquals(strings.size(),0);
+    }
 }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadCollectionTest.java

@@ -31,7 +31,7 @@ public class LoadCollectionTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollectionName,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
     }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/LoadPartitionsTest.java

@@ -43,7 +43,7 @@ public class LoadPartitionsTest extends BaseTest {
                 .collectionName(newCollection)
                 .partitionName(CommonData.partitionName)
                 .build());
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollection).partitionName(CommonData.partitionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollection,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
     }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleaseCollectionTest.java

@@ -27,7 +27,7 @@ public class ReleaseCollectionTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollectionName,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder()

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/loadRelease/ReleasePartitionsTest.java

@@ -42,7 +42,7 @@ public class ReleasePartitionsTest extends BaseTest {
                 .collectionName(newCollection)
                 .partitionName(CommonData.partitionName)
                 .build());
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollection).partitionName(CommonData.partitionName).data(jsonObjects).build());
         CommonFunction.createVectorIndex(newCollection,CommonData.fieldFloatVector, IndexParam.IndexType.HNSW, IndexParam.MetricType.L2);
         milvusClientV2.loadCollection(LoadCollectionReq.builder()

+ 63 - 0
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/DeleteTest.java

@@ -1,16 +1,24 @@
 package com.zilliz.milvustestv2.vectorOperation;
 
+import com.google.common.collect.Lists;
 import com.zilliz.milvustestv2.common.BaseTest;
 import com.zilliz.milvustestv2.common.CommonData;
 import com.zilliz.milvustestv2.common.CommonFunction;
 import com.zilliz.milvustestv2.utils.GenerateUtil;
+import io.milvus.v2.common.ConsistencyLevel;
 import io.milvus.v2.common.DataType;
 import io.milvus.v2.common.IndexParam;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
 import io.milvus.v2.service.collection.request.LoadCollectionReq;
 import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.vector.request.DeleteReq;
+import io.milvus.v2.service.vector.request.QueryReq;
+import io.milvus.v2.service.vector.request.SearchReq;
+import io.milvus.v2.service.vector.request.data.BaseVector;
 import io.milvus.v2.service.vector.response.DeleteResp;
+import io.milvus.v2.service.vector.response.QueryResp;
+import io.milvus.v2.service.vector.response.SearchResp;
+import org.apache.hadoop.yarn.webapp.hamlet2.Hamlet;
 import org.testng.Assert;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -18,6 +26,7 @@ import org.testng.annotations.Test;
 
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.List;
 
 /**
  * @Author yongpeng.li
@@ -71,4 +80,58 @@ public class DeleteTest extends BaseTest {
     }
 
 
+    @Test(description = "search after delete  ",groups = {"Smoke"})
+    public void searchAfterDelete(){
+        String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
+        CommonFunction.createIndexAndInsertAndLoad(newCollection,DataType.FloatVector,true,CommonData.numberEntities);
+        DeleteResp delete = milvusClientV2.delete(DeleteReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .build());
+        Assert.assertEquals(delete.getDeleteCnt(),10);
+        //count
+        QueryResp query = milvusClientV2.query(QueryReq.builder()
+                .collectionName(newCollection)
+                .outputFields(Lists.newArrayList("*"))
+                .filter(CommonData.fieldInt64+" >= 0 ")
+                .consistencyLevel(ConsistencyLevel.STRONG).build());
+        Assert.assertEquals(CommonData.numberEntities-10, query.getQueryResults().size());
+
+        // search
+        List<BaseVector> data = CommonFunction.providerBaseVector(CommonData.nq, CommonData.dim, DataType.FloatVector);
+        SearchResp search = milvusClientV2.search(SearchReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .outputFields(Lists.newArrayList("*"))
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .data(data)
+                .topK(CommonData.topK)
+                .build());
+        Assert.assertEquals(search.getSearchResults().size(), 1);
+        Assert.assertEquals(search.getSearchResults().get(0).size(), 0);
+
+        // insert deleted data
+        CommonFunction.createIndexAndInsertAndLoad(newCollection,DataType.FloatVector,true, 10L);
+        //count
+        QueryResp query2 = milvusClientV2.query(QueryReq.builder()
+                .collectionName(newCollection)
+                .outputFields(Lists.newArrayList("*"))
+                .filter(CommonData.fieldInt64+" >= 0 ")
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .build());
+        Assert.assertEquals(CommonData.numberEntities, query2.getQueryResults().size());
+        SearchResp search2 = milvusClientV2.search(SearchReq.builder()
+                .collectionName(newCollection)
+                .filter(CommonData.fieldInt64+" < 10 ")
+                .outputFields(Lists.newArrayList("*"))
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .data(data)
+                .topK(CommonData.topK)
+                .build());
+        Assert.assertEquals(search2.getSearchResults().size(), 1);
+        Assert.assertEquals(search2.getSearchResults().get(0).size(), CommonData.topK);
+        milvusClientV2.dropCollection(DropCollectionReq.builder()
+                .collectionName(newCollection).build());
+    }
+
 }

+ 1 - 1
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/GetTest.java

@@ -29,7 +29,7 @@ public class GetTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection(){
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim,DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
         IndexParam indexParam = IndexParam.builder()
                 .fieldName(CommonData.fieldFloatVector)

+ 2 - 2
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/InsertTest.java

@@ -59,7 +59,7 @@ public class InsertTest extends BaseTest {
 
     @Test(description = "insert test", groups = {"Smoke"})
     public void insert() {
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder()
                 .data(jsonObjects)
                 .collectionName(newCollectionName)
@@ -80,7 +80,7 @@ public class InsertTest extends BaseTest {
     @Test(description = "insert different vector collection test", groups = {"Smoke"}, dataProvider = "VectorTypeList")
     public void insertIntoDiffVectorCollection(DataType dataType) {
         String newCollection = CommonFunction.createNewCollection(CommonData.dim, null, dataType);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, dataType);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, dataType);
         InsertResp insert = milvusClientV2.insert(InsertReq.builder()
                 .collectionName(newCollection)
                 .data(jsonObjects).build());

+ 82 - 10
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/SearchTest.java

@@ -5,6 +5,7 @@ import com.google.gson.JsonObject;
 import com.zilliz.milvustestv2.common.BaseTest;
 import com.zilliz.milvustestv2.common.CommonData;
 import com.zilliz.milvustestv2.common.CommonFunction;
+import com.zilliz.milvustestv2.params.FieldParam;
 import com.zilliz.milvustestv2.utils.DataProviderUtils;
 import com.zilliz.milvustestv2.utils.GenerateUtil;
 import com.zilliz.milvustestv2.utils.MathUtil;
@@ -20,8 +21,11 @@ import io.milvus.v2.common.DataType;
 import io.milvus.v2.service.collection.request.DescribeCollectionReq;
 import io.milvus.v2.service.collection.request.DropCollectionReq;
 import io.milvus.v2.service.collection.request.GetCollectionStatsReq;
+import io.milvus.v2.common.IndexParam;
+import io.milvus.v2.service.collection.request.*;
 import io.milvus.v2.service.collection.response.DescribeCollectionResp;
 import io.milvus.v2.service.collection.response.GetCollectionStatsResp;
+import io.milvus.v2.service.index.request.CreateIndexReq;
 import io.milvus.v2.service.vector.request.InsertReq;
 import io.milvus.v2.service.vector.request.QueryReq;
 import io.milvus.v2.service.vector.request.SearchReq;
@@ -30,12 +34,15 @@ import io.milvus.v2.service.vector.request.data.FloatVec;
 import io.milvus.v2.service.vector.response.InsertResp;
 import io.milvus.v2.service.vector.response.QueryResp;
 import io.milvus.v2.service.vector.response.SearchResp;
+import lombok.extern.slf4j.Slf4j;
 import org.testng.Assert;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -43,9 +50,11 @@ import java.util.Map;
  * @Author yongpeng.li
  * @Date 2024/2/19 17:03
  */
+@Slf4j
 public class SearchTest extends BaseTest {
     int topK = 10;
     private MilvusServiceClient milvusServiceClient;
+    String newCollectionName;
 
     @DataProvider(name = "filterAndExcept")
     public Object[][] providerData() {
@@ -66,6 +75,9 @@ public class SearchTest extends BaseTest {
                 {CommonData.fieldVarchar + " like \"Str%\" ", topK},
                 {CommonData.fieldVarchar + " like \"Str1\" ", 1},
                 {CommonData.fieldInt8 + " > 129 ", 0},
+                {"array_contains(" + CommonData.fieldArray + ", 1)", 2},
+                {"array_contains_all(" + CommonData.fieldArray + ", [1, 2])", 2},
+                {"array_length(" + CommonData.fieldArray + ") == 3", 10},
 
         };
     }
@@ -75,22 +87,22 @@ public class SearchTest extends BaseTest {
         return new Object[][]{
                 {CommonData.defaultFloatVectorCollection, DataType.FloatVector},
 //                {CommonData.defaultBinaryVectorCollection,DataType.BinaryVector},
-                {CommonData.defaultFloat16VectorCollection,DataType.Float16Vector},
-                {CommonData.defaultBFloat16VectorCollection,DataType.BFloat16Vector},
-                {CommonData.defaultSparseFloatVectorCollection,DataType.SparseFloatVector},
+                {CommonData.defaultFloat16VectorCollection, DataType.Float16Vector},
+                {CommonData.defaultBFloat16VectorCollection, DataType.BFloat16Vector},
+                {CommonData.defaultSparseFloatVectorCollection, DataType.SparseFloatVector},
         };
     }
 
-    @DataProvider(name="VectorTypeWithFilter")
-    public Object[][] providerVectorTypeWithFilter(){
-        Object[][] vectorType=new Object[][]{
+    @DataProvider(name = "VectorTypeWithFilter")
+    public Object[][] providerVectorTypeWithFilter() {
+        Object[][] vectorType = new Object[][]{
                 {DataType.FloatVector},
                 {DataType.BinaryVector},
                 {DataType.Float16Vector},
                 {DataType.BFloat16Vector},
                 {DataType.SparseFloatVector}
         };
-        Object[][] filter=new Object[][]{
+        Object[][] filter = new Object[][]{
                 {CommonData.fieldVarchar + " like \"%0\" ", topK},
                 {CommonData.fieldInt64 + " < 10 ", topK},
                 {CommonData.fieldInt64 + " != 10 ", topK},
@@ -125,6 +137,47 @@ public class SearchTest extends BaseTest {
         };
     }
 
+    @BeforeClass(alwaysRun = true)
+    public void providerCollection() {
+        newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities * 10, CommonData.dim, DataType.FloatVector);
+        milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
+    }
+
+    @AfterClass(alwaysRun = true)
+    public void cleanTestData() {
+        milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(newCollectionName).build());
+    }
+
+    @Test(description = "Create vector and scalar index", groups = {"Smoke"})
+    public void createVectorAndScalarIndex() {
+        // Build Vector index
+        IndexParam indexParam = IndexParam.builder()
+                .fieldName(CommonData.fieldFloatVector)
+                .indexType(IndexParam.IndexType.AUTOINDEX)
+                .extraParams(CommonFunction.provideExtraParam(IndexParam.IndexType.AUTOINDEX))
+                .metricType(IndexParam.MetricType.L2)
+                .build();
+        milvusClientV2.createIndex(CreateIndexReq.builder()
+                .collectionName(newCollectionName)
+                .indexParams(Collections.singletonList(indexParam))
+                .build());
+
+        // Build Scalar Index
+        List<FieldParam> FieldParamList = new ArrayList<FieldParam>() {{
+//            add(FieldParam.builder().fieldName(CommonData.fieldVarchar).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt8).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt16).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt32).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldInt64).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldBool).indextype(IndexParam.IndexType.BITMAP).build());
+//            add(FieldParam.builder().fieldName(CommonData.fieldArray).indextype(IndexParam.IndexType.BITMAP).build());
+        }};
+        CommonFunction.createScalarCommonIndex(newCollectionName, FieldParamList);
+        log.info("Create Scalar index done{}, scalar index:{}", newCollectionName, FieldParamList);
+        milvusClientV2.loadCollection(LoadCollectionReq.builder().collectionName(newCollectionName).build());
+    }
+
     @Test(description = "search float vector collection", groups = {"Smoke"}, dataProvider = "filterAndExcept")
     public void searchFloatVectorCollection(String filter, int expect) {
         List<BaseVector> data = CommonFunction.providerBaseVector(CommonData.nq, CommonData.dim, DataType.FloatVector);
@@ -259,19 +312,38 @@ public class SearchTest extends BaseTest {
     }
 
     @Test(description = "search group by field name", groups = {"Smoke"}, dataProvider = "VectorTypeList")
-    public void searchByGroupByField(String collectionName,DataType vectorType){
+    public void searchByGroupByField(String collectionName, DataType vectorType) {
         List<BaseVector> data = CommonFunction.providerBaseVector(CommonData.nq, CommonData.dim, vectorType);
         SearchResp search = milvusClientV2.search(SearchReq.builder()
                 .collectionName(collectionName)
                 .outputFields(Lists.newArrayList("*"))
                 .consistencyLevel(ConsistencyLevel.STRONG)
-                        .groupByFieldName(CommonData.fieldInt8)
+                .groupByFieldName(CommonData.fieldInt8)
                 .data(data)
                 .topK(1000)
                 .build());
         Assert.assertEquals(search.getSearchResults().size(), CommonData.nq);
-        if(vectorType!=DataType.SparseFloatVector) {
+        if (vectorType != DataType.SparseFloatVector) {
             Assert.assertEquals(search.getSearchResults().get(0).size(), 127);
         }
     }
+
+    @Test(description = "search scalar index collection", groups = {"Smoke"}, dependsOnMethods = {"createVectorAndScalarIndex"}, dataProvider = "filterAndExcept")
+    public void searchScalarIndexCollection(String filter, int expect) {
+        List<BaseVector> data = CommonFunction.providerBaseVector(CommonData.nq, CommonData.dim, DataType.FloatVector);
+        SearchReq searchParams = SearchReq.builder()
+                .collectionName(CommonData.defaultFloatVectorCollection)
+                .filter(filter)
+                .outputFields(Lists.newArrayList("*"))
+                .consistencyLevel(ConsistencyLevel.STRONG)
+                .annsField(CommonData.fieldFloatVector)
+                .data(data)
+                .topK(topK)
+                .build();
+        System.out.println(searchParams);
+        SearchResp search = milvusClientV2.search(searchParams);
+        System.out.println(search);
+        Assert.assertEquals(search.getSearchResults().size(), CommonData.nq);
+        Assert.assertEquals(search.getSearchResults().get(0).size(), expect);
+    }
 }

+ 12 - 8
tests/milvustestv2/src/test/java/com/zilliz/milvustestv2/vectorOperation/UpsertTest.java

@@ -38,7 +38,7 @@ public class UpsertTest extends BaseTest {
     @BeforeClass(alwaysRun = true)
     public void providerCollection() {
         newCollectionName = CommonFunction.createNewCollection(CommonData.dim, null, DataType.FloatVector);
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,CommonData.numberEntities, CommonData.dim, DataType.FloatVector);
         milvusClientV2.insert(InsertReq.builder().collectionName(newCollectionName).data(jsonObjects).build());
     }
 
@@ -50,17 +50,20 @@ public class UpsertTest extends BaseTest {
     @DataProvider(name = "DifferentCollection")
     public Object[][] providerVectorType() {
         return new Object[][]{
-                {CommonData.defaultFloatVectorCollection, DataType.FloatVector},
-                {CommonData.defaultBinaryVectorCollection, DataType.BinaryVector},
-                {CommonData.defaultFloat16VectorCollection, DataType.Float16Vector},
-                {CommonData.defaultBFloat16VectorCollection, DataType.BFloat16Vector},
-                {CommonData.defaultSparseFloatVectorCollection, DataType.SparseFloatVector},
+                { DataType.FloatVector},
+                { DataType.BinaryVector},
+                { DataType.Float16Vector},
+                { DataType.BFloat16Vector},
+                { DataType.SparseFloatVector},
         };
     }
 
     @Test(description = "upsert collection", groups = {"Smoke"}, dataProvider = "DifferentCollection")
-    public void upsert(String collectionName, DataType vectorType) {
-        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(1, CommonData.dim, vectorType);
+    public void upsert( DataType vectorType) {
+        String collectionName = CommonFunction.createNewCollection(CommonData.dim, null, vectorType);
+        CommonFunction.createIndexAndInsertAndLoad(collectionName,vectorType,true,CommonData.numberEntities);
+
+        List<JsonObject> jsonObjects = CommonFunction.generateDefaultData(0,1, CommonData.dim, vectorType);
         for (int i = 1; i < 10; i++) {
             JsonObject jsonObject0 = jsonObjects.get(0).deepCopy();
             jsonObject0.addProperty(CommonData.fieldInt64, i);
@@ -95,6 +98,7 @@ public class UpsertTest extends BaseTest {
                 .outputFields(Lists.newArrayList(CommonData.fieldInt64, CommonData.fieldInt32))
                 .consistencyLevel(ConsistencyLevel.STRONG).build());
         Assert.assertEquals(query.getQueryResults().size(),10);
+        milvusClientV2.dropCollection(DropCollectionReq.builder().collectionName(collectionName).build());
     }
 
     @Test(description = "upsert collection", groups = {"Smoke"})

+ 127 - 0
tests/milvustestv2/src/test/java/resources/cluster-values.yaml

@@ -0,0 +1,127 @@
+cluster:
+  enabled: true
+image:
+  all:
+    repository: milvusdb/milvus
+    tag: master-latest
+    pullPolicy: IfNotPresent
+
+etcd:
+  replicaCount: 3
+  image:
+    repository: milvusdb/etcd
+    tag: 3.5.0-r7
+
+minio:
+  resources:
+    requests:
+      memory: 256Mi
+
+kafka:
+  enabled: false
+  name: kafka
+  replicaCount: 3
+  defaultReplicationFactor: 2
+
+pulsar:
+  enabled: true
+  extra:
+    bastion: no
+    wsproxy: no
+
+  autorecovery:
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+  proxy:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+    wsResources:
+      requests:
+        memory: 256Mi
+        cpu: 0.1
+    configData:
+      PULSAR_MEM: >
+        -Xms256m -Xmx256m
+      PULSAR_GC: >
+        -XX:MaxDirectMemorySize=512m
+      httpNumThreads: "50"
+
+  bookkeeper:
+    replicaCount: 2
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 512Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+        -XX:MaxDirectMemorySize=1024m
+      PULSAR_GC: >
+        -Dio.netty.leakDetectionLevel=disabled
+        -Dio.netty.recycler.linkCapacity=1024
+        -XX:+UseG1GC -XX:MaxGCPauseMillis=10
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:ParallelGCThreads=32
+        -XX:ConcGCThreads=32
+        -XX:G1NewSizePercent=50
+        -XX:+DisableExplicitGC
+        -XX:-ResizePLAB
+        -XX:+ExitOnOutOfMemoryError
+        -XX:+PerfDisableSharedMem
+        -XX:+PrintGCDetails
+      nettyMaxFrameSizeBytes: "104867840"
+  zookeeper:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 256Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+      PULSAR_GC: >
+        -Dcom.sun.management.jmxremote
+        -Djute.maxbuffer=10485760
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:+DisableExplicitGC
+        -XX:+PerfDisableSharedMem
+        -Dzookeeper.forceSync=no
+  broker:
+    replicaCount: 1
+    resources:
+      requests:
+        cpu: 0.1
+        memory: 512Mi
+    configData:
+      PULSAR_MEM: >
+        -Xms512m
+        -Xmx512m
+        -XX:MaxDirectMemorySize=1024m
+      PULSAR_GC: >
+        -Dio.netty.leakDetectionLevel=disabled
+        -Dio.netty.recycler.linkCapacity=1024
+        -XX:+ParallelRefProcEnabled
+        -XX:+UnlockExperimentalVMOptions
+        -XX:+DoEscapeAnalysis
+        -XX:ParallelGCThreads=32
+        -XX:ConcGCThreads=32
+        -XX:G1NewSizePercent=50
+        -XX:+DisableExplicitGC
+        -XX:-ResizePLAB
+        -XX:+ExitOnOutOfMemoryError
+      maxMessageSize: "104857600"
+      defaultRetentionTimeInMinutes: "10080"
+      defaultRetentionSizeInMB: "8192"
+      backlogQuotaDefaultLimitGB: "8"
+      backlogQuotaDefaultRetentionPolicy: producer_exception

+ 52 - 0
tests/milvustestv2/src/test/java/resources/docker-compose.yml

@@ -0,0 +1,52 @@
+version: '3.5'
+
+services:
+  etcd:
+    container_name: milvus-etcd
+    image: quay.io/coreos/etcd:v3.5.0
+    environment:
+      - ETCD_AUTO_COMPACTION_MODE=revision
+      - ETCD_AUTO_COMPACTION_RETENTION=1000
+      - ETCD_QUOTA_BACKEND_BYTES=4294967296
+      - ETCD_SNAPSHOT_COUNT=50000
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
+    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
+
+  minio:
+    container_name: milvus-minio
+    image: minio/minio:RELEASE.2022-03-17T06-34-49Z
+    environment:
+      MINIO_ACCESS_KEY: minioadmin
+      MINIO_SECRET_KEY: minioadmin
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
+    command: minio server /minio_data --console-address ":9001"
+    ports:
+      - "9000:9000"
+      - "9001:9001"
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
+      interval: 30s
+      timeout: 20s
+      retries: 3
+
+  standalone:
+    container_name: milvus-standalone
+    image: milvusdb/milvus:master-latest
+    command: ["milvus", "run", "standalone"]
+    environment:
+      ETCD_ENDPOINTS: etcd:2379
+      MINIO_ADDRESS: minio:9000
+    volumes:
+      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
+    ports:
+      - "19530:19530"
+      - "9091:9091"
+    depends_on:
+      - "etcd"
+      - "minio"
+
+networks:
+  default:
+    name: milvus

+ 230 - 0
tests/milvustestv2/src/test/java/resources/scripts/docker_image_find_tag.sh

@@ -0,0 +1,230 @@
+#!/usr/bin/env bash
+
+# Reference: https://github.com/ryandaniels/docker-script-find-latest-image-tag/blob/master/docker_image_find_tag.sh
+
+set -ef -o pipefail
+
+REGISTRY=${REGISTRY:-"https://index.docker.io/v2"}
+REGISTRY_AUTH=${REGISTRY_AUTH:-"https://auth.docker.io"}
+REGISTRY_SERVICE=${REGISTRY_SERVICE:-"registry.docker.io"}   
+# IMAGE_NAME=library/traefik
+IMAGE_NAME=${IMAGE_NAME:-""}
+IMAGE_TAG=${IMAGE_TAG-""}
+IMAGE_ID_SHORT=${IMAGE_ID_SHORT:-""}
+# IMAGE_ID_SHORT="96c63a7d3e50"
+IMAGE_ID_TARGET=""
+IMAGE_ID_LONG=${IMAGE_ID_LONG:-""}
+# IMAGE_ID_LONG="sha256:96c63a7d3e502fcbbd8937a2523368c22d0edd1788b8389af095f64038318834"
+DOCKER_BIN=docker
+# TAGS_FILTER="1.7"
+TAGS_FILTER=${TAGS_FILTER:-""}
+FAST_MATCH=0
+VERBOSE=0
+QUIET=0
+TAGS_LIMIT=100
+TAG_UNLIMIT=0
+ignore_404=0
+
+show_help () {
+  echo "Usage:"
+  echo "$0 [-n image name] [-i image-id]"
+  echo "Example: $0 -n traefik -i 96c63a7d3e50 -f 1.7"
+  echo "  -n [text]: Image name (Required). '-n traefik' would reference the traefik image"
+  echo "  -D: Use Docker binary for Image ID check (Default) (Optional)"
+  echo "  -P: Use Podman binary for Image ID check (Optional)"
+  echo "  -r [text]: Registry URL to use. Example: -r https://index.docker.io/v2 (Default) (Optional)"
+  echo "  -a [text]: Registry AUTH to use. Example: -a https://auth.docker.io (Default) (Optional)"  
+  echo "  -l [number]: Tag limit. Defaults to 100. (Optional)"  
+  echo "  -L: Tag unlimit. (Optional)"
+  echo "  -f [text]: Filter tag to contain this value (Optional)"
+  echo "  -F: Fast match tag. (Optional)"
+  echo "  -q: Quiet output (Optional)"
+  echo "  -v: Verbose output (Optional)"
+}
+
+# From: https://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash
+# A POSIX variable
+OPTIND=1         # Reset in case getopts has been used previously in the shell.
+
+while getopts "h?n:t:DPr:a:l:Lf:Fqv" opt; do
+    case "$opt" in
+    h|\?)
+        show_help
+        exit 0
+        ;;
+    n)  IMAGE_NAME="$OPTARG"
+        ;;
+    t)  IMAGE_TAG="$OPTARG"
+        ;;
+    D)  DOCKER_BIN=docker
+        ;;
+    P)  DOCKER_BIN=podman
+        ;;
+    r)  REGISTRY="$OPTARG"
+        ;;
+    a)  REGISTRY_AUTH="$OPTARG"
+        ;;
+    l)  TAGS_LIMIT="$OPTARG"
+        ;;
+    L)  TAG_UNLIMIT=1
+        ;;
+    f)  TAGS_FILTER="$OPTARG"
+        ;;
+    F)  FAST_MATCH=1
+        ;;
+    q)  QUIET=1
+        ;;
+    v)  VERBOSE=1
+        ;;
+    esac
+done
+
+shift $((OPTIND-1))
+
+[ "${1:-}" = "--" ] && shift
+
+if [ -z "$IMAGE_NAME" ]; then
+  echo "Requires Image Name"
+  exit 1;
+else
+  if [[ "$VERBOSE" -eq 1 ]]; then
+    echo "Using IMAGE_NAME: $IMAGE_NAME"
+  fi
+  # Add library/ if no /. (Which is _ aka official image like hub.docker.com/_/traefik)
+  # Official images are in "library/"
+  if [[ "$IMAGE_NAME" != *"/"* ]]; then
+      IMAGE_NAME="library/$IMAGE_NAME"
+  fi
+fi
+
+if [[ -z "$IMAGE_TAG" ]]; then
+  echo "Requires Image Tag"
+  exit 1;
+fi
+
+if [[ "$VERBOSE" -eq 1 ]]; then
+  echo "Using REGISTRY: $REGISTRY"
+fi
+
+if ! [[ $TAGS_LIMIT =~ ^[0-9]+$ ]] ; then
+  echo "Tag limit (-l) must be an integer > 0"
+  exit 1;
+fi
+
+function log() {
+  if [[ "${QUIET}" -ne 1 || "$VERBOSE" -eq 1  ]]; then
+    echo "${1}"
+  fi
+}
+
+# https://unix.stackexchange.com/questions/459367/using-shell-variables-for-command-options/459369#459369
+# https://unix.stackexchange.com/questions/444946/how-can-we-run-a-command-stored-in-a-variable/444949#444949
+# https://askubuntu.com/questions/674333/how-to-pass-an-array-as-function-argument/995110#995110
+# Maybe https://stackoverflow.com/questions/45948172/executing-a-curl-request-through-bash-script/45948289#45948289
+# http://mywiki.wooledge.org/BashFAQ/050#I_only_want_to_pass_options_if_the_runtime_data_needs_them
+function do_curl_get () {
+  local URL="$1"
+  shift
+  local array=("$@")
+  HTTP_RESPONSE="$(curl -sSL --write-out "HTTPSTATUS:%{http_code}" \
+    -H "Content-Type: application/json;charset=UTF-8" \
+    "${array[@]}" \
+    -X GET "$URL")"
+  HTTP_BODY=$(echo "$HTTP_RESPONSE" | sed -E 's/HTTPSTATUS\:[0-9]{3}$//')
+  HTTP_STATUS=$(echo "$HTTP_RESPONSE" | tr -d '\n' | sed -E 's/.*HTTPSTATUS:([0-9]{3})$/\1/')
+  # Check that the http status is 200
+  if [[ "$HTTP_STATUS" -ne 200 ]]; then
+    if [[ "$ignore_404" -eq 0 ]]; then
+      if [[ "$VERBOSE" -eq 0 ]]; then
+        echo -e "\\nError $HTTP_STATUS from: $URL\\n"
+      else
+        echo -e "\\nError $HTTP_STATUS from: $URL\\nHTTP_BODY: $HTTP_BODY\\n"
+      fi
+      exit 1
+    fi
+  fi
+}
+
+# Get AUTH token
+CURL_AUTH=()
+CURL_URL="$REGISTRY_AUTH/token?service=${REGISTRY_SERVICE##*(//)}&scope=repository:$IMAGE_NAME:pull"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+AUTH=$(echo "$HTTP_BODY" | jq --raw-output .token)
+
+# Get source image ID
+CURL_AUTH=( -H "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" )
+CURL_URL="$REGISTRY/$IMAGE_NAME/manifests/$IMAGE_TAG"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+IMAGE_ID_SOURCE="$(echo "$HTTP_BODY" |jq -r .config.digest)"
+
+# Get tags
+CURL_AUTH=( -H "Authorization: Bearer $AUTH" )
+CURL_URL="$REGISTRY/$IMAGE_NAME/tags/list"
+do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+TAGS_CURL=$(echo "$HTTP_BODY")
+TAGS_COUNT=$(echo "$TAGS_CURL"|jq -r '.tags[]'|grep -vi windows|wc -l)
+TAGS_temp=$(echo "$TAGS_CURL"|jq --arg TAGS_FILTER "$TAGS_FILTER" -r '.tags[]|select(.|contains($TAGS_FILTER))'|grep -vi windows|sort -r --version-sort)
+
+if [[ "$TAG_UNLIMIT" -eq 1 ]]; then
+  TAGS_LIMIT="$TAGS_COUNT"
+fi
+
+TAGS=$(echo "$TAGS_temp"|sed -n 1,"$TAGS_LIMIT"p)
+log "Found Total Tags: $TAGS_COUNT"
+# Check if tags are not being filtered
+if [ -z "$TAGS_FILTER" ]; then
+  log "Limiting Tags to: $TAGS_LIMIT"
+  # Check if limit reached and display warning
+  if [[ "$TAGS_COUNT" -gt "$TAGS_LIMIT" ]]; then
+    log "Limit reached, consider increasing limit (-l [number]) or adding a filter (-f [text])"
+  fi
+# If tags are filtered, show how many filtered tags were found
+else
+  TAGS_FILTER_COUNT=$(echo "$TAGS_temp"|wc -l)
+  log "Found Tags (after filtering): $TAGS_FILTER_COUNT"
+  log "Limiting Tags to: $TAGS_LIMIT"
+  # Check if limit reached and display warning
+  if [[ "$TAGS_FILTER_COUNT" -ge "$TAGS_LIMIT" ]]; then
+    log "Limit reached, consider increasing limit (-l [number]) or use more specific filter (-f [text])"
+  fi
+fi
+if [[ "$VERBOSE" -eq 1 ]]; then
+  # Output all tags found
+  echo -e "\nFound Tags:\n$TAGS"
+fi
+
+# Loop through tags and look for sha Id match
+# Some "manifests/tag" endpoints do not exist (http404 error)? Seems to be windows images. Ignore any 404 error
+ignore_404=1
+counter=0
+log "Checking for image match ..."
+
+if [[ "$FAST_MATCH" -eq 1 ]]; then
+    log "Fast match tag."
+fi
+for i in $TAGS; do
+  if [[ "$VERBOSE" -eq 1 ]]; then
+  # Output still working text every 50 tags if -v
+    if [[ "$counter" =~ ^($(echo {50..1000..50}|sed 's/ /|/g'))$ ]]; then
+      log "Still working, currently on tag number: $counter"
+    fi
+    counter=$((counter+1))
+  fi
+
+  if [[ "$IMAGE_TAG" != "$i" ]]; then
+    # IMAGE_ID_TARGET="$(curl -sSLH "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" -X GET "$REGISTRY/$IMAGE_NAME/manifests/$i"|jq -r .config.digest)"
+    CURL_AUTH=( -H "Authorization: Bearer $AUTH" -H "Accept:application/vnd.docker.distribution.manifest.v2+json" )
+    CURL_URL="$REGISTRY/$IMAGE_NAME/manifests/$i"
+    do_curl_get "$CURL_URL" "${CURL_AUTH[@]}"
+    IMAGE_ID_TARGET="$(echo "$HTTP_BODY" |jq -r .config.digest)"
+
+    if [[ "$IMAGE_ID_TARGET" == "$IMAGE_ID_SOURCE" ]]; then
+        log "Found match. tag:"
+        echo "$i"
+
+        if [[ "$FAST_MATCH" -eq 1 ]]; then
+          exit 0
+        fi
+    fi
+  fi
+done;

+ 8 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus.sh

@@ -0,0 +1,8 @@
+
+release=${1:-"milvs-chaos"}
+ns=${2:-"chaos-testing"}
+bash uninstall_milvus.sh ${release} ${ns}|| true
+
+helm repo add milvus https://milvus-io.github.io/milvus-helm/
+helm repo update
+helm install --wait --timeout 360s ${release} milvus/milvus -f ../cluster-values.yaml --set metrics.serviceMonitor.enabled=true -n=${ns}

+ 13 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus_cluster.sh

@@ -0,0 +1,13 @@
+#!/bin/bash
+set -e
+
+release=${1:-"milvs-chaos"}
+ns=${2:-"chaos-testing"}
+bash uninstall_milvus.sh ${release} ${ns}|| true
+
+echo "insatll cluster"
+helm install --wait --debug --timeout 600s ${RELEASE_NAME:-$release} milvus/milvus \
+                            --set image.all.repository=${REPOSITORY:-"milvusdb/milvus"} \
+                            --set image.all.tag=${IMAGE_TAG:-"master-latest"} \
+                            --set metrics.serviceMonitor.enabled=true \
+                            -f ../cluster-values.yaml -n=${ns}

+ 12 - 0
tests/milvustestv2/src/test/java/resources/scripts/install_milvus_standalone.sh

@@ -0,0 +1,12 @@
+#!/bin/bash
+set -e
+
+release=${1:-"milvs-chaos"}
+ns=${2:-"chaos-testing"}
+bash uninstall_milvus.sh ${release} ${ns}|| true
+echo "insatll standalone"
+helm install --wait --debug --timeout 600s ${RELEASE_NAME:-$release} milvus/milvus \
+                            --set image.all.repository=${REPOSITORY:-"milvusdb/milvus"} \
+                            --set image.all.tag=${IMAGE_TAG:-"master-latest"} \
+                            --set metrics.serviceMonitor.enabled=true \
+                            -f ../standalone-values.yaml -n=${ns}

+ 25 - 0
tests/milvustestv2/src/test/java/resources/scripts/modify_config.sh

@@ -0,0 +1,25 @@
+#!/bin/bash
+set -e
+set -x
+
+
+echo "check os env"
+platform='Linux'
+unamestr=$(uname)
+if [[ "$unamestr" == 'Linux' ]]; then
+   platform='Linux'
+elif [[ "$unamestr" == 'Darwin' ]]; then
+   platform='Mac'
+fi
+echo "platform: $platform"
+
+if [ "$platform" == "Mac" ];
+then
+    sed -i "" "s/TESTS_CONFIG_LOCATION =.*/TESTS_CONFIG_LOCATION = \'chaos_objects\/${CHAOS_TYPE/-/_}\/'/g" constants.py
+    sed -i "" "s/ALL_CHAOS_YAMLS =.*/ALL_CHAOS_YAMLS = \'chaos_${POD_NAME}_${CHAOS_TYPE/-/_}.yaml\'/g" constants.py
+    sed -i "" "s/RELEASE_NAME =.*/RELEASE_NAME = \'${RELEASE_NAME}\'/g" constants.py
+else
+    sed -i "s/TESTS_CONFIG_LOCATION =.*/TESTS_CONFIG_LOCATION = \'chaos_objects\/${CHAOS_TYPE/-/_}\/'/g" constants.py
+    sed -i "s/ALL_CHAOS_YAMLS =.*/ALL_CHAOS_YAMLS = \'chaos_${POD_NAME}_${CHAOS_TYPE/-/_}.yaml\'/g" constants.py
+    sed -i "s/RELEASE_NAME =.*/RELEASE_NAME = \'${RELEASE_NAME}\'/g" constants.py
+fi

+ 8 - 0
tests/milvustestv2/src/test/java/resources/scripts/uninstall_milvus.sh

@@ -0,0 +1,8 @@
+
+# Exit immediately for non zero status
+set -e
+release=${1:-"milvus-chaos"}
+ns=${2:-"chaos-testing"}
+helm uninstall ${release} -n=${ns}
+kubectl delete pvc -l release=${release} -n=${ns}
+kubectl delete pvc -l app.kubernetes.io/instance=${release} -n=${ns}

+ 23 - 0
tests/milvustestv2/src/test/java/resources/standalone-values.yaml

@@ -0,0 +1,23 @@
+cluster:
+  enabled: false
+image:
+  all:
+    repository: milvusdb/milvus
+    tag: master-latest
+    pullPolicy: IfNotPresent
+
+kafka:
+  enabled: false
+  name: kafka
+  replicaCount: 3
+  defaultReplicationFactor: 2
+
+etcd:
+  replicaCount: 1
+  image:
+    repository: milvusdb/etcd
+    tag: 3.5.0-r7  
+minio:
+  mode: standalone
+pulsar:
+  enabled: false

+ 1 - 1
tests/milvustestv2/src/test/resources/run.properties

@@ -1,3 +1,3 @@
-uri=http://10.102.6.30:19530
+uri=http://127.0.0.1:19530