From a4d2ea7047f24bc2570d507fc9da989f1339978c Mon Sep 17 00:00:00 2001 From: Soby Chacko Date: Tue, 17 Dec 2024 16:16:10 -0500 Subject: [PATCH] Hanadb vector store builder refactoring --- .../ROOT/pages/api/vectordbs/hana.adoc | 6 +- ...HanaCloudVectorStoreAutoConfiguration.java | 23 +-- .../{ => hanadb}/HanaCloudVectorStore.java | 131 +++++++++++++++--- .../HanaCloudVectorStoreConfig.java | 34 ++++- .../{ => hanadb}/HanaVectorEntity.java | 2 +- .../{ => hanadb}/HanaVectorRepository.java | 2 +- .../{ => hanadb}/CricketWorldCup.java | 2 +- .../CricketWorldCupHanaController.java | 3 +- .../CricketWorldCupRepository.java | 2 +- .../{ => hanadb}/HanaCloudVectorStoreIT.java | 12 +- .../HanaVectorStoreObservationIT.java | 16 ++- 11 files changed, 190 insertions(+), 43 deletions(-) rename vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaCloudVectorStore.java (64%) rename vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaCloudVectorStoreConfig.java (58%) rename vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaVectorEntity.java (96%) rename vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaVectorRepository.java (96%) rename vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/{ => hanadb}/CricketWorldCup.java (95%) rename vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/{ => hanadb}/CricketWorldCupHanaController.java (97%) rename vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/{ => hanadb}/CricketWorldCupRepository.java (97%) rename vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaCloudVectorStoreIT.java (94%) rename vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/{ => hanadb}/HanaVectorStoreObservationIT.java (95%) diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/hana.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/hana.adoc index 180c72099e1..dcd067d8bac 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/hana.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/hana.adoc @@ -142,7 +142,7 @@ import jakarta.persistence.Table; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.jackson.Jacksonized; -import org.springframework.ai.vectorstore.HanaVectorEntity; +import org.springframework.ai.vectorstore.hanadb.HanaVectorEntity; @Entity @Table(name = "CRICKET_WORLD_CUP") @@ -165,7 +165,7 @@ package com.interviewpedia.spring.ai.hana; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import jakarta.transaction.Transactional; -import org.springframework.ai.vectorstore.HanaVectorRepository; +import org.springframework.ai.vectorstore.hanadb.HanaVectorRepository; import org.springframework.stereotype.Repository; import java.util.List; @@ -246,7 +246,7 @@ import org.springframework.ai.chat.prompt.SystemPromptTemplate; import org.springframework.ai.document.Document; import org.springframework.ai.reader.pdf.PagePdfDocumentReader; import org.springframework.ai.transformer.splitter.TokenTextSplitter; -import org.springframework.ai.vectorstore.HanaCloudVectorStore; +import org.springframework.ai.vectorstore.hanadb.HanaCloudVectorStore; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/hanadb/HanaCloudVectorStoreAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/hanadb/HanaCloudVectorStoreAutoConfiguration.java index b2ffd903926..8c0c856285f 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/hanadb/HanaCloudVectorStoreAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/hanadb/HanaCloudVectorStoreAutoConfiguration.java @@ -21,10 +21,9 @@ import io.micrometer.observation.ObservationRegistry; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.vectorstore.HanaCloudVectorStore; -import org.springframework.ai.vectorstore.HanaCloudVectorStoreConfig; -import org.springframework.ai.vectorstore.HanaVectorEntity; -import org.springframework.ai.vectorstore.HanaVectorRepository; +import org.springframework.ai.vectorstore.hanadb.HanaCloudVectorStore; +import org.springframework.ai.vectorstore.hanadb.HanaVectorEntity; +import org.springframework.ai.vectorstore.hanadb.HanaVectorRepository; import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -39,6 +38,7 @@ * * @author Rahul Mittal * @author Christian Tzolov + * @author Soby Chacko * @since 1.0.0 */ @AutoConfiguration(after = { JpaRepositoriesAutoConfiguration.class }) @@ -53,13 +53,14 @@ public HanaCloudVectorStore vectorStore(HanaVectorRepository observationRegistry, ObjectProvider customObservationConvention) { - return new HanaCloudVectorStore(repository, embeddingModel, - HanaCloudVectorStoreConfig.builder() - .tableName(properties.getTableName()) - .topK(properties.getTopK()) - .build(), - observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP), - customObservationConvention.getIfAvailable(() -> null)); + return HanaCloudVectorStore.builder() + .repository(repository) + .embeddingModel(embeddingModel) + .tableName(properties.getTableName()) + .topK(properties.getTopK()) + .observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP)) + .customObservationConvention(customObservationConvention.getIfAvailable(() -> null)) + .build(); } } diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStore.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java similarity index 64% rename from vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStore.java rename to vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java index 2aa7f984e35..b0799973d62 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStore.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStore.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.util.Collections; import java.util.List; @@ -34,10 +34,12 @@ import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; +import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; +import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext; -import org.springframework.ai.vectorstore.observation.VectorStoreObservationContext.Builder; import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention; +import org.springframework.util.Assert; /** * The SAP HANA Cloud vector engine offers multiple use cases in AI scenarios. @@ -68,6 +70,7 @@ * @author Rahul Mittal * @author Christian Tzolov * @author Sebastien Deleuze + * @author Soby Chacko * @see SAP * HANA Database Vector Engine Guide @@ -79,30 +82,71 @@ public class HanaCloudVectorStore extends AbstractObservationVectorStore { private final HanaVectorRepository repository; - private final EmbeddingModel embeddingModel; + private final String tableName; - private final HanaCloudVectorStoreConfig config; + private final int topK; private final ObjectMapper objectMapper; + /** + * Creates a new HanaCloudVectorStore with basic configuration. + * @param repository the HANA vector repository + * @param embeddingModel the embedding model to use + * @param config the vector store configuration + * @deprecated Since 1.0.0-M5, use {@link #builder()} instead + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public HanaCloudVectorStore(HanaVectorRepository repository, EmbeddingModel embeddingModel, HanaCloudVectorStoreConfig config) { - this(repository, embeddingModel, config, ObservationRegistry.NOOP, null); } + /** + * Creates a new HanaCloudVectorStore with observation configuration. + * @param repository the HANA vector repository + * @param embeddingModel the embedding model to use + * @param config the vector store configuration + * @param observationRegistry the observation registry + * @param customObservationConvention the custom observation convention + * @deprecated Since 1.0.0-M5, use {@link #builder()} instead + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public HanaCloudVectorStore(HanaVectorRepository repository, EmbeddingModel embeddingModel, HanaCloudVectorStoreConfig config, ObservationRegistry observationRegistry, VectorStoreObservationConvention customObservationConvention) { - super(observationRegistry, customObservationConvention); + this(builder().repository(repository) + .embeddingModel(embeddingModel) + .tableName(config.getTableName()) + .topK(config.getTopK()) + .observationRegistry(observationRegistry) + .customObservationConvention(customObservationConvention)); + } + + /** + * Protected constructor that accepts a builder instance. This is the preferred way to + * create new HanaCloudVectorStore instances. + * @param builder the configured builder instance + */ + protected HanaCloudVectorStore(HanaCloudBuilder builder) { + super(builder); - this.repository = repository; - this.embeddingModel = embeddingModel; - this.config = config; + Assert.notNull(builder.repository, "Repository must not be null"); + + this.repository = builder.repository; + this.tableName = builder.tableName; + this.topK = builder.topK; this.objectMapper = JsonMapper.builder().addModules(JacksonUtils.instantiateAvailableModules()).build(); } + /** + * Creates a new builder for configuring and creating HanaCloudVectorStore instances. + * @return a new builder instance + */ + public static HanaCloudBuilder builder() { + return new HanaCloudBuilder(); + } + @Override public void doAdd(List documents) { int count = 1; @@ -111,27 +155,27 @@ public void doAdd(List documents) { document.getId()); String content = document.getContent().replaceAll("\\s+", " "); String embedding = getEmbedding(document); - this.repository.save(this.config.getTableName(), document.getId(), embedding, content); + this.repository.save(this.tableName, document.getId(), embedding, content); } logger.info("Embeddings saved in HanaCloudVectorStore for {} documents", count - 1); } @Override public Optional doDelete(List idList) { - int deleteCount = this.repository.deleteEmbeddingsById(this.config.getTableName(), idList); + int deleteCount = this.repository.deleteEmbeddingsById(this.tableName, idList); logger.info("{} embeddings deleted", deleteCount); return Optional.of(deleteCount == idList.size()); } public int purgeEmbeddings() { - int deleteCount = this.repository.deleteAllEmbeddings(this.config.getTableName()); + int deleteCount = this.repository.deleteAllEmbeddings(this.tableName); logger.info("{} embeddings deleted", deleteCount); return deleteCount; } @Override public List similaritySearch(String query) { - return similaritySearch(SearchRequest.query(query).withTopK(this.config.getTopK())); + return similaritySearch(SearchRequest.query(query).withTopK(this.topK)); } @Override @@ -142,8 +186,8 @@ public List doSimilaritySearch(SearchRequest request) { } String queryEmbedding = getEmbedding(request); - List searchResult = this.repository - .cosineSimilaritySearch(this.config.getTableName(), request.getTopK(), queryEmbedding); + List searchResult = this.repository.cosineSimilaritySearch(this.tableName, + request.getTopK(), queryEmbedding); logger.info("Hana cosine-similarity for query={}, with topK={} returned {} results", request.getQuery(), request.getTopK(), searchResult.size()); @@ -176,8 +220,63 @@ public VectorStoreObservationContext.Builder createObservationContextBuilder(Str return VectorStoreObservationContext.builder(VectorStoreProvider.HANA.value(), operationName) .withDimensions(this.embeddingModel.dimensions()) - .withCollectionName(this.config.getTableName()) + .withCollectionName(this.tableName) .withSimilarityMetric(VectorStoreSimilarityMetric.COSINE.value()); } + /** + * Builder class for creating {@link HanaCloudVectorStore} instances. + *

+ * Provides a fluent API for configuring all aspects of the HANA Cloud vector store. + * + * @since 1.0.0 + */ + public static class HanaCloudBuilder extends AbstractVectorStoreBuilder { + + private HanaVectorRepository repository; + + private String tableName; + + private int topK; + + /** + * Sets the HANA vector repository. + * @param repository the repository to use + * @return the builder instance + * @throws IllegalArgumentException if repository is null + */ + public HanaCloudBuilder repository(HanaVectorRepository repository) { + Assert.notNull(repository, "Repository must not be null"); + this.repository = repository; + return this; + } + + /** + * Sets the table name for vector storage. + * @param tableName the name of the table to use + * @return the builder instance + */ + public HanaCloudBuilder tableName(String tableName) { + this.tableName = tableName; + return this; + } + + /** + * Sets the number of top results to return. + * @param topK the number of results + * @return the builder instance + */ + public HanaCloudBuilder topK(int topK) { + this.topK = topK; + return this; + } + + @Override + public HanaCloudVectorStore build() { + validate(); + return new HanaCloudVectorStore(this); + } + + } + } diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreConfig.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreConfig.java similarity index 58% rename from vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreConfig.java rename to vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreConfig.java index bc56fe9a13f..b17ea0b6247 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreConfig.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreConfig.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; /** * The {@code HanaCloudVectorStoreConfig} class represents the configuration for the @@ -23,7 +23,9 @@ * * @author Rahul Mittal * @since 1.0.0 + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} */ +@Deprecated(since = "1.0.0-M5", forRemoval = true) public final class HanaCloudVectorStoreConfig { private String tableName; @@ -33,34 +35,64 @@ public final class HanaCloudVectorStoreConfig { private HanaCloudVectorStoreConfig() { } + /** + * Creates a new builder for HanaCloudVectorStoreConfig. + * @return a new builder instance + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public static HanaCloudVectorStoreConfigBuilder builder() { return new HanaCloudVectorStoreConfigBuilder(); } + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public String getTableName() { return this.tableName; } + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public int getTopK() { return this.topK; } + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public static class HanaCloudVectorStoreConfigBuilder { private String tableName; private int topK; + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public HanaCloudVectorStoreConfigBuilder tableName(String tableName) { this.tableName = tableName; return this; } + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public HanaCloudVectorStoreConfigBuilder topK(int topK) { this.topK = topK; return this; } + /** + * @deprecated Since 1.0.0-M5, use {@link HanaCloudVectorStore#builder()} + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) public HanaCloudVectorStoreConfig build() { HanaCloudVectorStoreConfig config = new HanaCloudVectorStoreConfig(); config.tableName = this.tableName; diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorEntity.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorEntity.java similarity index 96% rename from vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorEntity.java rename to vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorEntity.java index 7b7109c6a19..ed6d119fef7 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorEntity.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorEntity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import jakarta.persistence.Column; import jakarta.persistence.Id; diff --git a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorRepository.java b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorRepository.java similarity index 96% rename from vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorRepository.java rename to vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorRepository.java index e962006f107..dcfa959c35f 100644 --- a/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/HanaVectorRepository.java +++ b/vector-stores/spring-ai-hanadb-store/src/main/java/org/springframework/ai/vectorstore/hanadb/HanaVectorRepository.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.util.List; diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCup.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCup.java similarity index 95% rename from vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCup.java rename to vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCup.java index 8853ac37fca..67aea2ce84d 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCup.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCup.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java similarity index 97% rename from vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java rename to vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java index f3ffbeab9ac..e3745879a58 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupHanaController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.io.IOException; import java.util.List; @@ -33,6 +33,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.reader.pdf.PagePdfDocumentReader; import org.springframework.ai.transformer.splitter.TokenTextSplitter; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.http.ResponseEntity; diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupRepository.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupRepository.java similarity index 97% rename from vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupRepository.java rename to vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupRepository.java index 2a9aac568f3..a24914b00e9 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupRepository.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/CricketWorldCupRepository.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.util.List; diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreIT.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java similarity index 94% rename from vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreIT.java rename to vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java index c55f52ceca5..7015c31b6aa 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaCloudVectorStoreIT.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaCloudVectorStoreIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.util.List; import java.util.function.Function; @@ -34,6 +34,7 @@ import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.reader.pdf.PagePdfDocumentReader; import org.springframework.ai.transformer.splitter.TokenTextSplitter; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -89,8 +90,13 @@ public static class HanaTestApplication { @Bean public VectorStore hanaCloudVectorStore(CricketWorldCupRepository cricketWorldCupRepository, EmbeddingModel embeddingModel) { - return new HanaCloudVectorStore(cricketWorldCupRepository, embeddingModel, - HanaCloudVectorStoreConfig.builder().tableName("CRICKET_WORLD_CUP").topK(1).build()); + + return HanaCloudVectorStore.builder() + .repository(cricketWorldCupRepository) + .embeddingModel(embeddingModel) + .tableName("CRICKET_WORLD_CUP") + .topK(1) + .build(); } @Bean diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaVectorStoreObservationIT.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaVectorStoreObservationIT.java similarity index 95% rename from vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaVectorStoreObservationIT.java rename to vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaVectorStoreObservationIT.java index c61fb2aaf4e..d537aec4214 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/HanaVectorStoreObservationIT.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/hanadb/HanaVectorStoreObservationIT.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.ai.vectorstore; +package org.springframework.ai.vectorstore.hanadb; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -36,6 +36,8 @@ import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.api.OpenAiApi; +import org.springframework.ai.vectorstore.SearchRequest; +import org.springframework.ai.vectorstore.VectorStore; import org.springframework.ai.vectorstore.observation.DefaultVectorStoreObservationConvention; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.HighCardinalityKeyNames; import org.springframework.ai.vectorstore.observation.VectorStoreObservationDocumentation.LowCardinalityKeyNames; @@ -164,9 +166,15 @@ public TestObservationRegistry observationRegistry() { @Bean public VectorStore hanaCloudVectorStore(CricketWorldCupRepository cricketWorldCupRepository, EmbeddingModel embeddingModel, ObservationRegistry observationRegistry) { - return new HanaCloudVectorStore(cricketWorldCupRepository, embeddingModel, - HanaCloudVectorStoreConfig.builder().tableName(TEST_TABLE_NAME).topK(1).build(), - observationRegistry, null); + + return HanaCloudVectorStore.builder() + .repository(cricketWorldCupRepository) + .embeddingModel(embeddingModel) + .tableName(TEST_TABLE_NAME) + .topK(1) + .observationRegistry(observationRegistry) + .customObservationConvention(null) + .build(); } @Bean