Skip to content

Commit 2668972

Browse files
authored
Support Geometry field (#1627)
Signed-off-by: groot <yihua.mo@zilliz.com>
1 parent 11a3f13 commit 2668972

File tree

12 files changed

+154
-11
lines changed

12 files changed

+154
-11
lines changed

‎docker-compose.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ version: '3.5'
33
services:
44
standalone:
55
container_name: milvus-javasdk-standalone-1
6-
image: milvusdb/milvus:master-20250924-20411e52-amd64
6+
image: milvusdb/milvus:master-20250927-cc53b25b
77
command: [ "milvus", "run", "standalone" ]
88
environment:
99
- COMMON_STORAGETYPE=local
@@ -24,7 +24,7 @@ services:
2424

2525
standaloneslave:
2626
container_name: milvus-javasdk-standalone-2
27-
image: milvusdb/milvus:master-20250924-20411e52-amd64
27+
image: milvusdb/milvus:master-20250927-cc53b25b
2828
command: [ "milvus", "run", "standalone" ]
2929
environment:
3030
- COMMON_STORAGETYPE=local

‎sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/BulkWriter.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ protected Map<String, Object> verifyRow(JsonObject row) {
295295
break;
296296
}
297297
case VarChar:
298+
case Geometry:
298299
case Timestamptz: {
299300
Pair<Object, Integer> objectAndSize = verifyVarchar(obj, field);
300301
rowValues.put(fieldName, objectAndSize.getLeft());

‎sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/common/utils/ParquetUtils.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public static MessageType parseCollectionSchema(CreateCollectionReq.CollectionSc
9494
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.INT64, null, field, false);
9595
break;
9696
case VarChar:
97+
case Geometry:
9798
case Timestamptz:
9899
case JSON:
99100
case SparseFloatVector: // sparse vector is parsed as JSON format string in the server side
@@ -137,7 +138,6 @@ private static void fillArrayType(Types.MessageTypeBuilder messageTypeBuilder, C
137138
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.INT64, null, field, true);
138139
break;
139140
case VarChar:
140-
case Timestamptz:
141141
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.BINARY,
142142
LogicalTypeAnnotation.stringType(), field, true);
143143
break;

‎sdk-bulkwriter/src/main/java/io/milvus/bulkwriter/writer/ParquetFileWriter.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ private void appendGroup(Group group, String paramName, Object value, CreateColl
135135
break;
136136
case VarChar:
137137
case String:
138+
case Geometry:
138139
case Timestamptz:
139140
case JSON:
140141
group.append(paramName, (String)value);
@@ -170,7 +171,6 @@ private void appendGroup(Group group, String paramName, Object value, CreateColl
170171
break;
171172
case String:
172173
case VarChar:
173-
case Timestamptz:
174174
addStringArray(group, paramName, (List<String>) value);
175175
break;
176176
case Bool:

‎sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/BulkWriterTest.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,7 @@ private static void verifyElement(DataType dtype, JsonElement element, Object ob
521521
Assertions.assertEquals(element.getAsDouble(), obj);
522522
break;
523523
case VarChar:
524+
case Geometry:
524525
case Timestamptz:
525526
case JSON:
526527
verifyJsonString(element.getAsString(), ((Utf8)obj).toString());

‎sdk-core/src/main/java/io/milvus/param/ParamUtils.java‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ public static void checkFieldData(FieldType fieldSchema, List<?> values, boolean
270270
break;
271271
case VarChar:
272272
case String:
273+
case Geometry:
273274
case Timestamptz:
274275
for (Object value : values) {
275276
if (checkNullableFieldData(fieldSchema, value, verifyElementType)) {
@@ -419,6 +420,7 @@ public static Object checkFieldValue(String fieldName, DataType dataType, DataTy
419420
return value.getAsDouble(); // return double for genFieldData()
420421
case VarChar:
421422
case String:
423+
case Geometry:
422424
case Timestamptz:
423425
if (!(value.isJsonPrimitive())) {
424426
throw new ParamException(String.format(errMsgs.get(dataType), fieldName));
@@ -466,7 +468,6 @@ public static List<Object> convertJsonArray(JsonArray jsonArray, DataType elemen
466468
case Double:
467469
return JsonUtils.fromJson(jsonArray, new TypeToken<List<Double>>() {}.getType());
468470
case VarChar:
469-
case Timestamptz:
470471
return JsonUtils.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
471472
default:
472473
throw new ParamException(String.format("Unsupported element type of Array field '%s'", fieldName));
@@ -1376,6 +1377,11 @@ public static ScalarField genScalarField(DataType dataType, DataType elementType
13761377
StringArray stringArray = StringArray.newBuilder().addAllData(strings).build();
13771378
return ScalarField.newBuilder().setStringData(stringArray).build();
13781379
}
1380+
case Geometry: {
1381+
List<String> strings = objects.stream().map(p -> (p == null) ? null : (String) p).collect(Collectors.toList());
1382+
GeometryWktArray wktArray = GeometryWktArray.newBuilder().addAllData(strings).build();
1383+
return ScalarField.newBuilder().setGeometryWktData(wktArray).build();
1384+
}
13791385
case JSON: {
13801386
List<ByteString> byteStrings = objects.stream().map(p -> (p == null) ? null : ByteString.copyFromUtf8(p.toString()))
13811387
.collect(Collectors.toList());
@@ -1509,6 +1515,7 @@ public static ValueField objectToValueField(Object obj, DataType dataType) {
15091515
break;
15101516
case VarChar:
15111517
case String:
1518+
case Geometry:
15121519
case Timestamptz:
15131520
if (obj instanceof String) {
15141521
return builder.setStringData((String) obj).build();
@@ -1546,6 +1553,7 @@ public static Object valueFieldToObject(ValueField value, DataType dataType) {
15461553
return value.getBoolData();
15471554
case VarChar:
15481555
case String:
1556+
case Geometry:
15491557
case Timestamptz:
15501558
return value.getStringData();
15511559
case JSON:

‎sdk-core/src/main/java/io/milvus/response/FieldDataWrapper.java‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ public long getRowCount() throws IllegalResponseException {
175175
case String:
176176
case Timestamptz:
177177
return fieldData.getScalars().getStringData().getDataCount();
178+
case Geometry:
179+
return fieldData.getScalars().getGeometryWktData().getDataCount();
178180
case JSON:
179181
return fieldData.getScalars().getJsonData().getDataCount();
180182
case Array:
@@ -247,6 +249,7 @@ private List<?> getFieldDataInternal() throws IllegalResponseException {
247249
case Double:
248250
case VarChar:
249251
case String:
252+
case Geometry:
250253
case Timestamptz:
251254
case JSON:
252255
return getScalarData(dt, fieldData.getScalars(), fieldData.getValidDataList());
@@ -343,13 +346,19 @@ private List<?> getScalarData(DataType dt, ScalarField scalar, List<Boolean> val
343346
return setNoneData(scalar.getDoubleData().getDataList(), validData);
344347
case VarChar:
345348
case String:
346-
case Timestamptz:
349+
case Timestamptz: {
347350
ProtocolStringList protoStrList = scalar.getStringData().getDataList();
348351
return setNoneData(protoStrList.subList(0, protoStrList.size()), validData);
349-
case JSON:
352+
}
353+
case Geometry: {
354+
ProtocolStringList protoGeoList = scalar.getGeometryWktData().getDataList();
355+
return setNoneData(protoGeoList.subList(0, protoGeoList.size()), validData);
356+
}
357+
case JSON: {
350358
List<ByteString> dataList = scalar.getJsonData().getDataList();
351359
return dataList.stream().map(ByteString::toStringUtf8).collect(Collectors.toList());
352-
case Array:
360+
}
361+
case Array: {
353362
List<List<?>> array = new ArrayList<>();
354363
ArrayArray arrArray = scalar.getArrayData();
355364
boolean nullable = validData != null && validData.size() == arrArray.getDataCount();
@@ -362,6 +371,7 @@ private List<?> getScalarData(DataType dt, ScalarField scalar, List<Boolean> val
362371
}
363372
}
364373
return array;
374+
}
365375
default:
366376
return new ArrayList<>();
367377
}

‎sdk-core/src/main/java/io/milvus/v2/common/DataType.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public enum DataType {
3939
VarChar(21), // variable-length strings with a specified maximum length
4040
Array(22),
4141
JSON(23),
42+
Geometry(24),
4243
Timestamptz(26),
4344

4445
BinaryVector(100),

‎sdk-core/src/main/java/io/milvus/v2/service/vector/request/InsertReq.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class InsertReq {
3535
* Sets the row data to insert. The rows list cannot be empty.
3636
*
3737
* Internal class for insert data.
38-
* If dataType is Bool/Int8/Int16/Int32/Int64/Float/Double/Varchar, use JsonObject.addProperty(key, value) to input;
38+
* If dataType is Bool/Int8/Int16/Int32/Int64/Float/Double/Varchar/Geometry/Timestamptz, use JsonObject.addProperty(key, value) to input;
3939
* If dataType is FloatVector, use JsonObject.add(key, gson.toJsonTree(List[Float]) to input;
4040
* If dataType is BinaryVector/Float16Vector/BFloat16Vector/Int8Vector, use JsonObject.add(key, gson.toJsonTree(byte[])) to input;
4141
* If dataType is SparseFloatVector, use JsonObject.add(key, gson.toJsonTree(SortedMap[Long, Float])) to input;

‎sdk-core/src/main/java/io/milvus/v2/service/vector/request/UpsertReq.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ public class UpsertReq {
3333
* Sets the row data to insert. The rows list cannot be empty.
3434
*
3535
* Internal class for insert data.
36-
* If dataType is Bool/Int8/Int16/Int32/Int64/Float/Double/Varchar, use JsonObject.addProperty(key, value) to input;
36+
* If dataType is Bool/Int8/Int16/Int32/Int64/Float/Double/Varchar/Geometry/Timestamptz, use JsonObject.addProperty(key, value) to input;
3737
* If dataType is FloatVector, use JsonObject.add(key, gson.toJsonTree(List[Float]) to input;
3838
* If dataType is BinaryVector/Float16Vector/BFloat16Vector, use JsonObject.add(key, gson.toJsonTree(byte[])) to input;
3939
* If dataType is SparseFloatVector, use JsonObject.add(key, gson.toJsonTree(SortedMap[Long, Float])) to input;
4040
* If dataType is Array, use JsonObject.add(key, gson.toJsonTree(List of Boolean/Integer/Short/Long/Float/Double/String)) to input;
41+
* If dataType is Array and elementType is Struct, use JsonObject.add(key, JsonArray) to input, ensure the JsonArray is a list of JsonObject;
4142
* If dataType is JSON, use JsonObject.add(key, JsonElement) to input;
4243
*
4344
* Note:

0 commit comments

Comments
 (0)