diff --git a/sdk-core/src/main/java/io/milvus/v2/utils/DataUtils.java b/sdk-core/src/main/java/io/milvus/v2/utils/DataUtils.java index 44dd80e92..50ad53162 100644 --- a/sdk-core/src/main/java/io/milvus/v2/utils/DataUtils.java +++ b/sdk-core/src/main/java/io/milvus/v2/utils/DataUtils.java @@ -350,7 +350,7 @@ private static FieldData genStructSubFieldData(CreateCollectionReq.FieldSchema f FieldData.Builder builder = FieldData.newBuilder().setFieldName(fieldName); if (ParamUtils.isVectorDataType(dataType)) { - VectorArray vectorArr = genVectorArray(dataType, objects); + VectorArray vectorArr = genVectorArray(dataType, objects, fieldSchema.getDimension()); if (vectorArr.getDim() > 0 && vectorArr.getDim() != fieldSchema.getDimension()) { String msg = String.format("Dimension mismatch for field %s, expected: %d, actual: %d", fieldName, fieldSchema.getDimension(), vectorArr.getDim()); @@ -380,8 +380,8 @@ private static FieldData genStructSubFieldData(CreateCollectionReq.FieldSchema f } @SuppressWarnings("unchecked") - public static VectorArray genVectorArray(DataType dataType, List objects) { - VectorArray.Builder builder = VectorArray.newBuilder().setElementType(dataType); + public static VectorArray genVectorArray(DataType dataType, List objects, int dim) { + VectorArray.Builder builder = VectorArray.newBuilder().setElementType(dataType).setDim(dim); switch (dataType) { case FloatVector: case BinaryVector: @@ -398,19 +398,21 @@ public static VectorArray genVectorArray(DataType dataType, List objects) { List listOfList = (List) object; if (listOfList.isEmpty()) { // struct field value is empty, fill the VectorArray with zero-dim vectors? - builder.addData(VectorField.newBuilder().build()); + VectorField.Builder vfBuilder = VectorField.newBuilder().setDim(dim); + if (dataType == DataType.FloatVector) { + vfBuilder.setFloatVector(FloatArray.newBuilder().build()); + } else { + // not supported yet + throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Unsupported type: " + dataType.name()); + } + builder.addData(vfBuilder.build()); continue; } VectorField vf = ParamUtils.genVectorField(dataType, listOfList); - if (vf.getDim() == 0) { - throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Vector cannot be empty list"); - } - if (builder.getDataCount() == 0) { - builder.setDim(vf.getDim()); - } else if (builder.getDim() != vf.getDim()) { - String msg = String.format("Dimension mismatch for vector field, the first dimension: %d, mismatched: %d", - builder.getDim(), vf.getDim()); + if (vf.getDim() != dim) { + String msg = String.format("Dimension mismatch for vector field, schema dimension: %d, actual dimension: %d", + dim, vf.getDim()); throw new MilvusClientException(ErrorCode.INVALID_PARAMS, msg); } builder.addData(vf); diff --git a/sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java b/sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java index e2be98293..7faac012e 100644 --- a/sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java +++ b/sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java @@ -1282,7 +1282,7 @@ void testStruct() { row.add(normalVectorField, JsonUtils.toJsonTree(utils.generateFloatVector())); JsonArray structArr1 = new JsonArray(); JsonArray structArr2 = new JsonArray(); - for (int k = 0; k < 8; k++) { + for (int k = 0; k < i; k++) { if (k < 5) { JsonObject struct = new JsonObject(); struct.addProperty("aaa", "No." + k); @@ -1308,7 +1308,7 @@ void testStruct() { // upsert JsonObject row = new JsonObject(); - row.addProperty(pkField, 6); + row.addProperty(pkField, 0); row.addProperty(normalScalarField, "update_text"); row.add(normalVectorField, JsonUtils.toJsonTree(utils.generateFloatVector())); JsonArray structArr1 = new JsonArray(); @@ -1318,11 +1318,6 @@ void testStruct() { struct1.addProperty("aaa", "updated_No." + k); struct1.add("vector", JsonUtils.toJsonTree(utils.generateFloatVector(32))); structArr1.add(struct1); - - JsonObject struct2 = new JsonObject(); - struct2.addProperty("bbb", "updated_No." + k); - struct2.add("vector", JsonUtils.toJsonTree(utils.generateFloatVector(64))); - structArr2.add(struct2); } row.add("st1", structArr1); row.add("st2", structArr2); @@ -1336,7 +1331,7 @@ void testStruct() { // query QueryResp queryResp = client.query(QueryReq.builder() .collectionName(randomCollectionName) - .filter(String.format("%s == 6 or %s == 9", pkField, pkField)) + .filter(String.format("%s == 0 or %s == 9", pkField, pkField)) .limit(3) .consistencyLevel(ConsistencyLevel.STRONG) .outputFields(Collections.singletonList("*")) @@ -1376,7 +1371,7 @@ void testStruct() { for (List oneResults : searchResults) { Assertions.assertEquals(topK, oneResults.size()); } - Assertions.assertEquals(6L, (long) searchResults.get(0).get(0).getId()); + Assertions.assertEquals(0L, (long) searchResults.get(0).get(0).getId()); Assertions.assertEquals(9L, (long) searchResults.get(1).get(0).getId()); }