Skip to content

Commit e37ac40

Browse files
authored
v1.16.0 (#86)
* v1.16.0 Signed-off-by: Anush008 <anushshetty90@gmail.com> * chore: Use dev Signed-off-by: Anush008 <anushshetty90@gmail.com> * test: Use list collections to check for auth instead of health check Signed-off-by: Anush008 <anushshetty90@gmail.com> * feat: Added VectorOutputHelper Signed-off-by: Anush008 <anushshetty90@gmail.com> * matchTextAny Signed-off-by: Anush008 <anushshetty90@gmail.com> * feat: Added new RRF Query helper. Signed-off-by: Anush008 <anushshetty90@gmail.com> * chore: Added one overload for updateVectors null timeout Signed-off-by: Anush008 <anushshetty90@gmail.com> * chore: Updated imports as per qdrant/qdrant#7536 Signed-off-by: Anush008 <anushshetty90@gmail.com> * chore: Bump image and protos to v1.16.0 Signed-off-by: Anush008 <anushshetty90@gmail.com> * feat: Expose getCollectionClusterInfoAsync and getCollectionClusterInfoAsync to high-level client Signed-off-by: Anush008 <anushshetty90@gmail.com> --------- Signed-off-by: Anush008 <anushshetty90@gmail.com>
1 parent af30bab commit e37ac40

File tree

12 files changed

+276
-56
lines changed

12 files changed

+276
-56
lines changed

gradle.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# The version of qdrant to use to download protos
2-
qdrantProtosVersion=v1.15.0
2+
qdrantProtosVersion=v1.16.0
33

44
# The version of qdrant docker image to run integration tests against
5-
qdrantVersion=v1.15.0
5+
qdrantVersion=v1.16.0
66

77
# The version of the client to generate
8-
packageVersion=1.15.0
8+
packageVersion=1.16.0

src/main/java/io/qdrant/client/ConditionFactory.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package io.qdrant.client;
22

3-
import io.qdrant.client.grpc.Points.Condition;
4-
import io.qdrant.client.grpc.Points.DatetimeRange;
5-
import io.qdrant.client.grpc.Points.FieldCondition;
6-
import io.qdrant.client.grpc.Points.Filter;
7-
import io.qdrant.client.grpc.Points.GeoBoundingBox;
8-
import io.qdrant.client.grpc.Points.GeoLineString;
9-
import io.qdrant.client.grpc.Points.GeoPoint;
10-
import io.qdrant.client.grpc.Points.GeoPolygon;
11-
import io.qdrant.client.grpc.Points.GeoRadius;
12-
import io.qdrant.client.grpc.Points.HasIdCondition;
13-
import io.qdrant.client.grpc.Points.HasVectorCondition;
14-
import io.qdrant.client.grpc.Points.IsEmptyCondition;
15-
import io.qdrant.client.grpc.Points.IsNullCondition;
16-
import io.qdrant.client.grpc.Points.Match;
17-
import io.qdrant.client.grpc.Points.NestedCondition;
18-
import io.qdrant.client.grpc.Points.PointId;
19-
import io.qdrant.client.grpc.Points.Range;
20-
import io.qdrant.client.grpc.Points.RepeatedIntegers;
21-
import io.qdrant.client.grpc.Points.RepeatedStrings;
22-
import io.qdrant.client.grpc.Points.ValuesCount;
3+
import io.qdrant.client.grpc.Common.Condition;
4+
import io.qdrant.client.grpc.Common.DatetimeRange;
5+
import io.qdrant.client.grpc.Common.FieldCondition;
6+
import io.qdrant.client.grpc.Common.Filter;
7+
import io.qdrant.client.grpc.Common.GeoBoundingBox;
8+
import io.qdrant.client.grpc.Common.GeoLineString;
9+
import io.qdrant.client.grpc.Common.GeoPoint;
10+
import io.qdrant.client.grpc.Common.GeoPolygon;
11+
import io.qdrant.client.grpc.Common.GeoRadius;
12+
import io.qdrant.client.grpc.Common.HasIdCondition;
13+
import io.qdrant.client.grpc.Common.HasVectorCondition;
14+
import io.qdrant.client.grpc.Common.IsEmptyCondition;
15+
import io.qdrant.client.grpc.Common.IsNullCondition;
16+
import io.qdrant.client.grpc.Common.Match;
17+
import io.qdrant.client.grpc.Common.NestedCondition;
18+
import io.qdrant.client.grpc.Common.PointId;
19+
import io.qdrant.client.grpc.Common.Range;
20+
import io.qdrant.client.grpc.Common.RepeatedIntegers;
21+
import io.qdrant.client.grpc.Common.RepeatedStrings;
22+
import io.qdrant.client.grpc.Common.ValuesCount;
2323
import java.util.List;
2424

2525
/** Convenience methods for constructing {@link Condition} */
@@ -125,6 +125,23 @@ public static Condition matchPhrase(String field, String phrase) {
125125
.build();
126126
}
127127

128+
/**
129+
* Match records where the given field matches any word in the text.
130+
*
131+
* @param field The name of the field
132+
* @param textAny The text to match
133+
* @return a new instance of {@link Condition}
134+
*/
135+
public static Condition matchTextAny(String field, String textAny) {
136+
return Condition.newBuilder()
137+
.setField(
138+
FieldCondition.newBuilder()
139+
.setKey(field)
140+
.setMatch(Match.newBuilder().setTextAny(textAny).build())
141+
.build())
142+
.build();
143+
}
144+
128145
/**
129146
* Match records where the given field matches the given boolean value.
130147
*

src/main/java/io/qdrant/client/ExpressionFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.qdrant.client;
22

3-
import io.qdrant.client.grpc.Points.Condition;
3+
import io.qdrant.client.grpc.Common.Condition;
44
import io.qdrant.client.grpc.Points.DecayParamsExpression;
55
import io.qdrant.client.grpc.Points.DivExpression;
66
import io.qdrant.client.grpc.Points.Expression;

src/main/java/io/qdrant/client/PointIdFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.qdrant.client;
22

3-
import io.qdrant.client.grpc.Points.PointId;
3+
import io.qdrant.client.grpc.Common.PointId;
44
import java.util.UUID;
55

66
/** Convenience methods for constructing {@link PointId} */

src/main/java/io/qdrant/client/QdrantClient.java

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import io.qdrant.client.grpc.Collections.AliasDescription;
1111
import io.qdrant.client.grpc.Collections.AliasOperations;
1212
import io.qdrant.client.grpc.Collections.ChangeAliases;
13+
import io.qdrant.client.grpc.Collections.CollectionClusterInfoRequest;
14+
import io.qdrant.client.grpc.Collections.CollectionClusterInfoResponse;
1315
import io.qdrant.client.grpc.Collections.CollectionDescription;
1416
import io.qdrant.client.grpc.Collections.CollectionExistsRequest;
1517
import io.qdrant.client.grpc.Collections.CollectionExistsResponse;
@@ -35,10 +37,14 @@
3537
import io.qdrant.client.grpc.Collections.RenameAlias;
3638
import io.qdrant.client.grpc.Collections.ShardKey;
3739
import io.qdrant.client.grpc.Collections.UpdateCollection;
40+
import io.qdrant.client.grpc.Collections.UpdateCollectionClusterSetupRequest;
41+
import io.qdrant.client.grpc.Collections.UpdateCollectionClusterSetupResponse;
3842
import io.qdrant.client.grpc.Collections.VectorParams;
3943
import io.qdrant.client.grpc.Collections.VectorParamsMap;
4044
import io.qdrant.client.grpc.Collections.VectorsConfig;
4145
import io.qdrant.client.grpc.CollectionsGrpc;
46+
import io.qdrant.client.grpc.Common.Filter;
47+
import io.qdrant.client.grpc.Common.PointId;
4248
import io.qdrant.client.grpc.JsonWithInt.Value;
4349
import io.qdrant.client.grpc.Points;
4450
import io.qdrant.client.grpc.Points.BatchResult;
@@ -55,11 +61,9 @@
5561
import io.qdrant.client.grpc.Points.DiscoverPoints;
5662
import io.qdrant.client.grpc.Points.DiscoverResponse;
5763
import io.qdrant.client.grpc.Points.FieldType;
58-
import io.qdrant.client.grpc.Points.Filter;
5964
import io.qdrant.client.grpc.Points.GetPoints;
6065
import io.qdrant.client.grpc.Points.GetResponse;
6166
import io.qdrant.client.grpc.Points.PointGroup;
62-
import io.qdrant.client.grpc.Points.PointId;
6367
import io.qdrant.client.grpc.Points.PointStruct;
6468
import io.qdrant.client.grpc.Points.PointVectors;
6569
import io.qdrant.client.grpc.Points.PointsIdsList;
@@ -400,6 +404,35 @@ public ListenableFuture<CollectionInfo> getCollectionInfoAsync(
400404
future, GetCollectionInfoResponse::getResult, MoreExecutors.directExecutor());
401405
}
402406

407+
/**
408+
* Gets detailed information about a collection's cluster setup.
409+
*
410+
* @param collectionName The name of the collection.
411+
* @return a new instance of {@link ListenableFuture}
412+
*/
413+
public ListenableFuture<CollectionClusterInfoResponse> getCollectionClusterInfoAsync(
414+
String collectionName) {
415+
return getCollectionClusterInfoAsync(collectionName, null);
416+
}
417+
418+
/**
419+
* Gets detailed information about a collection's cluster setup.
420+
*
421+
* @param collectionName The name of the collection.
422+
* @param timeout The timeout for the call.
423+
* @return a new instance of {@link ListenableFuture}
424+
*/
425+
public ListenableFuture<CollectionClusterInfoResponse> getCollectionClusterInfoAsync(
426+
String collectionName, @Nullable Duration timeout) {
427+
logger.debug("Get collection cluster info for '{}'", collectionName);
428+
CollectionClusterInfoRequest request =
429+
CollectionClusterInfoRequest.newBuilder().setCollectionName(collectionName).build();
430+
ListenableFuture<CollectionClusterInfoResponse> future =
431+
getCollections(timeout).collectionClusterInfo(request);
432+
addLogFailureCallback(future, "Get collection cluster info");
433+
return future;
434+
}
435+
403436
/**
404437
* Deletes a collection and all its associated data.
405438
*
@@ -511,6 +544,47 @@ public ListenableFuture<CollectionOperationResponse> updateCollectionAsync(
511544
MoreExecutors.directExecutor());
512545
}
513546

547+
/**
548+
* Update cluster setup for a collection
549+
*
550+
* @param updateCollectionClusterSetup The update parameters.
551+
* @return a new instance of {@link ListenableFuture}
552+
*/
553+
public ListenableFuture<UpdateCollectionClusterSetupResponse> updateCollectionClusterSetupAsync(
554+
UpdateCollectionClusterSetupRequest updateCollectionClusterSetup) {
555+
return updateCollectionClusterSetupAsync(updateCollectionClusterSetup, null);
556+
}
557+
558+
/**
559+
* Update cluster setup for a collection
560+
*
561+
* @param updateCollectionClusterSetup The update parameters.
562+
* @param timeout The timeout for the call.
563+
* @return a new instance of {@link ListenableFuture}
564+
*/
565+
public ListenableFuture<UpdateCollectionClusterSetupResponse> updateCollectionClusterSetupAsync(
566+
UpdateCollectionClusterSetupRequest updateCollectionClusterSetup,
567+
@Nullable Duration timeout) {
568+
String collectionName = updateCollectionClusterSetup.getCollectionName();
569+
Preconditions.checkArgument(!collectionName.isEmpty(), "Collection name must not be empty");
570+
logger.debug("Update collection cluster setup'{}'", collectionName);
571+
572+
ListenableFuture<UpdateCollectionClusterSetupResponse> future =
573+
getCollections(timeout).updateCollectionClusterSetup(updateCollectionClusterSetup);
574+
addLogFailureCallback(future, "Update collection");
575+
return Futures.transform(
576+
future,
577+
response -> {
578+
if (!response.getResult()) {
579+
logger.error("Cluster setup of collection '{}' could not be updated", collectionName);
580+
throw new QdrantException(
581+
"Cluster setup of collection '" + collectionName + "' could not be updated");
582+
}
583+
return response;
584+
},
585+
MoreExecutors.directExecutor());
586+
}
587+
514588
/**
515589
* Check if a collection exists
516590
*
@@ -1212,6 +1286,16 @@ public ListenableFuture<UpdateResult> updateVectorsAsync(
12121286
return updateVectorsAsync(requestBuilder.build(), timeout);
12131287
}
12141288

1289+
/**
1290+
* Update named vectors for point.
1291+
*
1292+
* @param request The update point vectors request
1293+
* @return a new instance of {@link ListenableFuture}
1294+
*/
1295+
public ListenableFuture<UpdateResult> updateVectorsAsync(UpdatePointVectors request) {
1296+
return updateVectorsAsync(request, null);
1297+
}
1298+
12151299
/**
12161300
* Update named vectors for point.
12171301
*

src/main/java/io/qdrant/client/QueryFactory.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static io.qdrant.client.VectorInputFactory.multiVectorInput;
44
import static io.qdrant.client.VectorInputFactory.vectorInput;
55

6+
import io.qdrant.client.grpc.Common.PointId;
67
import io.qdrant.client.grpc.Points.ContextInput;
78
import io.qdrant.client.grpc.Points.DiscoverInput;
89
import io.qdrant.client.grpc.Points.Document;
@@ -13,9 +14,9 @@
1314
import io.qdrant.client.grpc.Points.Mmr;
1415
import io.qdrant.client.grpc.Points.NearestInputWithMmr;
1516
import io.qdrant.client.grpc.Points.OrderBy;
16-
import io.qdrant.client.grpc.Points.PointId;
1717
import io.qdrant.client.grpc.Points.Query;
1818
import io.qdrant.client.grpc.Points.RecommendInput;
19+
import io.qdrant.client.grpc.Points.Rrf;
1920
import io.qdrant.client.grpc.Points.Sample;
2021
import io.qdrant.client.grpc.Points.VectorInput;
2122
import java.util.List;
@@ -65,6 +66,16 @@ public static Query fusion(Fusion fusion) {
6566
return Query.newBuilder().setFusion(fusion).build();
6667
}
6768

69+
/**
70+
* Creates a {@link Query} for reciprocal rank fusion (RRF).
71+
*
72+
* @param rrf An instance of {@link Rrf}
73+
* @return a new instance of {@link Query}
74+
*/
75+
public static Query rrf(Rrf rrf) {
76+
return Query.newBuilder().setRrf(rrf).build();
77+
}
78+
6879
/**
6980
* Creates a {@link Query} to order points by a payload field.
7081
*

src/main/java/io/qdrant/client/TargetVectorFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.qdrant.client;
22

3-
import io.qdrant.client.grpc.Points.PointId;
3+
import io.qdrant.client.grpc.Common.PointId;
44
import io.qdrant.client.grpc.Points.TargetVector;
55
import io.qdrant.client.grpc.Points.Vector;
66
import io.qdrant.client.grpc.Points.VectorExample;

src/main/java/io/qdrant/client/VectorFactory.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.qdrant.client;
22

33
import com.google.common.primitives.Floats;
4+
import io.qdrant.client.grpc.Points.DenseVector;
45
import io.qdrant.client.grpc.Points.Document;
56
import io.qdrant.client.grpc.Points.Image;
67
import io.qdrant.client.grpc.Points.InferenceObject;
7-
import io.qdrant.client.grpc.Points.SparseIndices;
8+
import io.qdrant.client.grpc.Points.MultiDenseVector;
9+
import io.qdrant.client.grpc.Points.SparseVector;
810
import io.qdrant.client.grpc.Points.Vector;
911
import java.util.ArrayList;
1012
import java.util.List;
@@ -21,7 +23,9 @@ private VectorFactory() {}
2123
* @return A new instance of {@link Vector}
2224
*/
2325
public static Vector vector(List<Float> values) {
24-
return Vector.newBuilder().addAllData(values).build();
26+
return Vector.newBuilder()
27+
.setDense(DenseVector.newBuilder().addAllData(values).build())
28+
.build();
2529
}
2630

2731
/**
@@ -31,7 +35,9 @@ public static Vector vector(List<Float> values) {
3135
* @return A new instance of {@link Vector}
3236
*/
3337
public static Vector vector(float... values) {
34-
return Vector.newBuilder().addAllData(Floats.asList(values)).build();
38+
return Vector.newBuilder()
39+
.setDense(DenseVector.newBuilder().addAllData(Floats.asList(values)).build())
40+
.build();
3541
}
3642

3743
/**
@@ -43,8 +49,7 @@ public static Vector vector(float... values) {
4349
*/
4450
public static Vector vector(List<Float> vector, List<Integer> indices) {
4551
return Vector.newBuilder()
46-
.addAllData(vector)
47-
.setIndices(SparseIndices.newBuilder().addAllData(indices).build())
52+
.setSparse(SparseVector.newBuilder().addAllValues(vector).addAllIndices(indices).build())
4853
.build();
4954
}
5055

@@ -85,10 +90,13 @@ public static Vector vector(InferenceObject object) {
8590
* @return A new instance of {@link Vector}
8691
*/
8792
public static Vector multiVector(List<List<Float>> vectors) {
88-
int vectorSize = vectors.size();
89-
List<Float> flatVector = vectors.stream().flatMap(List::stream).collect(Collectors.toList());
90-
91-
return Vector.newBuilder().addAllData(flatVector).setVectorsCount(vectorSize).build();
93+
List<DenseVector> denseVectors =
94+
vectors.stream()
95+
.map(v -> DenseVector.newBuilder().addAllData(v).build())
96+
.collect(Collectors.toList());
97+
return Vector.newBuilder()
98+
.setMultiDense(MultiDenseVector.newBuilder().addAllVectors(denseVectors).build())
99+
.build();
92100
}
93101

94102
/**
@@ -98,15 +106,12 @@ public static Vector multiVector(List<List<Float>> vectors) {
98106
* @return A new instance of {@link Vector}
99107
*/
100108
public static Vector multiVector(float[][] vectors) {
101-
int vectorSize = vectors.length;
102-
103-
List<Float> flatVector = new ArrayList<>();
109+
List<DenseVector> denseVectors = new ArrayList<>();
104110
for (float[] vector : vectors) {
105-
for (float value : vector) {
106-
flatVector.add(value);
107-
}
111+
denseVectors.add(DenseVector.newBuilder().addAllData(Floats.asList(vector)).build());
108112
}
109-
110-
return Vector.newBuilder().addAllData(flatVector).setVectorsCount(vectorSize).build();
113+
return Vector.newBuilder()
114+
.setMultiDense(MultiDenseVector.newBuilder().addAllVectors(denseVectors).build())
115+
.build();
111116
}
112117
}

src/main/java/io/qdrant/client/VectorInputFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
import static io.qdrant.client.PointIdFactory.id;
44

55
import com.google.common.primitives.Floats;
6+
import io.qdrant.client.grpc.Common.PointId;
67
import io.qdrant.client.grpc.Points.DenseVector;
78
import io.qdrant.client.grpc.Points.Document;
89
import io.qdrant.client.grpc.Points.Image;
910
import io.qdrant.client.grpc.Points.InferenceObject;
1011
import io.qdrant.client.grpc.Points.MultiDenseVector;
11-
import io.qdrant.client.grpc.Points.PointId;
1212
import io.qdrant.client.grpc.Points.SparseVector;
1313
import io.qdrant.client.grpc.Points.VectorInput;
1414
import java.util.ArrayList;

0 commit comments

Comments
 (0)