Skip to content

Commit 51fcc0b

Browse files
authored
Fix a bug that insert() cannot handle empty struct list (#1723)
Signed-off-by: yhmo <yihua.mo@zilliz.com>
1 parent eaa06d5 commit 51fcc0b

File tree

2 files changed

+18
-21
lines changed

2 files changed

+18
-21
lines changed

sdk-core/src/main/java/io/milvus/v2/utils/DataUtils.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ private static FieldData genStructSubFieldData(CreateCollectionReq.FieldSchema f
350350
FieldData.Builder builder = FieldData.newBuilder().setFieldName(fieldName);
351351

352352
if (ParamUtils.isVectorDataType(dataType)) {
353-
VectorArray vectorArr = genVectorArray(dataType, objects);
353+
VectorArray vectorArr = genVectorArray(dataType, objects, fieldSchema.getDimension());
354354
if (vectorArr.getDim() > 0 && vectorArr.getDim() != fieldSchema.getDimension()) {
355355
String msg = String.format("Dimension mismatch for field %s, expected: %d, actual: %d",
356356
fieldName, fieldSchema.getDimension(), vectorArr.getDim());
@@ -380,8 +380,8 @@ private static FieldData genStructSubFieldData(CreateCollectionReq.FieldSchema f
380380
}
381381

382382
@SuppressWarnings("unchecked")
383-
public static VectorArray genVectorArray(DataType dataType, List<?> objects) {
384-
VectorArray.Builder builder = VectorArray.newBuilder().setElementType(dataType);
383+
public static VectorArray genVectorArray(DataType dataType, List<?> objects, int dim) {
384+
VectorArray.Builder builder = VectorArray.newBuilder().setElementType(dataType).setDim(dim);
385385
switch (dataType) {
386386
case FloatVector:
387387
case BinaryVector:
@@ -398,19 +398,21 @@ public static VectorArray genVectorArray(DataType dataType, List<?> objects) {
398398
List<?> listOfList = (List<?>) object;
399399
if (listOfList.isEmpty()) {
400400
// struct field value is empty, fill the VectorArray with zero-dim vectors?
401-
builder.addData(VectorField.newBuilder().build());
401+
VectorField.Builder vfBuilder = VectorField.newBuilder().setDim(dim);
402+
if (dataType == DataType.FloatVector) {
403+
vfBuilder.setFloatVector(FloatArray.newBuilder().build());
404+
} else {
405+
// not supported yet
406+
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Unsupported type: " + dataType.name());
407+
}
408+
builder.addData(vfBuilder.build());
402409
continue;
403410
}
404411

405412
VectorField vf = ParamUtils.genVectorField(dataType, listOfList);
406-
if (vf.getDim() == 0) {
407-
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "Vector cannot be empty list");
408-
}
409-
if (builder.getDataCount() == 0) {
410-
builder.setDim(vf.getDim());
411-
} else if (builder.getDim() != vf.getDim()) {
412-
String msg = String.format("Dimension mismatch for vector field, the first dimension: %d, mismatched: %d",
413-
builder.getDim(), vf.getDim());
413+
if (vf.getDim() != dim) {
414+
String msg = String.format("Dimension mismatch for vector field, schema dimension: %d, actual dimension: %d",
415+
dim, vf.getDim());
414416
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, msg);
415417
}
416418
builder.addData(vf);

sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,7 +1282,7 @@ void testStruct() {
12821282
row.add(normalVectorField, JsonUtils.toJsonTree(utils.generateFloatVector()));
12831283
JsonArray structArr1 = new JsonArray();
12841284
JsonArray structArr2 = new JsonArray();
1285-
for (int k = 0; k < 8; k++) {
1285+
for (int k = 0; k < i; k++) {
12861286
if (k < 5) {
12871287
JsonObject struct = new JsonObject();
12881288
struct.addProperty("aaa", "No." + k);
@@ -1308,7 +1308,7 @@ void testStruct() {
13081308

13091309
// upsert
13101310
JsonObject row = new JsonObject();
1311-
row.addProperty(pkField, 6);
1311+
row.addProperty(pkField, 0);
13121312
row.addProperty(normalScalarField, "update_text");
13131313
row.add(normalVectorField, JsonUtils.toJsonTree(utils.generateFloatVector()));
13141314
JsonArray structArr1 = new JsonArray();
@@ -1318,11 +1318,6 @@ void testStruct() {
13181318
struct1.addProperty("aaa", "updated_No." + k);
13191319
struct1.add("vector", JsonUtils.toJsonTree(utils.generateFloatVector(32)));
13201320
structArr1.add(struct1);
1321-
1322-
JsonObject struct2 = new JsonObject();
1323-
struct2.addProperty("bbb", "updated_No." + k);
1324-
struct2.add("vector", JsonUtils.toJsonTree(utils.generateFloatVector(64)));
1325-
structArr2.add(struct2);
13261321
}
13271322
row.add("st1", structArr1);
13281323
row.add("st2", structArr2);
@@ -1336,7 +1331,7 @@ void testStruct() {
13361331
// query
13371332
QueryResp queryResp = client.query(QueryReq.builder()
13381333
.collectionName(randomCollectionName)
1339-
.filter(String.format("%s == 6 or %s == 9", pkField, pkField))
1334+
.filter(String.format("%s == 0 or %s == 9", pkField, pkField))
13401335
.limit(3)
13411336
.consistencyLevel(ConsistencyLevel.STRONG)
13421337
.outputFields(Collections.singletonList("*"))
@@ -1376,7 +1371,7 @@ void testStruct() {
13761371
for (List<SearchResp.SearchResult> oneResults : searchResults) {
13771372
Assertions.assertEquals(topK, oneResults.size());
13781373
}
1379-
Assertions.assertEquals(6L, (long) searchResults.get(0).get(0).getId());
1374+
Assertions.assertEquals(0L, (long) searchResults.get(0).get(0).getId());
13801375
Assertions.assertEquals(9L, (long) searchResults.get(1).get(0).getId());
13811376
}
13821377

0 commit comments

Comments
 (0)