Skip to content

Commit 11a3f13

Browse files
authored
Support Timestamptz field (#1624)
Signed-off-by: yhmo <[email protected]>
1 parent 318e5c2 commit 11a3f13

13 files changed

Lines changed: 153 additions & 6 deletions

File tree

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-20250922-200ee4cb-amd64
6+
image: milvusdb/milvus:master-20250924-20411e52-amd64
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-20250922-200ee4cb-amd64
27+
image: milvusdb/milvus:master-20250924-20411e52-amd64
2828
command: [ "milvus", "run", "standalone" ]
2929
environment:
3030
- COMMON_STORAGETYPE=local

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ protected Map<String, Object> verifyRow(JsonObject row) {
294294
rowSize += objectAndSize.getRight();
295295
break;
296296
}
297-
case VarChar: {
297+
case VarChar:
298+
case Timestamptz: {
298299
Pair<Object, Integer> objectAndSize = verifyVarchar(obj, field);
299300
rowValues.put(fieldName, objectAndSize.getLeft());
300301
rowSize += objectAndSize.getRight();

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

Lines changed: 2 additions & 0 deletions
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 Timestamptz:
9798
case JSON:
9899
case SparseFloatVector: // sparse vector is parsed as JSON format string in the server side
99100
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.BINARY,
@@ -136,6 +137,7 @@ private static void fillArrayType(Types.MessageTypeBuilder messageTypeBuilder, C
136137
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.INT64, null, field, true);
137138
break;
138139
case VarChar:
140+
case Timestamptz:
139141
setMessageType(messageTypeBuilder, PrimitiveType.PrimitiveTypeName.BINARY,
140142
LogicalTypeAnnotation.stringType(), field, true);
141143
break;

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

Lines changed: 2 additions & 0 deletions
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 Timestamptz:
138139
case JSON:
139140
group.append(paramName, (String)value);
140141
break;
@@ -169,6 +170,7 @@ private void appendGroup(Group group, String paramName, Object value, CreateColl
169170
break;
170171
case String:
171172
case VarChar:
173+
case Timestamptz:
172174
addStringArray(group, paramName, (List<String>) value);
173175
break;
174176
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 Timestamptz:
524525
case JSON:
525526
verifyJsonString(element.getAsString(), ((Utf8)obj).toString());
526527
break;

sdk-bulkwriter/src/test/java/io/milvus/bulkwriter/TestUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,8 @@ public List<?> generateRandomArray(DataType eleType, int maxCapacity) {
150150
}
151151
return values;
152152
}
153-
case VarChar: {
153+
case VarChar:
154+
case Timestamptz: {
154155
List<String> values = new ArrayList<>();
155156
for (int i = 0; i < maxCapacity; i++) {
156157
values.add(String.format("varchar_arr_%d", i));

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

Lines changed: 7 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 Timestamptz:
273274
for (Object value : values) {
274275
if (checkNullableFieldData(fieldSchema, value, verifyElementType)) {
275276
continue;
@@ -418,6 +419,7 @@ public static Object checkFieldValue(String fieldName, DataType dataType, DataTy
418419
return value.getAsDouble(); // return double for genFieldData()
419420
case VarChar:
420421
case String:
422+
case Timestamptz:
421423
if (!(value.isJsonPrimitive())) {
422424
throw new ParamException(String.format(errMsgs.get(dataType), fieldName));
423425
}
@@ -464,6 +466,7 @@ public static List<Object> convertJsonArray(JsonArray jsonArray, DataType elemen
464466
case Double:
465467
return JsonUtils.fromJson(jsonArray, new TypeToken<List<Double>>() {}.getType());
466468
case VarChar:
469+
case Timestamptz:
467470
return JsonUtils.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());
468471
default:
469472
throw new ParamException(String.format("Unsupported element type of Array field '%s'", fieldName));
@@ -1367,7 +1370,8 @@ public static ScalarField genScalarField(DataType dataType, DataType elementType
13671370
return ScalarField.newBuilder().setDoubleData(doubleArray).build();
13681371
}
13691372
case String:
1370-
case VarChar: {
1373+
case VarChar:
1374+
case Timestamptz: {
13711375
List<String> strings = objects.stream().map(p -> (p == null) ? null : (String) p).collect(Collectors.toList());
13721376
StringArray stringArray = StringArray.newBuilder().addAllData(strings).build();
13731377
return ScalarField.newBuilder().setStringData(stringArray).build();
@@ -1505,6 +1509,7 @@ public static ValueField objectToValueField(Object obj, DataType dataType) {
15051509
break;
15061510
case VarChar:
15071511
case String:
1512+
case Timestamptz:
15081513
if (obj instanceof String) {
15091514
return builder.setStringData((String) obj).build();
15101515
}
@@ -1541,6 +1546,7 @@ public static Object valueFieldToObject(ValueField value, DataType dataType) {
15411546
return value.getBoolData();
15421547
case VarChar:
15431548
case String:
1549+
case Timestamptz:
15441550
return value.getStringData();
15451551
case JSON:
15461552
return JsonUtils.fromJson(value.getStringData(), JsonObject.class);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ public long getRowCount() throws IllegalResponseException {
173173
return fieldData.getScalars().getDoubleData().getDataCount();
174174
case VarChar:
175175
case String:
176+
case Timestamptz:
176177
return fieldData.getScalars().getStringData().getDataCount();
177178
case JSON:
178179
return fieldData.getScalars().getJsonData().getDataCount();
@@ -246,6 +247,7 @@ private List<?> getFieldDataInternal() throws IllegalResponseException {
246247
case Double:
247248
case VarChar:
248249
case String:
250+
case Timestamptz:
249251
case JSON:
250252
return getScalarData(dt, fieldData.getScalars(), fieldData.getValidDataList());
251253
case ArrayOfStruct:
@@ -341,6 +343,7 @@ private List<?> getScalarData(DataType dt, ScalarField scalar, List<Boolean> val
341343
return setNoneData(scalar.getDoubleData().getDataList(), validData);
342344
case VarChar:
343345
case String:
346+
case Timestamptz:
344347
ProtocolStringList protoStrList = scalar.getStringData().getDataList();
345348
return setNoneData(protoStrList.subList(0, protoStrList.size()), validData);
346349
case JSON:

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+
Timestamptz(26),
4243

4344
BinaryVector(100),
4445
FloatVector(101),

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ public class QueryReq {
4444
private long limit;
4545
private boolean ignoreGrowing;
4646

47+
// Extra parameters for query, timezone, time_fields, etc.
48+
// Make sure the value can be converted to String by String.valueOf().
49+
// For example: {"timezone": "America/Chicago"}
50+
@Builder.Default
51+
private Map<String, Object> queryParams = new HashMap<>();
52+
4753
// Expression template, to improve expression parsing performance in complicated list
4854
// Assume user has a filter = "pk > 3 and city in ["beijing", "shanghai", ......]
4955
// The long list of city will increase the time cost to parse this expression.

0 commit comments

Comments
 (0)