From 7a68141d84e578f570d3b3ccd42da665875bed25 Mon Sep 17 00:00:00 2001 From: westey <164392973+westey-m@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:00:12 +0100 Subject: [PATCH] Update to latest version of Qdrant SDK. --- dotnet/Directory.Packages.props | 2 +- ...drantVectorStoreCollectionSearchMapping.cs | 21 ++++++++++++++++++- .../QdrantVectorStoreRecordCollection.cs | 20 +++++++++++++++++- ...VectorStoreCollectionSearchMappingTests.cs | 4 +++- .../QdrantVectorStoreRecordCollectionTests.cs | 20 +++++++++++------- 5 files changed, 55 insertions(+), 12 deletions(-) diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props index 57b69e2620ec..dc5d23e892ac 100644 --- a/dotnet/Directory.Packages.props +++ b/dotnet/Directory.Packages.props @@ -157,7 +157,7 @@ - + diff --git a/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreCollectionSearchMapping.cs b/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreCollectionSearchMapping.cs index 15a95467672f..756050d639ff 100644 --- a/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreCollectionSearchMapping.cs +++ b/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreCollectionSearchMapping.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Extensions.VectorData; using Qdrant.Client.Grpc; @@ -103,10 +104,28 @@ public static VectorSearchResult MapScoredPointToVectorSearchResult payloadEntry in point.Payload) { pointStruct.Payload.Add(payloadEntry.Key, payloadEntry.Value); diff --git a/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreRecordCollection.cs b/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreRecordCollection.cs index 760aeaae24f4..24cbd097f422 100644 --- a/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreRecordCollection.cs +++ b/dotnet/src/Connectors/Connectors.Memory.Qdrant/QdrantVectorStoreRecordCollection.cs @@ -461,10 +461,28 @@ private async IAsyncEnumerable GetBatchByPointIdAsync( var pointStruct = new PointStruct { Id = retrievedPoint.Id, - Vectors = retrievedPoint.Vectors, Payload = { } }; + if (includeVectors) + { + pointStruct.Vectors = new(); + switch (retrievedPoint.Vectors.VectorsOptionsCase) + { + case VectorsOutput.VectorsOptionsOneofCase.Vector: + pointStruct.Vectors.Vector = retrievedPoint.Vectors.Vector.Data.ToArray(); + break; + case VectorsOutput.VectorsOptionsOneofCase.Vectors: + pointStruct.Vectors.Vectors_ = new(); + foreach (var v in retrievedPoint.Vectors.Vectors.Vectors) + { + // TODO: Refactor mapper to not require pre-mapping to pointstruct to avoid this ToArray conversion. + pointStruct.Vectors.Vectors_.Vectors.Add(v.Key, v.Value.Data.ToArray()); + } + break; + } + } + foreach (KeyValuePair payloadEntry in retrievedPoint.Payload) { pointStruct.Payload.Add(payloadEntry.Key, payloadEntry.Value); diff --git a/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreCollectionSearchMappingTests.cs b/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreCollectionSearchMappingTests.cs index afd5e545030a..638bc2cbf861 100644 --- a/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreCollectionSearchMappingTests.cs +++ b/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreCollectionSearchMappingTests.cs @@ -92,12 +92,14 @@ public void BuildFilterThrowsForUnknownFieldName() [Fact] public void MapScoredPointToVectorSearchResultMapsResults() { + var responseVector = VectorOutput.Parser.ParseJson("{ \"data\": [1, 2, 3] }"); + // Arrange. var scoredPoint = new ScoredPoint { Id = 1, Payload = { ["storage_DataField"] = "data 1" }, - Vectors = new float[] { 1, 2, 3 }, + Vectors = new VectorsOutput() { Vector = responseVector }, Score = 0.5f }; diff --git a/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreRecordCollectionTests.cs b/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreRecordCollectionTests.cs index 3d071066ae2b..216828137953 100644 --- a/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreRecordCollectionTests.cs +++ b/dotnet/src/Connectors/Connectors.Qdrant.UnitTests/QdrantVectorStoreRecordCollectionTests.cs @@ -691,15 +691,17 @@ private void SetupUpsertMock() private static RetrievedPoint CreateRetrievedPoint(bool hasNamedVectors, TKey recordKey) { + var responseVector = VectorOutput.Parser.ParseJson("{ \"data\": [1, 2, 3, 4] }"); + RetrievedPoint point; if (hasNamedVectors) { - var namedVectors = new NamedVectors(); - namedVectors.Vectors.Add("vector_storage_name", new[] { 1f, 2f, 3f, 4f }); + var namedVectors = new NamedVectorsOutput(); + namedVectors.Vectors.Add("vector_storage_name", responseVector); point = new RetrievedPoint() { Payload = { ["OriginalNameData"] = "data 1", ["data_storage_name"] = "data 1" }, - Vectors = new Vectors { Vectors_ = namedVectors } + Vectors = new VectorsOutput { Vectors = namedVectors } }; } else @@ -707,7 +709,7 @@ private static RetrievedPoint CreateRetrievedPoint(bool hasNamedVectors, T point = new RetrievedPoint() { Payload = { ["OriginalNameData"] = "data 1", ["data_storage_name"] = "data 1" }, - Vectors = new[] { 1f, 2f, 3f, 4f } + Vectors = new VectorsOutput() { Vector = responseVector } }; } @@ -726,16 +728,18 @@ private static RetrievedPoint CreateRetrievedPoint(bool hasNamedVectors, T private static ScoredPoint CreateScoredPoint(bool hasNamedVectors, TKey recordKey) { + var responseVector = VectorOutput.Parser.ParseJson("{ \"data\": [1, 2, 3, 4] }"); + ScoredPoint point; if (hasNamedVectors) { - var namedVectors = new NamedVectors(); - namedVectors.Vectors.Add("vector_storage_name", new[] { 1f, 2f, 3f, 4f }); + var namedVectors = new NamedVectorsOutput(); + namedVectors.Vectors.Add("vector_storage_name", responseVector); point = new ScoredPoint() { Score = 0.5f, Payload = { ["OriginalNameData"] = "data 1", ["data_storage_name"] = "data 1" }, - Vectors = new Vectors { Vectors_ = namedVectors } + Vectors = new VectorsOutput { Vectors = namedVectors } }; } else @@ -744,7 +748,7 @@ private static ScoredPoint CreateScoredPoint(bool hasNamedVectors, TKey re { Score = 0.5f, Payload = { ["OriginalNameData"] = "data 1", ["data_storage_name"] = "data 1" }, - Vectors = new[] { 1f, 2f, 3f, 4f } + Vectors = new VectorsOutput() { Vector = responseVector } }; }