Vector store impls: code cleanup and checkstyle fixes

Signed-off-by: Soby Chacko <soby.chacko@broadcom.com>
This commit is contained in:
Soby Chacko
2025-02-11 16:16:45 -05:00
parent bdd0aa118a
commit 3f0557b8b3
15 changed files with 86 additions and 107 deletions

View File

@@ -57,7 +57,6 @@ import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.observation.conventions.VectorStoreProvider;

View File

@@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@@ -19,7 +19,6 @@ package org.springframework.ai.chroma.vectorstore;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.Test;

View File

@@ -26,7 +26,6 @@ import java.util.stream.Collectors;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.elasticsearch.core.BulkResponse;
import co.elastic.clients.elasticsearch.core.DeleteByQueryResponse;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem;
import co.elastic.clients.elasticsearch.core.search.Hit;
@@ -41,10 +40,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentMetadata;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
import org.springframework.ai.model.EmbeddingUtils;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric;

View File

@@ -54,7 +54,6 @@ import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.Filter.Expression;
import org.springframework.ai.vectorstore.filter.Filter.ExpressionType;
import org.springframework.ai.vectorstore.filter.Filter.Key;

View File

@@ -19,7 +19,6 @@ package org.springframework.ai.vectorstore.gemfire;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonInclude;
@@ -32,10 +31,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentMetadata;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.util.JacksonUtils;
import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder;

View File

@@ -18,7 +18,6 @@ package org.springframework.ai.vectorstore.hanadb;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import com.fasterxml.jackson.core.JsonProcessingException;

View File

@@ -32,10 +32,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric;
import org.springframework.ai.util.JacksonUtils;

View File

@@ -54,10 +54,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentMetadata;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
import org.springframework.ai.model.EmbeddingUtils;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric;

View File

@@ -19,14 +19,12 @@ package org.springframework.ai.vectorstore.opensearch;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.TimeZone;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

View File

@@ -39,10 +39,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.ai.document.Document;
import org.springframework.ai.document.DocumentMetadata;
import org.springframework.ai.embedding.BatchingStrategy;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.embedding.EmbeddingOptionsBuilder;
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
import org.springframework.ai.observation.conventions.VectorStoreProvider;
import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric;
import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder;

View File

@@ -47,12 +47,12 @@ import org.springframework.ai.document.id.RandomIdGenerator;
import org.springframework.ai.embedding.EmbeddingModel;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIdType;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIndexType;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.FilterExpressionTextParser.FilterExpressionParseException;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIdType;
import org.springframework.ai.vectorstore.pgvector.PgVectorStore.PgIndexType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -560,9 +560,9 @@ public class PgVectorStoreIT {
public VectorStore vectorStore(JdbcTemplate jdbcTemplate, EmbeddingModel embeddingModel) {
return PgVectorStore.builder(jdbcTemplate, embeddingModel)
.dimensions(PgVectorStore.INVALID_EMBEDDING_DIMENSION)
.idType(idType)
.idType(this.idType)
.distanceType(this.distanceType)
.initializeSchema(initializeSchema)
.initializeSchema(this.initializeSchema)
.indexType(PgIndexType.HNSW)
.removeExistingVectorStoreTable(true)
.build();

View File

@@ -419,6 +419,58 @@ public class PineconeVectorStore extends AbstractObservationVectorStore {
this.indexName = indexName;
}
/**
* Sets the Pinecone namespace. Note: The free-tier (gcp-starter) doesn't support
* Namespaces.
* @param namespace The namespace to use (leave empty for free tier)
* @return The builder instance
*/
public Builder namespace(@Nullable String namespace) {
this.namespace = namespace != null ? namespace : "";
return this;
}
/**
* Sets the content field name.
* @param contentFieldName The content field name to use
* @return The builder instance
*/
public Builder contentFieldName(@Nullable String contentFieldName) {
this.contentFieldName = contentFieldName != null ? contentFieldName : CONTENT_FIELD_NAME;
return this;
}
/**
* Sets the distance metadata field name.
* @param distanceMetadataFieldName The distance metadata field name to use
* @return The builder instance
*/
public Builder distanceMetadataFieldName(@Nullable String distanceMetadataFieldName) {
this.distanceMetadataFieldName = distanceMetadataFieldName != null ? distanceMetadataFieldName
: DocumentMetadata.DISTANCE.value();
return this;
}
/**
* Sets the server-side timeout.
* @param serverSideTimeout The timeout duration to use
* @return The builder instance
*/
public Builder serverSideTimeout(@Nullable Duration serverSideTimeout) {
this.serverSideTimeout = serverSideTimeout != null ? serverSideTimeout : Duration.ofSeconds(20);
return this;
}
/**
* Builds a new PineconeVectorStore instance with the configured properties.
* @return A new PineconeVectorStore instance
* @throws IllegalStateException if the builder is in an invalid state
*/
@Override
public PineconeVectorStore build() {
return new PineconeVectorStore(this);
}
/**
* First step interface requiring API key configuration.
*/
@@ -487,40 +539,6 @@ public class PineconeVectorStore extends AbstractObservationVectorStore {
*/
public static class StepBuilder {
private record ApiKeyStep(EmbeddingModel embeddingModel) implements BuilderWithApiKey {
@Override
public BuilderWithProjectId apiKey(String apiKey) {
Assert.hasText(apiKey, "ApiKey must not be null or empty");
return new ProjectIdStep(embeddingModel, apiKey);
}
}
private record ProjectIdStep(EmbeddingModel embeddingModel, String apiKey) implements BuilderWithProjectId {
@Override
public BuilderWithEnvironment projectId(String projectId) {
Assert.hasText(projectId, "ProjectId must not be null or empty");
return new EnvironmentStep(embeddingModel, apiKey, projectId);
}
}
private record EnvironmentStep(EmbeddingModel embeddingModel, String apiKey,
String projectId) implements BuilderWithEnvironment {
@Override
public BuilderWithIndexName environment(String environment) {
Assert.hasText(environment, "Environment must not be null or empty");
return new IndexNameStep(embeddingModel, apiKey, projectId, environment);
}
}
private record IndexNameStep(EmbeddingModel embeddingModel, String apiKey, String projectId,
String environment) implements BuilderWithIndexName {
@Override
public Builder indexName(String indexName) {
Assert.hasText(indexName, "IndexName must not be null or empty");
return new Builder(embeddingModel, apiKey, projectId, environment, indexName);
}
}
/**
* Initiates the step builder sequence with the embedding model.
* @param embeddingModel The embedding model to use
@@ -532,58 +550,40 @@ public class PineconeVectorStore extends AbstractObservationVectorStore {
return new ApiKeyStep(embeddingModel);
}
}
private record ApiKeyStep(EmbeddingModel embeddingModel) implements BuilderWithApiKey {
@Override
public BuilderWithProjectId apiKey(String apiKey) {
Assert.hasText(apiKey, "ApiKey must not be null or empty");
return new ProjectIdStep(this.embeddingModel, apiKey);
}
}
/**
* Sets the Pinecone namespace. Note: The free-tier (gcp-starter) doesn't support
* Namespaces.
* @param namespace The namespace to use (leave empty for free tier)
* @return The builder instance
*/
public Builder namespace(@Nullable String namespace) {
this.namespace = namespace != null ? namespace : "";
return this;
}
private record ProjectIdStep(EmbeddingModel embeddingModel, String apiKey) implements BuilderWithProjectId {
@Override
public BuilderWithEnvironment projectId(String projectId) {
Assert.hasText(projectId, "ProjectId must not be null or empty");
return new EnvironmentStep(this.embeddingModel, this.apiKey, projectId);
}
}
/**
* Sets the content field name.
* @param contentFieldName The content field name to use
* @return The builder instance
*/
public Builder contentFieldName(@Nullable String contentFieldName) {
this.contentFieldName = contentFieldName != null ? contentFieldName : CONTENT_FIELD_NAME;
return this;
}
private record EnvironmentStep(EmbeddingModel embeddingModel, String apiKey,
String projectId) implements BuilderWithEnvironment {
@Override
public BuilderWithIndexName environment(String environment) {
Assert.hasText(environment, "Environment must not be null or empty");
return new IndexNameStep(this.embeddingModel, this.apiKey, this.projectId, environment);
}
}
/**
* Sets the distance metadata field name.
* @param distanceMetadataFieldName The distance metadata field name to use
* @return The builder instance
*/
public Builder distanceMetadataFieldName(@Nullable String distanceMetadataFieldName) {
this.distanceMetadataFieldName = distanceMetadataFieldName != null ? distanceMetadataFieldName
: DocumentMetadata.DISTANCE.value();
return this;
}
private record IndexNameStep(EmbeddingModel embeddingModel, String apiKey, String projectId,
String environment) implements BuilderWithIndexName {
@Override
public Builder indexName(String indexName) {
Assert.hasText(indexName, "IndexName must not be null or empty");
return new Builder(this.embeddingModel, this.apiKey, this.projectId, this.environment, indexName);
}
}
/**
* Sets the server-side timeout.
* @param serverSideTimeout The timeout duration to use
* @return The builder instance
*/
public Builder serverSideTimeout(@Nullable Duration serverSideTimeout) {
this.serverSideTimeout = serverSideTimeout != null ? serverSideTimeout : Duration.ofSeconds(20);
return this;
}
/**
* Builds a new PineconeVectorStore instance with the configured properties.
* @return A new PineconeVectorStore instance
* @throws IllegalStateException if the builder is in an invalid state
*/
@Override
public PineconeVectorStore build() {
return new PineconeVectorStore(this);
}
}

View File

@@ -31,7 +31,6 @@ import io.qdrant.client.grpc.Points.PointId;
import io.qdrant.client.grpc.Points.PointStruct;
import io.qdrant.client.grpc.Points.ScoredPoint;
import io.qdrant.client.grpc.Points.SearchPoints;
import io.qdrant.client.grpc.Points.UpdateStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -28,7 +28,6 @@ import java.util.UUID;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.typesense.TypesenseContainer;