Skip to content

Commit 5487068

Browse files
committed
fix: append nested filters to nested gRPC stubs
Added protobuf.java-util dependency for logging protobuf objects as JSON (debuggging).
1 parent 422817a commit 5487068

File tree

7 files changed

+138
-83
lines changed

7 files changed

+138
-83
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
<oauth2-oidc-sdk.version>11.20.1</oauth2-oidc-sdk.version>
7373
<mock-server.version>5.15.0</mock-server.version>
7474
<protobuf.java.version>4.29.1</protobuf.java.version>
75+
<protobuf.java-util.version>4.29.1</protobuf.java-util.version>
7576
<grpc-netty-shaded.version>1.68.2</grpc-netty-shaded.version>
7677
<grpc-protobuf.version>1.68.2</grpc-protobuf.version>
7778
<grpc-stub.version>1.68.2</grpc-stub.version>
@@ -84,6 +85,11 @@
8485
<artifactId>protobuf-java</artifactId>
8586
<version>${protobuf.java.version}</version>
8687
</dependency>
88+
<dependency>
89+
<groupId>com.google.protobuf</groupId>
90+
<artifactId>protobuf-java-util</artifactId>
91+
<version>${protobuf.java-util.version}</version>
92+
</dependency>
8793
<dependency>
8894
<groupId>io.grpc</groupId>
8995
<artifactId>grpc-netty-shaded</artifactId>

src/main/java/io/weaviate/client/v1/experimental/Batcher.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22

33
import java.lang.reflect.Field;
44
import java.util.ArrayList;
5+
import java.util.Date;
56
import java.util.HashMap;
67
import java.util.List;
78
import java.util.Map;
89
import java.util.function.Consumer;
910

11+
import org.apache.commons.lang3.time.DateFormatUtils;
12+
1013
import io.weaviate.client.Config;
1114
import io.weaviate.client.base.Result;
1215
import io.weaviate.client.base.http.HttpClient;
@@ -85,9 +88,15 @@ private Map<String, Object> toMap(T properties) {
8588
for (Field field : cls.getDeclaredFields()) {
8689
field.setAccessible(true);
8790
try {
88-
fieldMap.put(field.getName(), field.get(properties));
91+
Object value = field.get(properties);
92+
// TODO: there will need to be a more delicate way of handling these things
93+
// but this will suffice to demostrate the idea.
94+
if (value instanceof Date) {
95+
value = DateFormatUtils.format((Date) value, "yyyy-MM-dd'T'HH:mm:ssZZZZZ");
96+
}
97+
fieldMap.put(field.getName(), value);
8998
} catch (IllegalAccessException e) {
90-
// Ignore
99+
// Ignore for now
91100
}
92101
}
93102
return fieldMap;

src/main/java/io/weaviate/client/v1/experimental/SearchClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.weaviate.client.v1.experimental;
22

3+
import java.time.OffsetDateTime;
4+
import java.util.Date;
35
import java.util.List;
46
import java.util.Map;
57
import java.util.function.Consumer;
@@ -152,6 +154,9 @@ private static Object convertProtoValue(Value value) {
152154
return value.getIntValue();
153155
} else if (value.hasNumberValue()) {
154156
return value.getNumberValue();
157+
} else if (value.hasDateValue()) {
158+
OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.getDateValue());
159+
return Date.from(offsetDateTime.toInstant());
155160
} else {
156161
assert false : "branch not covered";
157162
}

src/main/java/io/weaviate/client/v1/experimental/Where.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ public static Where or(Map<String, Object> filters, Operator operator) {
8585
}
8686

8787
public static List<Operand> fromMap(Map<String, Object> filters, Operator operator) {
88+
if (operator.equals(Operator.AND) || operator.equals(Operator.OR)) {
89+
// TODO: we will avoid this by not exposing AND/OR operators to the user.
90+
throw new IllegalArgumentException("AND/OR operators are not comparison operators");
91+
}
8892
return filters.entrySet().stream()
8993
.<Operand>map(entry -> new Where(
9094
operator,
@@ -508,9 +512,19 @@ public void append(Filters.Builder where) {
508512
case 1: // no need for operator
509513
operands.getFirst().append(where);
510514
return;
515+
case 2: // Comparison operators: eq, gt, lt, like, etc.
516+
operands.forEach(op -> op.append(where));
517+
break;
518+
default:
519+
assert operator.equals(Operator.AND) || operator.equals(Operator.OR)
520+
: "comparison operators must have max 2 operands";
521+
522+
operands.forEach(op -> {
523+
Filters.Builder nested = Filters.newBuilder();
524+
op.append(nested);
525+
where.addFilters(nested);
526+
});
511527
}
512-
513-
this.operands.forEach(op -> op.append(where));
514528
operator.append(where);
515529
}
516530

@@ -609,7 +623,7 @@ private List<Long> toLongs() {
609623

610624
@Override
611625
public void append(Filters.Builder where) {
612-
where.setValueIntArray(WeaviateProtoBase.IntArray.newBuilder().addAllValues(toLongs()).build());
626+
where.setValueIntArray(WeaviateProtoBase.IntArray.newBuilder().addAllValues(toLongs()));
613627
}
614628
}
615629

src/main/java/io/weaviate/client/v1/filters/WhereFilter.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
package io.weaviate.client.v1.filters;
22

3+
import java.util.Date;
4+
import java.util.function.Consumer;
5+
6+
import org.apache.commons.lang3.ArrayUtils;
7+
38
import lombok.AccessLevel;
49
import lombok.Builder;
510
import lombok.EqualsAndHashCode;
611
import lombok.Getter;
712
import lombok.ToString;
813
import lombok.experimental.FieldDefaults;
9-
import org.apache.commons.lang3.ArrayUtils;
10-
11-
import java.util.Date;
12-
import java.util.function.Consumer;
1314

1415
@Getter
1516
@ToString
@@ -31,11 +32,15 @@ public class WhereFilter {
3132
Double valueNumber;
3233
Double[] valueNumberArray;
3334
/**
34-
* As of Weaviate v1.19 'valueString' is deprecated and replaced by 'valueText'.<br>
35-
* See <a href="https://weaviate.io/developers/weaviate/config-refs/datatypes#introduction">data types</a>
35+
* As of Weaviate v1.19 'valueString' is deprecated and replaced by
36+
* 'valueText'.<br>
37+
* See <a href=
38+
* "https://weaviate.io/developers/weaviate/config-refs/datatypes#introduction">data
39+
* types</a>
3640
*/
3741
@Deprecated
3842
String valueString;
43+
@Deprecated
3944
String[] valueStringArray;
4045
String valueText;
4146
String[] valueTextArray;
@@ -44,7 +49,6 @@ public static WhereFilterBuilder builder() {
4449
return new WhereFilterBuilder();
4550
}
4651

47-
4852
public static class WhereFilterBuilder {
4953
private WhereFilter[] operands;
5054
private String operator;
@@ -62,38 +66,49 @@ public WhereFilterBuilder operands(WhereFilter... operands) {
6266
this.operands = operands;
6367
return this;
6468
}
69+
6570
public WhereFilterBuilder operator(String operator) {
6671
this.operator = operator;
6772
return this;
6873
}
74+
6975
public WhereFilterBuilder path(String... path) {
7076
this.path = path;
7177
return this;
7278
}
79+
7380
public WhereFilterBuilder valueBoolean(Boolean... valueBoolean) {
7481
valueBooleanArray = valueBoolean;
7582
return this;
7683
}
84+
7785
public WhereFilterBuilder valueDate(Date... valueDate) {
7886
valueDateArray = valueDate;
7987
return this;
8088
}
89+
8190
public WhereFilterBuilder valueInt(Integer... valueInt) {
8291
valueIntArray = valueInt;
8392
return this;
8493
}
94+
8595
public WhereFilterBuilder valueNumber(Double... valueNumber) {
8696
valueNumberArray = valueNumber;
8797
return this;
8898
}
99+
100+
/** Deprecated: use {@link valueText} instead. */
101+
@Deprecated
89102
public WhereFilterBuilder valueString(String... valueString) {
90103
valueStringArray = valueString;
91104
return this;
92105
}
106+
93107
public WhereFilterBuilder valueText(String... valueText) {
94108
valueTextArray = valueText;
95109
return this;
96110
}
111+
97112
public WhereFilterBuilder valueGeoRange(GeoRange valueGeoRange) {
98113
this.valueGeoRange = valueGeoRange;
99114
return this;
@@ -126,7 +141,6 @@ private <T> void assignSingleOrArray(T[] values, Consumer<T> single, Consumer<T[
126141
}
127142
}
128143

129-
130144
@Getter
131145
@Builder
132146
@ToString

src/main/java/io/weaviate/client/v1/graphql/query/builder/GetBuilder.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,10 @@ private void addWhereFilters(Filters.Builder where, WhereFilter f) {
293293

294294
if (ArrayUtils.isNotEmpty(operands)) { // Nested filters
295295
for (WhereFilter op : operands) {
296-
addWhereFilters(where, op);
296+
Filters.Builder nested = Filters.newBuilder();
297+
addWhereFilters(nested, op);
298+
where.addFilters(nested);
299+
// addWhereFilters(where, op);
297300
}
298301
} else { // Individual where clauses (leaves)
299302
if (ArrayUtils.isNotEmpty(f.getPath())) {
@@ -310,19 +313,27 @@ private void addWhereFilters(Filters.Builder where, WhereFilter f) {
310313
} else if (f.getValueIntArray() != null) {
311314
IntArray.Builder arr = IntArray.newBuilder();
312315
Arrays.stream(f.getValueIntArray()).forEach(v -> arr.addValues(v));
313-
where.setValueIntArray(arr.build());
316+
where.setValueIntArray(arr);
314317
} else if (f.getValueNumber() != null) {
315318
where.setValueNumber(f.getValueNumber());
316319
} else if (f.getValueNumberArray() != null) {
317320
NumberArray.Builder arr = NumberArray.newBuilder();
318321
Arrays.stream(f.getValueNumberArray()).forEach(v -> arr.addValues(v));
319-
where.setValueNumberArray(arr.build());
322+
where.setValueNumberArray(arr);
320323
} else if (f.getValueText() != null) {
321324
where.setValueText(f.getValueText());
322325
} else if (f.getValueTextArray() != null) {
323326
TextArray.Builder arr = TextArray.newBuilder();
324327
Arrays.stream(f.getValueTextArray()).forEach(v -> arr.addValues(v));
325-
where.setValueTextArray(arr.build());
328+
where.setValueTextArray(arr);
329+
} else if (f.getValueString() != null) {
330+
where.setValueText(f.getValueString());
331+
} else if (f.getValueStringArray() != null) {
332+
TextArray.Builder arr = TextArray.newBuilder();
333+
Arrays.stream(f.getValueStringArray()).forEach(v -> arr.addValues(v));
334+
where.setValueTextArray(arr);
335+
} else {
336+
assert false : "unexpected WhereFilter value";
326337
}
327338
}
328339

@@ -333,6 +344,11 @@ private void addWhereFilters(Filters.Builder where, WhereFilter f) {
333344
case Operator.Or:
334345
where.setOperator(WeaviateProtoBase.Filters.Operator.OPERATOR_OR);
335346
break;
347+
case Operator.Equal:
348+
where.setOperator(WeaviateProtoBase.Filters.Operator.OPERATOR_EQUAL);
349+
break;
350+
default:
351+
assert false : "unexpected operator: " + f.getOperator();
336352
}
337353
}
338354

0 commit comments

Comments
 (0)