diff --git a/langchain4j-vespa/src/main/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStore.java b/langchain4j-vespa/src/main/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStore.java index e878ad238c..d330a192ef 100644 --- a/langchain4j-vespa/src/main/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStore.java +++ b/langchain4j-vespa/src/main/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStore.java @@ -170,6 +170,12 @@ public class VespaEmbeddingStore implements EmbeddingStore { @Override public void addAll(List ids, List embeddings, List embedded) { + if (isNullOrEmpty(ids) || isNullOrEmpty(embeddings)) { + return; + } + if (ids.size() != embeddings.size()) { + throw new IllegalArgumentException("The list of ids and embeddings must have the same size"); + } if (embedded != null && embeddings.size() != embedded.size()) { throw new IllegalArgumentException("The list of embeddings and embedded must have the same size"); } diff --git a/langchain4j-vespa/src/test/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStoreTest.java b/langchain4j-vespa/src/test/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStoreTest.java index 7c6a312bb4..7c9290024a 100644 --- a/langchain4j-vespa/src/test/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStoreTest.java +++ b/langchain4j-vespa/src/test/java/dev/langchain4j/store/embedding/vespa/VespaEmbeddingStoreTest.java @@ -1,10 +1,14 @@ package dev.langchain4j.store.embedding.vespa; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import dev.langchain4j.data.embedding.Embedding; import java.lang.reflect.Field; import java.nio.file.Paths; import java.time.Duration; +import java.util.List; import org.junit.jupiter.api.Test; class VespaEmbeddingStoreTest { @@ -82,6 +86,30 @@ class VespaEmbeddingStoreTest { assertThat(getFieldValue(store, "logResponses")).isEqualTo(false); } + @Test + void should_throw_when_ids_and_embeddings_have_different_sizes() { + // Given + VespaEmbeddingStore store = + VespaEmbeddingStore.builder().url("https://test.vespa.ai").build(); + Embedding embedding1 = Embedding.from(List.of(1f, 2f, 3f)); + Embedding embedding2 = Embedding.from(List.of(4f, 5f, 6f)); + + // When + Then + assertThatThrownBy(() -> store.addAll(List.of("id1"), List.of(embedding1, embedding2), null)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("same size"); + } + + @Test + void should_not_throw_or_call_server_when_input_is_empty() { + // Given + VespaEmbeddingStore store = + VespaEmbeddingStore.builder().url("https://test.vespa.ai").build(); + + // When + Then - empty input returns before any feeder/server interaction + assertThatCode(() -> store.addAll(List.of(), List.of(), null)).doesNotThrowAnyException(); + } + private Object getFieldValue(Object object, String fieldName) throws Exception { Field field = object.getClass().getDeclaredField(fieldName); field.setAccessible(true);