Skip to content

Commit 9365e20

Browse files
committed
Fix a defect of QueryReq
Signed-off-by: yhmo <yihua.mo@zilliz.com>
1 parent 951f4a3 commit 9365e20

4 files changed

Lines changed: 82 additions & 22 deletions

File tree

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import io.milvus.v2.service.vector.response.*;
3636
import io.milvus.v2.utils.DataUtils;
3737
import io.milvus.v2.utils.VectorUtils;
38+
import org.apache.commons.collections4.CollectionUtils;
3839
import org.apache.commons.lang3.StringUtils;
3940
import org.slf4j.Logger;
4041
import org.slf4j.LoggerFactory;
@@ -223,14 +224,11 @@ public QueryResp query(MilvusServiceGrpc.MilvusServiceBlockingStub blockingStub,
223224
String dbName = request.getDatabaseName();
224225
String collectionName = request.getCollectionName();
225226
String title = String.format("QueryRequest collectionName:%s, databaseName:%s", collectionName, dbName);
226-
if (request.getFilter() == null && request.getIds() == null) {
227-
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "filter and ids can't be null at the same time");
228-
} else if (request.getFilter() != null && request.getIds() != null) {
227+
if (StringUtils.isNotEmpty(request.getFilter()) && CollectionUtils.isNotEmpty(request.getIds())) {
229228
throw new MilvusClientException(ErrorCode.INVALID_PARAMS, "filter and ids can't be set at the same time");
230229
}
231230

232-
233-
if (request.getIds() != null && request.getFilter() == null) {
231+
if (CollectionUtils.isNotEmpty(request.getIds())) {
234232
DescribeCollectionResponse descResp = getCollectionInfo(blockingStub, dbName, collectionName, false);
235233
String primaryKeyName = "";
236234
List<FieldSchema> fields = descResp.getSchema().getFieldsList();

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public class QueryReq {
3636
@Builder.Default
3737
private List<String> outputFields = Collections.singletonList("*");
3838
private List<Object> ids;
39-
private String filter;
39+
@Builder.Default
40+
private String filter = "";
4041
@Builder.Default
4142
private ConsistencyLevel consistencyLevel = null;
4243
private long offset;

sdk-core/src/main/java/io/milvus/v2/utils/VectorUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public QueryRequest ConvertToGrpcQueryRequest(QueryReq request){
5858
builder.setDbName(dbName);
5959
}
6060

61-
if (request.getFilter() != null && !request.getFilter().isEmpty()) {
61+
if (StringUtils.isNotEmpty(request.getFilter())) {
6262
Map<String, Object> filterTemplateValues = request.getFilterTemplateValues();
6363
filterTemplateValues.forEach((key, value)->{
6464
builder.putExprTemplateValues(key, deduceAndCreateTemplateValue(value));

sdk-core/src/test/java/io/milvus/v2/client/MilvusClientV2DockerTest.java

Lines changed: 76 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,6 @@ private void verifyOutput(JsonObject row, Map<String, Object> entity) {
286286
private long getRowCount(String collectionName) {
287287
QueryResp queryResp = client.query(QueryReq.builder()
288288
.collectionName(collectionName)
289-
.filter("")
290289
.outputFields(Collections.singletonList("count(*)"))
291290
.consistencyLevel(ConsistencyLevel.STRONG)
292291
.build());
@@ -519,21 +518,83 @@ void testFloatVectors() {
519518
verifyOutput(row, entity);
520519
}
521520

522-
// query
523-
QueryResp queryResp = client.query(QueryReq.builder()
524-
.collectionName(randomCollectionName)
525-
.filter("JSON_CONTAINS_ANY(json_field[\"flags\"], [4, 100])")
526-
.build());
527-
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
528-
Assertions.assertEquals(6, queryResults.size());
521+
{
522+
// query with template
523+
Map<String,Object> template = new HashMap<>();
524+
template.put("id_arr", Arrays.asList(5, 6, 7));
525+
QueryResp queryResp = client.query(QueryReq.builder()
526+
.collectionName(randomCollectionName)
527+
.filter("id in {id_arr}")
528+
.filterTemplateValues(template)
529+
.build());
530+
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
531+
Assertions.assertEquals(3, queryResults.size());
532+
}
529533

530-
// test the withTimeout works well
531-
client.withTimeout(1, TimeUnit.NANOSECONDS);
532-
Assertions.assertThrows(MilvusClientException.class, ()->client.query(QueryReq.builder()
533-
.collectionName(randomCollectionName)
534-
.filter("JSON_CONTAINS_ANY(json_field[\"flags\"], [4, 100])")
535-
.consistencyLevel(ConsistencyLevel.STRONG)
536-
.build()));
534+
{
535+
// query with limit
536+
QueryResp queryResp = client.query(QueryReq.builder()
537+
.collectionName(randomCollectionName)
538+
.limit(8)
539+
.build());
540+
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
541+
Assertions.assertEquals(8, queryResults.size());
542+
}
543+
544+
{
545+
// query with limit and filter
546+
QueryResp queryResp = client.query(QueryReq.builder()
547+
.collectionName(randomCollectionName)
548+
.filter("id > 1")
549+
.limit(8)
550+
.build());
551+
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
552+
Assertions.assertEquals(8, queryResults.size());
553+
}
554+
555+
{
556+
// query with ids
557+
QueryResp queryResp = client.query(QueryReq.builder()
558+
.collectionName(randomCollectionName)
559+
.ids(Arrays.asList(1, 5, 10))
560+
.build());
561+
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
562+
Assertions.assertEquals(3, queryResults.size());
563+
}
564+
565+
{
566+
// query error with 0 limit and empty filter
567+
Assertions.assertThrows(MilvusClientException.class, () -> client.query(QueryReq.builder()
568+
.collectionName(randomCollectionName)
569+
.build()));
570+
}
571+
572+
{
573+
// query error with ids and filter
574+
Assertions.assertThrows(MilvusClientException.class, () -> client.query(QueryReq.builder()
575+
.collectionName(randomCollectionName)
576+
.filter("id > 1")
577+
.ids(Arrays.asList(1, 3, 5))
578+
.build()));
579+
}
580+
581+
{
582+
// query timeout
583+
QueryResp queryResp = client.query(QueryReq.builder()
584+
.collectionName(randomCollectionName)
585+
.filter("JSON_CONTAINS_ANY(json_field[\"flags\"], [4, 100])")
586+
.build());
587+
List<QueryResp.QueryResult> queryResults = queryResp.getQueryResults();
588+
Assertions.assertEquals(6, queryResults.size());
589+
590+
// test the withTimeout works well
591+
client.withTimeout(1, TimeUnit.NANOSECONDS);
592+
Assertions.assertThrows(MilvusClientException.class, () -> client.query(QueryReq.builder()
593+
.collectionName(randomCollectionName)
594+
.filter("JSON_CONTAINS_ANY(json_field[\"flags\"], [4, 100])")
595+
.consistencyLevel(ConsistencyLevel.STRONG)
596+
.build()));
597+
}
537598

538599
client.withTimeout(0, TimeUnit.SECONDS);
539600
client.dropCollection(DropCollectionReq.builder().collectionName(randomCollectionName).build());

0 commit comments

Comments
 (0)