From 7c078880ea80b2b0be1bb27ebaeaba9a38138d06 Mon Sep 17 00:00:00 2001 From: yhmo Date: Tue, 9 Dec 2025 10:55:55 +0800 Subject: [PATCH] Fix a bug that max_lenth of Array/Varchar field missed Signed-off-by: yhmo --- .../java/io/milvus/v2/utils/SchemaUtils.java | 3 + .../v2/client/MilvusClientV2DockerTest.java | 111 ++++++++++++++++-- 2 files changed, 101 insertions(+), 13 deletions(-) diff --git a/sdk-core/src/main/java/io/milvus/v2/utils/SchemaUtils.java b/sdk-core/src/main/java/io/milvus/v2/utils/SchemaUtils.java index e9a9f57c2..cd6f8e44a 100644 --- a/sdk-core/src/main/java/io/milvus/v2/utils/SchemaUtils.java +++ b/sdk-core/src/main/java/io/milvus/v2/utils/SchemaUtils.java @@ -325,6 +325,9 @@ public static CreateCollectionReq.FieldSchema convertFieldReqToFieldSchema(AddFi } fieldSchema.setElementType(addFieldReq.getElementType()); fieldSchema.setMaxCapacity(addFieldReq.getMaxCapacity()); + if (addFieldReq.getElementType().equals(io.milvus.v2.common.DataType.VarChar)) { + fieldSchema.setMaxLength(addFieldReq.getMaxLength()); + } } else if (addFieldReq.getDataType().equals(io.milvus.v2.common.DataType.VarChar)) { fieldSchema.setMaxLength(addFieldReq.getMaxLength()); } else if (ParamUtils.isDenseVectorDataType(io.milvus.grpc.DataType.valueOf(addFieldReq.getDataType().name()))) { 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 dd33598c4..b2d8adf59 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 @@ -70,7 +70,6 @@ import io.milvus.v2.service.utility.response.GetQuerySegmentInfoResp; import io.milvus.v2.service.vector.request.*; import io.milvus.v2.service.vector.request.data.*; -import io.milvus.v2.service.vector.request.ranker.BoostRanker; import io.milvus.v2.service.vector.request.ranker.RRFRanker; import io.milvus.v2.service.vector.request.ranker.WeightedRanker; import io.milvus.v2.service.vector.response.*; @@ -313,18 +312,6 @@ private long getRowCount(String dbName, String collectionName) { return (long) queryResults.get(0).getEntity().get("count(*)"); } - @Test - void testAAAA() { - CreateCollectionReq.Function func = CreateCollectionReq.Function.builder() - .name("XXX") - .build(); - BoostRanker ranker = BoostRanker.builder() - .name("AAA") - .weight(2.5f) - .build(); - } - - @Test void testFloatVectors() { CheckHealthResp healthy = client.checkHealth(); @@ -1051,6 +1038,104 @@ void testInt8Vectors() { } } + @Test + void testArray() { + String randomCollectionName = generator.generate(10); + String pkField = "key"; + String vectorField = "vector"; + String arrayField = "array"; + int capacity = 10; + int varcharLength = 88; + CreateCollectionReq.CollectionSchema collectionSchema = CreateCollectionReq.CollectionSchema.builder() + .build(); + collectionSchema.addField(AddFieldReq.builder() + .fieldName(pkField) + .dataType(DataType.Int64) + .isPrimaryKey(true) + .autoID(true) + .build()); + collectionSchema.addField(AddFieldReq.builder() + .fieldName(vectorField) + .dataType(DataType.FloatVector) + .dimension(DIMENSION) + .build()); + collectionSchema.addField(AddFieldReq.builder() + .fieldName(arrayField) + .description("dummy") + .dataType(DataType.Array) + .elementType(DataType.VarChar) + .maxCapacity(capacity) + .maxLength(varcharLength) + .build()); + + List indexParams = new ArrayList<>(); + indexParams.add(IndexParam.builder() + .fieldName(vectorField) + .indexType(IndexParam.IndexType.HNSW) + .metricType(IndexParam.MetricType.COSINE) + .build()); + + client.dropCollection(DropCollectionReq.builder() + .collectionName(randomCollectionName) + .build()); + + CreateCollectionReq requestCreate = CreateCollectionReq.builder() + .collectionName(randomCollectionName) + .collectionSchema(collectionSchema) + .indexParams(indexParams) + .build(); + client.createCollection(requestCreate); + + // describe + DescribeCollectionResp descResp = client.describeCollection(DescribeCollectionReq.builder() + .collectionName(randomCollectionName) + .build()); + CreateCollectionReq.CollectionSchema descSchema = descResp.getCollectionSchema(); + Assertions.assertEquals(3, descSchema.getFieldSchemaList().size()); + CreateCollectionReq.FieldSchema arraySchema = descSchema.getFieldSchemaList().get(2); + Assertions.assertEquals(arrayField, arraySchema.getName()); + Assertions.assertEquals("dummy", arraySchema.getDescription()); + Assertions.assertEquals(DataType.Array, arraySchema.getDataType()); + Assertions.assertEquals(DataType.VarChar, arraySchema.getElementType()); + Assertions.assertEquals(capacity, arraySchema.getMaxCapacity()); + Assertions.assertEquals(varcharLength, arraySchema.getMaxLength()); + + // insert + List rows = new ArrayList<>(); + int count = 20; + for (int i = 0; i < count; i++) { + JsonObject row = new JsonObject(); + row.add(vectorField, JsonUtils.toJsonTree(utils.generateFloatVector())); + List strArray = new ArrayList<>(); + for (int k = i; k < capacity; k++) { + strArray.add(String.format("string-%d-%d", i, k)); + } + row.add(arrayField, JsonUtils.toJsonTree(strArray).getAsJsonArray()); + rows.add(row); + } + + InsertResp insertResp = client.insert(InsertReq.builder() + .collectionName(randomCollectionName) + .data(rows) + .build()); + Assertions.assertEquals(count, insertResp.getInsertCnt()); + + // query + QueryResp queryResp = client.query(QueryReq.builder() + .collectionName(randomCollectionName) + .filter(String.format("ARRAY_CONTAINS(%s, \"string-0-9\")", arrayField)) + .limit(5) + .consistencyLevel(ConsistencyLevel.STRONG) + .outputFields(Collections.singletonList(arrayField)) + .build()); + List queryResults = queryResp.getQueryResults(); + Assertions.assertEquals(1, queryResults.size()); + Assertions.assertTrue(queryResults.get(0).getEntity().containsKey(arrayField)); + Assertions.assertInstanceOf(List.class, queryResults.get(0).getEntity().get(arrayField)); + List arr = (List) queryResults.get(0).getEntity().get(arrayField); + Assertions.assertEquals(capacity, arr.size()); + } + @Test void testStruct() { String randomCollectionName = generator.generate(10);