Skip to content

Commit 802ca25

Browse files
committed
fix: apply filters correctly and test the results
Return SearchResult<Map<String, Object>> from nearVectorUntyped
1 parent d889499 commit 802ca25

File tree

7 files changed

+84
-73
lines changed

7 files changed

+84
-73
lines changed

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@
77
import java.util.function.Consumer;
88
import java.util.stream.Collectors;
99

10-
import org.apache.hc.core5.http.HttpStatus;
11-
1210
import com.google.gson.Gson;
1311
import com.google.gson.JsonElement;
1412

1513
import io.weaviate.client.Config;
16-
import io.weaviate.client.base.Result;
17-
import io.weaviate.client.base.WeaviateErrorResponse;
1814
import io.weaviate.client.base.grpc.GrpcClient;
1915
import io.weaviate.client.grpc.protocol.v1.WeaviateProtoProperties.Value;
2016
import io.weaviate.client.grpc.protocol.v1.WeaviateProtoSearchGet.MetadataResult;
@@ -40,12 +36,12 @@ public class SearchClient<T> {
4036
// probably be POJOs rathen than List<MyClass<Something>>.
4137
private final Class<T> cls;
4238

43-
public Result<List<Map<String, Object>>> nearVectorUntyped(float[] vector) {
39+
public SearchResult<Map<String, Object>> nearVectorUntyped(float[] vector) {
4440
return nearVectorUntyped(vector, nop -> {
4541
});
4642
}
4743

48-
public Result<List<Map<String, Object>>> nearVectorUntyped(float[] vector, Consumer<Options> options) {
44+
public SearchResult<Map<String, Object>> nearVectorUntyped(float[] vector, Consumer<Options> options) {
4945
NearVector operator = new NearVector(vector, options);
5046
SearchRequest.Builder req = SearchRequest.newBuilder();
5147
req.setCollection(collection);
@@ -56,23 +52,36 @@ public Result<List<Map<String, Object>>> nearVectorUntyped(float[] vector, Consu
5652
return searchUntyped(req.build());
5753
}
5854

59-
private Result<List<Map<String, Object>>> searchUntyped(SearchRequest req) {
55+
private SearchResult<Map<String, Object>> searchUntyped(SearchRequest req) {
6056
GrpcClient grpc = GrpcClient.create(config, tokenProvider);
6157
try {
62-
SearchReply reply = grpc.search(req);
63-
return new Result<>(HttpStatus.SC_SUCCESS, deserializeUntyped(reply), WeaviateErrorResponse.builder().build());
58+
return deserializeUntyped(grpc.search(req));
6459
} finally {
6560
grpc.shutdown();
6661
}
6762
}
6863

69-
private List<Map<String, Object>> deserializeUntyped(SearchReply reply) {
70-
return reply.getResultsList().stream()
71-
.map(list -> list.getAllFields().entrySet().stream()
72-
.collect(Collectors.toMap(
73-
e -> e.getKey().getJsonName(),
74-
e -> e.getValue())))
75-
.toList();
64+
public static SearchResult<Map<String, Object>> deserializeUntyped(SearchReply reply) {
65+
List<SearchResult.SearchObject<Map<String, Object>>> objects = reply.getResultsList().stream()
66+
.map(res -> {
67+
Map<String, Object> properties = convertProtoMap(res.getProperties().getNonRefProps().getFieldsMap());
68+
69+
MetadataResult meta = res.getMetadata();
70+
SearchResult.SearchObject.SearchMetadata metadata = new SearchResult.SearchObject.SearchMetadata(
71+
meta.getId(),
72+
meta.getDistancePresent() ? meta.getDistance() : null,
73+
GRPC.fromByteString(meta.getVectorBytes()));
74+
75+
return new SearchResult.SearchObject<Map<String, Object>>(properties, metadata);
76+
}).toList();
77+
78+
return new SearchResult<Map<String, Object>>(objects);
79+
// return reply.getResultsList().stream()
80+
// .map(list -> list.getAllFields().entrySet().stream()
81+
// .collect(Collectors.toMap(
82+
// e -> e.getKey().getJsonName(),
83+
// e -> e.getValue())))
84+
// .toList();
7685
}
7786

7887
public SearchResult<T> nearVector(float[] vector) {
@@ -94,8 +103,7 @@ public SearchResult<T> nearVector(float[] vector, Consumer<Options> options) {
94103
private SearchResult<T> search(SearchRequest req) {
95104
GrpcClient grpc = GrpcClient.create(config, tokenProvider);
96105
try {
97-
SearchReply reply = grpc.search(req);
98-
return deserialize(reply);
106+
return deserialize(grpc.search(req));
99107
} finally {
100108
grpc.shutdown();
101109
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,21 @@ void append(SearchRequest.Builder search) {
4242
if (where != null && !where.isEmpty()) {
4343
Filters.Builder filters = Filters.newBuilder();
4444
where.append(filters);
45-
search.setFilters(filters.build());
45+
search.setFilters(filters);
4646
}
4747

4848
if (!returnMetadata.isEmpty()) {
4949
MetadataRequest.Builder metadata = MetadataRequest.newBuilder();
5050
returnMetadata.forEach(m -> m.append(metadata));
51-
search.setMetadata(metadata.build());
51+
search.setMetadata(metadata);
5252
}
5353

5454
if (!returnProperties.isEmpty()) {
5555
PropertiesRequest.Builder properties = PropertiesRequest.newBuilder();
5656
for (String property : returnProperties) {
5757
properties.addNonRefProperties(property);
5858
}
59-
search.setProperties(properties.build());
59+
search.setProperties(properties);
6060
}
6161
}
6262

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44

55
import lombok.AllArgsConstructor;
6+
import lombok.ToString;
67

78
@AllArgsConstructor
89
public class SearchResult<T> {
@@ -14,6 +15,7 @@ public static class SearchObject<T> {
1415
public final SearchMetadata metadata;
1516

1617
@AllArgsConstructor
18+
@ToString
1719
public static class SearchMetadata {
1820
String id;
1921
Float distance;

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public enum Operator {
2222

2323
// Comparison operators
2424
EQUAL("Equal", Filters.Operator.OPERATOR_EQUAL),
25-
NOT_EQUAL("NotEqual", Filters.Operator.OPERATOR_EQUAL),
25+
NOT_EQUAL("NotEqual", Filters.Operator.OPERATOR_NOT_EQUAL),
2626
LESS_THAN("LessThen", Filters.Operator.OPERATOR_LESS_THAN),
2727
LESS_THAN_EQUAL("LessThenEqual", Filters.Operator.OPERATOR_LESS_THAN_EQUAL),
2828
GREATER_THAN("GreaterThen", Filters.Operator.OPERATOR_GREATER_THAN),
@@ -512,18 +512,17 @@ public void append(Filters.Builder where) {
512512
case 1: // no need for operator
513513
operands.get(0).append(where);
514514
return;
515-
case 2: // Comparison operators: eq, gt, lt, like, etc.
516-
operands.forEach(op -> op.append(where));
517-
break;
518515
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-
});
516+
if (operator.equals(Operator.AND) || operator.equals(Operator.OR)) {
517+
operands.forEach(op -> {
518+
Filters.Builder nested = Filters.newBuilder();
519+
op.append(nested);
520+
where.addFilters(nested);
521+
});
522+
} else {
523+
// Comparison operators: eq, gt, lt, like, etc.
524+
operands.forEach(op -> op.append(where));
525+
}
527526
}
528527
operator.append(where);
529528
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ private void addWhereFilters(Filters.Builder where, WhereFilter f) {
347347
case Operator.Equal:
348348
where.setOperator(WeaviateProtoBase.Filters.Operator.OPERATOR_EQUAL);
349349
break;
350+
case Operator.NotEqual:
351+
where.setOperator(WeaviateProtoBase.Filters.Operator.OPERATOR_NOT_EQUAL);
352+
break;
350353
default:
351354
assert false : "unexpected operator: " + f.getOperator();
352355
}

src/main/java/io/weaviate/client/v1/grpc/query/Raw.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
package io.weaviate.client.v1.grpc.query;
22

3-
import java.util.List;
43
import java.util.Map;
5-
import java.util.stream.Collectors;
6-
7-
import org.apache.hc.core5.http.HttpStatus;
84

95
import io.weaviate.client.Config;
10-
import io.weaviate.client.base.Result;
11-
import io.weaviate.client.base.WeaviateErrorResponse;
126
import io.weaviate.client.base.grpc.GrpcClient;
137
import io.weaviate.client.base.http.HttpClient;
148
import io.weaviate.client.grpc.protocol.v1.WeaviateProtoSearchGet.SearchReply;
159
import io.weaviate.client.grpc.protocol.v1.WeaviateProtoSearchGet.SearchRequest;
1610
import io.weaviate.client.v1.auth.provider.AccessTokenProvider;
11+
import io.weaviate.client.v1.experimental.SearchClient;
12+
import io.weaviate.client.v1.experimental.SearchResult;
1713

1814
public class Raw {
1915
private final AccessTokenProvider tokenProvider;
@@ -30,17 +26,11 @@ public Raw withSearch(SearchRequest search) {
3026
return this;
3127
}
3228

33-
public Result<List<Map<String, Object>>> run() {
29+
public SearchResult<Map<String, Object>> run() {
3430
GrpcClient grpcClient = GrpcClient.create(this.config, this.tokenProvider);
3531
try {
3632
SearchReply reply = grpcClient.search(this.search);
37-
List<Map<String, Object>> result = reply.getResultsList().stream()
38-
.map(list -> list.getAllFields().entrySet().stream()
39-
.collect(Collectors.toMap(
40-
e -> e.getKey().getJsonName(),
41-
e -> e.getValue())))
42-
.toList();
43-
return new Result<>(HttpStatus.SC_SUCCESS, result, WeaviateErrorResponse.builder().build());
33+
return SearchClient.deserializeUntyped(reply);
4434
} finally {
4535
grpcClient.shutdown();
4636
}

0 commit comments

Comments
 (0)