Skip to content

Commit cafb7ae

Browse files
committed
feat: support object[] properties
1 parent b61086f commit cafb7ae

9 files changed

Lines changed: 98 additions & 17 deletions

File tree

src/it/java/io/weaviate/integration/CollectionsITest.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,17 +201,30 @@ public void testNestedProperties() throws IOException, Exception {
201201
nsBuildings, c -> c.properties(
202202
Property.object("address", p -> p.nestedProperties(
203203
Property.text("street"),
204-
Property.integer("buildingNr"),
205-
Property.bool("isOneWay")))));
204+
Property.integer("building_nr"),
205+
Property.bool("isOneWay"))),
206+
Property.objectArray("apartments", p -> p.nestedProperties(
207+
Property.integer("door_nr"),
208+
Property.number("area")))));
206209

207210
var config = client.collections.getConfig(nsBuildings);
208211

209-
Assertions.assertThat(config).get()
212+
var properties = Assertions.assertThat(config).get()
210213
.extracting(CollectionConfig::properties, InstanceOfAssertFactories.list(Property.class))
211-
.hasSize(1).first()
214+
.hasSize(2).actual();
215+
216+
Assertions.assertThat(properties.get(0))
212217
.returns("address", Property::propertyName)
218+
.returns(DataType.OBJECT, p -> p.dataTypes().get(0))
213219
.extracting(Property::nestedProperties, InstanceOfAssertFactories.list(Property.class))
214220
.extracting(Property::dataTypes).extracting(types -> types.get(0))
215221
.containsExactly(DataType.TEXT, DataType.INT, DataType.BOOL);
222+
223+
Assertions.assertThat(properties.get(1))
224+
.returns("apartments", Property::propertyName)
225+
.returns(DataType.OBJECT_ARRAY, p -> p.dataTypes().get(0))
226+
.extracting(Property::nestedProperties, InstanceOfAssertFactories.list(Property.class))
227+
.extracting(Property::dataTypes).extracting(types -> types.get(0))
228+
.containsExactly(DataType.INT, DataType.NUMBER);
216229
}
217230
}

src/it/java/io/weaviate/integration/DataITest.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@ public void testDataTypes() throws IOException {
433433
Property.uuidArray("prop_uuid_array"),
434434
Property.textArray("prop_text_array"),
435435
Property.object("prop_object",
436+
p -> p.nestedProperties(
437+
Property.text("marco"))),
438+
Property.objectArray("prop_object_array",
436439
p -> p.nestedProperties(
437440
Property.text("marco")))));
438441

@@ -454,7 +457,8 @@ public void testDataTypes() throws IOException {
454457
Map.entry("prop_date_array", List.of(now, now)),
455458
Map.entry("prop_uuid_array", List.of(uuid, uuid)),
456459
Map.entry("prop_text_array", List.of("a", "b", "c")),
457-
Map.entry("prop_object", Map.of("marco", "polo")));
460+
Map.entry("prop_object", Map.of("marco", "polo")),
461+
Map.entry("prop_object_array", List.of(Map.of("marco", "polo"))));
458462

459463
// Act
460464
var object = types.data.insert(want);
@@ -483,19 +487,31 @@ public void testNestedProperties_insertMany() throws IOException {
483487
nsBuildings, c -> c.properties(
484488
Property.object("address", p -> p.nestedProperties(
485489
Property.text("street"),
486-
Property.integer("buildingNr"),
487-
Property.bool("isOneWay")))));
490+
Property.integer("building_nr"),
491+
Property.bool("isOneWay"))),
492+
Property.objectArray("apartments", p -> p.nestedProperties(
493+
Property.integer("door_nr"),
494+
Property.number("area")))));
488495

489496
var buildings = client.collections.use(nsBuildings);
490497

491-
Map<String, Object> house_1 = Map.of("address", Map.of(
492-
"street", "Burggasse",
493-
"building_nr", 51,
494-
"isOneWay", true));
495-
Map<String, Object> house_2 = Map.of("address", new Address(
496-
"Port Mariland St.",
497-
111,
498-
false));
498+
Map<String, Object> house_1 = Map.of(
499+
"address", Map.of(
500+
"street", "Burggasse",
501+
"building_nr", 51,
502+
"isOneWay", true),
503+
"apartments", List.of(
504+
Map.of("door_nr", 11, "area", 42.2),
505+
Map.of("door_nr", 12, "area", 26.7)));
506+
Map<String, Object> house_2 = Map.of(
507+
"address", new Address(
508+
"Port Mariland St.",
509+
111,
510+
false),
511+
"apartments", new Map[] {
512+
Map.of("door_nr", 21, "area", 42.2),
513+
Map.of("door_nr", 22, "area", 26.7),
514+
});
499515

500516
// Act
501517
var result = buildings.data.insertMany(house_1, house_2);

src/it/java/io/weaviate/integration/ORMITest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,4 +350,8 @@ public void test_partialScan() throws IOException {
350350
.returns(true, Song::hasAward)
351351
.returns(null, Song::monthlyListeners);
352352
}
353+
354+
@Test
355+
public void test_nestedProperties() throws IOException {
356+
}
353357
}

src/main/java/io/weaviate/client6/v1/api/collections/DataType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ public interface DataType {
3434
*/
3535
public static final Set<String> KNOWN_TYPES = ImmutableSet.of(
3636
TEXT, INT, BLOB, BOOL, DATE, UUID, NUMBER, OBJECT,
37-
TEXT_ARRAY, INT_ARRAY, NUMBER_ARRAY, BOOL_ARRAY, DATE_ARRAY, UUID_ARRAY);
37+
TEXT_ARRAY, INT_ARRAY, NUMBER_ARRAY, BOOL_ARRAY, DATE_ARRAY, UUID_ARRAY, OBJECT_ARRAY);
3838
}

src/main/java/io/weaviate/client6/v1/api/collections/data/InsertManyRequest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,15 @@ private static com.google.protobuf.Value marshalValue(Object value) {
200200
protoListValue.setBoolValue(lv);
201201
} else if (listValue instanceof Number lv) {
202202
protoListValue.setNumberValue(lv.doubleValue());
203+
} else if (listValue instanceof Map<?, ?> properties) {
204+
protoListValue.setStructValue(marshalStruct((Map<String, Object>) properties));
205+
} else if (listValue instanceof Record r) {
206+
CollectionDescriptor<? super Record> recordDescriptor = (CollectionDescriptor<? super Record>) CollectionDescriptor
207+
.ofClass(r.getClass());
208+
var properties = recordDescriptor.propertiesReader(r).readProperties();
209+
protoListValue.setStructValue(marshalStruct(properties));
210+
} else {
211+
throw new IllegalArgumentException("data type " + value.getClass() + " is not supported");
203212
}
204213
return protoListValue.build();
205214
})
@@ -259,6 +268,24 @@ private static com.google.protobuf.Value marshalValue(Object value) {
259268
} else if (value instanceof Double[] v) {
260269
values = Arrays.stream(v)
261270
.map(lv -> com.google.protobuf.Value.newBuilder().setNumberValue(lv).build()).toList();
271+
} else if (value instanceof Map[] v) {
272+
values = Arrays.stream(v)
273+
.map(lv -> com.google.protobuf.Value.newBuilder()
274+
.setStructValue(marshalStruct((Map<String, Object>) lv))
275+
.build())
276+
.toList();
277+
} else if (value instanceof Record[] v) {
278+
values = Arrays.stream(v)
279+
.map(lv -> {
280+
// Get the descriptor for each iteration in case the array is heterogenous.
281+
final CollectionDescriptor<? super Record> recordDescriptor = (CollectionDescriptor<? super Record>) CollectionDescriptor
282+
.ofClass(lv.getClass());
283+
var properties = recordDescriptor.propertiesReader(lv).readProperties();
284+
return com.google.protobuf.Value.newBuilder()
285+
.setStructValue(marshalStruct(properties))
286+
.build();
287+
})
288+
.toList();
262289
} else {
263290
throw new IllegalArgumentException("array type " + value.getClass() + " is not supported");
264291
}

src/main/java/io/weaviate/client6/v1/api/collections/query/QueryRequest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,15 @@ private static <T> void setProperty(String property, WeaviateProtoProperties.Val
254254
var dates = list.getDateValues().getValuesList().stream()
255255
.map(DateUtil::fromISO8601).toList();
256256
builder.setOffsetDateTimeArray(property, dates);
257+
} else if (list.hasObjectValues()) {
258+
List<? extends Object> objects = list.getObjectValues().getValuesList().stream()
259+
.map(object -> {
260+
var properties = descriptor.propertiesBuilder();
261+
object.getFieldsMap().entrySet().stream()
262+
.forEach(entry -> setProperty(entry.getKey(), entry.getValue(), properties, descriptor));
263+
return properties.build();
264+
}).toList();
265+
builder.setNestedObjectArray(property, objects);
257266
}
258267
} else if (value.hasObjectValue()) {
259268
var object = value.getObjectValue();

src/main/java/io/weaviate/client6/v1/internal/orm/MapBuilder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public void setNestedObject(String property, Object value) {
8484
properties.put(property, value);
8585
}
8686

87+
@Override
88+
public void setNestedObjectArray(String property, List<? extends Object> value) {
89+
properties.put(property, value);
90+
}
91+
8792
@Override
8893
public Map<String, Object> build() {
8994
return properties;

src/main/java/io/weaviate/client6/v1/internal/orm/PojoBuilder.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,12 @@ public void setOffsetDateTimeArray(String propertyName, List<OffsetDateTime> val
229229

230230
@Override
231231
public void setNestedObject(String propertyName, Object value) {
232-
setValue(propertyName, value);
232+
throw new UnsupportedOperationException("Unimplemented method 'setNestedObjectArray'");
233+
}
234+
235+
@Override
236+
public void setNestedObjectArray(String property, List<? extends Object> value) {
237+
throw new UnsupportedOperationException("Unimplemented method 'setNestedObjectArray'");
233238
}
234239

235240
@Override

src/main/java/io/weaviate/client6/v1/internal/orm/PropertiesBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,7 @@ public interface PropertiesBuilder<T> {
3535

3636
void setNestedObject(String property, Object value);
3737

38+
void setNestedObjectArray(String property, List<? extends Object> value);
39+
3840
T build();
3941
}

0 commit comments

Comments
 (0)