diff --git a/langchain4j-mongodb-atlas/pom.xml b/langchain4j-mongodb-atlas/pom.xml index 5f14acd07..9f88d24ce 100644 --- a/langchain4j-mongodb-atlas/pom.xml +++ b/langchain4j-mongodb-atlas/pom.xml @@ -26,13 +26,7 @@ org.mongodb mongodb-driver-sync - 4.11.1 - - - - org.projectlombok - lombok - provided + 4.11.4 diff --git a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/IndexMapping.java b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/IndexMapping.java index b02d9c177..a32622d13 100644 --- a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/IndexMapping.java +++ b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/IndexMapping.java @@ -1,21 +1,17 @@ package dev.langchain4j.store.embedding.mongodb; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - import java.util.HashSet; import java.util.Set; -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class IndexMapping { - private int dimension; - private Set metadataFieldNames; + private final int dimension; + private final Set metadataFieldNames; + + public IndexMapping(int dimension, Set metadataFieldNames) { + this.dimension = dimension; + this.metadataFieldNames = new HashSet<>(metadataFieldNames); + } public static IndexMapping defaultIndexMapping() { return IndexMapping.builder() @@ -23,4 +19,36 @@ public class IndexMapping { .metadataFieldNames(new HashSet<>()) .build(); } + + public int getDimension() { + return dimension; + } + + public Set getMetadataFieldNames() { + return metadataFieldNames; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private int dimension; + private Set metadataFieldNames; + + public Builder dimension(int dimension) { + this.dimension = dimension; + return this; + } + + public Builder metadataFieldNames(Set metadataFieldNames) { + this.metadataFieldNames = metadataFieldNames; + return this; + } + + public IndexMapping build() { + return new IndexMapping(dimension, metadataFieldNames); + } + } } diff --git a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MappingUtils.java b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MappingUtils.java index bc4b512bb..5ec52349e 100644 --- a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MappingUtils.java +++ b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MappingUtils.java @@ -11,14 +11,19 @@ import java.util.Set; class MappingUtils { private MappingUtils() throws InstantiationException { - throw new InstantiationException("can't instantiate this class"); + throw new InstantiationException("Can't instantiate this class"); } static MongoDbDocument toMongoDbDocument(String id, Embedding embedding, TextSegment textSegment) { - if (textSegment == null) { - return new MongoDbDocument(id, embedding.vectorAsList(), null, null); - } - return new MongoDbDocument(id, embedding.vectorAsList(), textSegment.text(), textSegment.metadata().asMap()); + boolean hasTextSegment = textSegment != null; + + return MongoDbDocument.builder() + .id(id) + .embedding(embedding.vectorAsList()) + .text(hasTextSegment ? textSegment.text() : null) + // TODO: change to using Metadata.toMap() + .metadata(hasTextSegment ? textSegment.metadata().asMap() : null) + .build(); } static EmbeddingMatch toEmbeddingMatch(MongoDbMatchedDocument matchedDocument) { diff --git a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbDocument.java b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbDocument.java index 3371aa149..20bef5bf8 100644 --- a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbDocument.java +++ b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbDocument.java @@ -1,18 +1,10 @@ package dev.langchain4j.store.embedding.mongodb; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; import org.bson.codecs.pojo.annotations.BsonId; import java.util.List; import java.util.Map; -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder public class MongoDbDocument { @BsonId @@ -20,4 +12,83 @@ public class MongoDbDocument { private List embedding; private String text; private Map metadata; + + public MongoDbDocument() { + } + + public MongoDbDocument(String id, List embedding, String text, Map metadata) { + this.id = id; + this.embedding = embedding; + this.text = text; + this.metadata = metadata; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getEmbedding() { + return embedding; + } + + public void setEmbedding(List embedding) { + this.embedding = embedding; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private String id; + private List embedding; + private String text; + private Map metadata; + + public Builder id(String id) { + this.id = id; + return this; + } + + public Builder embedding(List embedding) { + this.embedding = embedding; + return this; + } + + public Builder text(String text) { + this.text = text; + return this; + } + + public Builder metadata(Map metadata) { + this.metadata = metadata; + return this; + } + + public MongoDbDocument build() { + return new MongoDbDocument(id, embedding, text, metadata); + } + + } } diff --git a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbMatchedDocument.java b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbMatchedDocument.java index cb4e8a437..0d7e808d5 100644 --- a/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbMatchedDocument.java +++ b/langchain4j-mongodb-atlas/src/main/java/dev/langchain4j/store/embedding/mongodb/MongoDbMatchedDocument.java @@ -1,15 +1,9 @@ package dev.langchain4j.store.embedding.mongodb; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - +import java.util.HashMap; import java.util.List; import java.util.Map; -@Data -@NoArgsConstructor -@AllArgsConstructor public class MongoDbMatchedDocument { private String id; @@ -17,4 +11,55 @@ public class MongoDbMatchedDocument { private String text; private Map metadata; private Double score; + + public MongoDbMatchedDocument() { + } + + public MongoDbMatchedDocument(String id, List embedding, String text, Map metadata, Double score) { + this.id = id; + this.embedding = embedding; + this.text = text; + this.metadata = new HashMap<>(metadata); + this.score = score; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getEmbedding() { + return embedding; + } + + public void setEmbedding(List embedding) { + this.embedding = embedding; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Map getMetadata() { + return metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + public Double getScore() { + return score; + } + + public void setScore(Double score) { + this.score = score; + } } diff --git a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreCloudIT.java b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreCloudIT.java index 34bc4a493..d1624962d 100644 --- a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreCloudIT.java +++ b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreCloudIT.java @@ -16,12 +16,17 @@ import org.bson.conversions.Bson; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; +import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariables; import static java.lang.String.format; import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; -@EnabledIfEnvironmentVariable(named = "MONGODB_ATLAS_USERNAME", matches = ".+") +@EnabledIfEnvironmentVariables({ + @EnabledIfEnvironmentVariable(named = "MONGODB_ATLAS_USERNAME", matches = ".+"), + @EnabledIfEnvironmentVariable(named = "MONGODB_ATLAS_PASSWORD", matches = ".+"), + @EnabledIfEnvironmentVariable(named = "MONGODB_ATLAS_HOST", matches = ".+") +}) class MongoDbEmbeddingStoreCloudIT extends EmbeddingStoreIT { private static final String DATABASE_NAME = "test_database"; diff --git a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreLocalIT.java b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreLocalIT.java index 97dbca506..49cd1c224 100644 --- a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreLocalIT.java +++ b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreLocalIT.java @@ -10,7 +10,6 @@ import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.model.embedding.onnx.allminilml6v2q.AllMiniLmL6V2QuantizedEmbeddingModel; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.EmbeddingStoreIT; -import lombok.SneakyThrows; import org.bson.codecs.configuration.CodecRegistry; import org.bson.codecs.pojo.PojoCodecProvider; import org.bson.conversions.Bson; @@ -49,7 +48,6 @@ class MongoDbEmbeddingStoreLocalIT extends EmbeddingStoreIT { .build(); @BeforeAll - @SneakyThrows static void start() { mongodb.start(); diff --git a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreNativeFilterIT.java b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreNativeFilterIT.java index 50bf0721f..495e5d95e 100644 --- a/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreNativeFilterIT.java +++ b/langchain4j-mongodb-atlas/src/test/java/dev/langchain4j/store/embedding/mongodb/MongoDbEmbeddingStoreNativeFilterIT.java @@ -12,7 +12,6 @@ import dev.langchain4j.model.embedding.onnx.allminilml6v2q.AllMiniLmL6V2Quantize import dev.langchain4j.store.embedding.EmbeddingMatch; import dev.langchain4j.store.embedding.EmbeddingSearchRequest; import dev.langchain4j.store.embedding.EmbeddingStore; -import lombok.SneakyThrows; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -52,7 +51,6 @@ class MongoDbEmbeddingStoreNativeFilterIT { .build(); @BeforeAll - @SneakyThrows static void start() { mongodb.start(); @@ -86,7 +84,7 @@ class MongoDbEmbeddingStoreNativeFilterIT { } @Test - void should_find_relevant_with_filter() { + void should_find_relevant_with_filter() throws Exception { // given TextSegment segment = TextSegment.from("this segment should be found", Metadata.from("test-key", "test-value")); @@ -115,8 +113,7 @@ class MongoDbEmbeddingStoreNativeFilterIT { assertThat(match.embedded()).isEqualTo(segment); } - @SneakyThrows - private void awaitUntilPersisted() { + private void awaitUntilPersisted() throws Exception { Thread.sleep(2000); } }