Skip to content

Commit 25123a5

Browse files
sobychackomarkpollack
authored andcommitted
Add builder pattern to CassandraVectorStore and refactor package name
Introduces a builder pattern for configuring CassandraVectorStore instances and moves the implementation to the org.springframework.ai.vectorstore.cassandra package. This change: - Makes configuration more flexible and type-safe through builder methods - Improves code organization by moving to a dedicated vector store package - Deprecates old constructors in favor of the builder pattern - Adds comprehensive validation of configuration options - Enables better IDE support through method chaining - The builder pattern provides a more maintainable and user-friendly way to configure vector stores while ensuring configuration validity at compile time.
1 parent d3d34c9 commit 25123a5

File tree

21 files changed

+1451
-706
lines changed

21 files changed

+1451
-706
lines changed

spring-ai-docs/src/main/antora/modules/ROOT/pages/api/vectordbs/apache-cassandra.adoc

Lines changed: 133 additions & 108 deletions
Large diffs are not rendered by default.

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfiguration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import com.datastax.oss.driver.api.core.CqlSession;
2020

21-
import org.springframework.ai.chat.memory.CassandraChatMemory;
22-
import org.springframework.ai.chat.memory.CassandraChatMemoryConfig;
21+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemory;
22+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig;
2323
import org.springframework.boot.autoconfigure.AutoConfiguration;
2424
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryProperties.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import org.slf4j.LoggerFactory;
2323

2424
import org.springframework.ai.autoconfigure.chat.memory.CommonChatMemoryProperties;
25-
import org.springframework.ai.chat.memory.CassandraChatMemoryConfig;
25+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig;
2626
import org.springframework.boot.context.properties.ConfigurationProperties;
2727
import org.springframework.lang.Nullable;
2828

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreAutoConfiguration.java

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
import org.springframework.ai.embedding.BatchingStrategy;
2626
import org.springframework.ai.embedding.EmbeddingModel;
2727
import org.springframework.ai.embedding.TokenCountBatchingStrategy;
28-
import org.springframework.ai.vectorstore.CassandraVectorStore;
29-
import org.springframework.ai.vectorstore.CassandraVectorStoreConfig;
28+
import org.springframework.ai.vectorstore.cassandra.CassandraVectorStore;
3029
import org.springframework.ai.vectorstore.observation.VectorStoreObservationConvention;
3130
import org.springframework.beans.factory.ObjectProvider;
3231
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -63,25 +62,21 @@ public CassandraVectorStore vectorStore(EmbeddingModel embeddingModel, Cassandra
6362
ObjectProvider<VectorStoreObservationConvention> customObservationConvention,
6463
BatchingStrategy batchingStrategy) {
6564

66-
var builder = CassandraVectorStoreConfig.builder().withCqlSession(cqlSession);
67-
68-
builder = builder.withKeyspaceName(properties.getKeyspace())
69-
.withTableName(properties.getTable())
70-
.withContentColumnName(properties.getContentColumnName())
71-
.withEmbeddingColumnName(properties.getEmbeddingColumnName())
72-
.withIndexName(properties.getIndexName())
73-
.withFixedThreadPoolExecutorSize(properties.getFixedThreadPoolExecutorSize());
74-
75-
if (!properties.isInitializeSchema()) {
76-
builder = builder.disallowSchemaChanges();
77-
}
78-
if (properties.getReturnEmbeddings()) {
79-
builder = builder.returnEmbeddings();
80-
}
81-
82-
return new CassandraVectorStore(builder.build(), embeddingModel,
83-
observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP),
84-
customObservationConvention.getIfAvailable(() -> null), batchingStrategy);
65+
return CassandraVectorStore.builder()
66+
.session(cqlSession)
67+
.keyspace(properties.getKeyspace())
68+
.table(properties.getTable())
69+
.contentColumnName(properties.getContentColumnName())
70+
.embeddingColumnName(properties.getEmbeddingColumnName())
71+
.indexName(properties.getIndexName())
72+
.fixedThreadPoolExecutorSize(properties.getFixedThreadPoolExecutorSize())
73+
.disallowSchemaChanges(!properties.isInitializeSchema())
74+
.returnEmbeddings(properties.getReturnEmbeddings())
75+
.embeddingModel(embeddingModel)
76+
.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
77+
.customObservationConvention(customObservationConvention.getIfAvailable(() -> null))
78+
.batchingStrategy(batchingStrategy)
79+
.build();
8580
}
8681

8782
@Bean

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStoreProperties.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.slf4j.LoggerFactory;
2222

2323
import org.springframework.ai.autoconfigure.vectorstore.CommonVectorStoreProperties;
24-
import org.springframework.ai.vectorstore.CassandraVectorStoreConfig;
24+
import org.springframework.ai.vectorstore.cassandra.CassandraVectorStore;
2525
import org.springframework.boot.context.properties.ConfigurationProperties;
2626

2727
/**
@@ -37,19 +37,19 @@ public class CassandraVectorStoreProperties extends CommonVectorStoreProperties
3737

3838
private static final Logger logger = LoggerFactory.getLogger(CassandraVectorStoreProperties.class);
3939

40-
private String keyspace = CassandraVectorStoreConfig.DEFAULT_KEYSPACE_NAME;
40+
private String keyspace = CassandraVectorStore.DEFAULT_KEYSPACE_NAME;
4141

42-
private String table = CassandraVectorStoreConfig.DEFAULT_TABLE_NAME;
42+
private String table = CassandraVectorStore.DEFAULT_TABLE_NAME;
4343

4444
private String indexName = null;
4545

46-
private String contentColumnName = CassandraVectorStoreConfig.DEFAULT_CONTENT_COLUMN_NAME;
46+
private String contentColumnName = CassandraVectorStore.DEFAULT_CONTENT_COLUMN_NAME;
4747

48-
private String embeddingColumnName = CassandraVectorStoreConfig.DEFAULT_EMBEDDING_COLUMN_NAME;
48+
private String embeddingColumnName = CassandraVectorStore.DEFAULT_EMBEDDING_COLUMN_NAME;
4949

5050
private boolean returnEmbeddings = false;
5151

52-
private int fixedThreadPoolExecutorSize = CassandraVectorStoreConfig.DEFAULT_ADD_CONCURRENCY;
52+
private int fixedThreadPoolExecutorSize = CassandraVectorStore.DEFAULT_ADD_CONCURRENCY;
5353

5454
public String getKeyspace() {
5555
return this.keyspace;

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfigurationIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.testcontainers.junit.jupiter.Testcontainers;
2727
import org.testcontainers.utility.DockerImageName;
2828

29-
import org.springframework.ai.chat.memory.CassandraChatMemory;
29+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemory;
3030
import org.springframework.ai.chat.messages.AssistantMessage;
3131
import org.springframework.ai.chat.messages.MessageType;
3232
import org.springframework.ai.chat.messages.UserMessage;

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryPropertiesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
import org.junit.jupiter.api.Test;
2222

23-
import org.springframework.ai.chat.memory.CassandraChatMemoryConfig;
23+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig;
2424

2525
import static org.assertj.core.api.Assertions.assertThat;
2626

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vectorstore/cassandra/CassandraVectorStorePropertiesTests.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818

1919
import org.junit.jupiter.api.Test;
2020

21-
import org.springframework.ai.vectorstore.CassandraVectorStoreConfig;
21+
import org.springframework.ai.vectorstore.cassandra.CassandraVectorStore;
22+
import org.springframework.ai.vectorstore.cassandra.CassandraVectorStoreConfig;
2223

2324
import static org.assertj.core.api.Assertions.assertThat;
2425

@@ -31,13 +32,12 @@ class CassandraVectorStorePropertiesTests {
3132
@Test
3233
void defaultValues() {
3334
var props = new CassandraVectorStoreProperties();
34-
assertThat(props.getKeyspace()).isEqualTo(CassandraVectorStoreConfig.DEFAULT_KEYSPACE_NAME);
35-
assertThat(props.getTable()).isEqualTo(CassandraVectorStoreConfig.DEFAULT_TABLE_NAME);
36-
assertThat(props.getContentColumnName()).isEqualTo(CassandraVectorStoreConfig.DEFAULT_CONTENT_COLUMN_NAME);
37-
assertThat(props.getEmbeddingColumnName()).isEqualTo(CassandraVectorStoreConfig.DEFAULT_EMBEDDING_COLUMN_NAME);
35+
assertThat(props.getKeyspace()).isEqualTo(CassandraVectorStore.DEFAULT_KEYSPACE_NAME);
36+
assertThat(props.getTable()).isEqualTo(CassandraVectorStore.DEFAULT_TABLE_NAME);
37+
assertThat(props.getContentColumnName()).isEqualTo(CassandraVectorStore.DEFAULT_CONTENT_COLUMN_NAME);
38+
assertThat(props.getEmbeddingColumnName()).isEqualTo(CassandraVectorStore.DEFAULT_EMBEDDING_COLUMN_NAME);
3839
assertThat(props.getIndexName()).isNull();
39-
assertThat(props.getFixedThreadPoolExecutorSize())
40-
.isEqualTo(CassandraVectorStoreConfig.DEFAULT_ADD_CONCURRENCY);
40+
assertThat(props.getFixedThreadPoolExecutorSize()).isEqualTo(CassandraVectorStore.DEFAULT_ADD_CONCURRENCY);
4141
}
4242

4343
@Test
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.ai.chat.memory;
17+
package org.springframework.ai.chat.memory.cassandra;
1818

1919
import java.time.Instant;
2020
import java.util.ArrayList;
@@ -32,7 +32,8 @@
3232
import com.datastax.oss.driver.api.querybuilder.select.Select;
3333
import com.datastax.oss.driver.shaded.guava.common.base.Preconditions;
3434

35-
import org.springframework.ai.chat.memory.CassandraChatMemoryConfig.SchemaColumn;
35+
import org.springframework.ai.chat.memory.ChatMemory;
36+
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig.SchemaColumn;
3637
import org.springframework.ai.chat.messages.AssistantMessage;
3738
import org.springframework.ai.chat.messages.Message;
3839
import org.springframework.ai.chat.messages.UserMessage;
@@ -42,7 +43,7 @@
4243
CassandraChatMemory.create(CassandraChatMemoryConfig.builder().withTimeToLive(Duration.ofDays(1)).build());
4344
</code>
4445
*
45-
* For example @see org.springframework.ai.chat.memory.CassandraChatMemory
46+
* For example @see org.springframework.ai.chat.memory.cassandra.CassandraChatMemory
4647
*
4748
* @author Mick Semb Wever
4849
* @since 1.0.0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.ai.chat.memory;
17+
package org.springframework.ai.chat.memory.cassandra;
1818

1919
import java.net.InetSocketAddress;
2020
import java.time.Duration;

0 commit comments

Comments
 (0)