From 3555540426522a08c467da9307a0ee641790d600 Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Mon, 4 Mar 2024 15:18:14 +0100 Subject: [PATCH 1/3] init rework --- astra-db-client/pom.xml | 4 + .../astradb/client/AstraCollection.java} | 7 +- .../astradb/client}/AstraDB.java | 22 +- .../astradb/client}/AstraDBAdmin.java | 12 +- .../astradb/client}/AstraDBRepository.java | 2 +- .../cassio/AbstractCassandraTable.java | 2 +- .../astradb/client}/cassio/AnnQuery.java | 2 +- .../astradb/client}/cassio/AnnResult.java | 2 +- .../astradb/client}/cassio/CassIO.java | 4 +- .../cassio/CassandraSimilarityMetric.java | 2 +- .../cassio/ClusteredMetadataVectorRecord.java | 12 +- .../cassio/ClusteredMetadataVectorTable.java | 4 +- .../client}/cassio/ClusteredRecord.java | 2 +- .../client}/cassio/ClusteredTable.java | 2 +- .../client}/cassio/MetadataVectorRecord.java | 12 +- .../client}/cassio/MetadataVectorTable.java | 2 +- .../astradb/client}/cassio/package-info.java | 2 +- .../astradb/client}/package-info.java | 2 +- .../datastax/astradb/client/v2/AstraDB.java | 241 ++++++++++++++++++ .../astradb/client/v2/AstraDBClients.java | 15 ++ .../com/dtsx/astra/sdk/AstraDBClients.java | 10 - .../client/AstraDatabaseReworkTest.java | 25 ++ .../client/AstraDatabaseTestSuiteIT.java} | 135 +++++----- .../astradb/client}/BreakAstraTest.java | 16 +- .../cassio/ClusteredMetadataVectorStore.java | 7 +- .../client}/cassio/RagPdfVectorTest.java | 4 +- .../cassio/vector/AstraDatabaseDemoTest.java} | 12 +- .../vector/AstraDatabaseQuickStart.java} | 24 +- .../cassio}/vector/AstraUIQuickStart.java | 4 +- .../vector/VectorClientPhilosopherTest.java | 8 +- .../vector/VectorClientProductTest.java | 16 +- .../CassIOClusteredMetadataVectorTable.java | 14 +- .../documentation/CassIOConnection.java | 6 +- .../CassIOMetadataVectorTable.java | 12 +- .../client/documentation/ClearCollection.java | 14 + .../client}/documentation/Connecting.java | 4 +- .../documentation/ConnectingAdmin.java | 4 +- .../documentation/CreateCollection.java | 12 +- .../client}/documentation/CreateDatabase.java | 4 +- .../client}/documentation/CreateKeyspace.java | 4 +- .../documentation/DeleteCollection.java | 4 +- .../client}/documentation/DeleteDatabase.java | 4 +- .../client}/documentation/DeleteKeyspace.java | 4 +- .../client}/documentation/DeleteMany.java | 8 +- .../client}/documentation/DeleteOne.java | 8 +- .../astradb/client}/documentation/Find.java | 8 +- .../documentation/FindAllCollections.java | 4 +- .../documentation/FindAllDatabases.java | 4 +- .../client}/documentation/FindById.java | 8 +- .../client}/documentation/FindByVector.java | 8 +- .../client}/documentation/FindCollection.java | 4 +- .../client}/documentation/FindDatabase.java | 4 +- .../client}/documentation/FindKeyspace.java | 4 +- .../client/documentation/FindMany.java | 14 + .../client}/documentation/FindOne.java | 8 +- .../client}/documentation/FindPage.java | 8 +- .../client}/documentation/FindVector.java | 8 +- .../client}/documentation/InsertMany.java | 8 +- .../client}/documentation/InsertOne.java | 8 +- .../ObjectMappingClearCollection.java | 6 +- .../ObjectMappingCreateCollection.java | 6 +- .../ObjectMappingDeleteMany.java | 6 +- .../documentation/ObjectMappingDeleteOne.java | 6 +- .../documentation/ObjectMappingFind.java | 8 +- .../documentation/ObjectMappingFindOne.java | 6 +- .../ObjectMappingFindVector.java | 6 +- .../ObjectMappingInsertMany.java | 6 +- .../documentation/ObjectMappingInsertOne.java | 6 +- .../documentation/ObjectMappingPaging.java | 6 +- .../ObjectMappingUpdateMany.java | 6 +- .../documentation/ObjectMappingUpdateOne.java | 6 +- .../client}/documentation/QuickStart.java | 8 +- .../client}/documentation/QuickStartAA.java | 10 +- .../client}/documentation/UpdateMany.java | 8 +- .../client}/documentation/UpdateOne.java | 8 +- .../client}/documentation/UpsertOne.java | 8 +- .../astradb/client/v2/AstraDataApiV2Test.java | 19 ++ .../com/dtsx/astra/sdk/AstraDBReworkTest.java | 18 -- .../sdk/documentation/ClearCollection.java | 14 - .../astra/sdk/documentation/FindMany.java | 14 - .../src/test/resources/logback-test.xml | 4 + .../com/datastax/astra/sdk/AstraClient.java | 4 +- pom.xml | 7 +- 83 files changed, 646 insertions(+), 364 deletions(-) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk/AstraDBCollection.java => datastax/astradb/client/AstraCollection.java} (99%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/AstraDB.java (93%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/AstraDBAdmin.java (98%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/AstraDBRepository.java (99%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/AbstractCassandraTable.java (98%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/AnnQuery.java (94%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/AnnResult.java (88%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/CassIO.java (97%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/CassandraSimilarityMetric.java (94%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/ClusteredMetadataVectorRecord.java (62%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/ClusteredMetadataVectorTable.java (99%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/ClusteredRecord.java (90%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/ClusteredTable.java (99%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/MetadataVectorRecord.java (82%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/MetadataVectorTable.java (99%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/package-info.java (70%) rename astra-db-client/src/main/java/com/{dtsx/astra/sdk => datastax/astradb/client}/package-info.java (60%) create mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java create mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java delete mode 100644 astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBClients.java create mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java rename astra-db-client/src/test/java/com/{dtsx/astra/sdk/AstraDBTestSuiteIT.java => datastax/astradb/client/AstraDatabaseTestSuiteIT.java} (93%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/BreakAstraTest.java (76%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/ClusteredMetadataVectorStore.java (95%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/cassio/RagPdfVectorTest.java (98%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk/vector/AstraDBDemoTest.java => datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java} (95%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk/vector/AstraDBQuickStart.java => datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java} (84%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client/cassio}/vector/AstraUIQuickStart.java (81%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client/cassio}/vector/VectorClientPhilosopherTest.java (96%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client/cassio}/vector/VectorClientProductTest.java (92%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CassIOClusteredMetadataVectorTable.java (81%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CassIOConnection.java (82%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CassIOMetadataVectorTable.java (84%) create mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/Connecting.java (83%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ConnectingAdmin.java (78%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CreateCollection.java (70%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CreateDatabase.java (82%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/CreateKeyspace.java (70%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/DeleteCollection.java (70%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/DeleteDatabase.java (78%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/DeleteKeyspace.java (70%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/DeleteMany.java (78%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/DeleteOne.java (63%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/Find.java (92%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindAllCollections.java (88%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindAllDatabases.java (78%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindById.java (86%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindByVector.java (87%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindCollection.java (82%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindDatabase.java (87%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindKeyspace.java (84%) create mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindOne.java (90%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindPage.java (87%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/FindVector.java (80%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/InsertMany.java (86%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/InsertOne.java (88%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingClearCollection.java (77%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingCreateCollection.java (86%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingDeleteMany.java (85%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingDeleteOne.java (81%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingFind.java (92%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingFindOne.java (85%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingFindVector.java (88%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingInsertMany.java (89%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingInsertOne.java (84%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingPaging.java (86%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingUpdateMany.java (89%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/ObjectMappingUpdateOne.java (84%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/QuickStart.java (90%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/QuickStartAA.java (85%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/UpdateMany.java (71%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/UpdateOne.java (78%) rename astra-db-client/src/test/java/com/{dtsx/astra/sdk => datastax/astradb/client}/documentation/UpsertOne.java (85%) create mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java delete mode 100644 astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBReworkTest.java delete mode 100644 astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ClearCollection.java delete mode 100644 astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindMany.java diff --git a/astra-db-client/pom.xml b/astra-db-client/pom.xml index 21b6cb64..fa4aa4ec 100644 --- a/astra-db-client/pom.xml +++ b/astra-db-client/pom.xml @@ -46,6 +46,10 @@ com.datastax.stargate stargate-sdk-data + + com.datastax.stargate + stargate-dataapi-client + diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBCollection.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java similarity index 99% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBCollection.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java index ba9f5f2b..ce86a9fb 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBCollection.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import io.stargate.sdk.core.domain.Page; import io.stargate.sdk.data.CollectionClient; @@ -20,7 +20,6 @@ import lombok.Getter; import lombok.NonNull; -import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -30,7 +29,7 @@ * Client for AstraDB at collection level (crud for documents). */ @Getter -public class AstraDBCollection { +public class AstraCollection { /** * Internal Stargate data api client. @@ -43,7 +42,7 @@ public class AstraDBCollection { * @param collectionClient * collection description */ - AstraDBCollection(CollectionClient collectionClient) { + AstraCollection(CollectionClient collectionClient) { this.collectionClient = collectionClient; } diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDB.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java similarity index 93% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDB.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java index f35be13a..9617b20d 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDB.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import com.dtsx.astra.sdk.db.AstraDBOpsClient; import com.dtsx.astra.sdk.db.domain.Database; @@ -259,8 +259,8 @@ public void deleteCollection(String name) { * @return * json vector store */ - public AstraDBCollection createCollection(String name) { - return new AstraDBCollection(nsClient.createCollection(name)); + public AstraCollection createCollection(String name) { + return new AstraCollection(nsClient.createCollection(name)); } /** @@ -289,8 +289,8 @@ public AstraDBRepository createCollection(String name, Class cla * @return * json vector store */ - public AstraDBCollection createCollection(String name, int vectorDimension) { - return new AstraDBCollection(nsClient.createCollection(name, vectorDimension)); + public AstraCollection createCollection(String name, int vectorDimension) { + return new AstraCollection(nsClient.createCollection(name, vectorDimension)); } /** @@ -305,8 +305,8 @@ public AstraDBCollection createCollection(String name, int vectorDimension) { * @return * json vector store */ - public AstraDBCollection createCollection(String name, int vectorDimension, SimilarityMetric metric) { - return new AstraDBCollection(nsClient.createCollection(CollectionDefinition + public AstraCollection createCollection(String name, int vectorDimension, SimilarityMetric metric) { + return new AstraCollection(nsClient.createCollection(CollectionDefinition .builder() .name(name) .vector(vectorDimension, metric) @@ -343,8 +343,8 @@ public AstraDBRepository createCollection(String name, int vectorDimensio * @return * json vector store */ - public AstraDBCollection createCollection(CollectionDefinition def) { - return new AstraDBCollection(nsClient.createCollection(def)); + public AstraCollection createCollection(CollectionDefinition def) { + return new AstraCollection(nsClient.createCollection(def)); } /** @@ -421,8 +421,8 @@ public void changeKeyspace(String keyspace) { * @return * storeName client */ - public AstraDBCollection getCollection(@NonNull String storeName) { - return new AstraDBCollection(nsClient.collection(storeName)); + public AstraCollection getCollection(@NonNull String storeName) { + return new AstraCollection(nsClient.collection(storeName)); } /** diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBAdmin.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java similarity index 98% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBAdmin.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java index 4ac26c5a..d4053b3a 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBAdmin.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import com.dtsx.astra.sdk.db.AstraDBOpsClient; import com.dtsx.astra.sdk.db.DbOpsClient; @@ -17,6 +17,8 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import java.io.Closeable; +import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpClient.Version; @@ -37,7 +39,7 @@ * Client for AstraDB at organization level (crud for databases). */ @Slf4j -public class AstraDBAdmin { +public class AstraDBAdmin implements Closeable { public static final String USER_AGENT = "astra-db-java"; @@ -488,4 +490,10 @@ public AstraDBOpsClient getDevopsApiClient() { } + /** + * Close the client. + */ + @Override + public void close() throws IOException { + } } diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBRepository.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java similarity index 99% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBRepository.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java index 55e0f250..3192ddbe 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBRepository.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import io.stargate.sdk.core.domain.Page; import io.stargate.sdk.data.CollectionRepository; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AbstractCassandraTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java similarity index 98% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AbstractCassandraTable.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java index dc0ccfe0..f1be91be 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AbstractCassandraTable.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.Row; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnQuery.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java similarity index 94% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnQuery.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java index fcfd72f3..854e955d 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnQuery.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import lombok.Builder; import lombok.Getter; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnResult.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java similarity index 88% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnResult.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java index 7c1e91cd..e166596d 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/AnnResult.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import lombok.Data; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassIO.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java similarity index 97% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassIO.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java index ded33f8d..59a75ae7 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassIO.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.CqlSession; import com.dtsx.astra.sdk.db.AstraDBOpsClient; @@ -10,7 +10,7 @@ import java.nio.file.Paths; import java.util.UUID; -import static com.dtsx.astra.sdk.AstraDBAdmin.DEFAULT_KEYSPACE; +import static com.datastax.astradb.client.AstraDBAdmin.DEFAULT_KEYSPACE; /** * Utility to work with CassIO and Astra diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassandraSimilarityMetric.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java similarity index 94% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassandraSimilarityMetric.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java index 2f02dfc8..156d5686 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/CassandraSimilarityMetric.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import lombok.Getter; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java similarity index 62% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorRecord.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java index 42d264b6..8157f831 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorRecord.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java @@ -1,24 +1,14 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; -import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.api.core.data.CqlVector; import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.AllArgsConstructor; import lombok.Data; -import lombok.NoArgsConstructor; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.ATTRIBUTES_BLOB; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.BODY_BLOB; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.METADATA_S; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.PARTITION_ID; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.ROW_ID; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.VECTOR; - /** * Partitioned table with cluster and vector. */ diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java similarity index 99% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorTable.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java index 67c323c7..4f60323a 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorTable.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.PreparedStatement; @@ -9,9 +9,7 @@ import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.UUID; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java similarity index 90% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredRecord.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java index 852e7326..dc78d416 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredRecord.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java similarity index 99% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredTable.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java index d5ee5bcc..73f86ec4 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/ClusteredTable.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.BatchStatement; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java similarity index 82% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorRecord.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java index 7fa61375..f31f377d 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorRecord.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.data.CqlVector; @@ -10,11 +10,11 @@ import java.util.List; import java.util.Map; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.ATTRIBUTES_BLOB; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.BODY_BLOB; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.METADATA_S; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.ROW_ID; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.VECTOR; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.ATTRIBUTES_BLOB; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.BODY_BLOB; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.METADATA_S; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.ROW_ID; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.VECTOR; /** * Record for the table metadata + vector. diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java similarity index 99% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorTable.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java index b31d5f39..7d4e6f16 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/MetadataVectorTable.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.Row; diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/package-info.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java similarity index 70% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/package-info.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java index 06df7093..73b1ccf0 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/cassio/package-info.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java @@ -1,4 +1,4 @@ /** * Client for Astra DB through Cassandra Query Language (CQL) reusing data models from CassIO, */ -package com.dtsx.astra.sdk.cassio; \ No newline at end of file +package com.datastax.astradb.client.cassio; \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/package-info.java b/astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java similarity index 60% rename from astra-db-client/src/main/java/com/dtsx/astra/sdk/package-info.java rename to astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java index 348566ae..2d866ec9 100644 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/package-info.java +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java @@ -1,4 +1,4 @@ /** * Client for Astra DB through Rest Data API. */ -package com.dtsx.astra.sdk; \ No newline at end of file +package com.datastax.astradb.client; \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java new file mode 100644 index 00000000..cf92c341 --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java @@ -0,0 +1,241 @@ +package com.datastax.astradb.client.v2; + +import com.datastax.astradb.client.AstraDBAdmin; +import com.dtsx.astra.sdk.db.AstraDBOpsClient; +import com.dtsx.astra.sdk.db.domain.Database; +import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; +import com.dtsx.astra.sdk.utils.ApiLocator; +import com.dtsx.astra.sdk.utils.AstraEnvironment; +import io.stargate.data_api.client.DataApiClient; +import io.stargate.data_api.client.DataApiClients; +import io.stargate.data_api.client.DataApiCollection; +import io.stargate.data_api.client.DataApiNamespace; +import io.stargate.data_api.client.model.CreateCollectionOptions; +import io.stargate.data_api.client.model.CreateNamespaceOptions; +import io.stargate.data_api.internal.model.CreateCollectionRequest; +import lombok.Getter; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.UUID; +import java.util.stream.Stream; + +/** + * Client for AstraDB at database level (crud for collections). + */ +@Slf4j @Getter +public class AstraDB implements DataApiNamespace, DataApiClient { + + /** + * Hold a reference to target Astra Environment. + */ + protected final AstraEnvironment env; + + /** + * Top level resource for json api. + */ + private final DataApiClient apiClient; + + /** + * Namespace client + */ + private DataApiNamespace nsClient; + + /** + * Url to access the API + */ + private final String apiEndpoint; + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + */ + public AstraDB(String apiEndpoint, String token) { + this(apiEndpoint, token, AstraDBAdmin.DEFAULT_KEYSPACE); + } + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + * @param keyspace + * keyspace + */ + public AstraDB(@NonNull String apiEndpoint, @NonNull String token, @NonNull String keyspace) { + // Support for apiEndpoint with or without /api/json + if (apiEndpoint.endsWith("com")) { + apiEndpoint = apiEndpoint + "/api/json"; + } + this.apiEndpoint = apiEndpoint; + + // Finding Environment based on apiEndpoint (looping to devops) + if (apiEndpoint.contains(AstraEnvironment.PROD.getAppsSuffix())) { + this.env = AstraEnvironment.PROD; + } else if (apiEndpoint.contains(AstraEnvironment.TEST.getAppsSuffix())) { + this.env = AstraEnvironment.TEST; + } else if (apiEndpoint.contains(AstraEnvironment.DEV.getAppsSuffix())) { + this.env = AstraEnvironment.DEV; + } else { + throw new IllegalArgumentException("Unable to detect environment from endpoint"); + } + + this.apiClient = DataApiClients.create(apiEndpoint, token); + this.nsClient = apiClient.getNamespace(keyspace); + String version = AstraDB.class.getPackage().getImplementationVersion(); + AstraDBAdmin.setCallerName(AstraDBAdmin.USER_AGENT, (null != version) ? version : "dev"); + } + + /** + * Full constructor. + * + * @param token + * token + * @param databaseId + * database identifier + */ + public AstraDB(@NonNull String token, @NonNull UUID databaseId) { + this(token, databaseId, null, AstraEnvironment.PROD, AstraDBAdmin.DEFAULT_KEYSPACE); + } + + /** + * Full constructor. + * + * @param token + * token + * @param databaseId + * database identifier + * @param keyspace + * database keyspace + */ + public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String keyspace) { + this(token, databaseId, null, AstraEnvironment.PROD, keyspace); + } + + /** + * Full constructor. + * + * @param token + * token + * @param databaseId + * database identifier + * @param region + * database region + * @param keyspace + * keyspace + */ + public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String region, @NonNull String keyspace) { + this(token, databaseId, region, AstraEnvironment.PROD, keyspace); + } + + /** + * Accessing the database with id and region. + * + * @param token + * astra token + * @param databaseId + * database id + * @param region + * database region + * @param env + * environment + * @param keyspace + * destination keyspace + */ + public AstraDB(@NonNull String token, @NonNull UUID databaseId, String region, @NonNull AstraEnvironment env, String keyspace) { + this.env = env; + Database db = new AstraDBOpsClient(token, env) + .findById(databaseId.toString()) + .orElseThrow(() -> new DatabaseNotFoundException(databaseId.toString())); + + // If no region is provided, we use the default region of the DB + if (region == null) { + region = db.getInfo().getRegion(); + } + if (keyspace == null) { + keyspace = db.getInfo().getKeyspace(); + } + this.apiEndpoint = ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), region); + this.apiClient = DataApiClients.create(apiEndpoint, token); + this.nsClient = apiClient.getNamespace(keyspace); + } + + + @Override + public DataApiNamespace getNamespace(String namespaceName) { + return apiClient.getNamespace(namespaceName); + } + + @Override + public Stream listNamespaceNames() { + return apiClient.listNamespaceNames(); + } + + @Override + public boolean isNamespaceExists(String namespace) { + return apiClient.isNamespaceExists(namespace); + } + + @Override + public DataApiNamespace createNamespace(String namespace) { + // use devops API + return null; + } + + @Override + public void dropNamespace(String namespace) { + // use devops API + + } + + @Override + public DataApiNamespace createNamespace(String namespace, CreateNamespaceOptions options) { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public Stream listCollectionNames() { + return null; + } + + @Override + public Stream listCollections() { + return null; + } + + @Override + public DataApiCollection getCollection(String collectionName, Class documentClass) { + return null; + } + + @Override + public void drop() { + + } + + @Override + public DataApiCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions, Class documentClass) { + return null; + } + + @Override + public void dropCollection(String collectionName) { + + } + + @Override + public void close() throws IOException { + } +} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java new file mode 100644 index 00000000..abdd1e37 --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java @@ -0,0 +1,15 @@ +package com.datastax.astradb.client.v2; + +import com.datastax.astradb.client.AstraDBAdmin; + +/** + * High level class to instanciate clients for AstraDB + */ +public class AstraDBClients { + + public static AstraDBAdmin create(String token) { + return new AstraDBAdmin(token); + } + + +} diff --git a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBClients.java b/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBClients.java deleted file mode 100644 index d7392020..00000000 --- a/astra-db-client/src/main/java/com/dtsx/astra/sdk/AstraDBClients.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dtsx.astra.sdk; - -public class AstraDBClients { - - public static AstraDBAdmin create(String token) { - return new AstraDBAdmin(token); - } - - -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java new file mode 100644 index 00000000..28ab9a0f --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java @@ -0,0 +1,25 @@ +package com.datastax.astradb.client; + +import com.datastax.astradb.client.v2.AstraDBClients; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +public class AstraDatabaseReworkTest { + + @Test + public void testRework() { + try(AstraDBAdmin astraDBAdmin = AstraDBClients.create("token");) { + AstraDB database = astraDBAdmin.getDatabase("sample_mflix"); + AstraCollection collection = database.getCollection("movies"); + + //AstraDatabase db1 = new AstraDatabase("apiEnpoint", "token"); + //AstraDBCollection collection = db.getCollection("sample_collection"); + //collection.insertOne(Document.builder().put("title", "Star Wars").build()); + } catch (IOException e) { + throw new RuntimeException(e); + } + + //collection.find().all().forEach(System.out::println); + } +} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBTestSuiteIT.java b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java similarity index 93% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBTestSuiteIT.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java index 37cd9208..a83530dc 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBTestSuiteIT.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import com.dtsx.astra.sdk.db.domain.CloudProviderType; import com.dtsx.astra.sdk.db.domain.Database; @@ -59,7 +59,7 @@ */ @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class AstraDBTestSuiteIT { +public class AstraDatabaseTestSuiteIT { /** * Test Constants @@ -82,12 +82,12 @@ public class AstraDBTestSuiteIT { * Shared working objects */ static AstraDBAdmin astraDbAdmin; - static AstraDB astraDb; + static AstraDB astraDB; static UUID databaseId; - static AstraDBCollection collectionSimple; - static AstraDBCollection collectionDeny; - static AstraDBCollection collectionAllow; - static AstraDBCollection collectionVector; + static AstraCollection collectionSimple; + static AstraCollection collectionDeny; + static AstraCollection collectionAllow; + static AstraCollection collectionVector; /** * Bean to be used for the test suite @@ -157,12 +157,11 @@ public void shouldConnectToDatabase() { Assertions.assertTrue(astraDbAdmin.isDatabaseExists(TEST_DBNAME)); Assertions.assertNotNull(astraDbAdmin.getDataApiClient(databaseId)); // When - astraDb = astraDbAdmin.getDatabase(databaseId); - Assertions.assertNotNull(astraDb.getNamespaceClient()); - Assertions.assertNotNull(astraDb); + astraDB = astraDbAdmin.getDatabase(databaseId); + Assertions.assertNotNull(astraDbAdmin); // When - astraDb = astraDbAdmin.getDatabase(TEST_DBNAME); - Assertions.assertNotNull(astraDb); + astraDB = astraDbAdmin.getDatabase(TEST_DBNAME); + Assertions.assertNotNull(astraDB); } @Test @@ -170,26 +169,24 @@ public void shouldConnectToDatabase() { public void shouldConnectToDatabaseWithEndpoint() { if (databaseId == null) shouldCreateDatabase(); // Given - Assertions.assertNotNull(astraDb.getApiEndpoint()); - Assertions.assertNotNull(astraDbAdmin.getToken()); - Assertions.assertNotNull(astraDbAdmin.getDataApiClient(TEST_DBNAME)); + Assertions.assertNotNull(astraDB); // When - AstraDB astraDb2 = new AstraDB(astraDbAdmin.getToken(), astraDb.getApiEndpoint()); + AstraDB astraDbClient2 = new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint()); // Then - Assertions.assertNotNull(astraDb2); - Assertions.assertNotNull(astraDb2.findAllCollections()); + Assertions.assertNotNull(astraDbClient2); + Assertions.assertNotNull(astraDbClient2.findAllCollections()); } @Test @Order(4) public void shouldConnectToDatabaseWithEndpointAndKeyspace() { // When initializing with a keyspace - AstraDB astraDb3 = new AstraDB(astraDbAdmin.getToken(), astraDb.getApiEndpoint(), AstraDBAdmin.DEFAULT_KEYSPACE); + AstraDB astraDbClient3 = new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint(), AstraDBAdmin.DEFAULT_KEYSPACE); // Then - Assertions.assertNotNull(astraDb3); - Assertions.assertNotNull(astraDb3.findAllCollections()); + Assertions.assertNotNull(astraDbClient3); + Assertions.assertNotNull(astraDbClient3.findAllCollections()); // When initializing with an INVALID keyspace - Assertions.assertThrows(DataApiNamespaceNotFoundException.class, () -> new AstraDB(astraDbAdmin.getToken(), astraDb.getApiEndpoint(), "invalid_keyspace")); + Assertions.assertThrows(DataApiNamespaceNotFoundException.class, () -> new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint(), "invalid_keyspace")); } // ------------------------------------------ @@ -276,38 +273,38 @@ public void shouldDeleteDatabaseById() throws InterruptedException { @Order(6) @DisplayName("06. Create a Collection (no vector)") public void shouldCreateCollectionSimple() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); // Given - astraDb.deleteCollection(TEST_COLLECTION_NAME); - Assertions.assertFalse(astraDb.isCollectionExists(TEST_COLLECTION_NAME)); + astraDB.deleteCollection(TEST_COLLECTION_NAME); + Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); // When - collectionSimple = astraDb.createCollection(TEST_COLLECTION_NAME); + collectionSimple = astraDB.createCollection(TEST_COLLECTION_NAME); // Then - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_NAME)); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); } @Test @Order(7) @DisplayName("07. Create Collections (with vector)") public void shouldCreateCollectionVector() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); // Given - astraDb.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); + astraDB.deleteCollection(TEST_COLLECTION_VECTOR); + Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); // When - astraDb.createCollection(TEST_COLLECTION_VECTOR, 14); + astraDB.createCollection(TEST_COLLECTION_VECTOR, 14); // Then - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); // Given - astraDb.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); - collectionVector = astraDb.createCollection(CollectionDefinition.builder() + astraDB.deleteCollection(TEST_COLLECTION_VECTOR); + Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); + collectionVector = astraDB.createCollection(CollectionDefinition.builder() .name(TEST_COLLECTION_VECTOR) .vector(14, SimilarityMetric.cosine) .build()); - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); } @Test @@ -316,13 +313,13 @@ public void shouldCreateCollectionVector() { public void shouldCreateCollectionWithIndexingOptions() { // Given - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); - astraDb.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); + astraDB.deleteCollection(TEST_COLLECTION_VECTOR); + Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); // Allow and Deny are mutually exclusive - Assertions.assertThrows(IllegalStateException.class, () -> collectionVector = astraDb.createCollection(CollectionDefinition.builder() + Assertions.assertThrows(IllegalStateException.class, () -> collectionVector = astraDB.createCollection(CollectionDefinition.builder() .name(TEST_COLLECTION_VECTOR) .vector(14, SimilarityMetric.cosine) .indexingDeny("blob_body") @@ -336,30 +333,30 @@ public void shouldCreateCollectionWithIndexingOptions() { @Order(8) @DisplayName("08. Find a single collection") public void shouldFindCollection() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); // Find a collection (1) - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_VECTOR)); - Optional def = astraDb.findCollectionByName(TEST_COLLECTION_VECTOR); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); + Optional def = astraDB.findCollectionByName(TEST_COLLECTION_VECTOR); Assertions.assertTrue(def.isPresent()); Assertions.assertEquals(14, def.get().getOptions().getVector().getDimension()); // Find a collection (2) - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_NAME)); - Assertions.assertTrue(astraDb.findCollectionByName(TEST_COLLECTION_NAME).isPresent()); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); + Assertions.assertTrue(astraDB.findCollectionByName(TEST_COLLECTION_NAME).isPresent()); // Find a collection (3) - Assertions.assertFalse(astraDb.isCollectionExists("invalid")); - Assertions.assertFalse(astraDb.findCollectionByName("invalid").isPresent()); + Assertions.assertFalse(astraDB.isCollectionExists("invalid")); + Assertions.assertFalse(astraDB.findCollectionByName("invalid").isPresent()); } @Test @Order(9) @DisplayName("09. Find all collections") public void shouldListCollection() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); - List collections = astraDb + List collections = astraDB .findAllCollections() .map(CollectionDefinition::getName) .collect(Collectors.toList()); @@ -372,14 +369,14 @@ public void shouldListCollection() { @DisplayName("10. Delete all documents in a collection") @Disabled("Product Issues") public void shouldDeleteACollection() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); String deleted_collection = "deleted_collection"; - astraDb.createCollection(deleted_collection); - Assertions.assertTrue(astraDb.isCollectionExists(deleted_collection)); + astraDB.createCollection(deleted_collection); + Assertions.assertTrue(astraDB.isCollectionExists(deleted_collection)); - astraDb.deleteCollection(deleted_collection); - Assertions.assertFalse(astraDb.isCollectionExists(deleted_collection)); + astraDB.deleteCollection(deleted_collection); + Assertions.assertFalse(astraDB.isCollectionExists(deleted_collection)); } @Test @@ -388,7 +385,7 @@ public void shouldDeleteACollection() { public void shouldClearACollection() { // Given if (collectionSimple == null) shouldCreateCollectionSimple(); - Assertions.assertTrue(astraDb.isCollectionExists(TEST_COLLECTION_NAME)); + Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); collectionSimple.deleteAll(); collectionSimple.insertOne(new JsonDocument().id("1")); Assertions.assertEquals(1, collectionSimple.countDocuments()); @@ -1356,9 +1353,9 @@ public void shouldSerializedAsJson() { @Order(41) @DisplayName("41. Create Collections (with deny)") public void shouldCreateCollectionWithDenyOptions() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); // When - collectionDeny = astraDb.createCollection(CollectionDefinition.builder() + collectionDeny = astraDB.createCollection(CollectionDefinition.builder() .name(TEST_COLLECTION_DENY) .vector(14, SimilarityMetric.cosine) .indexingDeny("blob_body") @@ -1383,7 +1380,7 @@ public void shouldCreateCollectionWithDenyOptions() { @Test public void shouldDoSemanticSearch() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); initializeCollectionVector(); // When @@ -1425,12 +1422,12 @@ public void shouldDoSemanticSearch() { @Order(42) @DisplayName("42. Create Collections (with allow)") public void shouldCreateCollectionWithAllowOptions() { - if (astraDb == null) shouldConnectToDatabase(); + if (astraDbAdmin == null) shouldConnectToDatabase(); // ---- TESTING WITH ALLOW ----- // When - astraDb.deleteCollection(TEST_COLLECTION_ALLOW); - collectionAllow = astraDb.createCollection(CollectionDefinition.builder() + astraDB.deleteCollection(TEST_COLLECTION_ALLOW); + collectionAllow = astraDB.createCollection(CollectionDefinition.builder() .name(TEST_COLLECTION_ALLOW) .vector(14, SimilarityMetric.cosine) .indexingAllow("prop1") @@ -1480,7 +1477,7 @@ public void testFindInArray() { public void shouldInsertRecords() { initializeCollectionVector(); - productRepositoryVector = astraDb.getCollection(TEST_COLLECTION_VECTOR, Product.class); + productRepositoryVector = astraDB.getCollection(TEST_COLLECTION_VECTOR, Product.class); productRepositoryVector.insert(new Document<>( "product1", new Product("something Good", 9.99), @@ -1501,7 +1498,7 @@ public void shouldInsertRecords() { @Order(51) @DisplayName("51. Insert with CollectionRepository") public void shouldInsertWithSimpleCollectionObjectMapping() { - productRepositorySimple = astraDb.getCollection(TEST_COLLECTION_NAME, Product.class); + productRepositorySimple = astraDB.getCollection(TEST_COLLECTION_NAME, Product.class); Assertions.assertNotNull(productRepositorySimple); productRepositorySimple.save(new Document().id("p1").data(new Product("Pupper Sausage Beef dog Treats", 9.99))); productRepositorySimple.save(new Document().id("p2").data(new Product("Dog Ring Chew Toy", 10.99))); @@ -1512,23 +1509,23 @@ public void shouldInsertWithSimpleCollectionObjectMapping() { } private void initializeCollectionSimple() { - if (astraDb == null) { + if (astraDbAdmin == null) { databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDb = astraDbAdmin.getDatabase(databaseId); + astraDB = astraDbAdmin.getDatabase(databaseId); } if (collectionSimple == null) { - collectionSimple = astraDb.createCollection(TEST_COLLECTION_NAME); + collectionSimple = astraDB.createCollection(TEST_COLLECTION_NAME); } collectionSimple.deleteAll(); } private void initializeCollectionVector() { - if (astraDb == null) { + if (astraDbAdmin == null) { databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDb = astraDbAdmin.getDatabase(databaseId); + astraDB = astraDbAdmin.getDatabase(databaseId); } if (collectionVector == null) { - collectionVector = astraDb.createCollection(TEST_COLLECTION_VECTOR, 14); + collectionVector = astraDB.createCollection(TEST_COLLECTION_VECTOR, 14); } collectionVector.deleteAll(); } diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/BreakAstraTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java similarity index 76% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/BreakAstraTest.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java index 0cbecff3..eb2ab060 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/BreakAstraTest.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java @@ -1,4 +1,4 @@ -package com.dtsx.astra.sdk; +package com.datastax.astradb.client; import com.dtsx.astra.sdk.db.domain.CloudProviderType; import com.dtsx.astra.sdk.utils.AstraEnvironment; @@ -20,18 +20,18 @@ public class BreakAstraTest { static String astraToken = Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN").get(); static AstraDBAdmin astraDbAdmin; - static AstraDB astraDb; + static AstraDB astraDB; static UUID databaseId; - static AstraDBCollection collectionSimple; + static AstraCollection collectionSimple; @Test public void testQueryBust() { astraDbAdmin = new AstraDBAdmin(astraToken, AstraEnvironment.PROD); databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDb = astraDbAdmin.getDatabase(databaseId); - collectionSimple = astraDb.createCollection("collection_vector", 1536); + astraDB = astraDbAdmin.getDatabase(databaseId); + collectionSimple = astraDB.createCollection("collection_vector", 1536); collectionSimple.deleteAll(); - List> documents = new ArrayList<>(); + List> documents = new ArrayList<>(); // Create an instance of Random Random random = new Random(); @@ -44,10 +44,10 @@ public void testQueryBust() { long start = System.currentTimeMillis(); int nbDocs = 200000; for (int i = 0; i < nbDocs; i++) { - documents.add(new Document() + documents.add(new Document() .id(String.valueOf(i)) .vector(fakeEmbeddings) - .data(new AstraDBTestSuiteIT.Product("Desc " + i, i * 1.0d))); + .data(new AstraDatabaseTestSuiteIT.Product("Desc " + i, i * 1.0d))); } collectionSimple.insertManyChunked(documents, 20, 200); } diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorStore.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java similarity index 95% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorStore.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java index 1692181f..d1d6dda1 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/ClusteredMetadataVectorStore.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java @@ -1,5 +1,10 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; +import com.datastax.astradb.client.cassio.AnnQuery; +import com.datastax.astradb.client.cassio.AnnResult; +import com.datastax.astradb.client.cassio.CassandraSimilarityMetric; +import com.datastax.astradb.client.cassio.ClusteredMetadataVectorRecord; +import com.datastax.astradb.client.cassio.ClusteredMetadataVectorTable; import com.datastax.oss.driver.api.core.uuid.Uuids; import dev.langchain4j.data.document.Metadata; import dev.langchain4j.data.embedding.Embedding; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/RagPdfVectorTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java similarity index 98% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/RagPdfVectorTest.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java index c8338b95..89d6a74a 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/cassio/RagPdfVectorTest.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.cassio; +package com.datastax.astradb.client.cassio; +import com.datastax.astradb.client.AstraDBAdmin; import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.AstraDBAdmin; import com.dtsx.astra.sdk.utils.TestUtils; import dev.langchain4j.data.document.Document; import dev.langchain4j.data.document.DocumentParser; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBDemoTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java similarity index 95% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBDemoTest.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java index 9d725356..4a36408d 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBDemoTest.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.vector; +package com.datastax.astradb.client.cassio.vector; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.AstraDBTestSuiteIT; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraDatabaseTestSuiteIT; import io.stargate.sdk.core.domain.Page; import io.stargate.sdk.data.CollectionClient; import io.stargate.sdk.data.domain.JsonDocumentMutationResult; @@ -22,7 +22,7 @@ /** * Demo using Json client */ -public class AstraDBDemoTest { +public class AstraDatabaseDemoTest { @Test public void shouldDoCollection() { @@ -31,11 +31,11 @@ public void shouldDoCollection() { AstraDBAdmin astraDBAdmin = new AstraDBAdmin(); // Create Database - UUID uuid = astraDBAdmin.createDatabase(AstraDBTestSuiteIT.TEST_DBNAME); + UUID uuid = astraDBAdmin.createDatabase(AstraDatabaseTestSuiteIT.TEST_DBNAME); // Select Database / Namespace NamespaceClient db = astraDBAdmin - .getDataApiClient(AstraDBTestSuiteIT.TEST_DBNAME) + .getDataApiClient(AstraDatabaseTestSuiteIT.TEST_DBNAME) .namespace("default_keyspace"); // Create a collection diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBQuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java similarity index 84% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBQuickStart.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java index c46bef61..093a51bf 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraDBQuickStart.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java @@ -1,10 +1,10 @@ -package com.dtsx.astra.sdk.vector; +package com.datastax.astradb.client.cassio.vector; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.AstraDBCollection; -import com.dtsx.astra.sdk.AstraDBRepository; -import com.dtsx.astra.sdk.AstraDBTestSuiteIT; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDBRepository; +import com.datastax.astradb.client.AstraDatabaseTestSuiteIT; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.JsonDocument; import io.stargate.sdk.data.domain.odm.Document; @@ -18,12 +18,12 @@ import java.util.List; import java.util.Map; -public class AstraDBQuickStart { +public class AstraDatabaseQuickStart { @Test public void quickStartTest() { String astraToken = System.getenv("ASTRA_DB_APPLICATION_TOKEN"); - String databaseName = AstraDBTestSuiteIT.TEST_DBNAME; + String databaseName = AstraDatabaseTestSuiteIT.TEST_DBNAME; String collectionName = "collection_quickstart"; // 1a. Initialization with a client @@ -34,10 +34,10 @@ public void quickStartTest() { } // 2. Create a store (delete if exist) - AstraDB astraDB = astraDBAdmin.getDatabase(databaseName); + AstraDB astraDBClient = astraDBAdmin.getDatabase(databaseName); // 3. Insert data in the store - astraDB.deleteCollection(collectionName); - AstraDBCollection collection = astraDB.createCollection(collectionName, 14); + astraDBClient.deleteCollection(collectionName); + AstraCollection collection = astraDBClient.createCollection(collectionName, 14); // 3a. Insert One (attributes as key/value) collection.insertOne(new JsonDocument() .id("doc1") // generated if not set @@ -73,7 +73,7 @@ public void quickStartTest() { // With ODM AstraDBRepository productRepository = - astraDB.getCollection(collectionName, Product.class); + astraDBClient.getCollection(collectionName, Product.class); // 3 fields: id, payload, vector productRepository.insert(new Document<>("doc5", diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraUIQuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java similarity index 81% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraUIQuickStart.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java index eaf15c74..2a2374b6 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/AstraUIQuickStart.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.vector; +package com.datastax.astradb.client.cassio.vector; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.CollectionDefinition; public class AstraUIQuickStart { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientPhilosopherTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java similarity index 96% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientPhilosopherTest.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java index 7f8c6f58..8b474be0 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientPhilosopherTest.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java @@ -1,8 +1,8 @@ -package com.dtsx.astra.sdk.vector; +package com.datastax.astradb.client.cassio.vector; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.dtsx.astra.sdk.utils.AstraRc; import dev.langchain4j.model.openai.OpenAiEmbeddingModel; import dev.langchain4j.model.openai.OpenAiModelName; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientProductTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java similarity index 92% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientProductTest.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java index 630c47ce..9baabfb3 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/vector/VectorClientProductTest.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java @@ -1,8 +1,8 @@ -package com.dtsx.astra.sdk.vector; +package com.datastax.astradb.client.cassio.vector; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBRepository; import com.dtsx.astra.sdk.utils.AstraRc; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.query.Filter; @@ -65,11 +65,11 @@ public static void setup() { @EnabledIfEnvironmentVariable(named = "ASTRA_DB_APPLICATION_TOKEN", matches = "Astra.*") public void shouldInsertStaticDocument() { // Recreating the store - AstraDB astraDB = new AstraDBAdmin().getDatabase(DBNAME_VECTOR_CLIENT); - astraDB.deleteCollection(VECTOR_STORE_NAME); - productRepository = astraDB.createCollection(VECTOR_STORE_NAME, 14, Product.class); + AstraDB astraDBClient = new AstraDBAdmin().getDatabase(DBNAME_VECTOR_CLIENT); + astraDBClient.deleteCollection(VECTOR_STORE_NAME); + productRepository = astraDBClient.createCollection(VECTOR_STORE_NAME, 14, Product.class); log.info("store {} is created ", VECTOR_STORE_NAME); - assertTrue(astraDB.isCollectionExists(VECTOR_STORE_NAME)); + assertTrue(astraDBClient.isCollectionExists(VECTOR_STORE_NAME)); // Easy insert one Document doc = new Document<>("pf7044", diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOClusteredMetadataVectorTable.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java similarity index 81% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOClusteredMetadataVectorTable.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java index 5e94f025..295909cf 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOClusteredMetadataVectorTable.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java @@ -1,18 +1,18 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; +import com.datastax.astradb.client.AstraDBAdmin; import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.cassio.AnnQuery; -import com.dtsx.astra.sdk.cassio.CassIO; -import com.dtsx.astra.sdk.cassio.ClusteredMetadataVectorRecord; -import com.dtsx.astra.sdk.cassio.ClusteredMetadataVectorTable; +import com.datastax.astradb.client.cassio.AnnQuery; +import com.datastax.astradb.client.cassio.CassIO; +import com.datastax.astradb.client.cassio.ClusteredMetadataVectorRecord; +import com.datastax.astradb.client.cassio.ClusteredMetadataVectorTable; import com.dtsx.astra.sdk.utils.TestUtils; import java.util.List; import java.util.Map; import java.util.UUID; -import static com.dtsx.astra.sdk.cassio.AbstractCassandraTable.PARTITION_ID; +import static com.datastax.astradb.client.cassio.AbstractCassandraTable.PARTITION_ID; public class CassIOClusteredMetadataVectorTable { public static void main(String[] args) { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOConnection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java similarity index 82% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOConnection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java index 5af1428f..12cb255c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOConnection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java @@ -1,8 +1,8 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.cassio.CassIO; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.cassio.CassIO; import com.dtsx.astra.sdk.utils.TestUtils; import java.util.UUID; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOMetadataVectorTable.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java similarity index 84% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOMetadataVectorTable.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java index 10561d3c..434d8dc2 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CassIOMetadataVectorTable.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java @@ -1,11 +1,11 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; +import com.datastax.astradb.client.AstraDBAdmin; import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.cassio.AnnQuery; -import com.dtsx.astra.sdk.cassio.CassIO; -import com.dtsx.astra.sdk.cassio.MetadataVectorRecord; -import com.dtsx.astra.sdk.cassio.MetadataVectorTable; +import com.datastax.astradb.client.cassio.AnnQuery; +import com.datastax.astradb.client.cassio.CassIO; +import com.datastax.astradb.client.cassio.MetadataVectorRecord; +import com.datastax.astradb.client.cassio.MetadataVectorTable; import com.dtsx.astra.sdk.utils.TestUtils; import java.util.List; diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java new file mode 100644 index 00000000..3cf637ac --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java @@ -0,0 +1,14 @@ +package com.datastax.astradb.client.documentation; + +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; + +public class ClearCollection { + public static void main(String[] args) { + AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); + AstraCollection collection = db.createCollection("collection_vector1", 14); + + // Delete all rows from an existing collection + collection.deleteAll(); + } +} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Connecting.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java similarity index 83% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Connecting.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java index 0f047fba..69cb6641 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Connecting.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; import java.util.UUID; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ConnectingAdmin.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java similarity index 78% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ConnectingAdmin.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java index 57b0816e..f69aea16 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ConnectingAdmin.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; public class ConnectingAdmin { public static void main(String[] args) { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java similarity index 70% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateCollection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java index b134bd82..a0179c4c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.CollectionDefinition; import io.stargate.sdk.data.domain.SimilarityMetric; import io.stargate.sdk.data.exception.DataApiException; @@ -11,16 +11,16 @@ public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); // Create a non-vector collection - AstraDBCollection collection1 = db.createCollection("collection_simple"); + AstraCollection collection1 = db.createCollection("collection_simple"); // Create a vector collection - AstraDBCollection collection2 = db.createCollection( + AstraCollection collection2 = db.createCollection( "collection_vector1", 14, SimilarityMetric.cosine); // Create a vector collection with a builder - AstraDBCollection collection3 = db.createCollection(CollectionDefinition + AstraCollection collection3 = db.createCollection(CollectionDefinition .builder() .name("collection_vector2") .vector(1536, SimilarityMetric.euclidean) diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java similarity index 82% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateDatabase.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java index 32576e31..1499161a 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateDatabase.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; import com.dtsx.astra.sdk.db.domain.CloudProviderType; import java.util.UUID; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java similarity index 70% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateKeyspace.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java index bb1c6d57..400af787 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateKeyspace.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; public class CreateKeyspace { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java similarity index 70% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteCollection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java index 43d987fc..811f3b0c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; public class DeleteCollection { public static void main(String[] args) { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java similarity index 78% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteDatabase.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java index 8f3c1e1f..d349aa20 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteDatabase.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; import java.util.UUID; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java similarity index 70% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteKeyspace.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java index 4e898d8c..70042735 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteKeyspace.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; public class DeleteKeyspace { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java similarity index 78% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java index bcbc8048..5af76709 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import io.stargate.sdk.data.domain.query.DeleteQuery; import io.stargate.sdk.data.domain.query.DeleteResult; @@ -10,7 +10,7 @@ public class DeleteMany { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Build our query DeleteQuery deleteQuery = DeleteQuery.builder() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java similarity index 63% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java index a8291266..8c5a0f72 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java @@ -1,14 +1,14 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import io.stargate.sdk.data.domain.query.DeleteQuery; import io.stargate.sdk.data.domain.query.DeleteResult; public class DeleteOne { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Delete items from an existing collection with a query DeleteResult deletedCount = collection diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Find.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java similarity index 92% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Find.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java index 71ee7993..3cd0e5a3 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Find.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.query.SelectQuery; import java.util.ArrayList; @@ -12,7 +12,7 @@ public class Find { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Retrieve the first document with a product_price Filter filter = new Filter() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllCollections.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java similarity index 88% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllCollections.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java index 956bf83f..8aba6179 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllCollections.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.CollectionDefinition; public class FindAllCollections { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllDatabases.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java similarity index 78% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllDatabases.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java index d4f1c220..70a00edc 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllDatabases.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; import com.dtsx.astra.sdk.db.domain.Database; import java.util.stream.Stream; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindById.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java similarity index 86% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindById.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java index f1eface9..48dd7605 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindById.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.JsonDocumentResult; import io.stargate.sdk.data.domain.odm.DocumentResult; @@ -10,7 +10,7 @@ public class FindById { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // Fetch a document by ID and return it as JSON Optional res = collection.findById("doc1"); diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindByVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java similarity index 87% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindByVector.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java index 5d3bf8b9..d7b34dd0 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindByVector.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.DocumentResult; @@ -10,7 +10,7 @@ public class FindByVector { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // Fetch a row by vector and return JSON collection diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java similarity index 82% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindCollection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java index 9d2bb3e1..e9d94235 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.CollectionDefinition; import java.util.Optional; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java similarity index 87% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindDatabase.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java index 30892663..e9822864 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindDatabase.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDBAdmin; +import com.datastax.astradb.client.AstraDBAdmin; import com.dtsx.astra.sdk.db.domain.Database; import java.util.Optional; import java.util.UUID; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java similarity index 84% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindKeyspace.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java index 434cc87e..22886235 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindKeyspace.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java @@ -1,6 +1,6 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; +import com.datastax.astradb.client.AstraDB; public class FindKeyspace { diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java new file mode 100644 index 00000000..5400ab45 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java @@ -0,0 +1,14 @@ +package com.datastax.astradb.client.documentation; + +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; + +public class FindMany { + public static void main(String[] args) { + AstraDB db = new AstraDB("", ""); + AstraCollection collection = db.createCollection("collection_vector1", 14); + + + + } +} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java similarity index 90% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java index 7fc74bcf..32523a5f 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.query.SelectQuery; @@ -10,7 +10,7 @@ public class FindOne { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Retrieve the first document where product_price exists Filter filter = new Filter() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindPage.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java similarity index 87% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindPage.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java index 6ace7b3b..ae0a1689 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindPage.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.core.domain.Page; import io.stargate.sdk.data.domain.JsonDocumentResult; @@ -12,7 +12,7 @@ public class FindPage { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Retrieve page 1 of a search (up to 20 results) Filter filter = new Filter() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java similarity index 80% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindVector.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java index 41f44ca4..e1284d33 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindVector.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.JsonDocumentResult; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.query.SelectQuery; @@ -10,7 +10,7 @@ public class FindVector { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); float[] embeddings = new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java similarity index 86% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java index cb6e492f..bbb578b0 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.JsonDocumentMutationResult; import io.stargate.sdk.data.domain.JsonDocument; import java.util.List; @@ -11,7 +11,7 @@ public class InsertMany { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1",14); + AstraCollection collection = db.createCollection("collection_vector1",14); // Insert documents into the collection (IDs are generated automatically) List identifiers = collection.insertManyJsonDocuments(List.of( diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java similarity index 88% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java index e22d14cc..99d981f5 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import io.stargate.sdk.data.domain.JsonDocumentMutationResult; import io.stargate.sdk.data.domain.JsonDocument; import java.util.Map; @@ -11,7 +11,7 @@ public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); // Assumes a collection with a vector field of dimension 14 - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // You must delete any existing rows with the same IDs as the // rows you want to insert diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingClearCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java similarity index 77% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingClearCollection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java index 94a1f4ef..c9b59cde 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingClearCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; public class ObjectMappingClearCollection { diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingCreateCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java similarity index 86% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingCreateCollection.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java index a5e4ebdf..486ad099 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingCreateCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.CollectionDefinition; import io.stargate.sdk.data.domain.SimilarityMetric; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java similarity index 85% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java index f438b3b7..0ccd4092 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.query.DeleteQuery; import io.stargate.sdk.data.domain.query.DeleteResult; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java similarity index 81% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java index 4322a715..f41336dc 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.Document; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFind.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java similarity index 92% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFind.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java index 591485b7..9671e84c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFind.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.query.SelectQuery; import java.util.ArrayList; @@ -12,7 +12,7 @@ public class ObjectMappingFind { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); + AstraCollection collection = db.createCollection("collection_vector1", 14); // Retrieve the first document with a product_price Filter filter = new Filter() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java similarity index 85% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java index f97dc327..338520a8 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.DocumentResult; import java.util.Optional; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java similarity index 88% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindVector.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java index 55170779..bd00976a 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindVector.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.DocumentResult; import io.stargate.sdk.data.domain.query.Filter; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java similarity index 89% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java index 97bbb4bc..bdeed6a2 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.DocumentMutationResult; import io.stargate.sdk.data.domain.odm.Document; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java similarity index 84% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java index 8658208a..8a5a170e 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.Document; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingPaging.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java similarity index 86% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingPaging.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java index e9c8bde8..9562e41c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingPaging.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.core.domain.Page; import io.stargate.sdk.data.domain.query.Filter; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java similarity index 89% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java index ed934457..1e2d2c9c 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.DocumentMutationResult; import io.stargate.sdk.data.domain.odm.Document; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java similarity index 84% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java index 3cbc4191..666413bd 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBRepository; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraDBRepository; import com.fasterxml.jackson.annotation.JsonProperty; import io.stargate.sdk.data.domain.odm.Document; diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java similarity index 90% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStart.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java index c78caaac..03d99801 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStart.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraDB; +import com.datastax.astradb.client.AstraCollection; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.JsonDocument; import io.stargate.sdk.data.domain.JsonDocumentResult; @@ -16,7 +16,7 @@ public static void main(String[] args) { AstraDB myDb = new AstraDB("TOKEN", "API_ENDPOINT"); // Create a collection - AstraDBCollection demoCollection = myDb.createCollection("demo",14); + AstraCollection demoCollection = myDb.createCollection("demo",14); // Insert vectors demoCollection.insertOne( diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStartAA.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java similarity index 85% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStartAA.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java index c3136ba4..1725fb45 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/QuickStartAA.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java @@ -1,8 +1,8 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBAdmin; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraDB; import com.dtsx.astra.sdk.db.domain.CloudProviderType; import io.stargate.sdk.data.domain.JsonDocument; import io.stargate.sdk.data.domain.JsonDocumentResult; @@ -25,7 +25,7 @@ public static void main(String[] args) { AstraDB myDb = astraDBAdmin.getDatabase("quickstart"); // Create a collection - AstraDBCollection demoCollection = myDb.createCollection("demo",14); + AstraCollection demoCollection = myDb.createCollection("demo",14); // Insertions demoCollection.insertManyJsonDocuments(List.of( diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java similarity index 71% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateMany.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java index 90928299..6cd30107 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateMany.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.query.Filter; import io.stargate.sdk.data.domain.query.UpdateQuery; import io.stargate.sdk.http.domain.FilterOperator; @@ -9,7 +9,7 @@ public class UpdateMany { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // Update multiple documents based on a query collection.updateMany(UpdateQuery.builder() diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java similarity index 78% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java index 41f4a92c..ccf139df 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.JsonDocument; import io.stargate.sdk.data.domain.query.UpdateQuery; @@ -10,7 +10,7 @@ public class UpdateOne { public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // You must delete any existing rows with the same IDs as the // rows you want to insert diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java similarity index 85% rename from astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpsertOne.java rename to astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java index a70d23ec..44f5dbc9 100644 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpsertOne.java +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java @@ -1,7 +1,7 @@ -package com.dtsx.astra.sdk.documentation; +package com.datastax.astradb.client.documentation; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; +import com.datastax.astradb.client.AstraCollection; +import com.datastax.astradb.client.AstraDB; import io.stargate.sdk.data.domain.JsonDocument; import io.stargate.sdk.data.domain.JsonDocumentMutationResult; import org.junit.jupiter.api.Assertions; @@ -15,7 +15,7 @@ public static void main(String[] args) { AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); // Assumes a collection with a vector field of dimension 14 - AstraDBCollection collection = db.getCollection("collection_vector1"); + AstraCollection collection = db.getCollection("collection_vector1"); // Insert rows defined by key/value JsonDocument doc1 = new JsonDocument() diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java b/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java new file mode 100644 index 00000000..40794a50 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java @@ -0,0 +1,19 @@ +package com.datastax.astradb.client.v2; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.stream.Collectors; + +public class AstraDataApiV2Test { + + @Test + public void testData() throws IOException { + try(AstraDB db = new AstraDB( + "https://4391daae-016c-49e3-8d0a-b4633a86082c-us-east1.apps.astra.datastax.com", + "AstraCS:iLPiNPxSSIdefoRdkTWCfWXt:2b360d096e0e6cb732371925ffcc6485541ff78067759a2a1130390e231c2c7a") { + + } + System.out.println(db.listNamespaceNames().collect(Collectors.toList())); + } +} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBReworkTest.java b/astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBReworkTest.java deleted file mode 100644 index fab719f9..00000000 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/AstraDBReworkTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dtsx.astra.sdk; - -import org.junit.jupiter.api.Test; - -public class AstraDBReworkTest { - - @Test - public void testReword() { - AstraDBAdmin client = AstraDBClients.create("token"); - AstraDB db = client.getDatabase("sample_database"); - - AstraDB db1 = new AstraDB("apiEnpoint", "token"); - AstraDBCollection collection = db.getCollection("sample_collection"); - - - //collection.find().all().forEach(System.out::println); - } -} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ClearCollection.java b/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ClearCollection.java deleted file mode 100644 index 5b5e8dac..00000000 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ClearCollection.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dtsx.astra.sdk.documentation; - -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; - -public class ClearCollection { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); - - // Delete all rows from an existing collection - collection.deleteAll(); - } -} diff --git a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindMany.java b/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindMany.java deleted file mode 100644 index e5ca5867..00000000 --- a/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindMany.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dtsx.astra.sdk.documentation; - -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBCollection; - -public class FindMany { - public static void main(String[] args) { - AstraDB db = new AstraDB("", ""); - AstraDBCollection collection = db.createCollection("collection_vector1", 14); - - - - } -} diff --git a/astra-db-client/src/test/resources/logback-test.xml b/astra-db-client/src/test/resources/logback-test.xml index 4d383586..a35e5f5f 100644 --- a/astra-db-client/src/test/resources/logback-test.xml +++ b/astra-db-client/src/test/resources/logback-test.xml @@ -20,6 +20,10 @@ + + + + diff --git a/astra-sdk/src/main/java/com/datastax/astra/sdk/AstraClient.java b/astra-sdk/src/main/java/com/datastax/astra/sdk/AstraClient.java index e8a927a3..bfeea60b 100644 --- a/astra-sdk/src/main/java/com/datastax/astra/sdk/AstraClient.java +++ b/astra-sdk/src/main/java/com/datastax/astra/sdk/AstraClient.java @@ -17,9 +17,9 @@ package com.datastax.astra.sdk; import com.datastax.astra.sdk.config.AstraClientConfig; +import com.datastax.astradb.client.AstraDBAdmin; +import com.datastax.astradb.client.AstraDB; import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.AstraDB; -import com.dtsx.astra.sdk.AstraDBAdmin; import com.dtsx.astra.sdk.AstraOpsClient; import com.dtsx.astra.sdk.db.AstraDBOpsClient; import com.dtsx.astra.sdk.db.domain.Database; diff --git a/pom.xml b/pom.xml index 98d79a28..e6259eee 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ 1.18.30 - 2.3.7 + 2.3.8-SNAPSHOT 2.1.0-BETA-9 1.62.2 @@ -160,6 +160,11 @@ stargate-sdk-data ${stargate-sdk.version} + + com.datastax.stargate + stargate-dataapi-client + ${stargate-sdk.version} + com.datastax.stargate stargate-sdk-test From cc0865c959beddffdf4ad6181aea1907af3ff492 Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Mon, 11 Mar 2024 17:49:45 +0100 Subject: [PATCH 2/3] Adapt to nea client --- astra-db-client/pom.xml | 56 +- .../db/AstraDBClient.java} | 150 +- .../datastax/astra/db/AstraDBCollection.java | 27 + .../datastax/astra/db/AstraDBDatabase.java | 274 ++ .../datastax/astra/db/AstraDBEndpoint.java | 108 + .../com/datastax/astra/db/AstraDBOptions.java | 22 + .../com/datastax/astra/db/package-info.java | 4 + .../astradb/client/AstraCollection.java | 1346 --------- .../com/datastax/astradb/client/AstraDB.java | 454 --- .../astradb/client/AstraDBRepository.java | 464 --- .../client/cassio/AbstractCassandraTable.java | 143 - .../astradb/client/cassio/AnnQuery.java | 41 - .../astradb/client/cassio/AnnResult.java | 29 - .../astradb/client/cassio/CassIO.java | 172 -- .../cassio/CassandraSimilarityMetric.java | 44 - .../cassio/ClusteredMetadataVectorRecord.java | 60 - .../cassio/ClusteredMetadataVectorTable.java | 384 --- .../client/cassio/ClusteredRecord.java | 30 - .../astradb/client/cassio/ClusteredTable.java | 193 -- .../client/cassio/MetadataVectorRecord.java | 94 - .../client/cassio/MetadataVectorTable.java | 187 -- .../astradb/client/cassio/package-info.java | 4 - .../datastax/astradb/client/package-info.java | 4 - .../datastax/astradb/client/v2/AstraDB.java | 241 -- .../astradb/client/v2/AstraDBClients.java | 15 - .../datastax/astra/AstraDBTestSupport.java | 69 + .../astra/documentation/FindCollection.java | 21 + .../integration/AstraNamespaceITTest.java | 19 + .../astra/unit/AstraDBEndpointTest.java | 40 + .../client/AstraDatabaseReworkTest.java | 25 - .../client/AstraDatabaseTestSuiteIT.java | 1533 ---------- .../astradb/client/BreakAstraTest.java | 54 - .../cassio/ClusteredMetadataVectorStore.java | 218 -- .../client/cassio/RagPdfVectorTest.java | 165 -- .../cassio/vector/AstraDatabaseDemoTest.java | 181 -- .../vector/AstraDatabaseQuickStart.java | 104 - .../cassio/vector/AstraUIQuickStart.java | 14 - .../vector/VectorClientPhilosopherTest.java | 140 - .../vector/VectorClientProductTest.java | 164 -- .../CassIOClusteredMetadataVectorTable.java | 57 - .../documentation/CassIOConnection.java | 28 - .../CassIOMetadataVectorTable.java | 54 - .../client/documentation/ClearCollection.java | 14 - .../client/documentation/Connecting.java | 19 - .../client/documentation/ConnectingAdmin.java | 14 - .../documentation/CreateCollection.java | 36 - .../client/documentation/CreateDatabase.java | 18 - .../client/documentation/CreateKeyspace.java | 13 - .../documentation/DeleteCollection.java | 12 - .../client/documentation/DeleteDatabase.java | 18 - .../client/documentation/DeleteKeyspace.java | 13 - .../client/documentation/DeleteMany.java | 32 - .../client/documentation/DeleteOne.java | 17 - .../astradb/client/documentation/Find.java | 79 - .../documentation/FindAllCollections.java | 23 - .../documentation/FindAllDatabases.java | 15 - .../client/documentation/FindById.java | 42 - .../client/documentation/FindByVector.java | 46 - .../client/documentation/FindCollection.java | 17 - .../client/documentation/FindDatabase.java | 24 - .../client/documentation/FindKeyspace.java | 23 - .../client/documentation/FindMany.java | 14 - .../astradb/client/documentation/FindOne.java | 67 - .../client/documentation/FindPage.java | 53 - .../client/documentation/FindVector.java | 30 - .../client/documentation/InsertMany.java | 39 - .../client/documentation/InsertOne.java | 51 - .../ObjectMappingClearCollection.java | 21 - .../ObjectMappingCreateCollection.java | 32 - .../ObjectMappingDeleteMany.java | 30 - .../documentation/ObjectMappingDeleteOne.java | 25 - .../documentation/ObjectMappingFind.java | 80 - .../documentation/ObjectMappingFindOne.java | 27 - .../ObjectMappingFindVector.java | 32 - .../ObjectMappingInsertMany.java | 35 - .../documentation/ObjectMappingInsertOne.java | 29 - .../documentation/ObjectMappingPaging.java | 25 - .../ObjectMappingUpdateMany.java | 35 - .../documentation/ObjectMappingUpdateOne.java | 29 - .../client/documentation/QuickStart.java | 55 - .../client/documentation/QuickStartAA.java | 52 - .../client/documentation/UpdateMany.java | 20 - .../client/documentation/UpdateOne.java | 30 - .../client/documentation/UpsertOne.java | 39 - .../astradb/client/v2/AstraDataApiV2Test.java | 19 - .../src/test/resources/documentation.asciidoc | 1433 --------- astra-db-client/src/test/resources/johnny.pdf | Bin 66591 -> 0 bytes .../src/test/resources/philo_quotes.json | 2590 ----------------- .../src/test/resources/philosopher-quotes.csv | 452 --- .../astra/devops}/AbstractApiClient.java | 10 +- .../astra/devops/AstraDevopsClient.java} | 37 +- .../astra/devops/db/AstraDBDevopsClient.java} | 38 +- .../astra/devops}/db/DbAccessListsClient.java | 20 +- .../astra/devops}/db/DbCdcsClient.java | 26 +- .../astra/devops}/db/DbDatacentersClient.java | 26 +- .../astra/devops}/db/DbKeyspacesClient.java | 16 +- .../astra/devops}/db/DbOpsClient.java | 28 +- .../devops}/db/DbPrivateLinksClient.java | 12 +- .../astra/devops}/db/DbRegionsClient.java | 22 +- .../astra/devops}/db/DbTelemetryClient.java | 28 +- .../astra/devops}/db/domain/AccessList.java | 5 +- .../devops}/db/domain/AccessListAddress.java | 2 +- .../db/domain/AccessListAddressRequest.java | 2 +- .../devops}/db/domain/AccessListRequest.java | 2 +- .../devops}/db/domain/CloudProviderType.java | 2 +- .../astra/devops}/db/domain/Database.java | 2 +- .../astra/devops}/db/domain/DatabaseCost.java | 2 +- .../db/domain/DatabaseCreationBuilder.java | 2 +- .../db/domain/DatabaseCreationRequest.java | 2 +- .../db/domain/DatabaseCreationType.java | 2 +- .../devops}/db/domain/DatabaseFilter.java | 2 +- .../astra/devops}/db/domain/DatabaseInfo.java | 2 +- .../devops}/db/domain/DatabaseMetrics.java | 2 +- .../devops}/db/domain/DatabaseRegion.java | 2 +- .../domain/DatabaseRegionCreationRequest.java | 2 +- .../db/domain/DatabaseRegionServerless.java | 2 +- .../devops}/db/domain/DatabaseStatusType.java | 2 +- .../devops}/db/domain/DatabaseStorage.java | 2 +- .../astra/devops}/db/domain/Datacenter.java | 2 +- .../astra/devops}/db/domain/RegionType.java | 2 +- .../astra/devops}/db/domain/package-info.java | 2 +- .../telemetry/CloudWatchTelemetryRequest.java | 2 +- .../telemetry/DatadogTelemetryRequest.java | 2 +- .../telemetry/KafkaTelemetryRequest.java | 2 +- .../telemetry/PrometheusTelemetryRequest.java | 2 +- .../telemetry/SpecializedTelemetryClient.java | 10 +- .../telemetry/SplunkTelemetryRequest.java | 2 +- .../db/domain/telemetry/package-info.java | 2 +- .../ChangeDataCaptureNotFoundException.java | 2 +- .../exception/DatabaseNotFoundException.java | 2 +- .../KeyspaceAlreadyExistException.java | 2 +- .../exception/KeyspaceNotFoundException.java | 2 +- .../RegionAlreadyExistException.java | 2 +- .../db/exception/RegionNotFoundException.java | 2 +- .../devops/db/exception/package-info.java | 2 + .../astra/devops}/db/package-info.java | 2 +- .../exception/AuthenticationException.java | 2 +- .../astra/devops}/exception/package-info.java | 2 +- .../astra/devops}/org/KeysClient.java | 18 +- .../astra/devops}/org/RolesClient.java | 26 +- .../astra/devops}/org/TokensClient.java | 24 +- .../astra/devops}/org/UsersClient.java | 34 +- .../org/domain/CreateRoleResponse.java | 2 +- .../org/domain/CreateTokenResponse.java | 2 +- .../devops}/org/domain/DefaultRoles.java | 2 +- .../astra/devops}/org/domain/IamToken.java | 2 +- .../devops}/org/domain/InviteUserRequest.java | 2 +- .../astra/devops}/org/domain/Key.java | 2 +- .../devops}/org/domain/KeyDefinition.java | 2 +- .../org/domain/KeyRegionDefinition.java | 2 +- .../devops}/org/domain/Organization.java | 2 +- .../astra/devops}/org/domain/Permission.java | 2 +- .../org/domain/ResponseAllIamTokens.java | 2 +- .../devops}/org/domain/ResponseAllUsers.java | 2 +- .../astra/devops}/org/domain/Role.java | 2 +- .../devops}/org/domain/RoleDefinition.java | 2 +- .../astra/devops}/org/domain/RolePolicy.java | 2 +- .../astra/devops}/org/domain/User.java | 2 +- .../astra/devops}/org/domain/UserStatus.java | 2 +- .../devops}/org/domain/package-info.java | 2 +- .../org/exception/RoleNotFoundException.java | 2 +- .../exception/UserAlreadyExistException.java | 2 +- .../org/exception/UserNotFoundException.java | 2 +- .../devops}/org/exception/package-info.java | 2 +- .../astra/devops}/org/package-info.java | 2 +- .../astra/devops}/package-info.java | 2 +- .../streaming/AstraStreamingClient.java | 20 +- .../devops}/streaming/ClustersClient.java | 12 +- .../devops}/streaming/ProvidersClient.java | 10 +- .../devops}/streaming/RegionsClient.java | 14 +- .../devops}/streaming/TenantCdcClient.java | 34 +- .../astra/devops}/streaming/TenantClient.java | 24 +- .../devops}/streaming/TenantLimitsClient.java | 18 +- .../devops}/streaming/TenantStatsClient.java | 18 +- .../streaming/domain/CdcDefinition.java | 2 +- .../devops}/streaming/domain/Cluster.java | 2 +- .../devops}/streaming/domain/CreateCdc.java | 2 +- .../streaming/domain/CreateTenant.java | 2 +- .../domain/CreateTenantResponse.java | 3 +- .../devops}/streaming/domain/DeleteCdc.java | 2 +- .../devops}/streaming/domain/Statistics.java | 2 +- .../streaming/domain/StreamingRegion.java | 2 +- .../devops}/streaming/domain/Tenant.java | 2 +- .../devops}/streaming/domain/TenantLimit.java | 2 +- .../streaming/domain/package-info.java | 2 +- .../TenantAlreadyExistException.java | 2 +- .../exception/TenantNotFoundException.java | 2 +- .../streaming/exception/package-info.java | 2 + .../astra/devops}/streaming/package-info.java | 2 +- .../astra/devops}/utils/ApiError.java | 2 +- .../astra/devops}/utils/ApiLocator.java | 2 +- .../astra/devops}/utils/ApiResponse.java | 2 +- .../astra/devops}/utils/ApiResponseError.java | 2 +- .../astra/devops}/utils/ApiResponseHttp.java | 2 +- .../astra/devops}/utils/Assert.java | 2 +- .../astra/devops}/utils/AstraEnvironment.java | 2 +- .../astra/devops}/utils/AstraRc.java | 2 +- .../devops}/utils/HttpClientWrapper.java | 5 +- .../astra/devops}/utils/IdUtils.java | 2 +- .../astra/devops}/utils/JsonUtils.java | 2 +- .../astra/devops}/utils/TestUtils.java | 22 +- .../astra/devops}/utils/Utils.java | 2 +- .../astra/devops/utils/package-info.java | 2 + .../astra/sdk/db/exception/package-info.java | 2 - .../sdk/streaming/exception/package-info.java | 2 - .../dtsx/astra/sdk/utils/package-info.java | 2 - .../astra/devops}/AbstractDevopsApiTest.java | 28 +- .../astra/devops}/ApiDevopsClientTest.java | 16 +- .../astra/devops}/db/CdcClientTest.java | 16 +- .../astra/devops}/db/DatabaseClientTest.java | 22 +- .../astra/devops}/db/DatabasesClientTest.java | 20 +- .../db/NonProductionEnvironmentTest.java | 20 +- .../astra/devops}/iam/RolesClientTest.java | 18 +- .../astra/devops}/iam/TokensClientTest.java | 8 +- .../astra/devops}/iam/UsersClientTest.java | 10 +- .../streaming/AstraStreamingClientTest.java | 8 +- .../devops}/streaming/ClustersClientTest.java | 6 +- .../streaming/ProvidersClientTest.java | 4 +- .../devops}/streaming/RegionClientTest.java | 6 +- .../devops}/streaming/TenantClientTest.java | 6 +- .../streaming/TenantStatsClientTest.java | 8 +- .../sdk/streaming/PulsarClientProvider.java | 5 +- .../PulsarAdminAstraStreamingTest.java | 10 +- .../com/datastax/astra/sdk/AstraClient.java | 40 +- .../astra/sdk/config/AstraClientConfig.java | 59 +- .../com/datastax/astra/sdk/AstraRcTest.java | 3 +- .../db/ApiDocumentCollectionsAstraTest.java | 7 +- .../sdk/db/ApiDocumentDocumentAstraTest.java | 4 +- .../db/ApiDocumentNamespacesAstraTest.java | 4 +- .../db/ApiDocumentRepositoryAstraTest.java | 4 +- .../astra/sdk/db/ApiGraphQLAstraTest.java | 4 +- .../astra/sdk/db/ApiGrpcAstraTest.java | 4 +- .../db/AstraStargateInitializationTest.java | 4 +- pom.xml | 9 +- 234 files changed, 1185 insertions(+), 13157 deletions(-) rename astra-db-client/src/main/java/com/datastax/{astradb/client/AstraDBAdmin.java => astra/db/AstraDBClient.java} (77%) create mode 100644 astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java create mode 100644 astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java create mode 100644 astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java create mode 100644 astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java create mode 100644 astra-db-client/src/main/java/com/datastax/astra/db/package-info.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java delete mode 100644 astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/AstraDBTestSupport.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/integration/AstraNamespaceITTest.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/unit/AstraDBEndpointTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java delete mode 100644 astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java delete mode 100644 astra-db-client/src/test/resources/documentation.asciidoc delete mode 100644 astra-db-client/src/test/resources/johnny.pdf delete mode 100644 astra-db-client/src/test/resources/philo_quotes.json delete mode 100644 astra-db-client/src/test/resources/philosopher-quotes.csv rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/AbstractApiClient.java (92%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk/AstraOpsClient.java => datastax/astra/devops/AstraDevopsClient.java} (79%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk/db/AstraDBOpsClient.java => datastax/astra/devops/db/AstraDBDevopsClient.java} (88%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbAccessListsClient.java (88%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbCdcsClient.java (87%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbDatacentersClient.java (86%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbKeyspacesClient.java (85%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbOpsClient.java (94%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbPrivateLinksClient.java (93%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbRegionsClient.java (84%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DbTelemetryClient.java (78%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/AccessList.java (96%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/AccessListAddress.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/AccessListAddressRequest.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/AccessListRequest.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/CloudProviderType.java (96%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/Database.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseCost.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseCreationBuilder.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseCreationRequest.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseCreationType.java (75%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseFilter.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseInfo.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseMetrics.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseRegion.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseRegionCreationRequest.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseRegionServerless.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseStatusType.java (96%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/DatabaseStorage.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/Datacenter.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/RegionType.java (93%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/package-info.java (51%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/CloudWatchTelemetryRequest.java (93%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/DatadogTelemetryRequest.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/KafkaTelemetryRequest.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/PrometheusTelemetryRequest.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/SpecializedTelemetryClient.java (90%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/SplunkTelemetryRequest.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/domain/telemetry/package-info.java (51%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/ChangeDataCaptureNotFoundException.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/DatabaseNotFoundException.java (88%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/KeyspaceAlreadyExistException.java (92%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/KeyspaceNotFoundException.java (90%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/RegionAlreadyExistException.java (92%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/exception/RegionNotFoundException.java (89%) create mode 100644 astra-sdk-devops/src/main/java/com/datastax/astra/devops/db/exception/package-info.java rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/package-info.java (56%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/exception/AuthenticationException.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/exception/package-info.java (54%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/KeysClient.java (76%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/RolesClient.java (88%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/TokensClient.java (85%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/UsersClient.java (86%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/CreateRoleResponse.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/CreateTokenResponse.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/DefaultRoles.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/IamToken.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/InviteUserRequest.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/Key.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/KeyDefinition.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/KeyRegionDefinition.java (96%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/Organization.java (96%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/Permission.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/ResponseAllIamTokens.java (93%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/ResponseAllUsers.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/Role.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/RoleDefinition.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/RolePolicy.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/User.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/UserStatus.java (77%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/domain/package-info.java (60%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/exception/RoleNotFoundException.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/exception/UserAlreadyExistException.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/exception/UserNotFoundException.java (88%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/exception/package-info.java (56%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/org/package-info.java (65%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/package-info.java (52%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/AstraStreamingClient.java (91%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/ClustersClient.java (87%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/ProvidersClient.java (83%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/RegionsClient.java (85%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantCdcClient.java (83%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantClient.java (85%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantLimitsClient.java (78%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantStatsClient.java (90%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/CdcDefinition.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/Cluster.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/CreateCdc.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/CreateTenant.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/CreateTenantResponse.java (84%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/DeleteCdc.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/Statistics.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/StreamingRegion.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/Tenant.java (94%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/TenantLimit.java (98%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/domain/package-info.java (51%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/exception/TenantAlreadyExistException.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/exception/TenantNotFoundException.java (87%) create mode 100644 astra-sdk-devops/src/main/java/com/datastax/astra/devops/streaming/exception/package-info.java rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/package-info.java (69%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/ApiError.java (95%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/ApiLocator.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/ApiResponse.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/ApiResponseError.java (89%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/ApiResponseHttp.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/Assert.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/AstraEnvironment.java (97%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/AstraRc.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/HttpClientWrapper.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/IdUtils.java (92%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/JsonUtils.java (99%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/TestUtils.java (91%) rename astra-sdk-devops/src/main/java/com/{dtsx/astra/sdk => datastax/astra/devops}/utils/Utils.java (99%) create mode 100644 astra-sdk-devops/src/main/java/com/datastax/astra/devops/utils/package-info.java delete mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/exception/package-info.java delete mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/streaming/exception/package-info.java delete mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/utils/package-info.java rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/AbstractDevopsApiTest.java (80%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/ApiDevopsClientTest.java (84%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/CdcClientTest.java (95%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DatabaseClientTest.java (93%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/DatabasesClientTest.java (93%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/db/NonProductionEnvironmentTest.java (66%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/iam/RolesClientTest.java (90%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/iam/TokensClientTest.java (85%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/iam/UsersClientTest.java (86%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/AstraStreamingClientTest.java (86%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/ClustersClientTest.java (89%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/ProvidersClientTest.java (90%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/RegionClientTest.java (84%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantClientTest.java (90%) rename astra-sdk-devops/src/test/java/com/{dtsx/astra/sdk => datastax/astra/devops}/streaming/TenantStatsClientTest.java (92%) diff --git a/astra-db-client/pom.xml b/astra-db-client/pom.xml index fa4aa4ec..31abb960 100644 --- a/astra-db-client/pom.xml +++ b/astra-db-client/pom.xml @@ -2,7 +2,7 @@ 4.0.0 astra-db-client - Java Client for Astra DB + + astra-db-client com.datastax.astra @@ -11,45 +11,26 @@ - 0.18.2 - 0.27.0 - 4.12.0 - 3.7.0 + 11 + org.slf4j slf4j-api - - - com.squareup.okhttp3 - okhttp - ${okhttp.version} - - - - com.squareup.okio - okio-jvm - ${okio-jvm.version} - - org.projectlombok lombok - + com.datastax.stargate stargate-sdk-data - - com.datastax.stargate - stargate-dataapi-client - @@ -57,7 +38,7 @@ java-driver-core - + com.datastax.astra astra-sdk-devops @@ -75,40 +56,37 @@ logback-classic test - - - dev.langchain4j - langchain4j - ${langchain4j.version} - test - - dev.langchain4j - langchain4j-open-ai - ${langchain4j.version} + org.assertj + assertj-core test - dev.langchain4j - langchain4j-document-parser-apache-pdfbox - ${langchain4j.version} + com.datastax.stargate + stargate-sdk-data + ${stargate-sdk.version} + tests + test-jar test + + org.apache.maven.plugins maven-compiler-plugin - 11 - 11 + ${java.version} + ${java.version} + Apache-2.0 diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java similarity index 77% rename from astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java rename to astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java index d4053b3a..f55d648b 100644 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBAdmin.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java @@ -1,27 +1,24 @@ -package com.datastax.astradb.client; - -import com.dtsx.astra.sdk.db.AstraDBOpsClient; -import com.dtsx.astra.sdk.db.DbOpsClient; -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import com.dtsx.astra.sdk.db.domain.Database; -import com.dtsx.astra.sdk.db.domain.DatabaseCreationRequest; -import com.dtsx.astra.sdk.db.domain.DatabaseStatusType; -import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; -import com.dtsx.astra.sdk.utils.ApiLocator; -import com.dtsx.astra.sdk.utils.Assert; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import com.dtsx.astra.sdk.utils.AstraRc; -import io.stargate.sdk.data.DataApiClient; -import io.stargate.sdk.http.RetryHttpClient; +package com.datastax.astra.db; + + +import com.datastax.astra.devops.db.AstraDBDevopsClient; +import com.datastax.astra.devops.db.DbOpsClient; +import com.datastax.astra.devops.db.domain.CloudProviderType; +import com.datastax.astra.devops.db.domain.Database; +import com.datastax.astra.devops.db.domain.DatabaseCreationRequest; +import com.datastax.astra.devops.db.domain.DatabaseStatusType; +import com.datastax.astra.devops.db.exception.DatabaseNotFoundException; +import com.datastax.astra.devops.utils.ApiLocator; +import com.datastax.astra.devops.utils.Assert; +import com.datastax.astra.devops.utils.AstraEnvironment; +import com.datastax.astra.devops.utils.AstraRc; +import io.stargate.sdk.data.client.DataApiClient; import lombok.Getter; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; -import java.io.Closeable; -import java.io.IOException; import java.net.URI; import java.net.http.HttpClient; -import java.net.http.HttpClient.Version; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; @@ -36,42 +33,43 @@ import static io.stargate.sdk.utils.Utils.readEnvVariable; /** - * Client for AstraDB at organization level (crud for databases). + * Main Client for AstraDB, it implements administration and Data Api Operations. + * + * @see AstraDBDevopsClient Client specialized in the Devops API operations + * @see DataApiClient Client specialized for Data API operation */ @Slf4j -public class AstraDBAdmin implements Closeable { +public class AstraDBClient { - public static final String USER_AGENT = "astra-db-java"; - - /** Default timeout for initiating connection. */ - public static final int CONNECT_TIMEOUT_SECONDS = 20; - - /** Default cloud provider if not provided by user. (free-tier) */ + /** Default cloud provider. (free-tier) */ public static final CloudProviderType FREE_TIER_CLOUD = CloudProviderType.GCP; - /** Default region if not provided by user. (free-tier) */ + /** Default region. (free-tier) */ public static final String FREE_TIER_CLOUD_REGION = "us-east1"; /** Header name used to hold the Astra Token. */ public static final String TOKEN_HEADER_PARAM = "X-Token"; - /** Default keyspace name if not provided by user. */ + /** Default keyspace (same created by the ui). */ public static final String DEFAULT_KEYSPACE = "default_keyspace"; - /** Client for the Astra Devops Api. (crud on databases) */ - final AstraDBOpsClient devopsDbClient; + /** Client for Astra Devops Api. */ + final AstraDBDevopsClient devopsDbClient; + + /** Options to personalized http client other client options. */ + final AstraDBOptions astraDbOptions; - /** Target Astra Environment, default is PROD. */ + /** Astra Environment. */ final AstraEnvironment env; - /** Astra Token used as credentials. */ + /** Astra Token (credentials). */ @Getter final String token; - /** JDK11 HttpClient to interact with apis. */ + /** Side Http Client (use only to resume a db). */ final HttpClient httpClient; - /** Token value read for environment variable. */ + /** Token read for environment variable ASTRA_DB_APPLICATION_TOKEN (if any). */ static String astraConfigToken; /* @@ -86,21 +84,21 @@ public class AstraDBAdmin implements Closeable { } /** - * Default initialization, the token is retrieved from environment variable ASTRA_DB_APPLICATION_TOKEN or from + * Default constructor. The token is read from environment variable ASTRA_DB_APPLICATION_TOKEN or * file ~/.astrarc, section default, key ASTRA_DB_APPLICATION_TOKEN. */ - public AstraDBAdmin() { + public AstraDBClient() { this(astraConfigToken); } /** - * Initialization with an authentification token, defaulting to production environment. + * Constructor with an authentification token, defaulting to production environment, and default http options. * * @param token * authentication token */ - public AstraDBAdmin(String token) { - this(token, AstraEnvironment.PROD); + public AstraDBClient(String token) { + this(token, AstraEnvironment.PROD, new AstraDBOptions()); } /** @@ -110,46 +108,25 @@ public AstraDBAdmin(String token) { * authentication token * @param env * target Astra environment + * @param astraDbOptions + * options for AstraDb. */ - public AstraDBAdmin(String token, AstraEnvironment env) { + public AstraDBClient(String token, AstraEnvironment env, AstraDBOptions astraDbOptions) { this.env = env; this.token = token; - this.devopsDbClient = new AstraDBOpsClient(token, env); - this.httpClient = HttpClient.newBuilder() - .version(Version.HTTP_2) - .connectTimeout(Duration.ofSeconds(CONNECT_TIMEOUT_SECONDS)) - .build(); - String version = AstraDBAdmin.class.getPackage().getImplementationVersion(); - AstraDBAdmin.setCallerName(AstraDBAdmin.USER_AGENT, (null != version) ? version : "dev"); - } - - // -------------------------- - // --- User Agent ---- - // -------------------------- - - /** - * Allow user to set the client name - * - * @param callerName - * client name - * @param callerVersion - * client version - */ - public static void setCallerName(String callerName, String callerVersion) { - RetryHttpClient.getInstance().pushUserAgent(callerName, callerVersion); - } - - // -------------------- - // -- Watch --- - // -------------------- - - public void watch() { - throw new UnsupportedOperationException("As we connect to a HTTP apis without hooks, no watch is possible."); + this.devopsDbClient = new AstraDBDevopsClient(token, env); + this.astraDbOptions = astraDbOptions; + + // Local Agent for Resume + HttpClient.Builder httpClientBuilder = HttpClient.newBuilder(); + httpClientBuilder.version(astraDbOptions.getHttpClientOptions().getHttpVersion()); + httpClientBuilder.connectTimeout(Duration.ofSeconds(astraDbOptions.getHttpClientOptions().getConnectionRequestTimeoutInSeconds())); + this.httpClient = httpClientBuilder.build(); } - // -------------------- - // -- Keyspace --- - // -------------------- + // ------------------------------- + // -- Working with Namespaces --- + // ------------------------------- /** * Create a keyspace. @@ -364,7 +341,7 @@ public Optional getDatabaseInformations(@NonNull UUID id) { * @return * database client */ - public AstraDB getDatabase(@NonNull String databaseName) { + public AstraDBDatabase getDatabase(@NonNull String databaseName) { List dbs = getDatabaseInformations(databaseName).collect(Collectors.toList()); if (dbs.isEmpty()) { throw new DatabaseNotFoundException(databaseName); @@ -387,8 +364,14 @@ public AstraDB getDatabase(@NonNull String databaseName) { * @return * database client */ - public AstraDB getDatabase(UUID databaseId) { - return new AstraDB(token, databaseId, null, env, AstraDBAdmin.DEFAULT_KEYSPACE); + public AstraDBDatabase getDatabase(UUID databaseId) { + String databaseRegion = devopsDbClient + .findById(databaseId.toString()) + .map(db -> db.getInfo().getRegion()) + .orElseThrow(() -> new DatabaseNotFoundException(databaseId.toString())); + return new AstraDBDatabase( + new AstraDBEndpoint(databaseId, databaseRegion, env), + token, AstraDBClient.DEFAULT_KEYSPACE, astraDbOptions); } /** @@ -464,7 +447,7 @@ private void resumeDb(Database db) { * database client */ public DataApiClient getDataApiClient(@NonNull String databaseName) { - return getDatabase(databaseName).getApiClient(); + return getDatabase(databaseName).getDataApiClient(); } /** @@ -476,7 +459,7 @@ public DataApiClient getDataApiClient(@NonNull String databaseName) { * database client */ public DataApiClient getDataApiClient(@NonNull UUID databaseId) { - return getDatabase(databaseId).getApiClient(); + return getDatabase(databaseId).getDataApiClient(); } /** @@ -485,15 +468,8 @@ public DataApiClient getDataApiClient(@NonNull UUID databaseId) { * @return * devops client. */ - public AstraDBOpsClient getDevopsApiClient() { + public AstraDBDevopsClient getDevopsApiClient() { return this.devopsDbClient; } - - /** - * Close the client. - */ - @Override - public void close() throws IOException { - } } diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java new file mode 100644 index 00000000..e6b878f8 --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java @@ -0,0 +1,27 @@ +package com.datastax.astra.db; + +import io.stargate.sdk.data.internal.DataApiCollectionImpl; + +/** + * Implementation of a Collection within Astra. + * + * @param + * working document class + */ +public class AstraDBCollection extends DataApiCollectionImpl { + + /** + * Constructor for a collection. + * + * @param db + * database in use + * @param collectionName + * collection identifier + * @param clazz + * document class to use + */ + protected AstraDBCollection(AstraDBDatabase db, String collectionName, Class clazz) { + super(db, collectionName, clazz); + } + +} diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java new file mode 100644 index 00000000..6697daa2 --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java @@ -0,0 +1,274 @@ +package com.datastax.astra.db; + +import com.datastax.astra.devops.db.AstraDBDevopsClient; +import io.stargate.sdk.data.client.DataApiClient; +import io.stargate.sdk.data.client.DataApiClients; +import io.stargate.sdk.data.client.DataApiCollection; +import io.stargate.sdk.data.client.DataApiNamespace; +import io.stargate.sdk.data.client.model.CreateCollectionOptions; +import io.stargate.sdk.data.client.model.CreateNamespaceOptions; +import io.stargate.sdk.data.internal.model.ApiResponse; +import io.stargate.sdk.data.internal.model.CollectionInformation; +import io.stargate.sdk.data.internal.model.NamespaceInformation; +import io.stargate.sdk.http.LoadBalancedHttpClient; +import io.stargate.sdk.http.ServiceHttp; +import io.stargate.sdk.utils.Assert; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * Client for AstraDB at database level (crud for collections). + */ +@Slf4j @Getter +public class AstraDBDatabase implements DataApiNamespace, DataApiClient { + + /** + * Url to access the API + */ + private final AstraDBEndpoint astraDbEndpoint; + + /** + * Top level resource for json api. + */ + private final DataApiClient dataApiClient; + + /** + * Namespace client + */ + private final DataApiNamespace dataApiNamespace; + + /** + * Devops Api Client. + */ + private final AstraDBDevopsClient devopsApi; + + /** + * Token used for the credentials + */ + private final String token; + + /** + * Name of the namespace in use. + */ + private final String namespaceName; + + /** + * Configuration of the + */ + private final AstraDBOptions astraDbOptions; + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + */ + public AstraDBDatabase(String apiEndpoint, String token) { + this(apiEndpoint, token, AstraDBClient.DEFAULT_KEYSPACE); + } + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + * @param keyspace + * keyspace + */ + public AstraDBDatabase(String apiEndpoint, String token, String keyspace) { + this(apiEndpoint, token, keyspace, new AstraDBOptions()); + } + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + * @param astraDbOptions + * setup of the clients with options + */ + public AstraDBDatabase(String apiEndpoint, String token, AstraDBOptions astraDbOptions) { + this(apiEndpoint, token, AstraDBClient.DEFAULT_KEYSPACE, astraDbOptions); + } + + /** + * Initialization with endpoint and apikey. + * + * @param token + * api token + * @param apiEndpoint + * api endpoint + * @param keyspace + * keyspace + * @param astraDbOptions + * setup of the clients with options + */ + public AstraDBDatabase(String apiEndpoint, String token, String keyspace, AstraDBOptions astraDbOptions) { + this(AstraDBEndpoint.parse(apiEndpoint), token, keyspace, astraDbOptions); + } + + /** + * Initialization with endpoint and apikey. + * + * @param apiEndpoint + * api endpoint + * @param token + * api token + * @param namespaceName + * namespaceName + * @param astraDbOptions + * setup of the clients with options + */ + public AstraDBDatabase(AstraDBEndpoint apiEndpoint, String token, String namespaceName, AstraDBOptions astraDbOptions) { + Assert.notNull(apiEndpoint, "endpoint"); + Assert.hasLength(token, "token"); + Assert.hasLength(namespaceName, "namespaceName"); + this.token = token; + this.astraDbEndpoint = apiEndpoint; + this.astraDbOptions = astraDbOptions; + this.namespaceName = namespaceName; + this.dataApiClient = DataApiClients.create(astraDbEndpoint.getApiEndPoint(), token, astraDbOptions.getHttpClientOptions()); + this.dataApiNamespace = dataApiClient.getNamespace(namespaceName); + this.devopsApi = new AstraDBDevopsClient(token); + String version = AstraDBDatabase.class.getPackage().getImplementationVersion(); + } + + // ------------------------------------------ + // ---- Crud on Namespaces (dataApi) ---- + // ------------------------------------------ + + /** {@inheritDoc} */ + @Override + public DataApiNamespace getNamespace(String namespaceName) { + return dataApiClient.getNamespace(namespaceName); + } + + /** {@inheritDoc} */ + @Override + public Stream listNamespaceNames() { + return dataApiClient.listNamespaceNames(); + } + + /** {@inheritDoc} */ + @Override + public Stream listNamespaces() { + return dataApiClient.listNamespaces(); + } + + /** {@inheritDoc} */ + @Override + public boolean isNamespaceExists(String namespace) { + return dataApiClient.isNamespaceExists(namespace); + } + + /** {@inheritDoc} */ + @Override + public DataApiNamespace createNamespace(String namespace) { + // We will NOT use the Data API methods in the Astra context but some devops API + devopsApi.database(astraDbEndpoint.getDatabaseId().toString()).keyspaces().create(namespace); + return new AstraDBDatabase(astraDbEndpoint, token, namespace, astraDbOptions); + } + + /** {@inheritDoc} */ + @Override + public void dropNamespace(String namespace) { + devopsApi.database(astraDbEndpoint.getDatabaseId().toString()).keyspaces().delete(namespace); + + } + + /** {@inheritDoc} */ + @Override + public DataApiNamespace createNamespace(String namespace, CreateNamespaceOptions options) { + throw new UnsupportedOperationException("Astra enforce the replication factor for you."); + } + + // -------------------------------------------- + // ---- Information on current Namespace ---- + // -------------------------------------------- + + /** {@inheritDoc} */ + @Override + public String getName() { + return this.namespaceName; + } + + /** {@inheritDoc} */ + @Override + public DataApiClient getClient() { + return dataApiClient; + } + + // -------------------------------------------- + // ---- Crud on Collection (namespace) ---- + // -------------------------------------------- + + /** {@inheritDoc} */ + @Override + public Stream listCollectionNames() { + return dataApiNamespace.listCollectionNames(); + } + + /** {@inheritDoc} */ + @Override + public Stream listCollections() { + return dataApiNamespace.listCollections(); + } + + /** {@inheritDoc} */ + @Override + public DataApiCollection getCollection(String collectionName, Class documentClass) { + return dataApiNamespace.getCollection(collectionName, documentClass); + } + + /** {@inheritDoc} */ + @Override + public void drop() { + dataApiNamespace.drop(); + } + + /** {@inheritDoc} */ + @Override + public DataApiCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions, Class documentClass) { + return dataApiNamespace.createCollection(collectionName, createCollectionOptions, documentClass); + } + + /** {@inheritDoc} */ + @Override + public void dropCollection(String collectionName) { + dataApiNamespace.dropCollection(collectionName); + } + + /** {@inheritDoc} */ + @Override + public ApiResponse runCommand(String jsonCommand) { + return dataApiNamespace.runCommand(jsonCommand); + } + + /** {@inheritDoc} */ + @Override + public DOC runCommand(String jsonCommand, Class documentClass) { + return dataApiNamespace.runCommand(jsonCommand, documentClass); + } + + /** {@inheritDoc} */ + @Override + public Function lookup() { + return dataApiNamespace.lookup(); + } + + /** {@inheritDoc} */ + @Override + public LoadBalancedHttpClient getHttpClient() { + return dataApiNamespace.getHttpClient(); + } + +} diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java new file mode 100644 index 00000000..b12eeece --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java @@ -0,0 +1,108 @@ +package com.datastax.astra.db; + +import com.datastax.astra.devops.utils.ApiLocator; +import com.datastax.astra.devops.utils.AstraEnvironment; +import io.stargate.sdk.utils.Assert; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +/** + * Create an endpoint to connect to a database. + */ +@Data @NoArgsConstructor +public class AstraDBEndpoint { + + /** + * Current Environment + */ + AstraEnvironment env; + + /** + * Database Identifier + */ + UUID databaseId; + + /** + * Database Region + */ + String databaseRegion; + + /** + * Parse an endpoint URL to know information on the DB. + * + * @param endpointUrl + * endpoint URL copy from UI + * @return + * astra db endpoint parsed + */ + public static AstraDBEndpoint parse(String endpointUrl) { + Assert.notNull(endpointUrl, "endpoint"); + AstraDBEndpoint endpoint = new AstraDBEndpoint(); + String tmpUrl; + if (endpointUrl.contains(AstraEnvironment.PROD.getAppsSuffix())) { + endpoint.env = AstraEnvironment.PROD; + tmpUrl= endpointUrl.replaceAll(AstraEnvironment.PROD.getAppsSuffix(), ""); + } else if (endpointUrl.contains(AstraEnvironment.TEST.getAppsSuffix())) { + endpoint.env = AstraEnvironment.TEST; + tmpUrl= endpointUrl.replaceAll(AstraEnvironment.TEST.getAppsSuffix(), ""); + } else if (endpointUrl.contains(AstraEnvironment.DEV.getAppsSuffix())) { + endpoint.env = AstraEnvironment.DEV; + tmpUrl= endpointUrl.replaceAll(AstraEnvironment.DEV.getAppsSuffix(), ""); + } else { + throw new IllegalArgumentException("Unable to detect environment from endpoint"); + } + tmpUrl = tmpUrl.replaceAll("https://", ""); + endpoint.databaseId = UUID.fromString(tmpUrl.substring(0,36)); + endpoint.databaseRegion = tmpUrl.substring(37); + return endpoint; + } + + /** + * Constructor from an URL. + */ + public AstraDBEndpoint(String apiEndpoint) { + AstraDBEndpoint a = parse(apiEndpoint); + this.env = a.env; + this.databaseId = a.databaseId; + this.databaseRegion = a.databaseRegion; + } + + /** + * Constructor with chunk of the URL. + * + * @param databaseId + * database identifier + * @param databaseRegion + * database region + * @param env + * environment + */ + public AstraDBEndpoint(UUID databaseId, String databaseRegion, AstraEnvironment env) { + this.databaseId = databaseId; + this.databaseRegion = databaseRegion; + this.env = env; + } + + /** + * Return the endpoint URL based on the chunks. + * + * @return + * endpoint URL. + */ + public String getApiEndPoint() { + return ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), databaseRegion); + } + + /** + * Return the endpoint URL based on the chunks. + * + * @return + * endpoint URL. + */ + public String getOriginalEndPoint() { + return getApiEndPoint().replaceAll("/api/json", ""); + } + +} diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java new file mode 100644 index 00000000..1240f04c --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java @@ -0,0 +1,22 @@ +package com.datastax.astra.db; + +import io.stargate.sdk.http.HttpClientOptions; +import lombok.Data; + +/** + * Astra DB Connections. + */ +@Data +public class AstraDBOptions { + + /** + * Http Connections. + */ + HttpClientOptions httpClientOptions = HttpClientOptions.builder() + .userAgentCallerName("astra-db-java") + .userAgentCallerVersion( + AstraDBOptions.class.getPackage().getImplementationVersion() != null ? + AstraDBOptions.class.getPackage().getImplementationVersion() : "dev") + .build(); + +} diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/package-info.java b/astra-db-client/src/main/java/com/datastax/astra/db/package-info.java new file mode 100644 index 00000000..e3be8c65 --- /dev/null +++ b/astra-db-client/src/main/java/com/datastax/astra/db/package-info.java @@ -0,0 +1,4 @@ +/** + * Data Api Client wrapper for AstraDB. + */ +package com.datastax.astra.db; \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java deleted file mode 100644 index ce86a9fb..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraCollection.java +++ /dev/null @@ -1,1346 +0,0 @@ -package com.datastax.astradb.client; - -import io.stargate.sdk.core.domain.Page; -import io.stargate.sdk.data.CollectionClient; -import io.stargate.sdk.data.domain.DocumentMutationResult; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.JsonResultUpdate; -import io.stargate.sdk.data.domain.UpdateStatus; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import io.stargate.sdk.data.domain.odm.DocumentResultMapper; -import io.stargate.sdk.data.domain.query.DeleteQuery; -import io.stargate.sdk.data.domain.query.DeleteResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import io.stargate.sdk.data.domain.query.SelectQueryBuilder; -import io.stargate.sdk.data.domain.query.UpdateQuery; -import lombok.Getter; -import lombok.NonNull; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Stream; - -/** - * Client for AstraDB at collection level (crud for documents). - */ -@Getter -public class AstraCollection { - - /** - * Internal Stargate data api client. - */ - CollectionClient collectionClient; - - /** - * Constructor with the internal client - * - * @param collectionClient - * collection description - */ - AstraCollection(CollectionClient collectionClient) { - this.collectionClient = collectionClient; - } - - /** - * Access the name of the collection. - * - * @return - * collection name - */ - public String getName() { - return collectionClient.getCollection(); - } - - // -------------------------- - // --- Insert One ---- - // -------------------------- - - /** - * Insert a single document from a Json String. - * - * @param json - * json String - * @return - * mutation result with status and id - */ - public final JsonDocumentMutationResult insertOne(String json) { - return collectionClient.insertOne(json); - } - - /** - * Insert a single document from a Json String, asynchronously. - * - * @param json - * json Strings - * @return - * mutation result with status and id - */ - public final CompletableFuture insertOneAsync(String json) { - return collectionClient.insertOneAsync(json); - } - - /** - * Insert a single document from a Json Document (schemaless). - * - * @param document - * current bean - * @return - * mutation result with status and id - */ - public final JsonDocumentMutationResult insertOne(JsonDocument document) { - return collectionClient.insertOne(document); - } - - /** - * Insert a single document from a Json Document (schemaless), asynchronously. - * - * @param document - * current bean - * @return - * mutation result with status and id - */ - public final CompletableFuture insertOneASync(JsonDocument document) { - return collectionClient.insertOneAsync(document); - } - - /** - * Insert a single document from a Document<T> object (SchemaFull) - * - * @param document - * current bean - * @param - * payload of document - * @return - * mutation result with status and id - */ - public final DocumentMutationResult insertOne(Document document) { - return collectionClient.insertOne(document); - } - - /** - * Insert a single document from a Document<T> object (SchemaFull), asynchronously. - * - * @param document - * current bean - * @param - * payload of document - * @return - * mutation result with status and id - */ - public final CompletableFuture> insertOneASync(Document document) { - return collectionClient.insertOneASync(document); - } - - // -------------------------- - // --- Upsert One ---- - // -------------------------- - - /** - * Upsert a single document from a Json String. - * - * @param json - * json Strings - * @return - * mutation result with status and id - */ - public final JsonDocumentMutationResult upsertOne(String json) { - return collectionClient.upsertOne(json); - } - - /** - * Upsert a single document from a Json String, asynchronously. - * - * @param json - * json Strings - * @return - * mutation result with status and id - */ - public final CompletableFuture upsertOneASync(String json) { - return collectionClient.upsertOneAsync(json); - } - - /** - * Upsert a single document from a Json Document (schemaless). - * - * @param document - * current document - * @return - * document id - */ - public final JsonDocumentMutationResult upsertOne(JsonDocument document) { - return collectionClient.upsertOne(document); - } - - /** - * Upsert a single document from a Json Document (schemaless), asynchronously. - * - * @param document - * current document - * @return - * document id - */ - public final CompletableFuture upsertOneASync(JsonDocument document) { - return CompletableFuture.supplyAsync(() -> collectionClient.upsertOne(document)); - } - - /** - * Upsert a single document from a Document<T> object (SchemaFull) - * - * @param document - * current document - * @param - * payload of document - * @return - * document id - */ - public final DocumentMutationResult upsertOne(Document document) { - return collectionClient.upsertOne(document); - } - - /** - * Upsert a single document from a Document<T> object (SchemaFull), asynchronously - * - * @param document - * current document - * @param - * payload of document - * @return - * document id - */ - public final CompletableFuture> upsertOneASync(Document document) { - return collectionClient.upsertOneASync(document); - } - - // -------------------------- - // --- Insert Many ---- - // -------------------------- - - /** - * Insert multiple documents (up to 20) as a Json String , for more document check insertManyChunked. - * - * @param json - * json String - * @return - * for each document its id and insertion status - */ - public final List insertMany(String json) { - return collectionClient.insertMany(json); - } - - /** - * Insert multiple documents (up to 20) as a Json String , for more document check insertManyChunked, Asynchronously. - * - * @param json - * json String - * @return - * for each document its id and insertion status - */ - public final CompletableFuture> insertManyASync(String json) { - return collectionClient.insertManyASync(json); - } - - /** - * Insert multiple documents (up to 20) as JsonDocument List , for more document check insertManyChunked. - * - * @param documents - * list of documents - * @return - * for each document its id and insertion status - */ - public final List insertManyJsonDocuments(List documents) { - return collectionClient.insertManyJsonDocuments(documents); - } - - /** - * Insert multiple documents (up to 20) as JsonDocument List , for more document check insertManyChunked. - * - * @param documents - * list of documents - * @return - * for each document its id and insertion status - */ - public final List insertMany(JsonDocument... documents) { - return collectionClient.insertMany(documents); - } - - /** - * Insert multiple documents (up to 20) as JsonDocument List , for more document check insertManyChunked, asynchronously. - * - * @param documents - * list of documents - * @return - * for each document its id and insertion status - */ - public final CompletableFuture> insertManyJsonDocumentsASync(List documents) { - return collectionClient.insertManyJsonDocumentsASync(documents); - } - - /** - * Insert multiple documents (up to 20) as generic Document<T> List , for more document check insertManyChunked. - * - * @param documents - * list of documents - * @param - * payload of document - * @return - * list of ids - */ - public final List> insertMany(List> documents) { - return collectionClient.insertMany(documents); - } - - /** - * Insert multiple documents (up to 20) as generic Document<T> List , for more document check insertManyChunked, asynchronously. - * - * @param documents - * list of documents - * @param - * payload of document - * @return - * list of ids - */ - public final CompletableFuture>> insertManyASync(List> documents) { - return collectionClient.insertManyASync(documents); - } - - // ------------------------------- - // --- Insert Many Chunked ---- - // ------------------------------- - - /** - * Insert large number of documents as generic Document<T> List. Insertions a redistributed in chunks and chunk processing are parallelized. - * - * @param documents - * list of documents - * @param chunkSize - * number of documents in one chunk (up to 20) - * @param concurrency - * number of chunks processed in parallel (depends on document size) - * @param - * payload for the documents - * @return - * list of ids - */ - public final List> insertManyChunked(List> documents, int chunkSize, int concurrency) { - return collectionClient.insertManyChunked(documents, chunkSize, concurrency); - } - - /** - * Insert large number of documents as generic Document<T> List. Insertions a redistributed in chunks and chunk processing are parallelized., Asynchronously - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * number of blocks in parallel - * @param - * represent the pojo, payload of document - * @return - * list of ids - */ - public final CompletableFuture>> insertManyChunkedASync(List> documents, int chunkSize, int concurrency) { - return CompletableFuture.supplyAsync(() -> insertManyChunked(documents, chunkSize, concurrency)); - } - - /** - * Insert large number of documents as JsonDocument List. Insertions a redistributed in chunks and chunk processing are parallelized., - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * number of blocks in parallel - * @return - * list of mutation status - */ - public final List insertManyChunkedJsonDocuments(List documents, int chunkSize, int concurrency) { - return collectionClient.insertManyJsonDocumentsChunked(documents, chunkSize, concurrency); - } - - /** - * Insert large number of documents as JsonDocument List. Insertions a redistributed in chunks and chunk processing are parallelized., Asynchronously - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * number of blocks in parallel - * @return - * list of mutation status - */ - public final CompletableFuture> insertManyChunkedJsonDocumentsAsync(List documents, int chunkSize, int concurrency) { - return CompletableFuture.supplyAsync(() -> insertManyChunkedJsonDocuments(documents, chunkSize, concurrency)); - } - - // ------------------------------ - // --- Upsert Many ---- - // ------------------------------ - - /** - * Upsert any items in the collection. - * - * @param json - * json String - * @return - * list of statuses - */ - public final List upsertMany(String json) { - return collectionClient.upsertMany(json); - } - - /** - * Upsert any items in the collection. - * - * @param json - * json String - * @return - * list of statuses - */ - public final CompletableFuture> upsertManyASync(String json) { - return collectionClient.upsertManyASync(json); - } - - /** - * Upsert any items in the collection. - * - * @param documents - * current collection list - * @return - * list of statuses - */ - public final List upsertManyJsonDocuments(List documents) { - return collectionClient.upsertManyJsonDocuments(documents); - } - - /** - * Upsert any items in the collection. - * - * @param documents - * current collection list - * @return - * list of statuses - */ - public final CompletableFuture> upsertManyJsonDocumentsASync(List documents) { - return collectionClient.upsertManyJsonDocumentsASync(documents); - } - - /** - * Upsert any items in the collection. - * @param documents - * current collection list - * @return - * list of statuses - * @param - * represent the pojo, payload of document - */ - public final List> upsertMany(List> documents) { - return collectionClient.upsertMany(documents); - } - - /** - * Upsert any items in the collection asynchronously. - * - * @param documents - * current collection list - * @return - * list of statuses - * @param - * represent the pojo, payload of document - */ - public final CompletableFuture>> upsertManyASync(List> documents) { - return collectionClient.upsertManyASync(documents); - } - - // -------------------------------- - // --- Upsert Many Chunked ---- - // -------------------------------- - - /** - * Low level insertion of multiple records - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * concurrency - * @param - * represent the pojo, payload of document - * @return - * list of ids - */ - public final List> upsertManyChunked(List> documents, int chunkSize, int concurrency) { - return collectionClient.upsertManyChunked(documents, chunkSize, concurrency); - } - - /** - * Low level insertion of multiple records - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * concurrency - * @param - * represent the pojo, payload of document - * @return - * list of ids - */ - public final CompletableFuture>> upsertManyChunkedASync(List> documents, int chunkSize, int concurrency) { - return collectionClient.upsertManyChunkedASync(documents, chunkSize, concurrency); - } - - /** - * Low level insertion of multiple records - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * concurrency - * @return - * list of ids - */ - public final List upsertManyJsonDocumentsChunked(List documents, int chunkSize, int concurrency) { - return collectionClient.upsertManyJsonDocumentsChunked(documents, chunkSize, concurrency); - } - - /** - * Low level insertion of multiple records - * - * @param documents - * list of documents - * @param chunkSize - * size of the block - * @param concurrency - * concurrency - * @return - * list of ids - */ - public final CompletableFuture> upsertManyJsonDocumentsChunkedAsync(List documents, int chunkSize, int concurrency) { - return collectionClient.upsertManyJsonDocumentsChunkedASync(documents, chunkSize, concurrency); - } - - // -------------------------- - // --- Count ---- - // -------------------------- - - /** - * Count Document request. - * - * @return - * number of document. - */ - public Integer countDocuments() { - return collectionClient.countDocuments(); - } - - /** - * Count Document request. - * - * @param jsonFilter - * request to filter for count - * @return - * number of document. - */ - public Integer countDocuments(Filter jsonFilter) { - return collectionClient.countDocuments(jsonFilter); - } - - // -------------------------- - // --- Find One ---- - // -------------------------- - - /** - * Check existence of a document from its id. - * Projection to make it as light as possible. - * - * @param id - * document identifier - * @return - * existence status - */ - public boolean isDocumentExists(String id) { - return collectionClient.isDocumentExists(id); - } - - /** - * Find one document matching the query. - * - * @param rawJsonQuery - * query documents and vector - * @return - * result if exists - */ - public Optional findOne(String rawJsonQuery) { - return collectionClient.findOne(rawJsonQuery); - } - - /** - * Find one document matching the query. - * - * @param query - * query documents and vector - * @return - * result if exists - */ - public Optional findOne(SelectQuery query) { - return collectionClient.findOne(query); - } - - /** - * Find one document matching the query. - * - * @param query - * query documents and vector - * @param clazz - * class of the document - * @return - * result if exists - * @param - * class to be marshalled - */ - public Optional> findOne(SelectQuery query, Class clazz) { - return findOne(query).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Find one document matching the query. - * - * @param query - * query documents and vector - * @param clazz - * class of the document - * @return - * result if exists - * @param - * class to be marshalled - */ - public Optional> findOne(String query, Class clazz) { - return findOne(query).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Find one document matching the query. - * - * @param query - * query documents and vector - * @param mapper - * convert a json into expected pojo - * @return - * result if exists - * @param - * class to be marshalled - */ - public Optional> findOne(SelectQuery query, DocumentResultMapper mapper) { - return findOne(query).map(mapper::map); - } - - - /** - * Find one document matching the query. - * - * @param query - * query documents and vector - * @param mapper - * convert a json into expected pojo - * @return - * result if exists - * @param - * class to be marshalled - */ - public Optional> findOne(String query, DocumentResultMapper mapper) { - return findOne(query).map(mapper::map); - } - - // -------------------------- - // --- Find By Id ---- - // -------------------------- - - /** - * Find document from its id. - * - * @param id - * document identifier - * @return - * document - */ - public Optional findById(String id) { - return findOne(SelectQuery.findById(id)); - } - - /** - * Find document from its id. - * - * @param id - * document identifier - * @param clazz - * class for target pojo - * @return - * document - * @param - * class to be marshalled - */ - public Optional> findById(@NonNull String id, Class clazz) { - return findById(id).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Find document from its id. - * - * @param id - * document identifier - * @param mapper - * convert a json into expected pojo - * @return - * document - * @param - * class to be marshalled - */ - public Optional> findById(@NonNull String id, DocumentResultMapper mapper) { - return findById(id).map(mapper::map); - } - - // -------------------------- - // --- Find By Vector ---- - // -------------------------- - - /** - * Find document from its vector. - * - * @param vector - * document vector - * @return - * document - */ - public Optional findOneByVector(float[] vector) { - return findOne(SelectQuery.findByVector(vector)); - } - - /** - * Find document from its vector. - * - * @param vector - * document vector - * @param clazz - * class for target pojo - * @return - * document - * @param - * class to be marshalled - */ - public Optional> findOneByVector(float[] vector, Class clazz) { - return findOneByVector(vector).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Find document from its vector. - * - * @param vector - * document vector - * @param mapper - * convert a json into expected pojo - * @return - * document - * @param - * class to be marshalled - */ - public Optional> findOneByVector(float[] vector, DocumentResultMapper mapper) { - return findOneByVector(vector).map(mapper::map); - } - - // -------------------------- - // --- Find ---- - // -------------------------- - - /** - * Search records with a filter - * - * @param query - * filter - * @return - * all items - */ - public Stream find(SelectQuery query) { - return collectionClient.find(query); - } - - /** - * Find documents matching the pagedQuery. - * - * @param pagedQuery - * current pagedQuery - * @return - * page of results - */ - public Page findPage(SelectQuery pagedQuery) { - return collectionClient.findPage(pagedQuery); - } - - /** - * Find documents matching the pagedQuery. - * - * @param pagedQuery - * current pagedQuery - * @return - * page of results - */ - public Page findPage(String pagedQuery) { - return collectionClient.findPage(pagedQuery); - } - - /** - * Search records with a filter - * - * @param query - * filter - * @param clazz - * class for target pojo - * @return - * all items - * @param - * class to be marshalled - */ - public Stream> find(SelectQuery query, Class clazz) { - return collectionClient.find(query, clazz); - } - - /** - * Search records with a filter - * - * @param query - * filter - * @param mapper - * convert a json into expected pojo - * @return - * all items - * @param - * class to be marshalled - */ - public Stream> find(SelectQuery query, DocumentResultMapper mapper) { - return collectionClient.find(query, mapper); - } - - /** - * Get all items in a collection. - * - * @return - * all items - */ - public Stream findAll() { - return collectionClient.findAll(); - } - - /** - * Find All with Object Mapping. - * - * @param clazz - * class to be used - * @param - * class to be marshalled - * @return - * stream of results - */ - public Stream> findAll(Class clazz) { - return collectionClient.findAll(clazz); - } - - /** - * Find All with Object Mapping. - * - * @param mapper - * convert a json into expected pojo - * @param - * class to be marshalled - * @return - * stream of results - */ - public Stream> findAll(DocumentResultMapper mapper) { - return collectionClient.findAll(mapper); - } - - /** - * Find documents matching the query. - * - * @param query - * current query - * @param clazz - * class for target pojo - * @return - * page of results - * @param - * class to be marshalled - */ - public Page> findPage(SelectQuery query, Class clazz) { - return collectionClient.findPage(query, clazz); - } - - // -------------------------- - // --- Delete One ---- - // -------------------------- - - /** - * Delete single record from a request. - * - * @param deleteQuery - * delete query - * @return - * number of deleted records - */ - public DeleteResult deleteOne(DeleteQuery deleteQuery) { - return collectionClient.deleteOne(deleteQuery); - } - - /** - * Delete single record from its id. - * - * @param id - * id - * @return - * number of deleted records - */ - public DeleteResult deleteById(String id) { - return deleteOne(DeleteQuery.deleteById(id)); - } - - /** - * Delete single record from its vector. - * - * @param vector - * vector - * @return - * number of deleted records - */ - public DeleteResult deleteByVector(float[] vector) { - return deleteOne(DeleteQuery.deleteByVector(vector)); - } - - // -------------------------- - // --- Delete Many ---- - // -------------------------- - - /** - * Delete multiple records from a request. - * - * @param deleteQuery - * delete query - * @return - * number of deleted records - */ - public DeleteResult deleteMany(DeleteQuery deleteQuery) { - return collectionClient.deleteMany(deleteQuery); - } - - /** - * Delete multiple records from a request. - * - * @param deleteQuery - * delete query - * @return - * number of deleted records - */ - public DeleteResult deleteManyPaged(DeleteQuery deleteQuery) { - return collectionClient.deleteManyPaged(deleteQuery); - } - - /** - * Delete multiple records from a request. - * - * @param deleteQuery - * delete query - * @param concurrency - * how many threads in parallel - * @return - * number of deleted records - */ - public DeleteResult deleteManyChunked(DeleteQuery deleteQuery, int concurrency) { - return collectionClient.deleteManyChunked(deleteQuery, concurrency); - } - - /** - * Clear the collection. - * - * @return - * number of items deleted - */ - public DeleteResult deleteAll() { - return deleteMany(null); - } - - // -------------------------- - // --- Update ---- - // -------------------------- - - /** - * Find ana update a record based on a query, - * - * @param query - * query to find the record - * @return - * result of the update - */ - public JsonResultUpdate findOneAndUpdate(UpdateQuery query) { - return collectionClient.findOneAndDelete(query); - } - - /** - * Find ana replace a record based on a query, - * - * @param query - * query to find the record - * @return - * result of the update - */ - public JsonResultUpdate findOneAndReplace(UpdateQuery query) { - return collectionClient.findOneAndReplace(query); - } - - /** - * Find ana delete a record based on a query. - * - * @param query - * query to find the record - * @return - * result of the update - */ - public JsonResultUpdate findOneAndDelete(UpdateQuery query) { - return collectionClient.findOneAndDelete(query); - } - - // -------------------------- - // --- UpdateOne ---- - // -------------------------- - - /** - * Update a single record. - * - * @param query - * query to find the record - * @return - * update status - */ - public UpdateStatus updateOne(UpdateQuery query) { - return collectionClient.updateOne(query); - } - - // -------------------------- - // --- UpdateMany ---- - // -------------------------- - - /** - * Update many records. - * - * @param query - * query to find the record - * @return - * update status - */ - public UpdateStatus updateMany(UpdateQuery query) { - return collectionClient.updateMany(query); - } - - // ------------------------------ - // --- Semantic Search ---- - // ------------------------------ - - /** - * Query builder. - * - * @param vector - * vector embeddings - * @param limit - * limit for output - * @return - * result page - */ - public Stream findVector(float[] vector, Integer limit) { - return findVector(vector, null, limit); - } - - /** - * Query builder. - * - * @param vector - * vector embeddings - * @param filter - * metadata filter - * @param limit - * limit for output - * @return - * result page - */ - public Stream findVector(float[] vector, Filter filter, Integer limit) { - return find(SelectQuery.builder() - .filter(filter) - .orderByAnn(vector) - .withLimit(limit) - .includeSimilarity() - .build()); - } - - - /** - * find Page. - * - * @param query - * return query Page - * @return - * page of results - */ - public Page findVectorPage(SelectQuery query) { - return findPage(query); - } - - /** - * Query builder. - * - * @param vector - * vector embeddings - * @param filter - * metadata filter - * @param limit - * limit - * @param pagingState - * paging state - * @return - * result page - */ - public Page findVectorPage(float[] vector, Filter filter, Integer limit, String pagingState) { - return findVectorPage(SelectQuery.builder() - .filter(filter) - .orderByAnn(vector) - .withLimit(limit) - .withPagingState(pagingState) - .includeSimilarity() - .build()); - } - - /** - * Search similarity from the vector (page by 20) - * - * @param vector - * vector embeddings - * @param filter - * metadata filter - * @param limit - * limit - * @param pagingState - * paging state - * @param clazz - * current class. - * @param - * type of document - * @return - * page of results - */ - public Page> findVectorPage(float[] vector, Filter filter, Integer limit, String pagingState, Class clazz) { - return collectionClient.findVectorPage(vector, filter, limit, pagingState, clazz); - } - - /** - * Search similarity from the vector (page by 20) - * - * @param vector - * vector embeddings - * @param filter - * metadata filter - * @param limit - * limit - * @param pagingState - * paging state - * @param mapper - * result mapper - * @param - * type of document - * @return - * page of results - */ - public Page> findVectorPage(float[] vector, Filter filter, Integer limit, String pagingState, DocumentResultMapper mapper) { - return collectionClient.findVectorPage(vector, filter, limit, pagingState, mapper); - } - - /** - * Retrieve documents from a vector. - * - * @param vector - * vector list - * @return - * the list of results - */ - public Stream findVector(float[] vector) { - return find(SelectQuery.findByVector(vector)); - } - - /** - * Retrieve documents from a vector. - * - * @param vector - * vector list - * @param recordCount - * record count - * @param filter - * metadata filter - * @return - * the list of results - */ - public Stream findVector(float[] vector, Filter filter, int recordCount) { - return findVector(SelectQuery.builder() - .includeSimilarity() - .filter(filter) - .withLimit(recordCount) - .orderByAnn(vector) - .build()); - } - - /** - * Retrieve documents from a vector. - * - * @param vector - * vector list - * @param clazz - * expected output class - * @param - * expected type - * @return - * the list of results - */ - public Stream> findVector(float[] vector, Class clazz) { - return findVector(vector).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Retrieve documents from a vector. - * - * @param vector - * vector list - * @param mapper - * mapper for results - * @return - * the list of results - * @param - * expected type - */ - public Stream> findVector(float[] vector, DocumentResultMapper mapper) { - return findVector(vector).map(mapper::map); - } - - // Find Vector with a filter and conditions - - /** - * Full-fledged search with a filter and conditions. - * - * @param query - * vector query - * @return - * stream of results - */ - public Stream findVector(SelectQuery query) { - return find(query); - } - - /** - * Full-fledged search with a filter and conditions. - * - * @param query - * vector query - * @param clazz - * clazz for returned type - * @return - * stream of results - * @param - * expected type - */ - public Stream> findVector(SelectQuery query, Class clazz) { - return findVector(query).map(r -> new DocumentResult<>(r, clazz)); - } - - /** - * Full-fledged search with a filter and conditions. - * - * @param query - * vector query - * @param mapper - * mapper for results - * @return - * stream of results - * @param - * expected type - */ - public Stream> findVector(SelectQuery query, DocumentResultMapper mapper) { - return findVector(query).map(mapper::map); - } - - // Find Vector with a filter and conditions - - /** - * Query builder. - * - * @param vector - * vector embeddings - * @param filter - * metadata filter - * @param limit - * how many items to be retrieved at most - * @param includeSimilarity - * include similarity - * @return - * result page - */ - public Stream findVector(float[] vector, Filter filter, Integer limit, boolean includeSimilarity) { - SelectQueryBuilder builder = SelectQuery - .builder() - .filter(filter) - .withLimit(limit) - .orderByAnn(vector); - if (includeSimilarity) builder.includeSimilarity(); - return findVector(builder.build()); - } - - /** - * Query builder. - * - * @param query - * query - * @return - * result page - */ - public Page findPageVector(SelectQuery query) { - return findPage(query); - } - - /** - * Internal Client for a collection. - * - * @return - * collection client - */ - public CollectionClient getRawCollectionClient() { - return collectionClient; - } - - /** - * Set this options during insertMany: {"ordered": true}. - */ - public void enableOrderingWhenInsert() { - collectionClient.setInsertManyOrdered(true); - } - - /** - * Set this options during insertMany: {"ordered": false}. - */ - public void disableOrderingWhenInsert() { - collectionClient.setInsertManyOrdered(false); - } - - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java deleted file mode 100644 index 9617b20d..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDB.java +++ /dev/null @@ -1,454 +0,0 @@ -package com.datastax.astradb.client; - -import com.dtsx.astra.sdk.db.AstraDBOpsClient; -import com.dtsx.astra.sdk.db.domain.Database; -import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; -import com.dtsx.astra.sdk.utils.ApiLocator; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import io.stargate.sdk.ServiceDeployment; -import io.stargate.sdk.api.SimpleTokenProvider; -import io.stargate.sdk.data.DataApiClient; -import io.stargate.sdk.data.NamespaceClient; -import io.stargate.sdk.data.domain.CollectionDefinition; -import io.stargate.sdk.data.domain.SimilarityMetric; -import io.stargate.sdk.http.ServiceHttp; -import lombok.Getter; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; - -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Stream; - -/** - * Client for AstraDB at database level (crud for collections). - */ -@Slf4j @Getter -public class AstraDB { - - /** - * Hold a reference to target Astra Environment. - */ - protected final AstraEnvironment env; - - /** - * Top level resource for json api. - */ - private final DataApiClient apiClient; - - /** - * Namespace client - */ - private NamespaceClient nsClient; - - /** - * Url to access the API - */ - private final String apiEndpoint; - - /** - * Initialization with endpoint and apikey. - * - * @param token - * api token - * @param apiEndpoint - * api endpoint - */ - public AstraDB(String token, String apiEndpoint) { - this(token, apiEndpoint, AstraDBAdmin.DEFAULT_KEYSPACE); - } - - /** - * Initialization with endpoint and apikey. - * - * @param token - * api token - * @param apiEndpoint - * api endpoint - * @param keyspace - * keyspace - */ - public AstraDB(@NonNull String token, @NonNull String apiEndpoint, @NonNull String keyspace) { - // Support for apiEndpoint with or without /api/json - if (apiEndpoint.endsWith("com")) { - apiEndpoint = apiEndpoint + "/api/json"; - } - this.apiEndpoint = apiEndpoint; - - // Finding Environment based on apiEndpoint (looping to devops) - if (apiEndpoint.contains(AstraEnvironment.PROD.getAppsSuffix())) { - this.env = AstraEnvironment.PROD; - } else if (apiEndpoint.contains(AstraEnvironment.TEST.getAppsSuffix())) { - this.env = AstraEnvironment.TEST; - } else if (apiEndpoint.contains(AstraEnvironment.DEV.getAppsSuffix())) { - this.env = AstraEnvironment.DEV; - } else { - throw new IllegalArgumentException("Unable to detect environment from endpoint"); - } - - // deploy on a single url with a static token (token provider) - ServiceDeployment jsonDeploy = new ServiceDeployment<>(); - jsonDeploy.addDatacenterTokenProvider("default", new SimpleTokenProvider(token)); - jsonDeploy.addDatacenterServices("default", new ServiceHttp("json", apiEndpoint, apiEndpoint)); - this.apiClient = new DataApiClient(jsonDeploy); - this.nsClient = apiClient.namespace(keyspace); - String version = AstraDB.class.getPackage().getImplementationVersion(); - AstraDBAdmin.setCallerName(AstraDBAdmin.USER_AGENT, (null != version) ? version : "dev"); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId) { - this(token, databaseId, null, AstraEnvironment.PROD, AstraDBAdmin.DEFAULT_KEYSPACE); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - * @param keyspace - * database keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String keyspace) { - this(token, databaseId, null, AstraEnvironment.PROD, keyspace); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - * @param region - * database region - * @param keyspace - * keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String region, @NonNull String keyspace) { - this(token, databaseId, region, AstraEnvironment.PROD, keyspace); - } - - /** - * Accessing the database with id and region. - * - * @param token - * astra token - * @param databaseId - * database id - * @param region - * database region - * @param env - * environment - * @param keyspace - * destination keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, String region, @NonNull AstraEnvironment env, String keyspace) { - this.env = env; - Database db = new AstraDBOpsClient(token, env) - .findById(databaseId.toString()) - .orElseThrow(() -> new DatabaseNotFoundException(databaseId.toString())); - - // If no region is provided, we use the default region of the DB - if (region == null) region = db.getInfo().getRegion(); - - ServiceDeployment jsonDeploy = new ServiceDeployment<>(); - jsonDeploy.addDatacenterTokenProvider("default", new SimpleTokenProvider(token)); - this.apiEndpoint = ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), region); - jsonDeploy.addDatacenterServices("default", new ServiceHttp("json", apiEndpoint, apiEndpoint)); - - final String defaultRegion = region; - db.getInfo() - .getDatacenters().stream() - .filter(dc->!dc.getRegion().equals(defaultRegion)) - .forEach(dc -> { - String dcApiEndpoint = ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), dc.getRegion()); - jsonDeploy.addDatacenterServices(dc.getName(), new ServiceHttp("json", dcApiEndpoint, dcApiEndpoint)); - }); - - this.apiClient = new DataApiClient(jsonDeploy); - if (keyspace == null) { - keyspace = db.getInfo().getKeyspace(); - } - this.nsClient = apiClient.namespace(keyspace); - } - - - - - // -------------------------- - // --- Find, FindAll ---- - // -------------------------- - - /** - * List all vector Stores for this environment. - * - * @return - * name of all vector store. - */ - public Stream findAllCollections() { - return nsClient.findCollections(); - } - - /** - * List all vector Stores for this environment. - * - * @return - * name of all vector store. - */ - public Stream findAllCollectionsNames() { - return nsClient.findCollections().map(CollectionDefinition::getName); - } - - /** - * Return the collection definition if its exists. - * - * @param name - * collection name - * @return - * collection definition - */ - public Optional findCollectionByName(String name) { - return nsClient.findCollectionByName(name); - } - - /** - * Check if a store exists. - * - * @param store - * collection name - * @return - * of the store already exist - */ - public boolean isCollectionExists(@NonNull String store) { - return nsClient.isCollectionExists(store); - } - - // -------------------------- - // --- Delete ---- - // -------------------------- - - /** - * Delete a store if it exists. - * - * @param name - * store name - */ - public void deleteCollection(String name) { - nsClient.deleteCollection(name); - } - - // -------------------------- - // --- Create ---- - // -------------------------- - - /** - * Create the minimal store. - * - * @param name - * store name - * @return - * json vector store - */ - public AstraCollection createCollection(String name) { - return new AstraCollection(nsClient.createCollection(name)); - } - - /** - * Create the minimal store. - * - * @param name - * store name - * @param clazz - * bean type - * @param - * type of document in used - * @return - * json vector store - */ - public AstraDBRepository createCollection(String name, Class clazz) { - return new AstraDBRepository<>(nsClient.createCollection(name, clazz)); - } - - /** - * Create the minimal store. - * - * @param name - * store name - * @param vectorDimension - * dimension - * @return - * json vector store - */ - public AstraCollection createCollection(String name, int vectorDimension) { - return new AstraCollection(nsClient.createCollection(name, vectorDimension)); - } - - /** - * Create the minimal store. - * - * @param name - * store name - * @param vectorDimension - * dimension - * @param metric - * similarity metric for the vector - * @return - * json vector store - */ - public AstraCollection createCollection(String name, int vectorDimension, SimilarityMetric metric) { - return new AstraCollection(nsClient.createCollection(CollectionDefinition - .builder() - .name(name) - .vector(vectorDimension, metric) - .build())); - } - - /** - * Create the minimal store. - * - * @param name - * store name - * @param vectorDimension - * dimension - * @param bean - * class of pojo - * @return - * vector store instance - * @param - * object type - */ - public AstraDBRepository createCollection(String name, int vectorDimension, Class bean) { - return new AstraDBRepository<>(nsClient.createCollection(CollectionDefinition.builder() - .name(name) - .vector(vectorDimension, SimilarityMetric.cosine) - .build(), bean)); - } - - - /** - * Create the minimal store. - * - * @param def - * collection definition - * @return - * json vector store - */ - public AstraCollection createCollection(CollectionDefinition def) { - return new AstraCollection(nsClient.createCollection(def)); - } - - /** - * Create the minimal store. - * - * @param def - * collection definition - * @param clazz - * bean type - * @param - * type of document in used - * @return - * json vector store - */ - public AstraDBRepository createCollection(CollectionDefinition def, Class clazz) { - return new AstraDBRepository<>(nsClient.createCollection(def, clazz)); - } - - // -------------------------- - // --- Keyspace ---- - // -------------------------- - - /** - * Validate a keyspace exists. - * - * @param keyspace - * current keyspace - * @return - * true if the keyspace exists - */ - public boolean isKeyspaceExists(String keyspace) { - return apiClient.isNamespaceExists(keyspace); - } - - /** - * List all keyspace for this environment. - * - * @return - * list of keyspace names - */ - public Stream findAllKeyspaceNames() { - return apiClient.findAllNamespaces(); - } - - /** - * get current keyspace name - * - * @return - * list of keyspace names - */ - public String getCurrentKeyspace() { - return this.nsClient.getNamespace(); - } - - /** - * Change the current keyspace. - * - * @param keyspace - * new keyspace - */ - public void changeKeyspace(String keyspace) { - this.nsClient = apiClient.namespace(keyspace); - } - - // -------------------- - // -- Sub resources -- - // -------------------- - - /** - * Access the database functions. - * - * @param storeName - * store identifier - * @return - * storeName client - */ - public AstraCollection getCollection(@NonNull String storeName) { - return new AstraCollection(nsClient.collection(storeName)); - } - - /** - * Access the database functions. - * - * @param storeName - * store identifier - * @param clazz - * type of object used - * @return - * storeName client - * @param - * type of the bean in use - */ - public AstraDBRepository getCollection(@NonNull String storeName, Class clazz) { - return new AstraDBRepository<>(nsClient.collectionRepository(storeName, clazz)); - } - - /** - * Access the low level Stargate Namespace resource operation. - * - * @return - * raw namespace client - */ - public NamespaceClient getNamespaceClient() { - return nsClient; - } - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java b/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java deleted file mode 100644 index 3192ddbe..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/AstraDBRepository.java +++ /dev/null @@ -1,464 +0,0 @@ -package com.datastax.astradb.client; - -import io.stargate.sdk.core.domain.Page; -import io.stargate.sdk.data.CollectionRepository; -import io.stargate.sdk.data.domain.DocumentMutationResult; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import io.stargate.sdk.data.domain.query.DeleteQuery; -import io.stargate.sdk.data.domain.query.DeleteResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import lombok.Getter; -import lombok.NonNull; - -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * Client for AstraDB collection using repository pattern. - * - * @param - * working document - */ -@Getter -public class AstraDBRepository { - - CollectionRepository collectionRepository; - - /** - * Default Constructor. - * - * @param collectionRepository - * current collection - */ - AstraDBRepository(CollectionRepository collectionRepository) { - this.collectionRepository = collectionRepository; - } - - /** - * Check existence of a document from its id. - * Projection to make it as light as possible. - * - * @param id - * document identifier - * @return - * existence status - */ - public boolean exists(String id) { - return collectionRepository.exists(id); - } - - // -------------------------- - // --- Insert ---- - // -------------------------- - - /** - * Save a NEW RECORD with a defined id. - * @param bean - * current object - * @return - * generated identifier - */ - public DocumentMutationResult insert(Document bean) { - return collectionRepository.insert(bean); - } - - /** - * Save a NEW RECORD with a defined id asynchronously - * - * @param bean - * current object - * @return - * generated identifier - */ - public CompletableFuture> insertAsync(Document bean) { - return collectionRepository.insertASync(bean); - } - - // -------------------------- - // --- Insert All ---- - // -------------------------- - - /** - * Low level insertion of multiple records, they should not exist, or it will fail. - * - * @param documents - * list of documents - * @return - * list of ids - */ - public final List> insert(List> documents) { - return collectionRepository.insert(documents); - } - - /** - * Insert a List asynchronously. - * - * @param documents - * list of documents - * @return - * list of ids - */ - public final CompletableFuture>> insertASync(List> documents) { - return collectionRepository.insertASync(documents); - } - - /** - * Low level insertion of multiple records, they should not exist, or it will fail. - * - * @param documents - * list of documents - * @param chunkSize - * how many document per chunk - * @param concurrency - * how many thread in parallel - * @return - * list of ids - */ - public final List> insert(List> documents, int chunkSize, int concurrency) { - return collectionRepository.insert(documents, chunkSize, concurrency); - } - - /** - * Insert a List asynchronously. - * - * @param documents - * list of documents - * @param chunkSize - * split into chunks - * @param concurrency - * number of thread to process the chunks - * @return - * list of ids - */ - public final CompletableFuture>> insertASync(List> documents, int chunkSize, int concurrency) { - return collectionRepository.insertASync(documents, chunkSize, concurrency); - } - - // -------------------------- - // --- Save ---- - // -------------------------- - - /** - * Save by record. - * - * @param current - * object Mapping - * @return - * an unique identifier for the document - */ - public final DocumentMutationResult save(@NonNull Document current) { - return collectionRepository.save(current); - } - - /** - * Save by record asynchronously. - * - * @param current - * object Mapping - * @return - * an unique identifier for the document - */ - public final CompletableFuture> saveASync(@NonNull Document current) { - return collectionRepository.saveASync(current); - } - - - // -------------------------- - // --- saveAll ---- - // -------------------------- - - /** - * Create a new document a generating identifier. - * - * @param documentList - * object Mapping - * @return - * an unique identifier for the document - */ - public final List> saveAll(List> documentList) { - return collectionRepository.saveAll(documentList); - } - - /** - * Create a new document a generating identifier asynchronously - * - * @param documentList - * object Mapping - * @return - * an unique identifier for the document - */ - public final CompletableFuture>> saveAllASync(List> documentList) { - return collectionRepository.saveAllASync(documentList); - } - - /** - * Create a new document a generating identifier. - * - * @param documentList - * object Mapping - * @param chunkSize - * size of the chunk to process items - * @param concurrency - * concurrency to process items - * @return - * an unique identifier for the document - */ - public final List> saveAll(List> documentList, int chunkSize, int concurrency) { - return collectionRepository.saveAll(documentList, chunkSize, concurrency); - } - - /** - * Create a new document a generating identifier asynchronously - * - * @param documentList - * object Mapping - * @param chunkSize - * size of the chunk to process items - * @param concurrency - * concurrency to process items - * @return - * an unique identifier for the document - */ - public final CompletableFuture>> saveAllASync(List> documentList, int chunkSize, int concurrency) { - return collectionRepository.saveAllASync(documentList, chunkSize, concurrency); - } - - // -------------------------- - // --- Count ---- - // -------------------------- - - /** - * Count Document request. - * - * @return - * number of document. - */ - public final int count() { - return count(null); - } - - /** - * Count Document request. - * - * @param jsonFilter - * a filter for the count - * @return - * number of document. - */ - public final int count(Filter jsonFilter) { - return collectionRepository.count(jsonFilter); - } - - // -------------------------- - // --- Find ---- - // -------------------------- - - /** - * Find by id. - * - * @param id - * identifier - * @return - * object if presents - */ - public Optional> findById(@NonNull String id) { - return collectionRepository.findById(id); - } - - /** - * Find all item in the collection. - * - * @return - * retrieve all items - */ - public Stream> findAll() { - return collectionRepository.search(); - } - - /** - * Find all item in the collection. - * - * @param query - * search with a query - * @return - * retrieve all items - */ - public Stream> find(@NonNull SelectQuery query) { - return collectionRepository.search(query); - } - - /** - * Find a page in the collection. - * - * @param query - * current query - * @return - * page of records - */ - public Page> searchPage(SelectQuery query) { - return collectionRepository.searchPage(query); - } - - // -------------------------- - // --- Delete ---- - // -------------------------- - - /** - * Delete a document from id or vector. - * - * @param document - * document - * @return - * if document has been deleted. - */ - public boolean delete(Document document) { - return collectionRepository.delete(document); - } - - /** - * Delete all documents - * - * @return - * number of document deleted - */ - public DeleteResult deleteAll() { - return collectionRepository.deleteAll(); - } - - /** - * Use parallelism and async to delete all records. - * - * @param documents - * list of records - * @return - * number of records deleted - */ - public int deleteAll(List> documents) { - List> futures = documents.stream() - .map(record -> CompletableFuture.supplyAsync(() -> delete(record) ? 1 : 0)) - .collect(Collectors.toList()); - return futures.stream() - .map(CompletableFuture::join) // This will wait for the result of each future - .mapToInt(Integer::intValue) - .sum(); - } - - /** - * Delete item through a query. - * - * @param deleteQuery - * delete query - * @return - * number of records deleted - */ - public DeleteResult deleteAll(DeleteQuery deleteQuery) { - return collectionRepository.deleteAll(deleteQuery); - } - - /** - * Delete item through a query. - * - * @param deleteQuery - * delete query - * @param concurrent - * How many threads in parallel - * @return - * number of records deleted - */ - public DeleteResult deleteAllChunked(DeleteQuery deleteQuery, int concurrent) { - return collectionRepository.deleteAllChunked(deleteQuery, concurrent); - } - - // ------------------------------ - // --- OPERATIONS VECTOR ---- - // ------------------------------ - - /** - * Find by vector - * - * @param vector - * vector - * @return - * object if presents - */ - public Optional> findByVector(float[] vector) { - return collectionRepository.findByVector(vector); - } - - /** - * Delete by vector - * - * @param vector - * vector - * @return - * if object deleted - */ - public boolean deleteByVector(float[] vector) { - return collectionRepository.deleteByVector(vector); - } - - - /** - * Delete by vector - * - * @param id - * id - * @return - * if object deleted - */ - public boolean deleteById(String id) { - return collectionRepository.deleteById(id); - } - - // ------------------------------ - // --- Similarity Search ---- - // ------------------------------ - - /** - * Search similarity from the vector and a limit, if a limit / no paging - * - * @param vector - * vector - * @param metadataFilter - * metadata filtering - * @return - * page of results - */ - public Page> findVector(float[] vector, Filter metadataFilter) { - return collectionRepository.findVector(vector, metadataFilter); - } - - /** - * Search similarity from the vector and a limit, if a limit / no paging - * - * @param vector - * vector - * @param limit - * return count - * @return - * page of results - */ - public List> findVector(float[] vector, Integer limit) { - return collectionRepository.findVector(vector, limit); - } - /** - * Search similarity from the vector and a limit, if a limit / no paging - * - * @param vector - * vector - * @param limit - * return count - * @param metadataFilter - * metadata filtering - * @return - * page of results - */ - public List> findVector(float[] vector, Filter metadataFilter, Integer limit) { - return collectionRepository.findVector(vector, metadataFilter, limit); - } -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java deleted file mode 100644 index f1be91be..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AbstractCassandraTable.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.Row; - -import java.util.concurrent.CompletableFuture; - -/** - * Abstract class for table management at Cassandra level. - * - * @param - * object in use with Cassandra - */ -public abstract class AbstractCassandraTable { - - /** - * Class needed to create a SAI Index. - */ - public static final String SAI_INDEX_CLASSNAME = "org.apache.cassandra.index.sai.StorageAttachedIndex"; - - /** - * Table column names. - */ - public static final String PARTITION_ID = "partition_id"; - - /** - * Table column names. - */ - public static final String ROW_ID = "row_id"; - - /** - * Table column names. - */ - public static final String ATTRIBUTES_BLOB = "attributes_blob"; - - /** - * Table column names. - */ - public static final String BODY_BLOB = "body_blob"; - - /** - * Table column names. - */ - public static final String METADATA_S = "metadata_s"; - - /** - * Table column names. - */ - public static final String VECTOR = "vector"; - - /** - * Table column names. - */ - public static final String COLUMN_SIMILARITY = "similarity"; - - /** - * Default Number of item retrieved - */ - public static final int DEFAULT_RECORD_COUNT = 4; - - /** Session to Cassandra. */ - protected final CqlSession cqlSession; - - /** Destination keyspace. */ - protected final String keyspaceName; - - /** Destination table. */ - protected final String tableName; - - /** - * Default cosntructor. - * - * @param session - * cassandra session - * @param keyspaceName - * keyspace - * @param tableName - * table Name - */ - public AbstractCassandraTable(CqlSession session, String keyspaceName, String tableName) { - this.cqlSession = session; - this.keyspaceName = keyspaceName; - this.tableName = tableName; - } - - /** - * Create table if not exist. - */ - public abstract void create(); - - /** - * Upsert a row of the table. - * - * @param row - * current row - */ - public abstract void put(RECORD row); - - /** - * Should be table to map from a Cassandra row to a record. - * - * @param row - * current cassandra row - * @return - * current record - */ - public abstract RECORD mapRow(Row row); - - /** - * Insert a row asynchronously. - * - * @param inputRow - * current row - * @return - * output - */ - public CompletableFuture putAsync(final RECORD inputRow) { - return CompletableFuture.runAsync(() -> put(inputRow)); - } - - /** - * Delete the table. - */ - public void delete() { - cqlSession.execute("DROP TABLE IF EXISTS " + keyspaceName + "." + tableName); - } - - /** - * Empty a table - */ - public void clear() { - cqlSession.execute("TRUNCATE " + keyspaceName + "." + tableName); - } - - /** - * Gets cqlSession - * - * @return value of cqlSession - */ - public CqlSession getCqlSession() { - return cqlSession; - } -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java deleted file mode 100644 index 854e955d..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnQuery.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; -import java.util.Map; - -/** - * Wrap query parameters as a Bean. - */ -@Getter @Setter @Builder -public class AnnQuery { - - /** - * Maximum number of item returned - */ - private int recordCount; - - /** - * Minimum distance computation - */ - private double threshold = 0.0; - - /** - * Embeddings to be searched. - */ - private List embeddings; - - /** - * Default distance is cosine - */ - private CassandraSimilarityMetric metric = CassandraSimilarityMetric.COSINE; - - /** - * If provided search on metadata - */ - private Map metaData; - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java deleted file mode 100644 index e166596d..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/AnnResult.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import lombok.Data; - -/** - * Item Retrieved by the search. - * - * @param - * record. - */ -@Data -public class AnnResult { - - /** - * Embedded object - */ - private EMBEDDED embedded; - - /** - * Score - */ - private float similarity; - - /** - * Default constructor. - */ - public AnnResult() {} - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java deleted file mode 100644 index 59a75ae7..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassIO.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.db.AstraDBOpsClient; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import io.stargate.sdk.utils.Utils; -import lombok.extern.slf4j.Slf4j; - -import java.io.File; -import java.nio.file.Paths; -import java.util.UUID; - -import static com.datastax.astradb.client.AstraDBAdmin.DEFAULT_KEYSPACE; - -/** - * Utility to work with CassIO and Astra - */ -@Slf4j -public class CassIO { - - private static CqlSession cqlSession; - - /** - * Default constructor. - */ - public CassIO() { - Runtime.getRuntime().addShutdownHook(shutdownHook); - } - - /** - * Shutdown hook to close Session. - */ - private final Thread shutdownHook = new Thread() { - public void run() { - if (cqlSession != null) { - cqlSession.close(); - } - } - }; - - /** - * Accessing the session. - * - * @return - * the cassandra session - */ - public static CqlSession getCqlSession() { - if (cqlSession == null) { - throw new IllegalStateException("CqlSession not initialized, please use init() method"); - } - return cqlSession; - } - - /** - * Initialization from db is and region. - * - * @param cqlSession - * cassandra connection - * @return - * the cassandra session initialized - */ - public static synchronized CqlSession init(CqlSession cqlSession) { - if (cqlSession == null) { - throw new IllegalStateException("CqlSession not initialized, please use init() method"); - } - CassIO.cqlSession = cqlSession; - return cqlSession; - } - - /** - * Initialization from db is and region. - * - * @param dbId - * database identifier. - * @param dbRegion - * database region, - * @param token - * astra token - * @return - * the cassandra session initialized - */ - public static CqlSession init(String token, UUID dbId, String dbRegion) { - return init(token, dbId, dbRegion, DEFAULT_KEYSPACE, AstraEnvironment.PROD); - } - - /** - * Initialization from db is and region. - * - * @param dbId - * database identifier. - * @param dbRegion - * database region, - * @param token - * astra token - * @param keyspace - * destination keyspace - * @return - * the cassandra session initialized - */ - public static CqlSession init(String token, UUID dbId, String dbRegion, String keyspace) { - return init(token, dbId, dbRegion, keyspace, AstraEnvironment.PROD); - } - - /** - * Initialization from db is and region. - * - * @param dbId - * database identifier. - * @param dbRegion - * database region, - * @param token - * astra token - * @param keyspace - * destination keyspace - * @param env - * destination environment - * @return - * the cassandra session initialized - */ - public static synchronized CqlSession init(String token, UUID dbId, String dbRegion, String keyspace, AstraEnvironment env) { - String secureConnectBundleFolder = Utils - .readEnvVariable("ASTRA_DB_SCB_FOLDER") - .orElse(System.getProperty("user.home") + File.separator + ".astra" + File.separator + "scb"); - if (!new File(secureConnectBundleFolder).exists()) { - if (new File(secureConnectBundleFolder).mkdirs()) { - log.info("+ Folder Created to hold SCB {}", secureConnectBundleFolder); - } - } - - // Download SCB with Devops API - AstraDBOpsClient devopsApiClient = new AstraDBOpsClient(token, env); - devopsApiClient.database(dbId.toString()).downloadAllSecureConnectBundles(secureConnectBundleFolder); - String scb = secureConnectBundleFolder + File.separator + "scb_" + dbId + "_" + dbRegion + ".zip"; - // Create Session - cqlSession = CqlSession.builder() - .withAuthCredentials("token", token) - .withCloudSecureConnectBundle(Paths.get(scb)) - .withKeyspace(keyspace) - .build(); - return cqlSession; - } - - /** - * Create a new table to store vectors. - * - * @param tableName - * table name - * @param vectorDimension - * vector dimension - * @return - * table to store vector - */ - public static MetadataVectorTable metadataVectorTable(String tableName, int vectorDimension) { - if (tableName == null || tableName.isEmpty()) throw new IllegalArgumentException("Table name must be provided"); - if (vectorDimension < 1) throw new IllegalArgumentException("Vector dimension must be greater than 0"); - return new MetadataVectorTable( - getCqlSession(), - cqlSession.getKeyspace().orElseThrow(() -> - new IllegalArgumentException("CqlSession does not select any keyspace")).asInternal(), - tableName, vectorDimension); - } - - public static ClusteredMetadataVectorTable clusteredMetadataVectorTable(String tableName, int vectorDimension) { - if (tableName == null || tableName.isEmpty()) throw new IllegalArgumentException("Table name must be provided"); - if (vectorDimension < 1) throw new IllegalArgumentException("Vector dimension must be greater than 0"); - return new ClusteredMetadataVectorTable( - getCqlSession(), - cqlSession.getKeyspace().orElseThrow(() -> - new IllegalArgumentException("CqlSession does not select any keyspace")).asInternal(), - tableName, vectorDimension); - } -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java deleted file mode 100644 index 156d5686..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/CassandraSimilarityMetric.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import lombok.Getter; - -/** - * Option for the similarity metric. - */ -@Getter -public enum CassandraSimilarityMetric { - - /** dot product. */ - DOT_PRODUCT("DOT_PRODUCT","similarity_dot_product"), - - /** cosine. */ - COSINE("COSINE","similarity_cosine"), - - /** euclidean. */ - EUCLIDEAN("EUCLIDEAN","similarity_euclidean"); - - /** - * Option. - */ - private final String option; - - /** - * Function. - */ - private final String function; - - /** - * Constructor. - * - * @param option - * option in the index creation - * @param function - * function to be used in the query - */ - CassandraSimilarityMetric(String option, String function) { - this.option = option; - this.function = function; - } - - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java deleted file mode 100644 index 8157f831..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorRecord.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.uuid.Uuids; -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -/** - * Partitioned table with cluster and vector. - */ -@Data -@AllArgsConstructor -public class ClusteredMetadataVectorRecord { - - /** Partition id (clustered). */ - String partitionId = "default"; - - /** - * Metadata (for metadata filtering) - */ - Map metadata = new HashMap<>(); - - /** - * Vector Store - */ - List vector; - - /** Row identifier. */ - UUID rowId; - - /** Text body. */ - String body; - - /** - * Store special attributes - */ - String attributes; - - /** - * Default Constructor. - */ - public ClusteredMetadataVectorRecord() {} - - /** - * Create a record with a vector. - * - * @param vector current vector. - */ - public ClusteredMetadataVectorRecord(List vector) { - this.rowId = Uuids.timeBased(); - this.vector = vector; - } - - - -} \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java deleted file mode 100644 index 4f60323a..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorTable.java +++ /dev/null @@ -1,384 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.PreparedStatement; -import com.datastax.oss.driver.api.core.cql.Row; -import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.api.core.data.CqlVector; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; - -import static io.stargate.sdk.utils.AnsiUtils.cyan; -import static io.stargate.sdk.utils.AnsiUtils.yellow; - -/** - * Table representing persistence for LangChain operations. - * - parition key: partitionId - * - clustering key: rowId - * - column: value - */ -@Slf4j -public class ClusteredMetadataVectorTable extends AbstractCassandraTable { - - /** - * Dimension of the vector in use - */ - private final int vectorDimension; - - /** - * Similarity Metric, Vector is indexed with this metric. - */ - private final CassandraSimilarityMetric similarityMetric; - - /** - * Prepared statements - */ - private PreparedStatement findPartitionStatement; - private PreparedStatement deletePartitionStatement; - private PreparedStatement findRowStatement; - private PreparedStatement deleteRowStatement; - private PreparedStatement insertRowStatement; - - /** - * Constructor with mandatory parameters. - * - * @param session cassandra session - * @param keyspaceName keyspace name - * @param tableName table name - * @param vectorDimension vector dimension - * @param metric similarity metric - */ - public ClusteredMetadataVectorTable( - @NonNull CqlSession session, - @NonNull String keyspaceName, - @NonNull String tableName, - @NonNull Integer vectorDimension, - @NonNull CassandraSimilarityMetric metric) { - super(session, keyspaceName, tableName); - this.vectorDimension = vectorDimension; - this.similarityMetric = metric; - } - - /** - * Constructor with mandatory parameters. - * - * @param session cassandra session - * @param keyspaceName keyspace name - * @param tableName table name - * @param vectorDimension vector dimension - */ - public ClusteredMetadataVectorTable(CqlSession session, String keyspaceName, String tableName, int vectorDimension) { - this(session, keyspaceName, tableName, vectorDimension, CassandraSimilarityMetric.COSINE); - } - - /** - * Builder class for creating instances of {@link ClusteredMetadataVectorTable}. - * This class follows the builder pattern to allow setting various parameters - * before creating an instance of {@link ClusteredMetadataVectorTable}. - */ - public static class Builder { - private CqlSession session; - private String keyspaceName; - private String tableName; - private Integer vectorDimension; - private CassandraSimilarityMetric metric = CassandraSimilarityMetric.COSINE; - - /** - * Sets the CqlSession. - * - * @param session The CqlSession to be used by the ClusteredMetadataVectorCassandraTable. - * @return The current Builder instance for chaining. - */ - public Builder withSession(CqlSession session) { - this.session = session; - return this; - } - - /** - * Sets the keyspace name. - * - * @param keyspaceName The name of the keyspace to be used. - * @return The current Builder instance for chaining. - */ - public Builder withKeyspaceName(String keyspaceName) { - this.keyspaceName = keyspaceName; - return this; - } - - /** - * Sets the table name. - * - * @param tableName The name of the table to be used. - * @return The current Builder instance for chaining. - */ - public Builder withTableName(String tableName) { - this.tableName = tableName; - return this; - } - - /** - * Sets the vector dimension. - * - * @param vectorDimension The vector dimension to be used. - * @return The current Builder instance for chaining. - */ - public Builder withVectorDimension(Integer vectorDimension) { - this.vectorDimension = vectorDimension; - return this; - } - - /** - * Sets the similarity metric. - * - * @param metric The SimilarityMetric to be used. - * @return The current Builder instance for chaining. - */ - public Builder withMetric(CassandraSimilarityMetric metric) { - this.metric = metric; - return this; - } - - /** - * Creates a new instance of ClusteredMetadataVectorCassandraTable with the current builder settings. - * - * @return A new instance of ClusteredMetadataVectorCassandraTable. - */ - public ClusteredMetadataVectorTable build() { - return new ClusteredMetadataVectorTable(session, keyspaceName, tableName, vectorDimension, metric); - } - - /** - * Default constructor for Builder. - */ - public Builder() {} - } - - /** - * Builder for the class. - * - * @return - * builder for the class - */ - public static ClusteredMetadataVectorTable.Builder builder() { - return new Builder(); - } - - /** - * Prepare statements on first request. - */ - private synchronized void prepareStatements() { - if (findPartitionStatement == null) { - findPartitionStatement = cqlSession.prepare( - "select * from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? "); - deletePartitionStatement = cqlSession.prepare( - "delete from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? "); - findRowStatement = cqlSession.prepare( - "select * from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? " - + " and " + ROW_ID + " = ? "); - deleteRowStatement = cqlSession.prepare( - "delete from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? " - + " and " + ROW_ID + " = ? "); - insertRowStatement = cqlSession.prepare("INSERT INTO " + keyspaceName + "." + tableName + " (" - + PARTITION_ID + "," + ROW_ID + "," + VECTOR + "," + ATTRIBUTES_BLOB + "," + BODY_BLOB + "," + METADATA_S + ") VALUES (?,?,?,?,?,?)"); - } - } - - /* {@inheritDoc} */ - @Override - public void create() { - // Create Table - cqlSession.execute("CREATE TABLE IF NOT EXISTS " + tableName + " (" + - PARTITION_ID + " text, " + - ROW_ID + " timeuuid, " + - ATTRIBUTES_BLOB + " text, " + - BODY_BLOB + " text, " + - METADATA_S + " map, " + - VECTOR + " vector, " + - "PRIMARY KEY ((" + PARTITION_ID + "), " + ROW_ID + ")) " + - "WITH CLUSTERING ORDER BY (" + ROW_ID + " DESC)"); - cqlSession.execute( - "CREATE CUSTOM INDEX IF NOT EXISTS idx_vector_" + tableName - + " ON " + tableName + " (" + VECTOR + ") " - + "USING 'org.apache.cassandra.index.sai.StorageAttachedIndex' " - + "WITH OPTIONS = { 'similarity_function': '" + similarityMetric.getOption() + "'};"); - log.info("+ Index '{}' has been created (if needed).", "idx_vector_" + tableName); - // Create Metadata Index - cqlSession.execute( - "CREATE CUSTOM INDEX IF NOT EXISTS eidx_metadata_s_" + tableName - + " ON " + tableName + " (ENTRIES(" + METADATA_S + ")) " - + "USING 'org.apache.cassandra.index.sai.StorageAttachedIndex' "); - log.info("+ Index '{}' has been created (if needed).", "eidx_metadata_s_" + tableName); - } - - /** - * Find a partition. - * - * @param partitionDd - * partition id - * @return - * list of rows - */ - public List findPartition(@NonNull String partitionDd) { - prepareStatements(); - return cqlSession.execute(findPartitionStatement.bind(partitionDd)) - .all().stream() - .map(this::mapRow) - .collect(Collectors.toList()); - } - - /** - * Delete a partition. - * - * @param partitionDd - * partition id - */ - public void deletePartition(@NonNull String partitionDd) { - prepareStatements(); - cqlSession.execute(deletePartitionStatement.bind(partitionDd)); - } - - /** - * Access a record by its id - * - * @param partitionId - * partition id - * @param rowId - * rowId - * @return - * record if exists - */ - public Optional get(String partitionId, UUID rowId) { - prepareStatements(); - return Optional - .ofNullable(cqlSession.execute(findRowStatement.bind(partitionId, rowId)) - .one()) - .map(this::mapRow); - } - - /** - * Access a record by its id - * - * @param partitionId - * partition id - * @param rowId - * rowId - */ - public void delete(String partitionId, UUID rowId) { - prepareStatements(); - cqlSession.execute(deleteRowStatement.bind(partitionId, rowId)); - } - - public void save(ClusteredMetadataVectorRecord row) { - put(row); - } - - /* {@inheritDoc} */ - @Override - public void put(ClusteredMetadataVectorRecord row) { - prepareStatements(); - cqlSession.execute(insertRowStatement.bind( - row.getPartitionId(), - row.getRowId(), - CqlVector.newInstance(row.getVector()), - row.getAttributes(), - row.getBody(), - row.getMetadata())); - } - - /* {@inheritDoc} */ - @Override - @SuppressWarnings("unchecked") - public ClusteredMetadataVectorRecord mapRow(Row cqlRow) { - if (cqlRow == null ) return null; - ClusteredMetadataVectorRecord record = new ClusteredMetadataVectorRecord(); - // Clustered - record.setPartitionId(cqlRow.getString(PARTITION_ID)); - // Vector - record.setVector(((CqlVector) Objects.requireNonNull(cqlRow.getObject(VECTOR))) - .stream().collect(Collectors.toList())); - // Always There - record.setRowId(cqlRow.getUuid(ROW_ID)); - record.setBody(cqlRow.getString(BODY_BLOB)); - if (cqlRow.getColumnDefinitions().contains(ATTRIBUTES_BLOB)) { - record.setAttributes(cqlRow.getString(ATTRIBUTES_BLOB)); - } - if (cqlRow.getColumnDefinitions().contains(METADATA_S)) { - record.setMetadata(cqlRow.getMap(METADATA_S, String.class, String.class)); - } - return record; - } - - /** - * Compute Similarity Search. - * - * @param query - * current query - * @return - * results - */ - public List> similaritySearch(AnnQuery query) { - StringBuilder cqlQuery = new StringBuilder("SELECT ") - .append(String.join(",", PARTITION_ID, ROW_ID, VECTOR, BODY_BLOB, ATTRIBUTES_BLOB, METADATA_S, "")) - .append(query.getMetric().getFunction()).append("(vector, :vector) as ").append(COLUMN_SIMILARITY) - .append(" FROM ").append(tableName); - - List conditions = new ArrayList<>(); - - // Add metadata conditions - if (query.getMetaData() != null && !query.getMetaData().isEmpty()) { - if (query.getMetaData().containsKey(PARTITION_ID)) { - conditions.add(PARTITION_ID + " = '" + query.getMetaData().get(PARTITION_ID) + "'"); - // remove partition id (if any - query.getMetaData().remove(PARTITION_ID); - } - query.getMetaData().forEach((key, value) -> - conditions.add(METADATA_S + "['" + key + "'] = '" + value + "'")); - } - - if (!conditions.isEmpty()) { - cqlQuery.append(" WHERE ").append(String.join(" AND ", conditions)); - } - - cqlQuery.append(" ORDER BY vector ANN OF :vector LIMIT :maxRecord"); - - log.debug("Query on table '{}' with vector size '{}' and max record='{}'", - yellow(tableName), - cyan("[" + query.getEmbeddings().size() + "]"), - cyan("" + (query.getRecordCount() > 0 ? query.getRecordCount() : DEFAULT_RECORD_COUNT))); - return cqlSession.execute(SimpleStatement.builder(cqlQuery.toString()) - .addNamedValue("vector", CqlVector.newInstance(query.getEmbeddings())) - .addNamedValue("maxRecord", query.getRecordCount() > 0 ? query.getRecordCount() : DEFAULT_RECORD_COUNT) - .build()) - .all().stream() // max record is small and pagination is not needed - .map(this::mapResult) - .filter(r -> r.getSimilarity() >= query.getThreshold()) - .collect(Collectors.toList()); - } - - /** - * Marshall a row as a result. - * - * @param cqlRow cql row - * @return resul - */ - private AnnResult mapResult(Row cqlRow) { - if (cqlRow == null) return null; - AnnResult res = new AnnResult<>(); - res.setEmbedded(mapRow(cqlRow)); - res.setSimilarity(cqlRow.getFloat(COLUMN_SIMILARITY)); - log.debug("Result similarity '{}' for embedded id='{}'", res.getSimilarity(), res.getEmbedded().getRowId()); - return res; - } - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java deleted file mode 100644 index dc78d416..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredRecord.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -/** - * Default Constructor. - */ -@Data -@AllArgsConstructor -public class ClusteredRecord { - - /** Partition id. */ - String partitionId; - - /** Row identifier. */ - UUID rowId; - - /** Text body. */ - String body; - - /** - * Record for a clustered table. - */ - public ClusteredRecord() {} - -} \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java deleted file mode 100644 index 73f86ec4..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/ClusteredTable.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.BatchStatement; -import com.datastax.oss.driver.api.core.cql.BatchStatementBuilder; -import com.datastax.oss.driver.api.core.cql.BatchType; -import com.datastax.oss.driver.api.core.cql.PreparedStatement; -import com.datastax.oss.driver.api.core.cql.Row; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; - -/** - * Table representing persistence for LangChain operations - */ -@Slf4j -public class ClusteredTable extends AbstractCassandraTable { - - /** - * Prepared statements - */ - private PreparedStatement findPartitionStatement; - private PreparedStatement deletePartitionStatement; - private PreparedStatement deleteRowStatement; - private PreparedStatement insertRowStatement; - private PreparedStatement findRowStatement; - - /** - * Constructor with the mandatory parameters. - * - * @param session - * cassandra Session - * @param keyspaceName - * keyspace name - * @param tableName - * table name - */ - public ClusteredTable(@NonNull CqlSession session, @NonNull String keyspaceName, @NonNull String tableName) { - super(session, keyspaceName, tableName); - } - - /** - * Prepare statements on first request. - */ - private synchronized void prepareStatements() { - if (findPartitionStatement == null) { - findPartitionStatement = cqlSession.prepare( - "select * from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? "); - deletePartitionStatement = cqlSession.prepare( - "delete from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? "); - findRowStatement = cqlSession.prepare( - "select * from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? " - + " and " + ROW_ID + " = ? "); - deleteRowStatement = cqlSession.prepare( - "delete from " + keyspaceName + "." + tableName - + " where " + PARTITION_ID + " = ? " - + " and " + ROW_ID + " = ? "); - insertRowStatement = cqlSession.prepare( - "insert into " + keyspaceName + "." + tableName - + " (" + PARTITION_ID + ", " + ROW_ID + ", " + BODY_BLOB + ") " - + " values (?, ?, ?)"); - } - } - - /** {@inheritDoc} */ - @Override - public void create() { - cqlSession.execute("CREATE TABLE IF NOT EXISTS " + keyspaceName + "." + tableName + " (" - + PARTITION_ID + " text, " - + ROW_ID + " timeuuid, " - + BODY_BLOB + " text, " - + "PRIMARY KEY ((" + PARTITION_ID + "), " + ROW_ID + ")) " - + "WITH CLUSTERING ORDER BY (" + ROW_ID + " DESC)"); - log.info("+ Table '{}' has been created (if needed).", tableName); - } - - /** {@inheritDoc} */ - @Override - public void put(@NonNull ClusteredRecord row) { - prepareStatements(); - cqlSession.execute(insertRowStatement.bind(row.getPartitionId(), row.getRowId(), row.getBody())); - } - - /** {@inheritDoc} */ - @Override - public ClusteredRecord mapRow(@NonNull Row row) { - return new ClusteredRecord( - row.getString(PARTITION_ID), - row.getUuid(ROW_ID), - row.getString(BODY_BLOB)); - } - - /** - * Find a partition. - * - * @param partitionDd - * partition id - * @return - * list of rows - */ - public List findPartition(@NonNull String partitionDd) { - prepareStatements(); - return cqlSession.execute(findPartitionStatement.bind(partitionDd)) - .all().stream() - .map(this::mapRow) - .collect(Collectors.toList()); - } - - /** - * Update the history in one go. - * - * @param rows - * current rows. - */ - public void upsertPartition(List rows) { - prepareStatements(); - if (rows != null && !rows.isEmpty()) { - BatchStatementBuilder batch = BatchStatement.builder(BatchType.LOGGED); - String currentPartitionId = null; - for (ClusteredRecord row : rows) { - if (currentPartitionId != null && !currentPartitionId.equals(row.getPartitionId())) { - log.warn("Not all rows are part of the same partition"); - } - currentPartitionId = row.getPartitionId(); - batch.addStatement(insertRowStatement.bind(row.getPartitionId(), row.getRowId(), row.getBody())); - } - cqlSession.execute(batch.build()); - } - } - - /** - * Find a row by its id. - * @param partition - * partition id - * @param rowId - * row id - * @return - * record if exists - */ - public Optional findById(String partition, UUID rowId) { - prepareStatements(); - return Optional.ofNullable(cqlSession - .execute(findRowStatement.bind(partition, rowId)) - .one()).map(this::mapRow); - } - - /** - * Delete Partition. - * - * @param partitionId - * delete the whole partition - */ - public void deletePartition(@NonNull String partitionId) { - prepareStatements(); - cqlSession.execute(deletePartitionStatement.bind(partitionId)); - } - - /** - * Delete one row. - * - * @param partitionId - * current session - * @param rowId - * message id - */ - public void delete(@NonNull String partitionId, @NonNull UUID rowId) { - prepareStatements(); - cqlSession.execute(deleteRowStatement.bind(partitionId, rowId)); - } - - /** - * Insert Row. - * - * @param partitionId - * partition id - * @param rowId - * rowId - * @param bodyBlob - * body - */ - public void insert(@NonNull String partitionId, @NonNull UUID rowId, @NonNull String bodyBlob) { - prepareStatements(); - cqlSession.execute(insertRowStatement.bind(partitionId,rowId, bodyBlob)); - } - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java deleted file mode 100644 index f31f377d..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorRecord.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.api.core.data.CqlVector; -import com.datastax.oss.driver.api.core.uuid.Uuids; -import lombok.Data; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.ATTRIBUTES_BLOB; -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.BODY_BLOB; -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.METADATA_S; -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.ROW_ID; -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.VECTOR; - -/** - * Record for the table metadata + vector. - */ -@Data -public class MetadataVectorRecord implements Serializable { - - /** - * Identifier of the row in Cassandra - */ - private String rowId; - - /** - * Store special attributes - */ - private String attributes; - - /** - * Body, contains the Text Fragment. - */ - private String body; - - /** - * Metadata (for metadata filtering) - */ - private Map metadata = new HashMap<>(); - - /** - * Embeddings - */ - private List vector; - - /** - * Default Constructor - */ - public MetadataVectorRecord() { - this(Uuids.timeBased().toString(), null); - } - - /** - * Create a record with a vector. - * - * @param vector current vector. - */ - public MetadataVectorRecord(List vector) { - this(Uuids.timeBased().toString(), vector); - } - - /** - * Create a record with a vector. - * @param rowId identifier for the row - * @param vector current vector. - */ - public MetadataVectorRecord(String rowId, List vector) { - this.rowId = rowId; - this.vector = vector; - } - - /** - * Build insert statement dynamically. - * - * @param keyspaceName - * keyspace name - * @param tableName - * table bane - * @return - * statement - */ - public SimpleStatement insertStatement(String keyspaceName, String tableName) { - if (rowId == null) throw new IllegalStateException("Row Id cannot be null"); - if (vector == null) throw new IllegalStateException("Vector cannot be null"); - return SimpleStatement.newInstance("INSERT INTO " + keyspaceName + "." + tableName + " (" - + ROW_ID + "," + VECTOR + "," + ATTRIBUTES_BLOB + "," + BODY_BLOB + "," + METADATA_S + ") VALUES (?,?,?,?,?)", - rowId, CqlVector.newInstance(vector), attributes, body, metadata); - } - -} \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java deleted file mode 100644 index 7d4e6f16..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/MetadataVectorTable.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.cql.Row; -import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.api.core.data.CqlVector; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -import static io.stargate.sdk.utils.AnsiUtils.cyan; -import static io.stargate.sdk.utils.AnsiUtils.yellow; - -/** - * Table representing persistence for Vector Stores support. As the name stated - * it holds both a vector and a metadata map. - * - * CREATE TABLE langchain4j.test_embedding_store ( - * row_id text PRIMARY KEY, - * attributes_blob text, - * body_blob text, - * metadata_s map<text, text>, - * vector vector<float, 11> - * ); - * - */ -@Slf4j -@Getter -public class MetadataVectorTable extends AbstractCassandraTable { - - /** - * Dimension of the vector in use - */ - private final int vectorDimension; - - /** - * Similarity Metric, Vector is indexed with this metric. - */ - private final CassandraSimilarityMetric similarityMetric; - - /** - * Constructor with mandatory parameters. - * - * @param session cassandra session - * @param keyspaceName keyspace name - * @param tableName table name - * @param vectorDimension vector dimension - */ - public MetadataVectorTable(CqlSession session, String keyspaceName, String tableName, int vectorDimension) { - this(session, keyspaceName, tableName, vectorDimension, CassandraSimilarityMetric.COSINE); - } - - /** - * Constructor with mandatory parameters. - * - * @param session cassandra session - * @param keyspaceName keyspace name - * @param tableName table name - * @param vectorDimension vector dimension - * @param metric similarity metric - */ - public MetadataVectorTable(CqlSession session, String keyspaceName, String tableName, int vectorDimension, CassandraSimilarityMetric metric) { - super(session, keyspaceName, tableName); - this.vectorDimension = vectorDimension; - this.similarityMetric = metric; - create(); - } - - /** - * Create table and indexes if not exist. - */ - public void create() { - // Create Table - String cqlQueryCreateTable = "CREATE TABLE IF NOT EXISTS " + tableName + " (" + - ROW_ID + " text, " + - ATTRIBUTES_BLOB + " text, " + - BODY_BLOB + " text, " + - METADATA_S + " map, " + - VECTOR + " vector, " + - "PRIMARY KEY (" + - ROW_ID + ")" + - ")"; - cqlSession.execute(cqlQueryCreateTable); - log.info("Table '{}' has been created (if needed).", tableName); - cqlSession.execute( - "CREATE CUSTOM INDEX IF NOT EXISTS idx_vector_" + tableName - + " ON " + tableName + " (" + VECTOR + ") " - + "USING 'org.apache.cassandra.index.sai.StorageAttachedIndex' " - + "WITH OPTIONS = { 'similarity_function': '" + similarityMetric.getOption() + "'};"); - log.info("Index '{}' has been created (if needed).", "idx_vector_" + tableName); - // Create Metadata Index - cqlSession.execute( - "CREATE CUSTOM INDEX IF NOT EXISTS eidx_metadata_s_" + tableName - + " ON " + tableName + " (ENTRIES(" + METADATA_S + ")) " - + "USING 'org.apache.cassandra.index.sai.StorageAttachedIndex';"); - log.info("Index '{}' has been created (if needed).", "eidx_metadata_s_" + tableName); - } - - /** {@inheritDoc} */ - public void put(MetadataVectorRecord row) { - cqlSession.execute(row.insertStatement(keyspaceName, tableName)); - } - - /** - * Marshall a row as a result. - * - * @param cqlRow cql row - * @return resul - */ - private AnnResult mapResult(Row cqlRow) { - if (cqlRow == null) return null; - AnnResult res = new AnnResult<>(); - res.setEmbedded(mapRow(cqlRow)); - res.setSimilarity(cqlRow.getFloat(COLUMN_SIMILARITY)); - log.debug("Result similarity '{}' for embedded id='{}'", res.getSimilarity(), res.getEmbedded().getRowId()); - return res; - } - - @Override - @SuppressWarnings("unchecked") - public MetadataVectorRecord mapRow(Row cqlRow) { - if (cqlRow == null) return null; - - MetadataVectorRecord record = new MetadataVectorRecord(); - record.setRowId(cqlRow.getString(ROW_ID)); - record.setBody(cqlRow.getString(BODY_BLOB)); - record.setVector(((CqlVector) Objects.requireNonNull(cqlRow.getObject(VECTOR))) - .stream().collect(Collectors.toList())); - if (cqlRow.getColumnDefinitions().contains(ATTRIBUTES_BLOB)) { - record.setAttributes(cqlRow.getString(ATTRIBUTES_BLOB)); - } - if (cqlRow.getColumnDefinitions().contains(METADATA_S)) { - record.setMetadata(cqlRow.getMap(METADATA_S, String.class, String.class)); - } - return record; - } - - /** - * Compute Similarity Search. - * - * @param query - * current query - * @return - * results - */ - public List> similaritySearch(AnnQuery query) { - StringBuilder cqlQuery = new StringBuilder("SELECT " + ROW_ID + "," - + VECTOR + "," + BODY_BLOB + "," - + ATTRIBUTES_BLOB + "," + METADATA_S + ","); - cqlQuery.append(query.getMetric().getFunction()).append("(vector, :vector) as ").append(COLUMN_SIMILARITY); - cqlQuery.append(" FROM ").append(tableName); - if (query.getMetaData() != null && !query.getMetaData().isEmpty()) { - cqlQuery.append(" WHERE "); - boolean first = true; - for (Map.Entry entry : query.getMetaData().entrySet()) { - if (!first) { - cqlQuery.append(" AND "); - } - cqlQuery.append(METADATA_S).append("['") - .append(entry.getKey()) - .append("'] = '") - .append(entry.getValue()).append("'"); - first = false; - } - } - cqlQuery.append(" ORDER BY vector ANN OF :vector "); - cqlQuery.append(" LIMIT :maxRecord"); - log.debug("Query on table '{}' with vector size '{}' and max record='{}'", - yellow(tableName), - cyan("[" + query.getEmbeddings().size() + "]"), - cyan("" + (query.getRecordCount() > 0 ? query.getRecordCount() : DEFAULT_RECORD_COUNT))); - return cqlSession.execute(SimpleStatement.builder(cqlQuery.toString()) - .addNamedValue("vector", CqlVector.newInstance(query.getEmbeddings())) - .addNamedValue("maxRecord", query.getRecordCount() > 0 ? query.getRecordCount() : DEFAULT_RECORD_COUNT) - .build()) - .all().stream() // max record is small and pagination is not needed - .map(this::mapResult) - .filter(r -> r.getSimilarity() >= query.getThreshold()) - .collect(Collectors.toList()); - } - - -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java b/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java deleted file mode 100644 index 73b1ccf0..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/cassio/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Client for Astra DB through Cassandra Query Language (CQL) reusing data models from CassIO, - */ -package com.datastax.astradb.client.cassio; \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java b/astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java deleted file mode 100644 index 2d866ec9..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Client for Astra DB through Rest Data API. - */ -package com.datastax.astradb.client; \ No newline at end of file diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java deleted file mode 100644 index cf92c341..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDB.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.datastax.astradb.client.v2; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.dtsx.astra.sdk.db.AstraDBOpsClient; -import com.dtsx.astra.sdk.db.domain.Database; -import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; -import com.dtsx.astra.sdk.utils.ApiLocator; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import io.stargate.data_api.client.DataApiClient; -import io.stargate.data_api.client.DataApiClients; -import io.stargate.data_api.client.DataApiCollection; -import io.stargate.data_api.client.DataApiNamespace; -import io.stargate.data_api.client.model.CreateCollectionOptions; -import io.stargate.data_api.client.model.CreateNamespaceOptions; -import io.stargate.data_api.internal.model.CreateCollectionRequest; -import lombok.Getter; -import lombok.NonNull; -import lombok.extern.slf4j.Slf4j; - -import java.io.IOException; -import java.util.UUID; -import java.util.stream.Stream; - -/** - * Client for AstraDB at database level (crud for collections). - */ -@Slf4j @Getter -public class AstraDB implements DataApiNamespace, DataApiClient { - - /** - * Hold a reference to target Astra Environment. - */ - protected final AstraEnvironment env; - - /** - * Top level resource for json api. - */ - private final DataApiClient apiClient; - - /** - * Namespace client - */ - private DataApiNamespace nsClient; - - /** - * Url to access the API - */ - private final String apiEndpoint; - - /** - * Initialization with endpoint and apikey. - * - * @param token - * api token - * @param apiEndpoint - * api endpoint - */ - public AstraDB(String apiEndpoint, String token) { - this(apiEndpoint, token, AstraDBAdmin.DEFAULT_KEYSPACE); - } - - /** - * Initialization with endpoint and apikey. - * - * @param token - * api token - * @param apiEndpoint - * api endpoint - * @param keyspace - * keyspace - */ - public AstraDB(@NonNull String apiEndpoint, @NonNull String token, @NonNull String keyspace) { - // Support for apiEndpoint with or without /api/json - if (apiEndpoint.endsWith("com")) { - apiEndpoint = apiEndpoint + "/api/json"; - } - this.apiEndpoint = apiEndpoint; - - // Finding Environment based on apiEndpoint (looping to devops) - if (apiEndpoint.contains(AstraEnvironment.PROD.getAppsSuffix())) { - this.env = AstraEnvironment.PROD; - } else if (apiEndpoint.contains(AstraEnvironment.TEST.getAppsSuffix())) { - this.env = AstraEnvironment.TEST; - } else if (apiEndpoint.contains(AstraEnvironment.DEV.getAppsSuffix())) { - this.env = AstraEnvironment.DEV; - } else { - throw new IllegalArgumentException("Unable to detect environment from endpoint"); - } - - this.apiClient = DataApiClients.create(apiEndpoint, token); - this.nsClient = apiClient.getNamespace(keyspace); - String version = AstraDB.class.getPackage().getImplementationVersion(); - AstraDBAdmin.setCallerName(AstraDBAdmin.USER_AGENT, (null != version) ? version : "dev"); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId) { - this(token, databaseId, null, AstraEnvironment.PROD, AstraDBAdmin.DEFAULT_KEYSPACE); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - * @param keyspace - * database keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String keyspace) { - this(token, databaseId, null, AstraEnvironment.PROD, keyspace); - } - - /** - * Full constructor. - * - * @param token - * token - * @param databaseId - * database identifier - * @param region - * database region - * @param keyspace - * keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, @NonNull String region, @NonNull String keyspace) { - this(token, databaseId, region, AstraEnvironment.PROD, keyspace); - } - - /** - * Accessing the database with id and region. - * - * @param token - * astra token - * @param databaseId - * database id - * @param region - * database region - * @param env - * environment - * @param keyspace - * destination keyspace - */ - public AstraDB(@NonNull String token, @NonNull UUID databaseId, String region, @NonNull AstraEnvironment env, String keyspace) { - this.env = env; - Database db = new AstraDBOpsClient(token, env) - .findById(databaseId.toString()) - .orElseThrow(() -> new DatabaseNotFoundException(databaseId.toString())); - - // If no region is provided, we use the default region of the DB - if (region == null) { - region = db.getInfo().getRegion(); - } - if (keyspace == null) { - keyspace = db.getInfo().getKeyspace(); - } - this.apiEndpoint = ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), region); - this.apiClient = DataApiClients.create(apiEndpoint, token); - this.nsClient = apiClient.getNamespace(keyspace); - } - - - @Override - public DataApiNamespace getNamespace(String namespaceName) { - return apiClient.getNamespace(namespaceName); - } - - @Override - public Stream listNamespaceNames() { - return apiClient.listNamespaceNames(); - } - - @Override - public boolean isNamespaceExists(String namespace) { - return apiClient.isNamespaceExists(namespace); - } - - @Override - public DataApiNamespace createNamespace(String namespace) { - // use devops API - return null; - } - - @Override - public void dropNamespace(String namespace) { - // use devops API - - } - - @Override - public DataApiNamespace createNamespace(String namespace, CreateNamespaceOptions options) { - return null; - } - - @Override - public String getName() { - return null; - } - - @Override - public Stream listCollectionNames() { - return null; - } - - @Override - public Stream listCollections() { - return null; - } - - @Override - public DataApiCollection getCollection(String collectionName, Class documentClass) { - return null; - } - - @Override - public void drop() { - - } - - @Override - public DataApiCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions, Class documentClass) { - return null; - } - - @Override - public void dropCollection(String collectionName) { - - } - - @Override - public void close() throws IOException { - } -} diff --git a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java b/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java deleted file mode 100644 index abdd1e37..00000000 --- a/astra-db-client/src/main/java/com/datastax/astradb/client/v2/AstraDBClients.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.datastax.astradb.client.v2; - -import com.datastax.astradb.client.AstraDBAdmin; - -/** - * High level class to instanciate clients for AstraDB - */ -public class AstraDBClients { - - public static AstraDBAdmin create(String token) { - return new AstraDBAdmin(token); - } - - -} diff --git a/astra-db-client/src/test/java/com/datastax/astra/AstraDBTestSupport.java b/astra-db-client/src/test/java/com/datastax/astra/AstraDBTestSupport.java new file mode 100644 index 00000000..0acc4db9 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/AstraDBTestSupport.java @@ -0,0 +1,69 @@ +package com.datastax.astra; + +import com.datastax.astra.db.AstraDBClient; +import com.datastax.astra.db.AstraDBDatabase; +import com.datastax.astra.devops.db.domain.CloudProviderType; +import com.datastax.astra.devops.utils.ApiLocator; +import com.datastax.astra.devops.utils.AstraEnvironment; +import io.stargate.sdk.utils.Utils; +import lombok.extern.slf4j.Slf4j; + +import java.util.UUID; + +/** + * This class will help us generate database or select the environment + * we are targeting. + */ +@Slf4j +public class AstraDBTestSupport { + + /** + * Test Constants + */ + public static final String DATABASE_NAME = "astra_db_client"; + + public static AstraDBClient getAstraDBClient(AstraEnvironment env) { + switch (env) { + case DEV: + return new AstraDBClient(Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN_DEV") + .orElseThrow(() -> new IllegalStateException("Please define env variable 'ASTRA_DB_APPLICATION_TOKEN_DEV'"))); + case PROD: + return new AstraDBClient(Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN") + .orElseThrow(() -> new IllegalStateException("Please define env variable 'ASTRA_DB_APPLICATION_TOKEN'"))); + case TEST: + return new AstraDBClient(Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN_TEST") + .orElseThrow(() -> new IllegalStateException("Please define env variable 'ASTRA_DB_APPLICATION_TOKEN_TEST'"))); + default: + throw new IllegalArgumentException("Invalid Environment"); + } + } + + public static AstraDBDatabase createDatabase(AstraEnvironment env) { + CloudProviderType cloud; + String region; + switch (env) { + case DEV: + case TEST: + cloud = CloudProviderType.GCP; + region = "europe-west4"; + break; + case PROD: + cloud = CloudProviderType.GCP; + region = "us-east1"; + break; + default: + throw new IllegalArgumentException("Invalid Environment"); + } + return createDatabase(env, cloud, region); + } + + public static AstraDBDatabase createDatabase(AstraEnvironment env, CloudProviderType cloud, String region) { + log.info("Working in environment '{}'", env.name()); + AstraDBClient client = getAstraDBClient(env); + UUID databaseId = client.createDatabase(DATABASE_NAME, cloud, region); + log.info("Working with api Endpoint '{}'", ApiLocator.getApiJsonEndpoint(env, databaseId.toString(), region)); + return client.getDatabase(databaseId); + } + + +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java new file mode 100644 index 00000000..75a9383a --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java @@ -0,0 +1,21 @@ +package com.datastax.astra.documentation; + +import com.datastax.astra.db.AstraDBDatabase; +import io.stargate.sdk.data.client.DataApiCollection; +import io.stargate.sdk.data.client.model.CreateCollectionOptions; +import io.stargate.sdk.data.client.model.Document; + +public class FindCollection { + public static void main(String[] args) { + AstraDBDatabase db = new AstraDBDatabase("TOKEN", "API_ENDPOINT"); + + // Find a collection + DataApiCollection collection = db.getCollection("collection_vector1"); + + // Gather collection information + CreateCollectionOptions options = collection.getOptions(); + + // Check if a collection exists + boolean collectionExists = db.isCollectionExists("collection_vector2"); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/integration/AstraNamespaceITTest.java b/astra-db-client/src/test/java/com/datastax/astra/integration/AstraNamespaceITTest.java new file mode 100644 index 00000000..7c2b265b --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/integration/AstraNamespaceITTest.java @@ -0,0 +1,19 @@ +package com.datastax.astra.integration; + +import com.datastax.astra.devops.utils.AstraEnvironment; +import io.stargate.sdk.data.client.DataApiNamespace; +import io.stargate.sdk.data.test.integration.AbstractNamespaceITTest; + +import static com.datastax.astra.AstraDBTestSupport.createDatabase; + +/** + * Run the namespace test Suite against Astra. + */ +public class AstraNamespaceITTest extends AbstractNamespaceITTest { + + @Override + public DataApiNamespace initNamespace() { + return createDatabase(AstraEnvironment.PROD); + } + +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/unit/AstraDBEndpointTest.java b/astra-db-client/src/test/java/com/datastax/astra/unit/AstraDBEndpointTest.java new file mode 100644 index 00000000..b0534574 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/unit/AstraDBEndpointTest.java @@ -0,0 +1,40 @@ +package com.datastax.astra.unit; + +import com.datastax.astra.db.AstraDBEndpoint; +import com.datastax.astra.devops.utils.AstraEnvironment; +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Work with the AstraDBEndpoint Object. + */ +public class AstraDBEndpointTest { + + @Test + public void shouldParseApiEndpoint() { + String url1 = "https://4391daae-016c-49e3-8d0a-b4633a86082c-us-east1.apps.astra.datastax.com"; + AstraDBEndpoint example1 = AstraDBEndpoint.parse(url1); + assertThat(example1).isNotNull(); + assertThat(example1.getEnv()).isEqualTo(AstraEnvironment.PROD); + assertThat(example1.getDatabaseId()).isEqualTo(UUID.fromString("4391daae-016c-49e3-8d0a-b4633a86082c")); + assertThat(example1.getDatabaseRegion()).isEqualTo("us-east1"); + assertThat(example1.getOriginalEndPoint()).isEqualTo(url1); + + AstraDBEndpoint example2 = AstraDBEndpoint + .parse("https://4391daae-016c-49e3-8d0a-b4633a86082c-us-west-2.apps.astra.datastax.com"); + assertThat(example2).isNotNull(); + assertThat(example2.getEnv()).isEqualTo(AstraEnvironment.PROD); + assertThat(example2.getDatabaseId()).isEqualTo(UUID.fromString("4391daae-016c-49e3-8d0a-b4633a86082c")); + assertThat(example2.getDatabaseRegion()).isEqualTo("us-west-2"); + + AstraDBEndpoint example3 = AstraDBEndpoint + .parse("https://25cf3382-d3d2-45d3-86af-b0b498c79cd7-europe-west4.apps.astra-dev.datastax.com"); + assertThat(example3).isNotNull(); + assertThat(example3.getEnv()).isEqualTo(AstraEnvironment.DEV); + assertThat(example3.getDatabaseId()).isEqualTo(UUID.fromString("25cf3382-d3d2-45d3-86af-b0b498c79cd7")); + assertThat(example3.getDatabaseRegion()).isEqualTo("europe-west4"); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java deleted file mode 100644 index 28ab9a0f..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseReworkTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.datastax.astradb.client; - -import com.datastax.astradb.client.v2.AstraDBClients; -import org.junit.jupiter.api.Test; - -import java.io.IOException; - -public class AstraDatabaseReworkTest { - - @Test - public void testRework() { - try(AstraDBAdmin astraDBAdmin = AstraDBClients.create("token");) { - AstraDB database = astraDBAdmin.getDatabase("sample_mflix"); - AstraCollection collection = database.getCollection("movies"); - - //AstraDatabase db1 = new AstraDatabase("apiEnpoint", "token"); - //AstraDBCollection collection = db.getCollection("sample_collection"); - //collection.insertOne(Document.builder().put("title", "Star Wars").build()); - } catch (IOException e) { - throw new RuntimeException(e); - } - - //collection.find().all().forEach(System.out::println); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java b/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java deleted file mode 100644 index a83530dc..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/AstraDatabaseTestSuiteIT.java +++ /dev/null @@ -1,1533 +0,0 @@ -package com.datastax.astradb.client; - -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import com.dtsx.astra.sdk.db.domain.Database; -import com.dtsx.astra.sdk.utils.ApiLocator; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.CollectionDefinition; -import io.stargate.sdk.data.domain.DocumentMutationResult; -import io.stargate.sdk.data.domain.DocumentMutationStatus; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.SimilarityMetric; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import io.stargate.sdk.data.domain.query.UpdateQuery; -import io.stargate.sdk.data.exception.DataApiDocumentAlreadyExistException; -import io.stargate.sdk.data.exception.DataApiException; -import io.stargate.sdk.data.exception.DataApiInvalidArgumentException; -import io.stargate.sdk.data.exception.DataApiNamespaceNotFoundException; -import io.stargate.sdk.utils.Utils; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static io.stargate.sdk.http.domain.FilterOperator.EQUALS_TO; -import static io.stargate.sdk.http.domain.FilterOperator.EXISTS; -import static io.stargate.sdk.http.domain.FilterOperator.GREATER_THAN; -import static io.stargate.sdk.http.domain.FilterOperator.GREATER_THAN_OR_EQUALS_TO; -import static io.stargate.sdk.http.domain.FilterOperator.LESS_THAN; - -/** - * Once upon a time in the vector database wonderland. - */ -@Slf4j -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class AstraDatabaseTestSuiteIT { - - /** - * Test Constants - */ - public static final String TEST_DBNAME = "astra_db_client"; - static final String TEST_COLLECTION_NAME = "collection_simple"; - static final String TEST_COLLECTION_VECTOR = "collection_vector"; - static final String TEST_COLLECTION_DENY = "collection_deny"; - static final String TEST_COLLECTION_ALLOW = "collection_allow"; - - /** - * Test Environment - */ - static AstraEnvironment targetEnvironment = AstraEnvironment.PROD; - static CloudProviderType targetCloud = AstraDBAdmin.FREE_TIER_CLOUD; - static String targetRegion = AstraDBAdmin.FREE_TIER_CLOUD_REGION; - static String astraToken; - - /** - * Shared working objects - */ - static AstraDBAdmin astraDbAdmin; - static AstraDB astraDB; - static UUID databaseId; - static AstraCollection collectionSimple; - static AstraCollection collectionDeny; - static AstraCollection collectionAllow; - static AstraCollection collectionVector; - - /** - * Bean to be used for the test suite - */ - @Data - @NoArgsConstructor - @AllArgsConstructor - static class Product { - @JsonProperty("product_name") - private String name; - @JsonProperty("product_price") - private Double price; - } - - // SELECT WHERE TO RUN TESTS - static boolean DEV = false; - - // ------------------------------------- - // ------- INITIALIZATION -------------- - // ------------------------------------- - - @BeforeAll - @DisplayName("00. Connect to Astra") - public static void setupAndConnectToAstra() { - if (DEV) { - targetEnvironment = AstraEnvironment.DEV; - astraToken = "AstraCS:ZiWfNzYJtUGszRuGyyTjFIXU:2c5a21a4623c6ee688d4bca4b8e55a269aa3ee864fcd16b26b7f9a82ca57b999"; - targetCloud = CloudProviderType.GCP; - targetRegion = "europe-west4"; - } else { - targetEnvironment = AstraEnvironment.PROD; - astraToken = Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN").get(); - targetCloud = CloudProviderType.GCP; - targetRegion = "us-east1"; - } - // When - astraDbAdmin = new AstraDBAdmin(astraToken, targetEnvironment); - // When - Assertions.assertNotNull(astraDbAdmin.getToken()); - } - - @Test - @Order(1) - public void shouldCreateDatabase() { - // Given - Assertions.assertNotNull(targetCloud); - Assertions.assertNotNull(targetRegion); - Assertions.assertNotNull(astraDbAdmin.getDevopsApiClient()); - // When - databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - // Then - Assertions.assertNotNull(databaseId); - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(TEST_DBNAME)); - log.info("Api Endpoint {}", ApiLocator.getApiJsonEndpoint(targetEnvironment, databaseId.toString(), targetRegion)); - } - - // ------------------------------------- - // ----------- CONNECTION -------------- - // ------------------------------------- - - @Test - @Order(2) - public void shouldConnectToDatabase() { - if (databaseId == null) shouldCreateDatabase(); - // Given - Assertions.assertNotNull(databaseId); - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(TEST_DBNAME)); - Assertions.assertNotNull(astraDbAdmin.getDataApiClient(databaseId)); - // When - astraDB = astraDbAdmin.getDatabase(databaseId); - Assertions.assertNotNull(astraDbAdmin); - // When - astraDB = astraDbAdmin.getDatabase(TEST_DBNAME); - Assertions.assertNotNull(astraDB); - } - - @Test - @Order(3) - public void shouldConnectToDatabaseWithEndpoint() { - if (databaseId == null) shouldCreateDatabase(); - // Given - Assertions.assertNotNull(astraDB); - // When - AstraDB astraDbClient2 = new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint()); - // Then - Assertions.assertNotNull(astraDbClient2); - Assertions.assertNotNull(astraDbClient2.findAllCollections()); - } - - @Test - @Order(4) - public void shouldConnectToDatabaseWithEndpointAndKeyspace() { - // When initializing with a keyspace - AstraDB astraDbClient3 = new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint(), AstraDBAdmin.DEFAULT_KEYSPACE); - // Then - Assertions.assertNotNull(astraDbClient3); - Assertions.assertNotNull(astraDbClient3.findAllCollections()); - // When initializing with an INVALID keyspace - Assertions.assertThrows(DataApiNamespaceNotFoundException.class, () -> new AstraDB(astraDbAdmin.getToken(), astraDB.getApiEndpoint(), "invalid_keyspace")); - } - - // ------------------------------------------ - // ----------- WORKING WITH DB -------------- - // ------------------------------------------ - - @Test - @Order(5) - public void shouldFindDatabaseById() { - if (databaseId == null) shouldCreateDatabase(); - // When - Optional opt = astraDbAdmin.getDatabaseInformations(databaseId); - // Then - Assertions.assertNotNull(opt); - Assertions.assertTrue(opt.isPresent()); - Assertions.assertEquals(TEST_DBNAME, opt.get().getInfo().getName()); - } - - @Test - @Order(6) - public void shouldFindDatabaseByName() { - if (databaseId == null) shouldCreateDatabase(); - // Given - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(TEST_DBNAME)); - // When - Stream dbs = astraDbAdmin.getDatabaseInformations(TEST_DBNAME); - // Then - Assertions.assertNotNull(dbs); - dbs.findFirst().ifPresent(db -> { - Assertions.assertEquals(TEST_DBNAME, db.getInfo().getName()); - Assertions.assertEquals(databaseId.toString(), db.getId()); - }); - } - - @Test - @Order(7) - @DisplayName("04. Find all databases") - public void shouldFindAllDatabases() { - // Given - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(TEST_DBNAME)); - // When - Assertions.assertTrue(astraDbAdmin - .listDatabases() - .anyMatch(db -> db.getInfo().getName().equals(TEST_DBNAME))); - } - - @Test - @Order(8) - @Disabled("slow") - public void shouldDeleteDatabaseByName() throws InterruptedException { - String dbName = "test_delete_db_by_name"; - // Given - Assertions.assertFalse(astraDbAdmin.isDatabaseExists(dbName)); - // When - UUID dbId = astraDbAdmin.createDatabase(dbName, targetCloud, targetRegion); - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(dbName)); - // When - boolean isDeleted = astraDbAdmin.dropDatabase(dbName); - // Then - Thread.sleep(5000); - Assertions.assertTrue(isDeleted); - } - - @Test - @Order(8) - @Disabled("slow") - public void shouldDeleteDatabaseById() throws InterruptedException { - String dbName = "test_delete_db_by_id"; - // Given - Assertions.assertFalse(astraDbAdmin.isDatabaseExists(dbName)); - // When - UUID tmpDbId = astraDbAdmin.createDatabase(dbName, targetCloud, targetRegion); - Assertions.assertTrue(astraDbAdmin.isDatabaseExists(dbName)); - boolean isDeleted = astraDbAdmin.dropDatabase(tmpDbId); - Thread.sleep(5000); - Assertions.assertTrue(isDeleted); - } - - // ------------------------------------ - // --------- Collections -------------- - // ------------------------------------ - - @Test - @Order(6) - @DisplayName("06. Create a Collection (no vector)") - public void shouldCreateCollectionSimple() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - // Given - astraDB.deleteCollection(TEST_COLLECTION_NAME); - Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); - // When - collectionSimple = astraDB.createCollection(TEST_COLLECTION_NAME); - // Then - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); - } - - @Test - @Order(7) - @DisplayName("07. Create Collections (with vector)") - public void shouldCreateCollectionVector() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - - // Given - astraDB.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - // When - astraDB.createCollection(TEST_COLLECTION_VECTOR, 14); - // Then - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - - // Given - astraDB.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - collectionVector = astraDB.createCollection(CollectionDefinition.builder() - .name(TEST_COLLECTION_VECTOR) - .vector(14, SimilarityMetric.cosine) - .build()); - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - } - - @Test - @Order(7) - @DisplayName("07. Create Collections (with vector)") - public void shouldCreateCollectionWithIndexingOptions() { - - // Given - if (astraDbAdmin == null) shouldConnectToDatabase(); - - astraDB.deleteCollection(TEST_COLLECTION_VECTOR); - Assertions.assertFalse(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - - // Allow and Deny are mutually exclusive - Assertions.assertThrows(IllegalStateException.class, () -> collectionVector = astraDB.createCollection(CollectionDefinition.builder() - .name(TEST_COLLECTION_VECTOR) - .vector(14, SimilarityMetric.cosine) - .indexingDeny("blob_body") - .indexingAllow("property1") - .build())); - } - - - - @Test - @Order(8) - @DisplayName("08. Find a single collection") - public void shouldFindCollection() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - - // Find a collection (1) - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_VECTOR)); - Optional def = astraDB.findCollectionByName(TEST_COLLECTION_VECTOR); - Assertions.assertTrue(def.isPresent()); - Assertions.assertEquals(14, def.get().getOptions().getVector().getDimension()); - - // Find a collection (2) - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); - Assertions.assertTrue(astraDB.findCollectionByName(TEST_COLLECTION_NAME).isPresent()); - - // Find a collection (3) - Assertions.assertFalse(astraDB.isCollectionExists("invalid")); - Assertions.assertFalse(astraDB.findCollectionByName("invalid").isPresent()); - } - - @Test - @Order(9) - @DisplayName("09. Find all collections") - public void shouldListCollection() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - - List collections = astraDB - .findAllCollections() - .map(CollectionDefinition::getName) - .collect(Collectors.toList()); - Assertions.assertTrue(collections.contains(TEST_COLLECTION_NAME)); - Assertions.assertTrue(collections.contains(TEST_COLLECTION_VECTOR)); - } - - @Test - @Order(10) - @DisplayName("10. Delete all documents in a collection") - @Disabled("Product Issues") - public void shouldDeleteACollection() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - - String deleted_collection = "deleted_collection"; - astraDB.createCollection(deleted_collection); - Assertions.assertTrue(astraDB.isCollectionExists(deleted_collection)); - - astraDB.deleteCollection(deleted_collection); - Assertions.assertFalse(astraDB.isCollectionExists(deleted_collection)); - } - - @Test - @Order(11) - @DisplayName("11. Delete a collection") - public void shouldClearACollection() { - // Given - if (collectionSimple == null) shouldCreateCollectionSimple(); - Assertions.assertTrue(astraDB.isCollectionExists(TEST_COLLECTION_NAME)); - collectionSimple.deleteAll(); - collectionSimple.insertOne(new JsonDocument().id("1")); - Assertions.assertEquals(1, collectionSimple.countDocuments()); - // When - collectionSimple.deleteAll(); - // Then - Assertions.assertEquals(0, collectionSimple.countDocuments()); - } - - // ------------------------------------ - // --------- Documents -------------- - // ------------------------------------ - - // ======== INSERT ========= - - @Test - @Order(12) - @DisplayName("12. InsertOne with json String") - public void shouldInsertOneJson() { - initializeCollectionVector(); - - String json = "{" + - "\"$vector\": [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3,0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], " + - "\"product_name\": \"HealthyFresh - Chicken raw dog food\", " + - "\"product_price\": 9.99" + - "}"; - JsonDocumentMutationResult dmr = collectionVector.insertOne(json); - Assertions.assertNotNull(dmr.getDocument().getId()); - Assertions.assertEquals(9.99d, dmr.getDocument().getDouble("product_price")); - Assertions.assertEquals(DocumentMutationStatus.CREATED, dmr.getStatus()); - - // Insert again Asynchronously - collectionVector.insertOneAsync(json).thenAccept(dmr2 -> { - Assertions.assertNotNull(dmr2.getDocument().getId()); - Assertions.assertEquals(9.99d, dmr2.getDocument().getDouble("product_price")); - Assertions.assertEquals(DocumentMutationStatus.CREATED, dmr2.getStatus()); - }); - } - - @Test - @Order(13) - @DisplayName("13. InsertOne with a JsonDocument") - public void shouldInsertOneJsonDocument() { - initializeCollectionSimple(); - - // Working document - JsonDocument doc = new JsonDocument().id("1").put("a", "a").put("b", true); - - // Insert ONE - JsonDocumentMutationResult res = collectionSimple.insertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - Assertions.assertEquals("a", res.getDocument().getString("a")); - Assertions.assertEquals(true, res.getDocument().getBoolean("b")); - - // Insert ONE => ERROR - Assertions.assertThrows(DataApiDocumentAlreadyExistException.class, () -> collectionSimple.insertOne(doc)); - - // Insert ONE => Asynchronously - JsonDocument doc2 = new JsonDocument().id("2").put("a", "a").put("b", true); - collectionSimple.insertOneASync(doc2).thenAccept(res2 -> { - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, res2.getStatus()); - Assertions.assertEquals("2", res2.getDocument().getId()); - }); - } - - @Test - @Order(14) - @DisplayName("14. InsertOne with a Java Bean") - public void shouldInsertOneDocument() { - initializeCollectionSimple(); - - // Working document - Document doc = new Document().id("p1").data(new Product("p1", 10.1)); - - // Insert ONE - DocumentMutationResult res = collectionSimple.insertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("p1", res.getDocument().getId()); - Assertions.assertEquals("p1", res.getDocument().getData().getName()); - - // Insert ONE => ERROR - Assertions.assertThrows(DataApiDocumentAlreadyExistException.class, () -> collectionSimple.insertOne(doc)); - - // Insert Async - Document doc2 = new Document().id("p2").data(new Product("p2", 10.1)); - collectionSimple.insertOneASync(doc2).thenAccept(res2 -> { - Assertions.assertEquals(DocumentMutationStatus.CREATED, res2.getStatus()); - Assertions.assertEquals("p2", res2.getDocument().getId()); - }); - - } - - @Test - @Order(15) - @DisplayName("15. Insert Doc and find By Id") - public void shouldInsertAndRetrieve() { - initializeCollectionSimple(); - - // Working document - Document doc = new Document().id("p1").data(new Product("p1", 10.1)); - - // Insert ONE - DocumentMutationResult res = collectionSimple.insertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("p1", res.getDocument().getId()); - Assertions.assertEquals("p1", res.getDocument().getData().getName()); - - // Find the retrieved object - Optional> optRes = collectionSimple.findById("p1", Product.class); - if (optRes.isPresent()) { - DocumentResult res2 = optRes.get(); - Assertions.assertEquals("p1", res2.getId()); - Assertions.assertEquals("p1", res2.getData().getName()); - } else { - Assertions.fail("Should have found a document"); - } - } - - @Test - @Order(16) - @DisplayName("16. Insert a JsonDocument with multiple Manner") - public void shouldInsertADocument() { - initializeCollectionVector(); - - // You must delete any existing rows with the same IDs as the - // rows you want to insert - collectionVector.deleteAll(); - - // Insert rows defined by key/value - collectionVector.insertOne( - new JsonDocument() - .id("doc1") // uuid is generated if not explicitely set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99)); - - // Insert rows defined as a JSON String - collectionVector.insertOne( - new JsonDocument() - .data( - "{" + - "\"_id\": \"doc2\", " + - "\"$vector\": [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], " + - "\"product_name\": \"HealthyFresh - Chicken raw dog food\", " + - "\"product_price\": 9.99" + - "}")); - - // Insert rows defined as a Map - collectionVector.insertOne( - new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food"))); - - // Insert rows defined as a combination of key/value, JSON, and Map - collectionVector.insertOne( - new JsonDocument() - .id("doc4") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data("{" + - "\"product_name\": \"HealthyFresh - Chicken raw dog food\", " + - "\"product_price\": 8.99" + - "}")); - - // If you do not provide an ID, they are generated automatically - collectionVector.insertOne(new JsonDocument().put("demo", 1)); - Assertions.assertEquals(5, collectionVector.countDocuments()); - } - - @Test - @Order(17) - @DisplayName("17. Insert document with a lot of properties and retrieve them") - public void shouldInsertOneComplexDocument() { - initializeCollectionSimple(); - Assertions.assertEquals(0, collectionSimple.countDocuments()); - - // Adding Many with a Json document with a lof properties - collectionSimple.insertOne( - new JsonDocument().id("1") - .put("metadata_instant", Instant.now()) - .put("metadata_date", new Date()) - .put("metadata_calendar", Calendar.getInstance()) - .put("metadata_int", 1) - .put("metadata_long", 12321323L) - .put("metadata_double", 1213.343243d) - .put("metadata_float", 1.1232434543f) - .put("metadata_string", "hello") - .put("metadata_short", Short.valueOf("1")) - .put("metadata_string_array", new String[]{"a", "b", "c"}) - .put("metadata_int_array", new Integer[]{1, 2, 3}) - .put("metadata_long_array", new Long[]{1L, 2L, 3L}) - .put("metadata_double_array", new Double[]{1d, 2d, 3d}) - .put("metadata_float_array", new Float[]{1f, 2f, 3f}) - .put("metadata_short_array", new Short[]{1, 2, 3}) - .put("metadata_boolean", true) - .put("metadata_boolean_array", new Boolean[]{true, false, true}) - .put("metadata_uuid", UUID.randomUUID()) - .put("metadata_uuid_array", new UUID[]{UUID.randomUUID(), UUID.randomUUID()}) - .put("metadata_map", Map.of("key1", "value1", "key2", "value2")) - .put("metadata_list", List.of("value1", "value2")) - .put("metadata_byte", Byte.valueOf("1")) - .put("metadata_character", 'c') - .put("metadata_enum", AstraDBAdmin.FREE_TIER_CLOUD) - .put("metadata_enum_array", new CloudProviderType[]{AstraDBAdmin.FREE_TIER_CLOUD, CloudProviderType.AWS}) - .put("metadata_object", new Product("name", 1d))); - - // Search By id - JsonDocumentResult res = collectionSimple.findById("1") - .orElseThrow(() -> new IllegalStateException("Should have found a document" )); - - // Accessing result - Instant i = res.getInstant("metadata_instant"); - Assertions.assertNotNull(i); - Date d = res.getDate("metadata_date"); - Assertions.assertNotNull(d); - Calendar c = res.getCalendar("metadata_calendar"); - Assertions.assertNotNull(c); - Integer integer = res.getInteger("metadata_int"); - Assertions.assertNotNull(integer); - Long l = res.getLong("metadata_long"); - Assertions.assertNotNull(l); - Double db = res.getDouble("metadata_double"); - Assertions.assertNotNull(db); - Float f = res.getFloat("metadata_float"); - Assertions.assertNotNull(f); - String s = res.getString("metadata_string"); - Assertions.assertNotNull(s); - Short sh = res.getShort("metadata_short"); - Assertions.assertNotNull(sh); - Boolean b = res.getBoolean("metadata_boolean"); - Assertions.assertNotNull(b); - UUID u = res.getUUID("metadata_uuid"); - Assertions.assertNotNull(u); - Byte by = res.getByte("metadata_byte"); - Assertions.assertNotNull(by); - Character ch = res.getCharacter("metadata_character"); - Assertions.assertNotNull(ch); - Product p = res.getObject("metadata_object", Product.class); - Assertions.assertNotNull(p); - List l2 = res.getList("metadata_list", String.class); - Assertions.assertNotNull(l2); - Boolean[] ba = res.getArray("metadata_boolean_array", Boolean.class); - Assertions.assertNotNull(ba); - } - - // ======== UPSERT ========= - - @Test - @Order(18) - @DisplayName("18. UpsertOne with a jsonDocument") - public void shouldUpsertOneWithJson() - throws ExecutionException, InterruptedException { - initializeCollectionSimple(); - String json = "{" + - "\"_id\": \"doc1\", " + - "\"$vector\": [0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3,0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3], " + - "\"product_name\": \"HealthyFresh - Chicken raw dog food\", " + - "\"product_price\": 9.99" + - "}"; - - // First insertion will give you a CREATED status - JsonDocumentMutationResult res = collectionSimple.upsertOne(json); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("doc1", res.getDocument().getId()); - - // Second will give you with no UNCHANGED (Async_ - res = collectionSimple.upsertOneASync(json).get(); - Assertions.assertEquals(DocumentMutationStatus.UNCHANGED, res.getStatus()); - - // Third will give you with a CHANGED - String jsonUdated = json.replaceAll("9.99", "10.99"); - res = collectionSimple.upsertOne(jsonUdated); - Assertions.assertEquals(DocumentMutationStatus.UPDATED, res.getStatus()); - - } - - @Test - @Order(19) - @DisplayName("19. UpdateOne with a jsonDocument") - public void shouldUpdate() - throws ExecutionException, InterruptedException { - initializeCollectionSimple(); - - JsonDocument doc1 = new JsonDocument().id("1").put("a", "a").put("b", "c"); - JsonDocument doc2 = new JsonDocument().id("2").put("a", "a").put("b", "b"); - collectionSimple.insertMany(doc1, doc2); - - /* - collectionSimple.updateOne(UpdateQuery.builder() - .updateSet("a", "b") - .filter(f) - .withUpsert() - .build());*/ - - collectionSimple.updateMany(UpdateQuery.builder() - .updateSet("a", "b") - .filter(new Filter().where("a").isEqualsTo("a")) - .withUpsert() - .build()); - } - - @Test - @Order(19) - @DisplayName("19. UpsertOne with a jsonDocument") - public void shouldUpsertOneWithJsonDocument() - throws ExecutionException, InterruptedException { - initializeCollectionSimple(); - - JsonDocument doc = new JsonDocument().id("1").put("a", "a").put("b", "c"); - JsonDocumentMutationResult res = collectionSimple.upsertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - - // Upsert with no CHANGE - res = collectionSimple.upsertOneASync(doc).get(); - Assertions.assertEquals(DocumentMutationStatus.UNCHANGED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - - // Upsert with a CHANGE - doc.put("b", "updated"); - res = collectionSimple.upsertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.UPDATED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - } - - @Test - @Order(20) - @DisplayName("20. UpsertOne with a Document") - public void shouldUpsertOneWithDocument() - throws ExecutionException, InterruptedException { - initializeCollectionSimple(); - - Document doc = new Document().id("1").data(new Product("p1", 10.1)); - DocumentMutationResult res = collectionSimple.upsertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - - // Upsert with no CHANGE - res = collectionSimple.upsertOneASync(doc).get(); - Assertions.assertEquals(DocumentMutationStatus.UNCHANGED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - - // Upsert with a CHANGE - doc.getData().setName("updated"); - res = collectionSimple.upsertOne(doc); - Assertions.assertEquals(DocumentMutationStatus.UPDATED, res.getStatus()); - Assertions.assertEquals("1", res.getDocument().getId()); - } - - // ======== INSERT MANY ========= - - @Test - @Order(21) - @DisplayName("21. InsertMany Json") - public void shouldInsertManyJson() { - initializeCollectionSimple(); - - String jsonMany = "[" + - "{\"product_name\":\"test1\",\"product_price\":12.99,\"_id\":\"doc1\"}," + - "{\"product_name\":\"test2\",\"product_price\":2.99,\"_id\":\"doc2\"}" + - "]"; - List status = collectionSimple.insertMany(jsonMany); - Assertions.assertEquals(2, status.size()); - List ids = status.stream() - .map(JsonDocumentMutationResult::getDocument) - .map(Document::getId) - .collect(Collectors.toList()); - Assertions.assertTrue(ids.contains("doc1")); - Assertions.assertTrue(ids.contains("doc2")); - status.forEach(s -> Assertions.assertEquals(DocumentMutationStatus.CREATED, s.getStatus())); - - status = collectionSimple.insertMany(jsonMany); - status.forEach(s -> Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, s.getStatus())); - - collectionSimple.deleteAll(); - collectionSimple.insertManyASync(jsonMany).thenAccept(status2 -> { - Assertions.assertEquals(2, status2.size()); - List ids2 = status2.stream() - .map(JsonDocumentMutationResult::getDocument) - .map(Document::getId) - .collect(Collectors.toList()); - Assertions.assertTrue(ids2.contains("doc1")); - Assertions.assertTrue(ids2.contains("doc2")); - status2.forEach(s -> Assertions.assertEquals(DocumentMutationStatus.CREATED, s.getStatus())); - }); - - } - - @Test - @Order(22) - @DisplayName("22. InsertMany Java Bean") - public void shouldInsertManyJavaBean() { - initializeCollectionSimple(); - - Document p1 = new Document().id("doc1").data(new Product("test1", 12.99)); - Document p2 = new Document().id("doc2").data(new Product("test2", 2.99)); - List> results = collectionSimple.insertMany(List.of(p1, p2)); - if (results !=null) { - results.forEach(r -> { - Assertions.assertEquals(DocumentMutationStatus.CREATED, r.getStatus()); - Assertions.assertNotNull(r.getDocument().getId()); - Product p = r.getDocument().getData(); - Assertions.assertNotNull(p.getName()); - }); - } - - // Same with async - collectionSimple.deleteAll(); - collectionSimple.insertManyASync(List.of(p1, p2)).thenAccept(results2 -> { - if (results2 !=null) { - results2.forEach(r -> { - Assertions.assertEquals(DocumentMutationStatus.CREATED, r.getStatus()); - Assertions.assertNotNull(r.getDocument().getId()); - Product p = r.getDocument().getData(); - Assertions.assertNotNull(p.getName()); - }); - } - }); - } - - JsonDocument player1 = new JsonDocument().id("1").put("firstName", "Lucas").put("lastName", "Hernandez"); - JsonDocument player2 = new JsonDocument().id("2").put("firstName", "Antoine").put("lastName", "Griezmann"); - JsonDocument player3 = new JsonDocument().id("3").put("firstName", "N'Golo").put("lastName", "Kanté"); - JsonDocument player4 = new JsonDocument().id("4").put("firstName", "Paul").put("lastName", "Pogba"); - JsonDocument player5 = new JsonDocument().id("5").put("firstName", "Raphaël").put("lastName", "Varane"); - JsonDocument player6 = new JsonDocument().id("6").put("firstName", "Hugo").put("lastName", "Lloris"); - JsonDocument player7 = new JsonDocument().id("7").put("firstName", "Olivier").put("lastName", "Giroud"); - JsonDocument player8 = new JsonDocument().id("8").put("firstName", "Benjamin").put("lastName", "Pavard"); - JsonDocument player9 = new JsonDocument().id("9").put("firstName", "Kylian").put("lastName", "Mbappé"); - JsonDocument player10 = new JsonDocument().id("10").put("firstName", "Blaise").put("lastName", "Matuidi"); - JsonDocument player11 = new JsonDocument().id("11").put("firstName", "Samuel").put("lastName", "Umtiti"); - JsonDocument player12 = new JsonDocument().id("12").put("firstName", "Thomas").put("lastName", "Lemar"); - JsonDocument player13 = new JsonDocument().id("13").put("firstName", "Ousmane").put("lastName", "Dembélé"); - JsonDocument player14 = new JsonDocument().id("14").put("firstName", "Karim").put("lastName", "Benzema"); - JsonDocument player15 = new JsonDocument().id("15").put("firstName", "Adrien").put("lastName", "Rabiot"); - JsonDocument player16 = new JsonDocument().id("16").put("firstName", "Kingsley").put("lastName", "Coman"); - JsonDocument player17 = new JsonDocument().id("17").put("firstName", "Moussa").put("lastName", "Sissoko"); - JsonDocument player18 = new JsonDocument().id("18").put("firstName", "Lucas").put("lastName", "Digne"); - JsonDocument player19 = new JsonDocument().id("19").put("firstName", "Steve").put("lastName", "Mandanda"); - JsonDocument player20 = new JsonDocument().id("20").put("firstName", "Presnel").put("lastName", "Kimpembe"); - JsonDocument player21 = new JsonDocument().id("21").put("firstName", "Clement").put("lastName", "Lenglet"); - JsonDocument player22 = new JsonDocument().id("22").put("firstName", "Leo").put("lastName", "Dubois"); - JsonDocument player23 = new JsonDocument().id("23").put("firstName", "Kurt").put("lastName", "Zouma"); - JsonDocument player24 = new JsonDocument().id("24").put("firstName", "Tanguy").put("lastName", "Ndombele"); - - @Test - @Order(23) - @DisplayName("23. InsertMany JsonDocuments") - public void shouldManyJsonDocuments() { - initializeCollectionSimple(); - collectionSimple.insertManyJsonDocuments(List.of(player1, player2)).forEach(r -> { - Assertions.assertEquals(DocumentMutationStatus.CREATED, r.getStatus()); - Assertions.assertNotNull(r.getDocument().getId()); - Assertions.assertNotNull(r.getDocument().getString("firstName")); - }); - collectionSimple.deleteAll(); - - // Same but Async - collectionSimple.insertManyJsonDocumentsASync(List.of(player1, player2)).thenAccept(r -> { - Assertions.assertEquals(2, r.size()); - r.forEach(res -> { - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - Assertions.assertNotNull(res.getDocument().getId()); - Assertions.assertNotNull(res.getDocument().getString("firstName")); - }); - }); - } - - @Test - @Order(24) - @DisplayName("24. InsertMany too many items") - public void shouldInsertTooMany() { - initializeCollectionSimple(); - //Assertions.assertThrows(DataApiInvalidArgumentException.class, - // () -> collectionSimple.insertMany( List.of( - // player1, player2, player3, player4, player5, player6, - // player7, player8, player9, player10,player11, player12, - // player13, player14, player15, player16, player17, player18, - // player19, player20, player21, player22, player23, player24))); - try { - collectionSimple.insertMany( List.of( - player1, player2, player3, player4, player5, player6, - player7, player8, player9, player10,player11, player12, - player13, player14, player15, player16, player17, player18, - player19, player20, player21, player22, player23, player24)); - } catch(DataApiInvalidArgumentException dai) { - dai.printStackTrace();; - } - } - - - @Test - @Order(25) - @DisplayName("25. InsertMany order true, no replace") - public void shouldInsertManyOrdered() { - initializeCollectionSimple(); - - List>> othersPlayers = new ArrayList<>(List.of( - player1, player2, player3, - player4, player5, player6, - player7, player8, player9)); - List statuses1 = new ArrayList<>(); - collectionSimple.insertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - statuses1.add(res.getStatus()); - }); - log.info("Statuses => " + statuses1.stream().map(Enum::name).collect(Collectors.joining(", "))); - - // Insert again - List statuses = new ArrayList<>(); - collectionSimple.enableOrderingWhenInsert(); - collectionSimple.insertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - if (player1.getId().equals(res.getDocument().getId())) { - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, res.getStatus()); - } else { - Assertions.assertEquals(DocumentMutationStatus.NOT_PROCESSED, res.getStatus()); - } - statuses.add(res.getStatus()); - }); - log.info("Statuses => " + statuses.stream().map(Enum::name).collect(Collectors.joining(", "))); - } - - @Test - @Order(26) - @DisplayName("26. InsertMany with replacements") - public void shouldInsertManyWithDuplicatesOrder() { - initializeCollectionSimple(); - - List>> othersPlayers = new ArrayList<>(List.of( - player1, player2, player3, - player4, player5, player6, - player7, player8)); - othersPlayers.add(new JsonDocument().id("9").put("firstName", "Kylian2").put("lastName", "Mbappé")); - othersPlayers.addAll(List.of(player9, player10,player11)); - log.info("Players order, 9 is duplicate :" + othersPlayers - .stream().map(Document::getId) - .collect(Collectors.joining(", "))); - - - // Status CREATED up to the duplicate - List statuses = new ArrayList<>(); - collectionSimple.enableOrderingWhenInsert(); - collectionSimple.insertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - int id = Integer.parseInt(res.getDocument().getId()); - if (id<9) { - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - } else if (id==9) { - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, res.getStatus()); - } else { - Assertions.assertEquals(DocumentMutationStatus.NOT_PROCESSED, res.getStatus()); - } - statuses.add(res.getStatus()); - }); - log.info("Statuses1 => " + statuses.stream().map(Enum::name).collect(Collectors.joining(", "))); - - // Status ALREADY EXIST for first and else NOT PROCESS - List statuses2 = new ArrayList<>(); - collectionSimple.insertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - int id = Integer.parseInt(res.getDocument().getId()); - if (id==1) { - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, res.getStatus()); - } else { - Assertions.assertEquals(DocumentMutationStatus.NOT_PROCESSED, res.getStatus()); - } - statuses2.add(res.getStatus()); - }); - log.info("Statuses2 => " + statuses2.stream().map(Enum::name).collect(Collectors.joining(", "))); - - // 1 to 9 is ALREADY_EXIST, 10 and 11 are created - collectionSimple.disableOrderingWhenInsert(); - List statuses3 = new ArrayList<>(); - collectionSimple.insertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - int id = Integer.parseInt(res.getDocument().getId()); - if (id<10) { - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, res.getStatus()); - } else { - Assertions.assertEquals(DocumentMutationStatus.CREATED, res.getStatus()); - } - statuses3.add(res.getStatus()); - }); - log.info("Statuses3 => " + statuses3.stream().map(Enum::name).collect(Collectors.joining(", "))); - - // Try to replace - List statuses4 = new ArrayList<>(); - collectionSimple.upsertMany(othersPlayers).forEach(res -> { - Assertions.assertNotNull(res.getDocument().getId()); - int id = Integer.parseInt(res.getDocument().getId()); - if (id==9) { - Assertions.assertEquals(DocumentMutationStatus.UPDATED, res.getStatus()); - } else { - Assertions.assertEquals(DocumentMutationStatus.UNCHANGED, res.getStatus()); - } - statuses4.add(res.getStatus()); - }); - log.info("Statuses4 => " + statuses4.stream().map(Enum::name).collect(Collectors.joining(", "))); - } - - // ======== INSERT MANY ========= - - @Test - @Order(27) - @DisplayName("27. InsertVeryMany Documents") - public void shouldInsertManyChunkedSequential() { - initializeCollectionSimple(); - - int nbDocs = 251; - List> documents = new ArrayList<>(); - long start = System.currentTimeMillis(); - for (int i = 0; i < nbDocs; i++) { - documents.add(new Document().id(String.valueOf(i)).data(new Product("Desc " + i, i * 1.0d))); - } - List> result = collectionSimple.insertManyChunked(documents, 20, 1); - long end = System.currentTimeMillis(); - log.info("Inserting {} documents took {} ms", nbDocs, end - start); - Assertions.assertEquals(nbDocs, collectionSimple.countDocuments()); - Assertions.assertEquals(nbDocs, result.size()); - collectionSimple.deleteAll(); - collectionSimple - .insertManyChunkedASync(documents, 20, 1) - .thenAccept(res -> Assertions.assertEquals(nbDocs, res.size())); - } - - @Test - @Order(28) - @DisplayName("28. InsertVeryMany concurrently") - public void shouldInsertManyChunkedParallel() { - initializeCollectionSimple(); - List> documents = new ArrayList<>(); - long start = System.currentTimeMillis(); - - int nbDocs = 999; - for (int i = 0; i < nbDocs; i++) { - documents.add(new Document().id(String.valueOf(i)).data(new Product("Desc " + i, i * 1.0d))); - } - collectionSimple.insertManyChunked(documents, 20, 20); - long end = System.currentTimeMillis(); - log.info("Inserting {} documents took {} ms", nbDocs, end - start); - - collectionSimple.countDocuments(); - - long top = System.currentTimeMillis(); - //DeleteQuery query = DeleteQuery.builder() - // .where("product_price", GREATER_THAN, 100) - // .build(); - //collectionSimple.deleteMany(query); - //collectionSimple.deleteManyChunked(query, 5); - //System.out.println("Total time " + (System.currentTimeMillis() - top)); - //collectionSimple.countDocuments(); - - /* - collectionSimple.insertManyChunkedASync(documents, 20, 20).thenAccept(res -> { - Assertions.assertEquals(nbDocs, res.size()); - Assertions.assertEquals(nbDocs, collectionSimple.countDocuments()); - });*/ - - } - - @Test - @Order(29) - @DisplayName("29. InsertMany with duplicates") - public void insertWithDuplicatesLeadToErrors() { - initializeCollectionSimple(); - collectionSimple.enableOrderingWhenInsert(); - List status = collectionSimple.insertManyJsonDocuments(List.of( - new JsonDocument().id("1").put("firstName", "Kylian").put("lastName", "Mbappé"), - new JsonDocument().id("1").put("firstName", "Antoine").put("lastName", "Griezmann"))); - Assertions.assertEquals(DocumentMutationStatus.ALREADY_EXISTS, status.get(0).getStatus()); - } - - @Test - @Order(30) - @DisplayName("30. UpsertMany") - public void insertVeryWithDuplicatesLeadToErrors() { - initializeCollectionSimple(); - List status = collectionSimple.upsertManyJsonDocuments(List.of(player1, player2, player3)); - Assertions.assertEquals(DocumentMutationStatus.CREATED, status.get(0).getStatus()); - } - - // ======== FIND ========= - - @Test - @Order(25) - @DisplayName("25. Find with $gte") - public void shouldFindWithGreaterThan() { - shouldInsertADocument(); - Assertions.assertEquals(1, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isGreaterOrEqualsThan(12.99)) - .build()).count()); - } - - @Test - @Order(25) - @DisplayName("25. Find with $gte") - public void shouldFindWithEquals() { - shouldInsertADocument(); - /* - Filter f1 = new Filter().where("product_price").isEqualsTo(12.99); - Assertions.assertEquals(1, collectionVector.find(new SelectQuery(f1)).count()); - - Filter f2 = new Filter(). - and() - .where("product_price", FilterOperator.EQUALS_TO,12.99) - .where("product_name", FilterOperator.EQUALS_TO, "HealthyFresh - Beef raw dog food") - .end(); - Assertions.assertEquals(1, collectionVector.find(new SelectQuery(f2)).count()); - Filter f3 = new Filter() - .not() - .where("product_price", FilterOperator.EQUALS_TO,10.99) - .end(); - Assertions.assertEquals(5, collectionVector.find(new SelectQuery(f3)).count()); - - Filter f4 = new Filter("{\"$not\":{\"product_price\":{\"$eq\":10.99}}}"); - Assertions.assertEquals(5, collectionVector.find(new SelectQuery(f4)).count()); - */ - - Filter yaFilter = new Filter() - .and() - .or() - .where("a", EQUALS_TO, 10) - .where("b", EXISTS, true) - .end() - .or() - .where("c", GREATER_THAN, 5) - .where("d", GREATER_THAN_OR_EQUALS_TO, 5) - .end() - .not() - .where("e", LESS_THAN, 5) - .end(); - - collectionVector.find(new SelectQuery(yaFilter)); - - } - - @Test - @Order(26) - @DisplayName("26. Find with $gt") - // Greater than - public void shouldFindGreaterThan() { - shouldInsertADocument(); - Assertions.assertEquals(1, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isGreaterThan(10)) - .build()).count()); - } - - @Test - @Order(27) - @DisplayName("27. Find with $lt (less than)") - // Greater than - public void shouldFindLessThen() { - shouldInsertADocument(); - Assertions.assertEquals(2, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isLessThan(10)) - .build()).count()); - } - - @Test - @Order(28) - @DisplayName("28. Find with $lte (less than or equals)") - // Greater than - public void shouldFindLessOrEqualsThen() { - shouldInsertADocument(); - Assertions.assertEquals(2, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isLessOrEqualsThan(9.99)) - .build()).count()); - } - - @Test - @Order(29) - @DisplayName("29. Find with $eq") - // Greater than - public void shouldEqualsThen() { - shouldInsertADocument(); - Assertions.assertEquals(1, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isEqualsTo(9.99)) - .build()).count()); - } - - @Test - @Order(30) - @DisplayName("30. Find Nwith $ne (not equals)") - // Greater than - public void shouldNotEqualsThen() { - shouldInsertADocument(); - Assertions.assertEquals(4, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .isNotEqualsTo(9.99)) - .build()).count()); - } - - @Test - @Order(31) - @DisplayName("31. Find with $exists") - // Greater than - public void shouldFindExists() { - shouldInsertADocument(); - Assertions.assertEquals(3, collectionVector.find(SelectQuery.builder() - .filter(new Filter().where("product_price") - .exists()) - .build()).count()); - } - - @Test - @Order(32) - @DisplayName("32. AND with Exists and Not Equals") - // Greater than - public void shouldFindAndExistsAndNotEquals() { - shouldInsertADocument(); - // Exists AND not equals - // {"find":{"filter":{"$and":[{"product_price":{"$exists":true}},{"product_price":{"$ne":9.99}}]}}} - SelectQuery existAndNotEquals = new SelectQuery(); - List>> andCriteriaList = new ArrayList<>(); - Map> criteria1 = new HashMap<>(); - criteria1.put("product_price", Map.of("$exists", true)); - Map> criteria2 = new HashMap<>(); - criteria2.put("product_price", Map.of("$ne", 9.99)); - andCriteriaList.add(criteria1); - andCriteriaList.add(criteria2); - existAndNotEquals.setFilter(Map.of("$and", andCriteriaList)); - Assertions.assertEquals(2, collectionVector.find(existAndNotEquals).count()); - - SelectQuery query2 = SelectQuery.builder().filter(new Filter("{" + - "\"$and\":[" + - " {" + - "\"product_price\": {\"$exists\":true}" + - "}," + - "{" + - "\"product_price\":{\"$ne\":9.99}}]" + - "}")) - .build(); - Assertions.assertEquals(2, collectionVector.find(query2).count()); - - } - - @Test - @Order(33) - @DisplayName("33. Find $in") - public void shouldFindWithIn() { - shouldInsertOneComplexDocument(); - - // $in - log.info("Search with $in..."); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("metadata_string") - .isInArray(new String[]{"hello", "world"})).build()) - .findFirst().isPresent()); - } - - @Test - @Order(34) - @DisplayName("34. Find $nin") - public void shouldFindWithNIn() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("metadata_string") - .isNotInArray(new String[]{"Hallo", "Welt"})).build()) - .findFirst().isPresent()); - } - - @Test - @Order(35) - @DisplayName("35. Should find with $size") - public void shouldFindWithSize() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("metadata_boolean_array") - .hasSize(3)).build()).findFirst().isPresent()); - } - - @Test - @Order(36) - @DisplayName("36. Should find with $lt") - public void shouldFindWithLT() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("metadata_int") - .isLessThan(2)).build()).findFirst().isPresent()); - } - - @Test - @Order(37) - @DisplayName("37. Should find with $lte") - public void shouldFindWithLTE() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("metadata_int") - .isLessOrEqualsThan(1)).build()).findFirst().isPresent()); - } - - @Test - @Order(38) - @DisplayName("38. Should find with $gt") - public void shouldFindWithGTE() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find( - SelectQuery.builder().filter(new Filter() - .where("metadata_int") - .isGreaterThan(0)).build()).findFirst().isPresent()); - } - - @Test - @Order(39) - @DisplayName("39. Should find with $gte and Instant") - public void shouldFindWithGTEInstant() { - shouldInsertOneComplexDocument(); - Assertions.assertTrue(collectionSimple.find(SelectQuery.builder().filter(new Filter() - .where("metadata_instant") - .isLessThan(Instant.now())).build()).findFirst().isPresent()); - } - - @Test - @Order(40) - @DisplayName("40. ToString should provide the json String") - public void shouldSerializedAsJson() { - - // Serializing a JsonDocument give you back the Json String - JsonDocument doc1 = new JsonDocument().id("1").put("a", "a").put("b", "c"); - Assertions.assertEquals("{\"a\":\"a\",\"b\":\"c\",\"_id\":\"1\"}", doc1.toString()); - - // Serializing a Document give you back a Json String - Document doc2 = new Document().id("1").data(new Product("name", 1d)); - Assertions.assertEquals("{\"product_name\":\"name\",\"product_price\":1.0,\"_id\":\"1\"}", doc2.toString()); - - initializeCollectionVector(); - collectionVector.insertManyJsonDocuments(List.of( - new JsonDocument() - .id("doc1") // generated if not set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99), - new JsonDocument() - .id("doc2") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data("{\"product_name\": \"HealthyFresh - Chicken raw dog food\", \"product_price\": 9.99}"), - new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food")), - new JsonDocument() - .id("doc4") - .vector(new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99) - )); - - SelectQuery query2 = SelectQuery.builder() - .orderByAnn(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .withLimit(4) - .includeSimilarity() - .build(); - collectionVector.find(query2).forEach(System.out::println); - } - - @Test - @Order(41) - @DisplayName("41. Create Collections (with deny)") - public void shouldCreateCollectionWithDenyOptions() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - // When - collectionDeny = astraDB.createCollection(CollectionDefinition.builder() - .name(TEST_COLLECTION_DENY) - .vector(14, SimilarityMetric.cosine) - .indexingDeny("blob_body") - .build()); - collectionDeny.insertOne(new JsonDocument() - .id("p1") - .put("prop1", "value1") - .put("blob_body", "hello")); - // Then - Assertions.assertTrue(collectionDeny - .findById("p1").isPresent()); - Assertions.assertTrue(collectionDeny - .findOne(SelectQuery - .builder().filter(new Filter().where("prop1") - .isEqualsTo("value1")).build()).isPresent()); - Assertions.assertThrows(DataApiException.class, () -> collectionDeny - .findOne(SelectQuery.builder() - .filter(new Filter().where("blob_body") - .isEqualsTo("hello")) - .build())); - } - - @Test - public void shouldDoSemanticSearch() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - initializeCollectionVector(); - - // When - // Insert vectors - collectionVector.insertOne( - new JsonDocument() - .id("doc1") // generated if not set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99)); - collectionVector.insertOne( - new JsonDocument() - .id("doc2") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)); - collectionVector.insertOne( - new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food"))); - collectionVector.insertOne( - new JsonDocument() - .id("doc4") - .vector(new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)); - - // Perform a similarity search - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - //Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - int maxRecord = 10; - long top = System.currentTimeMillis(); - Stream resultsSet = collectionVector.findVector(embeddings, null, maxRecord); - System.out.println(System.currentTimeMillis() - top); - } - - @Test - @Order(42) - @DisplayName("42. Create Collections (with allow)") - public void shouldCreateCollectionWithAllowOptions() { - if (astraDbAdmin == null) shouldConnectToDatabase(); - // ---- TESTING WITH ALLOW ----- - - // When - astraDB.deleteCollection(TEST_COLLECTION_ALLOW); - collectionAllow = astraDB.createCollection(CollectionDefinition.builder() - .name(TEST_COLLECTION_ALLOW) - .vector(14, SimilarityMetric.cosine) - .indexingAllow("prop1") - .build()); - collectionAllow.insertOne(new JsonDocument() - .id("p1") - .put("prop1", "value1") - .put("blob_body", "hello")); - Assertions.assertTrue(collectionAllow - .findOne(SelectQuery.builder() .filter(new Filter().where("prop1").isEqualsTo("value1")) - .build()).isPresent()); - Assertions.assertThrows(DataApiException.class, () -> collectionAllow - .findOne(SelectQuery.builder() - .filter(new Filter().where("blob_body") - .isEqualsTo("hello")) - .build())); - - } - - @Test - @Order(43) - @DisplayName("43. Find in array (not keyword)") - public void testFindInArray() { - initializeCollectionSimple(); - // Given 2 records - collectionSimple.insertManyJsonDocuments(List.of( - new JsonDocument().id("1").put("names", List.of("John", "Doe")), - new JsonDocument().id("2").put("names", List.of("Cedrick", "Lunven")) - )); - // I should perform an any filter in a collection - Assertions.assertEquals(1, collectionSimple.find(SelectQuery.builder() - .filter(new Filter().where("names") - .isEqualsTo("John")) - .build()).count()); - } - - // ---------------------------------------- - // --------- Object Mapping --------------- - // ---------------------------------------- - - static AstraDBRepository productRepositoryVector; - static AstraDBRepository productRepositorySimple; - - @Test - @Order(50) - @DisplayName("50. Insert with CollectionRepository and vector") - public void shouldInsertRecords() { - initializeCollectionVector(); - - productRepositoryVector = astraDB.getCollection(TEST_COLLECTION_VECTOR, Product.class); - productRepositoryVector.insert(new Document<>( - "product1", - new Product("something Good", 9.99), - new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f})); - - // Add vector without an id - productRepositoryVector.insert(new Document() - .data(new Product("id will be generated for you", 10.99)) - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f})); - - // Insert a full-fledged object - productRepositoryVector.insert(new Document() - .id("pf2000") - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f})); - } - - @Test - @Order(51) - @DisplayName("51. Insert with CollectionRepository") - public void shouldInsertWithSimpleCollectionObjectMapping() { - productRepositorySimple = astraDB.getCollection(TEST_COLLECTION_NAME, Product.class); - Assertions.assertNotNull(productRepositorySimple); - productRepositorySimple.save(new Document().id("p1").data(new Product("Pupper Sausage Beef dog Treats", 9.99))); - productRepositorySimple.save(new Document().id("p2").data(new Product("Dog Ring Chew Toy", 10.99))); - productRepositorySimple.saveAll(List.of( - new Document().id("p3").data(new Product("Dog Ring Chew Toy", 9.99)), - new Document().id("p4").data(new Product("Pepper Sausage Bacon dog Treats", 9.99)) - )); - } - - private void initializeCollectionSimple() { - if (astraDbAdmin == null) { - databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDB = astraDbAdmin.getDatabase(databaseId); - } - if (collectionSimple == null) { - collectionSimple = astraDB.createCollection(TEST_COLLECTION_NAME); - } - collectionSimple.deleteAll(); - } - - private void initializeCollectionVector() { - if (astraDbAdmin == null) { - databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDB = astraDbAdmin.getDatabase(databaseId); - } - if (collectionVector == null) { - collectionVector = astraDB.createCollection(TEST_COLLECTION_VECTOR, 14); - } - collectionVector.deleteAll(); - } - -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java deleted file mode 100644 index eb2ab060..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/BreakAstraTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.datastax.astradb.client; - -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.utils.Utils; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.UUID; - -public class BreakAstraTest { - - public static final String TEST_DBNAME = "astra_db_client"; - - static CloudProviderType targetCloud = AstraDBAdmin.FREE_TIER_CLOUD; - static String targetRegion = AstraDBAdmin.FREE_TIER_CLOUD_REGION; - static String astraToken = Utils.readEnvVariable("ASTRA_DB_APPLICATION_TOKEN").get(); - - static AstraDBAdmin astraDbAdmin; - static AstraDB astraDB; - static UUID databaseId; - static AstraCollection collectionSimple; - - @Test - public void testQueryBust() { - astraDbAdmin = new AstraDBAdmin(astraToken, AstraEnvironment.PROD); - databaseId = astraDbAdmin.createDatabase(TEST_DBNAME, targetCloud, targetRegion); - astraDB = astraDbAdmin.getDatabase(databaseId); - collectionSimple = astraDB.createCollection("collection_vector", 1536); - collectionSimple.deleteAll(); - List> documents = new ArrayList<>(); - - // Create an instance of Random - Random random = new Random(); - int size = 1536; - float[] fakeEmbeddings = new float[size]; - for(int i = 0; i < size; i++) { - fakeEmbeddings[i] = random.nextFloat(); - } - - long start = System.currentTimeMillis(); - int nbDocs = 200000; - for (int i = 0; i < nbDocs; i++) { - documents.add(new Document() - .id(String.valueOf(i)) - .vector(fakeEmbeddings) - .data(new AstraDatabaseTestSuiteIT.Product("Desc " + i, i * 1.0d))); - } - collectionSimple.insertManyChunked(documents, 20, 200); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java deleted file mode 100644 index d1d6dda1..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/ClusteredMetadataVectorStore.java +++ /dev/null @@ -1,218 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.astradb.client.cassio.AnnQuery; -import com.datastax.astradb.client.cassio.AnnResult; -import com.datastax.astradb.client.cassio.CassandraSimilarityMetric; -import com.datastax.astradb.client.cassio.ClusteredMetadataVectorRecord; -import com.datastax.astradb.client.cassio.ClusteredMetadataVectorTable; -import com.datastax.oss.driver.api.core.uuid.Uuids; -import dev.langchain4j.data.document.Metadata; -import dev.langchain4j.data.embedding.Embedding; -import dev.langchain4j.data.segment.TextSegment; -import dev.langchain4j.internal.ValidationUtils; -import dev.langchain4j.store.embedding.CosineSimilarity; -import dev.langchain4j.store.embedding.EmbeddingMatch; -import dev.langchain4j.store.embedding.EmbeddingStore; -import dev.langchain4j.store.embedding.RelevanceScore; -import lombok.NonNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static java.util.stream.Collectors.toList; - -/** - * Implementation of {@link EmbeddingStore} using Cassandra. - * - * @see EmbeddingStore - */ -public class ClusteredMetadataVectorStore implements EmbeddingStore { - - /** Represents an embedding table in Cassandra, it is a table with a vector column. */ - protected ClusteredMetadataVectorTable embeddingTable; - - /** - * Embedding Store. - * - * @param table - * Cassandra Table - */ - public ClusteredMetadataVectorStore(ClusteredMetadataVectorTable table) { - this.embeddingTable = table; - } - - /** - * Delete the table. - */ - public void delete() { - embeddingTable.delete(); - } - - /** - * Delete all rows. - */ - public void clear() { - embeddingTable.clear(); - } - - /** - * Add a new embedding to the store. - * - the row id is generated - * - text and metadata are not stored - * - * @param embedding representation of the list of floats - * @return newly created row id - */ - @Override - public String add(@NonNull Embedding embedding) { - return add(embedding, null); - } - - /** - * Add a new embedding to the store. - * - the row id is generated - * - text and metadata coming from the text Segment - * - * @param embedding representation of the list of floats - * @param textSegment text content and metadata - * @return newly created row id - */ - @Override - public String add(@NonNull Embedding embedding, TextSegment textSegment) { - ClusteredMetadataVectorRecord record = new ClusteredMetadataVectorRecord(); - record.setVector(embedding.vectorAsList()); - record.setPartitionId("default"); - record.setRowId(Uuids.timeBased()); - if (textSegment != null) { - record.setBody(textSegment.text()); - Map metaData = textSegment.metadata().asMap(); - if (metaData != null && !metaData.isEmpty()) { - if (metaData.containsKey(ClusteredMetadataVectorTable.PARTITION_ID)) { - record.setPartitionId(metaData.get(ClusteredMetadataVectorTable.PARTITION_ID)); - metaData.remove(ClusteredMetadataVectorTable.PARTITION_ID); - } - record.setMetadata(metaData); - } - } - embeddingTable.save(record); - return record.getRowId().toString(); - } - - /** - * Add a new embedding to the store. - * - * @param rowId the row id - * @param embedding representation of the list of floats - */ - @Override - public void add(@NonNull String rowId, @NonNull Embedding embedding) { - ClusteredMetadataVectorRecord record = new ClusteredMetadataVectorRecord(); - record.setVector(embedding.vectorAsList()); - record.setPartitionId("default"); - record.setRowId(UUID.fromString(rowId)); - embeddingTable.save(record); - } - - /** - * They will all be added in the same partition. - * - * @param embeddingList embeddings list - * @return list of new row if (same order as the input) - */ - @Override - public List addAll(List embeddingList) { - return embeddingList.stream() - .map(Embedding::vectorAsList) - .map(ClusteredMetadataVectorRecord::new) - .peek(embeddingTable::save) - .map(ClusteredMetadataVectorRecord::getRowId) - .map(UUID::toString) - .collect(toList()); - } - - /** - * Add multiple embeddings as a single action. - * - * @param embeddingList embeddings - * @param textSegmentList text segments - * @return list of new row if (same order as the input) - */ - @Override - public List addAll(List embeddingList, List textSegmentList) { - if (embeddingList == null || textSegmentList == null || embeddingList.size() != textSegmentList.size()) { - throw new IllegalArgumentException("embeddingList and textSegmentList must not be null and have the same size"); - } - // Looping on both list with an index - List ids = new ArrayList<>(); - for (int i = 0; i < embeddingList.size(); i++) { - ids.add(add(embeddingList.get(i), textSegmentList.get(i))); - } - return ids; - } - - /** - * Search for relevant. - * - * @param embedding current embeddings - * @param maxResults max number of result - * @param minScore threshold - * @return list of matching elements - */ - public List> findRelevant(Embedding embedding, int maxResults, double minScore) { - return findRelevant(embedding, maxResults, minScore, null); - } - - /** - * Similarity Search ANN based on the embedding. - * - * @param embedding vector - * @param maxResults max number of results - * @param minScore score minScore - * @param metadata map key-value to build a metadata filter - * @return list of matching results - */ - public List> findRelevant(Embedding embedding, int maxResults, double minScore, Metadata metadata) { - AnnQuery.AnnQueryBuilder builder = AnnQuery.builder() - .embeddings(embedding.vectorAsList()) - .metric(CassandraSimilarityMetric.COSINE) - .recordCount(ValidationUtils.ensureGreaterThanZero(maxResults, "maxResults")) - .threshold(CosineSimilarity.fromRelevanceScore(ValidationUtils.ensureBetween(minScore, 0, 1, "minScore"))); - if (metadata != null) { - builder.metaData(metadata.asMap()); - } - return embeddingTable - .similaritySearch(builder.build()) - .stream() - .map(this::mapSearchResult) - .collect(toList()); - } - - /** - * Map Search result coming from Astra. - * - * @param record current record - * @return search result - */ - private EmbeddingMatch mapSearchResult(AnnResult record) { - - TextSegment embedded = null; - String body = record.getEmbedded().getBody(); - if (body != null - && !body.isEmpty() - && record.getEmbedded().getMetadata() != null) { - embedded = TextSegment.from(record.getEmbedded().getBody(), - new Metadata(record.getEmbedded().getMetadata())); - } - return new EmbeddingMatch<>( - // Score - RelevanceScore.fromCosineSimilarity(record.getSimilarity()), - // EmbeddingId : unique identifier - record.getEmbedded().getRowId().toString(), - // Embeddings vector - Embedding.from(record.getEmbedded().getVector()), - // Text segment and metadata - embedded); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java deleted file mode 100644 index 89d6a74a..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/RagPdfVectorTest.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.datastax.astradb.client.cassio; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.oss.driver.api.core.CqlSession; -import com.dtsx.astra.sdk.utils.TestUtils; -import dev.langchain4j.data.document.Document; -import dev.langchain4j.data.document.DocumentParser; -import dev.langchain4j.data.document.DocumentSplitter; -import dev.langchain4j.data.document.parser.apache.pdfbox.ApachePdfBoxDocumentParser; -import dev.langchain4j.data.document.splitter.DocumentSplitters; -import dev.langchain4j.data.embedding.Embedding; -import dev.langchain4j.data.message.AiMessage; -import dev.langchain4j.data.segment.TextSegment; -import dev.langchain4j.model.chat.ChatLanguageModel; -import dev.langchain4j.model.embedding.EmbeddingModel; -import dev.langchain4j.model.input.Prompt; -import dev.langchain4j.model.input.PromptTemplate; -import dev.langchain4j.model.openai.OpenAiChatModel; -import dev.langchain4j.model.openai.OpenAiEmbeddingModel; -import dev.langchain4j.model.openai.OpenAiTokenizer; -import dev.langchain4j.model.output.Response; -import dev.langchain4j.store.embedding.EmbeddingMatch; -import dev.langchain4j.store.embedding.EmbeddingStore; -import dev.langchain4j.store.embedding.EmbeddingStoreIngestor; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; - -import java.io.InputStream; -import java.time.Duration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static com.dtsx.astra.sdk.utils.TestUtils.getAstraToken; -import static dev.langchain4j.model.openai.OpenAiModelName.GPT_3_5_TURBO; -import static java.util.stream.Collectors.joining; - -@Slf4j -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class RagPdfVectorTest { - - public static final String LLM_MODEL_CHAT_COMPLETION = "gpt-3.5-turbo"; - public static final String TEXT_EMBEDDING_ADA_002 = "text-embedding-ada-002"; - public static final int LLM_MODEL_DIMENSION = 1536; - - public static EmbeddingModel embeddingModel; - public static EmbeddingStore embeddingStore; - - /** - * Settings from Astra Usage - */ - private static final String ASTRA_DB_DATABASE = "test_java_astra_db_client"; - static CqlSession cqlSession; - static ClusteredMetadataVectorTable cassandraTable; - - @BeforeAll - public static void init() { - - // Initializing DV - UUID databaseId = new AstraDBAdmin(getAstraToken()).createDatabase(ASTRA_DB_DATABASE); - log.info("Astra Database is ready"); - - // Initializing Session - cqlSession = CassIO.init(getAstraToken(), databaseId, TestUtils.TEST_REGION, AstraDBAdmin.DEFAULT_KEYSPACE); - log.info("Astra connection is opened"); - - // Initializing table - cassandraTable = CassIO.clusteredMetadataVectorTable("vector_store", LLM_MODEL_DIMENSION); - CassIO.metadataVectorTable("", 1536); - cassandraTable.create(); - log.info("Destination Table is created"); - - // Initializing Embedding Store - embeddingStore = new ClusteredMetadataVectorStore(cassandraTable); - log.info("Embedding Store is ready"); - - // Initializing Embedding Model - embeddingModel = OpenAiEmbeddingModel.builder() - .apiKey(System.getenv("OPENAI_API_KEY")) - .modelName(TEXT_EMBEDDING_ADA_002) - .build(); - log.info("Embedding Model is ready"); - } - - @Test - @SuppressWarnings("unchecked") - public void shouldIngestPDF() { - - DocumentParser parser = new ApachePdfBoxDocumentParser(); - InputStream inputStream = RagPdfVectorTest.class.getClassLoader().getResourceAsStream("johnny.pdf"); - - Document document = parser.parse(inputStream); - - DocumentSplitter splitter = DocumentSplitters - .recursive(100, 10, new OpenAiTokenizer(GPT_3_5_TURBO)); - - EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder() - .documentSplitter(splitter) - .embeddingModel(embeddingModel) - .embeddingStore(embeddingStore) - .build(); - ingestor.ingest(document); - - } - - @Test - public void shouldDoRAG() { - String question = "What animal is Johnny ?"; - - // Embed the question - Response questionEmbedding = embeddingModel.embed(question); - - // Find relevant embeddings in embedding store by semantic similarity - // You can play with parameters below to find a sweet spot for your specific use case - int maxResults = 5; - double minScore = 0.8; - List> relevantEmbeddings = - embeddingStore.findRelevant(questionEmbedding.content(), maxResults, minScore); - - - // Create a prompt for the model that includes question and relevant embeddings - PromptTemplate promptTemplate = PromptTemplate.from( - "Answer the following question to the best of your ability:\n" - + "\n" - + "Question:\n" - + "{{question}}\n" - + "\n" - + "Base your answer on the following information:\n" - + "{{information}}"); - - String information = relevantEmbeddings.stream() - .map(match -> match.embedded().text()) - .collect(joining("\n\n")); - - Map variables = new HashMap<>(); - variables.put("question", question); - variables.put("information", information); - - Prompt prompt = promptTemplate.apply(variables); - - // Send the prompt to the OpenAI chat model - ChatLanguageModel chatModel = OpenAiChatModel.builder() - .apiKey(System.getenv("OPENAI_API_KEY")) - .modelName(GPT_3_5_TURBO) - .temperature(0.7) - .timeout(Duration.ofSeconds(15)) - .maxRetries(3) - .logResponses(true) - .logRequests(true) - .build(); - - Response aiMessage = chatModel.generate(prompt.toUserMessage()); - - // See an answer from the model - String answer = aiMessage.content().text(); - System.out.println(answer); - - - } - -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java deleted file mode 100644 index 4a36408d..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseDemoTest.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.datastax.astradb.client.cassio.vector; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.AstraDatabaseTestSuiteIT; -import io.stargate.sdk.core.domain.Page; -import io.stargate.sdk.data.CollectionClient; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import io.stargate.sdk.data.NamespaceClient; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import io.stargate.sdk.data.domain.query.UpdateQuery; -import io.stargate.sdk.data.domain.query.UpdateQueryBuilder; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -/** - * Demo using Json client - */ -public class AstraDatabaseDemoTest { - - @Test - public void shouldDoCollection() { - - // Token retrieved from CLI config or env var - AstraDBAdmin astraDBAdmin = new AstraDBAdmin(); - - // Create Database - UUID uuid = astraDBAdmin.createDatabase(AstraDatabaseTestSuiteIT.TEST_DBNAME); - - // Select Database / Namespace - NamespaceClient db = astraDBAdmin - .getDataApiClient(AstraDatabaseTestSuiteIT.TEST_DBNAME) - .namespace("default_keyspace"); - - // Create a collection - db.deleteCollection("collection_test"); - db.createCollection("collection_test", 5); - - // User the collection - CollectionClient collection = db.collection("collection_test"); - - // # Insert into vector collection - collection.insertOne(new JsonDocument().id("4") - .put("name", "Coded Cleats Copy") - .put("description", "ChatGPT integrated sneakers that talk to you") - .vector(new float[]{0.25f, 0.25f, 0.25f, 0.25f, 0.25f})); - // # Insert non-vector document - collection.insertOne(new JsonDocument().id("Cliff1") - .put("first_name", "Cliff") - .put("last_name", "Wicklow")); - - // Insert Many document - List docs = collection.insertManyJsonDocuments(List.of( - new JsonDocument().id("1") - .vector(new float[]{0.1f, 0.15f, 0.3f, 0.12f, 0.05f}) - .put("name", "Coded Cleats") - .put("description", "ChatGPT integrated sneakers that talk to you"), - new JsonDocument().id("2") - .vector(new float[]{0.45f, 0.09f, 0.01f, 0.2f, 0.11f}) - .put("name", "Logic Layers") - .put("description", "An AI quilt to help you sleep forever"), - new JsonDocument().id("3") - .vector(new float[]{0.1f, 0.05f, 0.08f, 0.3f, 0.6f}) - .put("name", "Vision Vector Frame") - .put("description", "Vision Vector Frame - A deep learning display that controls your mood") - )); - - // Find a document - Filter filter = new Filter().where("_id").isEqualsTo("4"); - Optional doc1 = collection.findOne(SelectQuery.builder().filter(filter).build()); - Optional doc2 = collection.findById("4"); - doc2.ifPresent(this::showResult); - - // Find documents using vector search - Filter filterVector = new Filter().where("$vector").isEqualsTo(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}); - Page results = collection.findPage( - SelectQuery.builder().filter(filterVector) - // best way to do it below - //.orderByAnn(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}) - .withLimit(2) - .build()); - System.out.println(results.getResults().get(0).getData().get("name")); - System.out.println(results.getResults().size()); - showPage(results); - - /** - * Find documents using vector search and projection. - * - * sort = {"$vector": [0.15, 0.1, 0.1, 0.35, 0.55]} - * options = {"limit": 100} - * projection = {"$vector": 1, "$similarity": 1} - */ - Page results2 = collection.findPage( - SelectQuery.builder() - .orderByAnn(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}) - .withLimit(2) - .includeSimilarity() - .build()); - showPage(results2); - - /** - * Find one document using vector search and projection - * - * sort = {"$vector": [0.15, 0.1, 0.1, 0.35, 0.55]} - * projection = {"$vector": 1} - */ - Optional doc3 = collection.findOne(SelectQuery.builder() - .orderByAnn(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}) - .build()); - doc3.ifPresent(this::showResult); - - /** - * Find one and update with vector search - * - * sort = {"$vector": [0.15, 0.1, 0.1, 0.35, 0.55]} - * update = {"$set": {"status": "active"}} - * options = {"returnDocument": "after"} - */ - collection.findOneAndUpdate(UpdateQuery.builder() - .updateSet("status", "active") - .orderByAnn(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}) - .withReturnDocument(UpdateQueryBuilder.ReturnDocument.after) - .build()); - Filter filter3 = new Filter().where("status").isEqualsTo("active"); - Optional result = collection.findOne(SelectQuery.builder() - .filter(filter3) - .build()); - result.ifPresent(this::showResult); - - /** - * Find one and replace with vector search - * - * sort = ({"$vector": [0.15, 0.1, 0.1, 0.35, 0.55]},) - * replacement = { - * "_id": "3", - * "name": "Vision Vector Frame", - * "description": "Vision Vector Frame - A deep learning display that controls your mood", - * "$vector": [0.1, 0.05, 0.08, 0.3, 0.6], - * "status": "inactive", - * } - * options = {"returnDocument": "after"} - */ - collection.findOneAndReplace(UpdateQuery.builder() - .replaceBy(new JsonDocument().id("3") - .vector(new float[]{0.1f, 0.05f, 0.08f, 0.3f, 0.6f}) - .put("name", "Vision Vector Frame") - .put("description", "Vision Vector Frame - A deep learning display that controls your mood") - .put("status", "inactive")) - .orderByAnn(new float[]{0.15f, 0.1f, 0.1f, 0.35f, 0.55f}) - .withReturnDocument(UpdateQueryBuilder.ReturnDocument.after) - .build()); - Filter filter4 = new Filter().where("name").isEqualsTo("Vision Vector Frame"); - Optional result2 = collection.findOne(SelectQuery.builder() - .filter(filter4) - .build()); - result2.ifPresent(this::showResult); - } - - private void showPage(Page page) { - if (page != null) { - System.out.println("Page size: " + page.getPageSize()); - System.out.println("Page state: " + page.getPageState()); - System.out.println("Page results: " + page.getResults().size()); - page.getResults().forEach(this::showResult); - } - } - - private void showResult(JsonDocumentResult r) { - String row = r.getId() + " - "; - if (r.getSimilarity() != null) { - row += r.getSimilarity() + " - "; - } - System.out.println(row + r.getData() + " " + Arrays.toString(r.getVector())); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java deleted file mode 100644 index 093a51bf..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraDatabaseQuickStart.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.datastax.astradb.client.cassio.vector; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDBRepository; -import com.datastax.astradb.client.AstraDatabaseTestSuiteIT; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; - -public class AstraDatabaseQuickStart { - - @Test - public void quickStartTest() { - String astraToken = System.getenv("ASTRA_DB_APPLICATION_TOKEN"); - String databaseName = AstraDatabaseTestSuiteIT.TEST_DBNAME; - String collectionName = "collection_quickstart"; - - // 1a. Initialization with a client - AstraDBAdmin astraDBAdmin = new AstraDBAdmin(astraToken); - // 1b. Create DB (Skip if you already have a database running) - if (!astraDBAdmin.isDatabaseExists(databaseName)) { - astraDBAdmin.createDatabase(databaseName); - } - - // 2. Create a store (delete if exist) - AstraDB astraDBClient = astraDBAdmin.getDatabase(databaseName); - // 3. Insert data in the store - astraDBClient.deleteCollection(collectionName); - AstraCollection collection = astraDBClient.createCollection(collectionName, 14); - // 3a. Insert One (attributes as key/value) - collection.insertOne(new JsonDocument() - .id("doc1") // generated if not set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99)); - // 3b. Insert One (attributes as JSON) - collection.insertOne(new JsonDocument() - .id("doc2") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data("{" - +" \"product_name\": \"HealthyFresh - Chicken raw dog food\", " - + " \"product_price\": 9.99" - + "}") - ); - // 3c. Insert One (attributes as a MAP) - collection.insertOne(new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food")) - ); - // 3d. Insert as a single Big JSON - collection.insertOne(new JsonDocument() - .id("doc4") - .vector(new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)); - collection.findVector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}); - - // ------------------------------------------ - // ----- Crud Repository ---- - // ------------------------------------------ - - // With ODM - AstraDBRepository productRepository = - astraDBClient.getCollection(collectionName, Product.class); - - // 3 fields: id, payload, vector - productRepository.insert(new Document<>("doc5", - new Product("HealthyFresh - Beef raw dog food", 12.99), - new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f})); - - // build the "document" and insert the document - Document doc6 = new Document<>("doc6", - new Product("HealthyFresh - Beef raw dog food", 12.99), - new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}); - productRepository.insert(doc6); - - Assertions.assertEquals(6, productRepository.count()); - - List> results = productRepository - .findVector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, null, 2); - } - - @Data - @NoArgsConstructor - @AllArgsConstructor - static class Product { - @JsonProperty("product_name") - private String name; - @JsonProperty("product_price") - private Double price; - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java deleted file mode 100644 index 2a2374b6..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/AstraUIQuickStart.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.datastax.astradb.client.cassio.vector; - -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.CollectionDefinition; - -public class AstraUIQuickStart { - public static void main(String[] args) { - AstraDB db = new AstraDB("", ""); - System.out.println("Connected to AstraDB"); - db.findAllCollections() - .map(CollectionDefinition::getName) - .forEach(col -> System.out.println("Collection:" + col)); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java deleted file mode 100644 index 8b474be0..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientPhilosopherTest.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.datastax.astradb.client.cassio.vector; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.dtsx.astra.sdk.utils.AstraRc; -import dev.langchain4j.model.openai.OpenAiEmbeddingModel; -import dev.langchain4j.model.openai.OpenAiModelName; -import io.stargate.sdk.data.domain.odm.Document; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - -import java.io.File; -import java.io.FileNotFoundException; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Scanner; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -@Slf4j -class VectorClientPhilosopherTest { - - static final String DBNAME_VECTOR_CLIENT = "test_java_astra_db_client"; - static final String VECTOR_STORE_NAME = "demo_philosophers"; - static final String DATASET = "/philosopher-quotes.csv"; - - @Data @AllArgsConstructor @NoArgsConstructor - static class Quote { - private String philosopher; - private String quote; - private Set tags; - } - - static AstraDBRepository quoteRepository; - - static OpenAiEmbeddingModel openaiVectorizer = OpenAiEmbeddingModel.builder() - .apiKey(System.getenv("OPENAI_API_KEY")) - .modelName(OpenAiModelName.TEXT_EMBEDDING_ADA_002) - .timeout(Duration.ofSeconds(15)) - .logRequests(true) - .logResponses(true) - .build(); - - static float[] vectorize(String inputText) { - return openaiVectorizer.embed(inputText).content().vector(); - } - - @BeforeAll - public static void setup() { - if (System.getenv(AstraRc.ASTRA_DB_APPLICATION_TOKEN) == null) { - throw new IllegalStateException("Please setup 'ASTRA_DB_APPLICATION_TOKEN' env variable"); - } - new AstraDBAdmin().createDatabase(DBNAME_VECTOR_CLIENT); - log.info("db is created and active"); - } - - @Test - @Order(1) - @DisplayName("01. Import Data") - @EnabledIfEnvironmentVariable(named = "ASTRA_DB_APPLICATION_TOKEN", matches = "Astra.*") - public void shouldIngestCsv() { - // Init the Store - AstraDB dbClient = new AstraDBAdmin().getDatabase(DBNAME_VECTOR_CLIENT); - dbClient.deleteCollection(VECTOR_STORE_NAME); - quoteRepository = dbClient.createCollection(VECTOR_STORE_NAME, 1536, Quote.class); - log.info("store {} is created ", VECTOR_STORE_NAME); - assertTrue(dbClient.isCollectionExists(VECTOR_STORE_NAME)); - - // Populate the Store - AtomicInteger rowId = new AtomicInteger(); - loadQuotesFromCsv(DATASET).forEach(quote -> { - log.info("Inserting {}: {}", rowId.get(), quote.getQuote()); - Document quoteDoc = new Document( - String.valueOf(rowId.incrementAndGet()), - quote, - vectorize(quote.getQuote())); - quoteRepository.insert(quoteDoc); - }); - } - - @Test - @Order(2) - @DisplayName("02. Should Similarity Search") - public void shouldSimilaritySearch() { - - quoteRepository = new AstraDBAdmin() - .getDatabase(DBNAME_VECTOR_CLIENT) - .getCollection(VECTOR_STORE_NAME, Quote.class); - - float[] embeddings = vectorize("We struggle all our life for nothing"); - quoteRepository.findVector(embeddings,3) - .stream() - .map(Document::getData) - .map(Quote::getQuote) - .forEach(System.out::println); - } - - - // --- Utilities (loading CSV) --- - - private List loadQuotesFromCsv(String filePath) { - List quotes = new ArrayList<>(); - File csvFile = new File(VectorClientPhilosopherTest.class.getResource(filePath).getFile()); - try (Scanner scanner = new Scanner(csvFile)) { - while (scanner.hasNextLine()) { - Quote q = mapCsvLine(scanner.nextLine()); - if (q != null) quotes.add(q); - } - } catch (FileNotFoundException fex) { - throw new IllegalArgumentException("file is not in the classpath", fex); - } - return quotes; - } - - private Quote mapCsvLine(String line) { - String[] parts = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1); - if (parts.length >= 3) { - String author = parts[0]; - String quote = parts[1].replaceAll("\"", ""); - Set tags = new HashSet<>(Arrays.asList(parts[2].split("\\;"))); - return new Quote(author, quote, tags); - } - return null; - } - - -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java b/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java deleted file mode 100644 index 9baabfb3..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/cassio/vector/VectorClientProductTest.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.datastax.astradb.client.cassio.vector; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.AstraDBRepository; -import com.dtsx.astra.sdk.utils.AstraRc; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.odm.Document; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; - -import java.util.Arrays; -import java.util.List; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Test the Vector Store Client with no third party embeddings. - */ -@Slf4j -class VectorClientProductTest { - - public static final String DBNAME_VECTOR_CLIENT = "test_java_astra_db_client"; - - public static final String VECTOR_STORE_NAME = "demo_product"; - - @Data - @NoArgsConstructor - @AllArgsConstructor - static class Product { - - @JsonProperty("product_name") - private String name; - - @JsonProperty("product_price") - private Double price; - } - - static AstraDBRepository productRepository; - - @BeforeAll - public static void setup() { - if (System.getenv(AstraRc.ASTRA_DB_APPLICATION_TOKEN) == null) { - throw new IllegalStateException("Please setup 'ASTRA_DB_APPLICATION_TOKEN' env variable"); - } - AstraDBAdmin vectorClient = new AstraDBAdmin(); - UUID databaseId = vectorClient.createDatabase(DBNAME_VECTOR_CLIENT); - log.info("{} is created and active", databaseId); - } - - @Test - @Order(1) - @DisplayName("01. Import Data") - @EnabledIfEnvironmentVariable(named = "ASTRA_DB_APPLICATION_TOKEN", matches = "Astra.*") - public void shouldInsertStaticDocument() { - // Recreating the store - AstraDB astraDBClient = new AstraDBAdmin().getDatabase(DBNAME_VECTOR_CLIENT); - astraDBClient.deleteCollection(VECTOR_STORE_NAME); - productRepository = astraDBClient.createCollection(VECTOR_STORE_NAME, 14, Product.class); - log.info("store {} is created ", VECTOR_STORE_NAME); - assertTrue(astraDBClient.isCollectionExists(VECTOR_STORE_NAME)); - - // Easy insert one - Document doc = new Document<>("pf7044", - new Product("Pupper Sausage Beef dog Treats", 9.99), - new float[]{0f, 0f, 0f, 1f, 0f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f}); - productRepository.insert(doc); - // Easy insert many - productRepository.insert(List.of( - new Document<>("pt0041", - new Product("Dog Ring Chew Toy", 9.99), - new float[]{0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f, 1f, 1f, 0f, 0f, 0f, 0f}), - new Document<>("pf7043", - new Product("Pepper Sausage Bacon dog Treats", 9.99), - new float[]{0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f, 1f, 1f, 0f, 0f, 0f, 0f}) - )); - // Insert Many with Json - productRepository.saveAll(List.of( - new Document<>("pf1844", - new Product("HealthyFresh - Beef raw dog food", 12.99), - new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}), - new Document<>("pf1843", - new Product("HealthyFresh - Beef raw dog food", 12.99), - new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}), - new Document() - .id("pt0021") - .data(new Product("Dog Tennis Ball Toy", 12.99)) - .vector(new float[]{0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 1f, 1f, 0f, 0f})) - ); - assertEquals(6, productRepository.count()); - assertEquals(3, productRepository.count(new Filter() - .where("product_price").isEqualsTo(9.99))); - } - - @Test - @Order(2) - @DisplayName("02. Similarity Search") - public void shouldSimilaritySearch() { - - productRepository = new AstraDBAdmin() - .getDatabase(DBNAME_VECTOR_CLIENT) - .getCollection(VECTOR_STORE_NAME, Product.class); - - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - for(DocumentResult result : productRepository.findVector(embeddings,null, 2)) { - System.out.println(result.getId() - + ") similarity=" + result.getSimilarity() - + ", vector=" + Arrays.toString(result.getVector())); - } - } - - @Test - @Order(3) - @DisplayName("03. Search with Meta Data") - public void shouldSimilaritySearchWithMetaData() { - productRepository = new AstraDBAdmin() - .getDatabase(DBNAME_VECTOR_CLIENT) - .getCollection(VECTOR_STORE_NAME, Product.class); - - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - - for(DocumentResult result : productRepository - .findVector(embeddings, metadataFilter, 2)) { - System.out.println(result.getId() - + ") similarity=" + result.getSimilarity() - + ", vector=" + Arrays.toString(result.getVector())); - } - - } - - @Test - @Order(4) - @DisplayName("04. Search with Meta Data") - public void shouldSimilaritySearcAndNotReturnVector() { - productRepository = new AstraDBAdmin() - .getDatabase(DBNAME_VECTOR_CLIENT) - .getCollection(VECTOR_STORE_NAME, Product.class); - - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - new Filter().where("product_price").isEqualsTo(9.99); - - for(DocumentResult result : productRepository - .findVector(embeddings, metadataFilter, 2)) { - System.out.println(result.getId() - + ") similarity=" + result.getSimilarity() - + ", vector=" + Arrays.toString(result.getVector())); - } - - } - -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java deleted file mode 100644 index 295909cf..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOClusteredMetadataVectorTable.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.astradb.client.cassio.AnnQuery; -import com.datastax.astradb.client.cassio.CassIO; -import com.datastax.astradb.client.cassio.ClusteredMetadataVectorRecord; -import com.datastax.astradb.client.cassio.ClusteredMetadataVectorTable; -import com.dtsx.astra.sdk.utils.TestUtils; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import static com.datastax.astradb.client.cassio.AbstractCassandraTable.PARTITION_ID; - -public class CassIOClusteredMetadataVectorTable { - public static void main(String[] args) { - - // Create db if not exists - UUID databaseId = new AstraDBAdmin("TOKEN") - .createDatabase("database"); - - // Initializing CqlSession - try (CqlSession cqlSession = CassIO.init("TOKEN", - databaseId, TestUtils.TEST_REGION, - AstraDBAdmin.DEFAULT_KEYSPACE)) { - - // Initializing table with the dimension - ClusteredMetadataVectorTable vector_Store = CassIO - .clusteredMetadataVectorTable("vector_store", 1536); - vector_Store.create(); - - // Insert Vectors - String partitionId = UUID.randomUUID().toString(); - ClusteredMetadataVectorRecord record = new ClusteredMetadataVectorRecord(); - record.setVector(List.of(0.1f, 0.2f, 0.3f, 0.4f)); - record.setMetadata(Map.of("key", "value")); - record.setPartitionId(partitionId); - record.setBody("Sample text fragment"); - record.setAttributes("handy field for special attributes"); - vector_Store.put(record); - - // Semantic Search - AnnQuery query = AnnQuery - .builder() - .embeddings(List.of(0.1f, 0.2f, 0.3f, 0.4f)) - .metaData(Map.of(PARTITION_ID, partitionId)) - .build(); - - vector_Store.similaritySearch(query).forEach(result -> { - System.out.println("Similarity : " + result.getSimilarity()); - System.out.println("Record : " + result.getEmbedded().getBody()); - }); - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java deleted file mode 100644 index 12cb255c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOConnection.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.cassio.CassIO; -import com.dtsx.astra.sdk.utils.TestUtils; - -import java.util.UUID; - -public class CassIOConnection { - - public static void main(String[] args) { - - // Create db if not exists - UUID databaseId = new AstraDBAdmin("TOKEN") - .createDatabase("database"); - - // Initializing CqlSession - try (CqlSession cqlSession = CassIO.init("TOKEN", - databaseId, TestUtils.TEST_REGION, - AstraDBAdmin.DEFAULT_KEYSPACE)) { - cqlSession - .execute("SELECT datacenter FROM system.local;") - .one() - .get("datacenter", String.class); - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java deleted file mode 100644 index 434d8dc2..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CassIOMetadataVectorTable.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.astradb.client.cassio.AnnQuery; -import com.datastax.astradb.client.cassio.CassIO; -import com.datastax.astradb.client.cassio.MetadataVectorRecord; -import com.datastax.astradb.client.cassio.MetadataVectorTable; -import com.dtsx.astra.sdk.utils.TestUtils; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class CassIOMetadataVectorTable { - public static void main(String[] args) { - - // Create db if not exists - UUID databaseId = new AstraDBAdmin("TOKEN") - .createDatabase("database"); - - // Initializing CqlSession - try (CqlSession cqlSession = CassIO.init("TOKEN", - databaseId, TestUtils.TEST_REGION, - AstraDBAdmin.DEFAULT_KEYSPACE)) { - - // Initializing table with the dimension - MetadataVectorTable vector_Store = CassIO - .metadataVectorTable("vector_store", 1536); - vector_Store.create(); - - // Insert Vectors - String partitionId = UUID.randomUUID().toString(); - MetadataVectorRecord record = new MetadataVectorRecord(); - record.setVector(List.of(0.1f, 0.2f, 0.3f, 0.4f)); - record.setMetadata(Map.of("key", "value")); - record.setBody("Sample text fragment"); - record.setAttributes("handy field for special attributes"); - vector_Store.put(record); - - // Semantic Search - AnnQuery query = AnnQuery - .builder() - .embeddings(List.of(0.1f, 0.2f, 0.3f, 0.4f)) - .metaData(Map.of("key", "value")) - .build(); - - vector_Store.similaritySearch(query).forEach(result -> { - System.out.println("Similarity : " + result.getSimilarity()); - System.out.println("Record : " + result.getEmbedded().getBody()); - }); - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java deleted file mode 100644 index 3cf637ac..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ClearCollection.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; - -public class ClearCollection { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Delete all rows from an existing collection - collection.deleteAll(); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java deleted file mode 100644 index 69cb6641..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Connecting.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; - -import java.util.UUID; - -public class Connecting { - public static void main(String[] args) { - // Default initialization - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Initialize with a non-default keyspace - AstraDB db1 = new AstraDB("TOKEN", "API_ENDPOINT", ""); - - // Initialize with an identifier instead of an endpoint - UUID databaseUuid = UUID.fromString(""); - AstraDB db2 = new AstraDB("TOKEN", databaseUuid); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java deleted file mode 100644 index f69aea16..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ConnectingAdmin.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; - -public class ConnectingAdmin { - public static void main(String[] args) { - // Default Initialization - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // You can omit the token if you defined the `ASTRA_DB_APPLICATION_TOKEN` - // environment variable or if you are using the Astra CLI. - AstraDBAdmin defaultClient=new AstraDBAdmin(); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java deleted file mode 100644 index a0179c4c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateCollection.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.CollectionDefinition; -import io.stargate.sdk.data.domain.SimilarityMetric; -import io.stargate.sdk.data.exception.DataApiException; - -public class CreateCollection { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Create a non-vector collection - AstraCollection collection1 = db.createCollection("collection_simple"); - - // Create a vector collection - AstraCollection collection2 = db.createCollection( - "collection_vector1", - 14, - SimilarityMetric.cosine); - - // Create a vector collection with a builder - AstraCollection collection3 = db.createCollection(CollectionDefinition - .builder() - .name("collection_vector2") - .vector(1536, SimilarityMetric.euclidean) - .build()); - - // Collection names should use snake case ([a-zA-Z][a-zA-Z0-9_]*) - try { - db.createCollection("invalid.name"); - } catch(DataApiException e) { - // invalid.name is not valid - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java deleted file mode 100644 index 1499161a..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateDatabase.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import java.util.UUID; - -public class CreateDatabase { - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // Choose a cloud provider (GCP, AZURE, AWS) and a region - CloudProviderType cloudProvider = CloudProviderType.GCP; - String cloudRegion = "us-east1"; - - // Create a database - UUID newDbId = client.createDatabase("", cloudProvider, cloudRegion); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java deleted file mode 100644 index 400af787..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/CreateKeyspace.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; - -public class CreateKeyspace { - - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // Create a Keyspace - client.createKeyspace("", ""); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java deleted file mode 100644 index 811f3b0c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteCollection.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; - -public class DeleteCollection { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Delete an existing collection - db.deleteCollection("collection_vector2"); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java deleted file mode 100644 index d349aa20..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteDatabase.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; - -import java.util.UUID; - -public class DeleteDatabase { - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // Delete an existing database - client.dropDatabase(""); - - // Delete an existing database by ID - client.dropDatabase( - UUID.fromString("")); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java deleted file mode 100644 index 70042735..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteKeyspace.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; - -public class DeleteKeyspace { - - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // Create a Keyspace - client.deleteKeyspace("", ""); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java deleted file mode 100644 index 5af76709..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteMany.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import io.stargate.sdk.data.domain.query.DeleteQuery; -import io.stargate.sdk.data.domain.query.DeleteResult; - -import static io.stargate.sdk.http.domain.FilterOperator.EQUALS_TO; - -public class DeleteMany { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Build our query - DeleteQuery deleteQuery = DeleteQuery.builder() - .where("product_price", EQUALS_TO, 9.99) - .build(); - - // Deleting only up to 20 record - DeleteResult page = collection - .deleteManyPaged(deleteQuery); - - // Deleting all documents matching query - DeleteResult allDeleted = collection - .deleteMany(deleteQuery); - - // Deleting all documents matching query in distributed way - DeleteResult result = collection - .deleteManyChunked(deleteQuery, 5); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java deleted file mode 100644 index 8c5a0f72..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/DeleteOne.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import io.stargate.sdk.data.domain.query.DeleteQuery; -import io.stargate.sdk.data.domain.query.DeleteResult; - -public class DeleteOne { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Delete items from an existing collection with a query - DeleteResult deletedCount = collection - .deleteOne(DeleteQuery.deleteById("id1")); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java deleted file mode 100644 index 3cd0e5a3..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/Find.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Find { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Retrieve the first document with a product_price - Filter filter = new Filter() - .where("product_price") - .exists(); - collection.find( - SelectQuery.builder().filter(filter).build() - ).forEach(System.out::println); - - // Retrieve the first document where the product_price is 12.99 - Filter filter2 = new Filter() - .where("product_price") - .isEqualsTo(12.99); - collection - .find(SelectQuery.builder().filter(filter2).build()) - .forEach(System.out::println); - - // Only retrieve the product_name and product_price fields - collection.find( - SelectQuery.builder() - .select("product_name", "product_price") - .filter(filter2) - .build()) - .forEach(System.out::println); - - // Order the results by similarity - collection.find( - SelectQuery.builder() - .filter(filter2) - .orderByAnn(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .build()) - .forEach(System.out::println); - - // Order the results by a specific field - Filter filter3 = new Filter() - .where("product_name") - .isEqualsTo("HealthyFresh - Chicken raw dog food"); - collection.find( - SelectQuery.builder() - .filter(filter3) - .orderBy("product_price", 1) - .build()) - .forEach(System.out::println); - - // Complex query with AND and OR: - // (product_price == 9.99 OR product_name == "HealthyFresh - Beef raw dog food") - // AND (product_price == 12.99 OR product_name == "HealthyFresh - Beef raw dog food") - SelectQuery sq2 = new SelectQuery(); - sq2.setFilter(new HashMap<>()); - Map>> or1Criteria = new HashMap<>(); - or1Criteria.put("$or", new ArrayList>()); - or1Criteria.get("$or").add(Map.of("product_price", 9.99)); - or1Criteria.get("$or").add(Map.of("product_name", "HealthyFresh - Beef raw dog food")); - Map>> or2Criteria = new HashMap<>(); - or2Criteria.put("$or", new ArrayList>()); - or2Criteria.get("$or").add(Map.of("product_price", 12.99)); - or2Criteria.get("$or").add(Map.of("product_name", "HealthyFresh - Beef raw dog food")); - List>>> andCriteria = new ArrayList<>(); - andCriteria.add(or1Criteria); - andCriteria.add(or2Criteria); - sq2.getFilter().put("$and", andCriteria); - collection.find(sq2).forEach(System.out::println); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java deleted file mode 100644 index 8aba6179..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllCollections.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.CollectionDefinition; - -public class FindAllCollections { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Get Collection Names - db.findAllCollectionsNames().forEach(System.out::println); - - // Iterate over all collections and print each vector definition - db.findAllCollections().forEach(col -> { - System.out.print("\nname=" + col.getName()); - if (col.getOptions() != null && col.getOptions().getVector() != null) { - CollectionDefinition.Options.Vector vector = col.getOptions().getVector(); - System.out.print(", dim=" + vector.getDimension()); - System.out.print(", metric=" + vector.getMetric()); - } - }); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java deleted file mode 100644 index 70a00edc..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindAllDatabases.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.dtsx.astra.sdk.db.domain.Database; -import java.util.stream.Stream; - -public class FindAllDatabases { - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - boolean exists = client.isDatabaseExists(""); - - // List all available databases - Stream dbStream = client.listDatabases(); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java deleted file mode 100644 index 48dd7605..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindById.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import java.util.Optional; - -public class FindById { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.getCollection("collection_vector1"); - - // Fetch a document by ID and return it as JSON - Optional res = collection.findById("doc1"); - res.ifPresent(jsonResult -> System.out.println(jsonResult.getSimilarity())); - - // Fetch a document by ID and map it to an object with ResultMapper - Optional> res2 = collection.findById("doc1", record -> { - MyBean bean = new MyBean( - (String) record.getData().get("product_name"), - (Double) record.getData().get("product_price")); - return new DocumentResult<>(record, bean); - }); - - // Fetch a document by ID and map it to a class - Optional> res3 = collection.findById("doc1", MyBean.class); - - // Check if a document exists - boolean exists = collection.isDocumentExists("doc1"); - } - - public static class MyBean { - @JsonProperty("product_name") String name; - @JsonProperty("product_price") Double price; - public MyBean(String name, Double price) { - this.name = name; - this.price = price; - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java deleted file mode 100644 index d7b34dd0..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindByVector.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.DocumentResult; - -import java.util.Optional; - -public class FindByVector { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.getCollection("collection_vector1"); - - // Fetch a row by vector and return JSON - collection - .findOneByVector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .ifPresent(jsonResult -> System.out.println(jsonResult.getSimilarity())); - - // Fetch a row by ID and map it to an object with ResultMapper - Optional> res2 = collection - .findOneByVector( - new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, - record -> { - MyBean bean = new MyBean( - (String)record.getData().get("product_name"), - (Double)record.getData().get("product_price")); - return new DocumentResult<>(record, bean); - } - ); - - // Fetch a row by ID and map the result to a class - Optional> res3 = collection.findOneByVector( - new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}, - MyBean.class); - } - - public static class MyBean { - @JsonProperty("product_name") String name; - @JsonProperty("product_price") Double price; - public MyBean(String name, Double price) { - this.name = name; - this.price = price; - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java deleted file mode 100644 index e9d94235..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindCollection.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.CollectionDefinition; -import java.util.Optional; - -public class FindCollection { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Find a collection - Optional collection = db.findCollectionByName("collection_vector1"); - - // Check if a collection exists - boolean collectionExists = db.isCollectionExists("collection_vector2"); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java deleted file mode 100644 index e9822864..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindDatabase.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDBAdmin; -import com.dtsx.astra.sdk.db.domain.Database; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Stream; - -public class FindDatabase { - public static void main(String[] args) { - AstraDBAdmin client = new AstraDBAdmin("TOKEN"); - - // Check if a database exists - boolean exists = client.isDatabaseExists(""); - - // Find a database by name (names may not be unique) - Stream dbStream = client.getDatabaseInformations(""); - Optional dbByName = dbStream.findFirst(); - - // Find a database by ID - Optional dbById = client - .getDatabaseInformations(UUID.fromString("")); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java deleted file mode 100644 index 22886235..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindKeyspace.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; - -public class FindKeyspace { - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // List all keyspaces in the db - db.findAllKeyspaceNames().forEach(System.out::println); - - // validate is a keyspace exists - boolean ks = db.isKeyspaceExists("keyspace_name"); - - // Show Current keyspace name - String currentKs = db.getCurrentKeyspace(); - - // Switch keyspace if needed - db.changeKeyspace("keyspace_name"); - } -} - diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java deleted file mode 100644 index 5400ab45..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindMany.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; - -public class FindMany { - public static void main(String[] args) { - AstraDB db = new AstraDB("", ""); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - - - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java deleted file mode 100644 index 32523a5f..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindOne.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; - -import static io.stargate.sdk.http.domain.FilterOperator.EQUALS_TO; - -public class FindOne { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Retrieve the first document where product_price exists - Filter filter = new Filter() - .where("product_price") - .exists(); - collection.findOne(SelectQuery.builder() - .filter(filter).build()) - .ifPresent(System.out::println); - - // Retrieve the first document where product_price is 12.99 - Filter filter2 = new Filter() - .where("product_price") - .isEqualsTo(12.99); - collection.findOne(SelectQuery.builder() - .filter(filter2).build()) - .ifPresent(System.out::println); - - // Send the request as a JSON String - collection.findOne( - "{" + - "\"filter\":{" + - "\"product_price\":9.99," + - "\"product_name\":\"HealthyFresh - Chicken raw dog food\"}" + - "}") - .ifPresent(System.out::println); - - // Only retrieve the product_name and product_price fields - collection.findOne(SelectQuery.builder() - .select("product_name", "product_price") - .filter(filter2) - .build()) - .ifPresent(System.out::println); - - // Perform a similarity search - collection.findOne(SelectQuery.builder() - .filter(filter2) - .orderByAnn(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .build()); - - // Perform a complex query with AND and OR - SelectQuery sq2 = new SelectQuery(); - Filter yaFilter = new Filter() - .and() - .or() - .where("product_price", EQUALS_TO, 9.99) - .where("product_name", EQUALS_TO, "HealthyFresh - Beef raw dog food") - .end() - .or() - .where("product_price", EQUALS_TO, 9.99) - .where("product_name", EQUALS_TO, "HealthyFresh - Beef raw dog food") - .end(); - collection.findOne(sq2).ifPresent(System.out::println); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java deleted file mode 100644 index ae0a1689..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindPage.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.core.domain.Page; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; - -public class FindPage { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Retrieve page 1 of a search (up to 20 results) - Filter filter = new Filter() - .where("product_price") - .exists(); - Page page1 = collection.findPage( - SelectQuery.builder() - .filter(filter) - .build()); - - // Retrieve page 2 of the same search (if there are more than 20 results) - Filter filter2 = new Filter() - .where("product_price") - .isEqualsTo(12.99); - page1.getPageState().ifPresent(pageState -> { - Page page2 = collection.findPage( - SelectQuery.builder() - .filter(filter2) - .withPagingState(pageState) - .build()); - }); - - // You can map the output as Result using either a Java pojo or mapper - Page> page = collection.findPage( - SelectQuery.builder().filter(filter2).build(), - MyBean.class); - } - - public static class MyBean { - @JsonProperty("product_name") String name; - @JsonProperty("product_price") Double price; - - public MyBean(String name, Double price) { - this.name = name; - this.price = price; - } - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java deleted file mode 100644 index e1284d33..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/FindVector.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import java.util.stream.Stream; - -public class FindVector { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - float[] embeddings = new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - int maxRecord = 10; - - // Retrieve all document with product price based on the ann search - collection.findVector(SelectQuery.builder() - .filter(metadataFilter) - .orderByAnn(embeddings) - .withLimit(maxRecord) - .build()) - .forEach(System.out::println); - - // Same using another signature - Stream result = collection.findVector(embeddings, metadataFilter, maxRecord); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java deleted file mode 100644 index bbb578b0..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertMany.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import io.stargate.sdk.data.domain.JsonDocument; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class InsertMany { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1",14); - - // Insert documents into the collection (IDs are generated automatically) - List identifiers = collection.insertManyJsonDocuments(List.of( - new JsonDocument() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "Yet another product") - .put("product_price", 99.99), - new JsonDocument() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "product3") - .put("product_price", 99.99))); - - // Insert large collection of documents - List largeList = IntStream - .rangeClosed(1, 1000) - .mapToObj(id -> new JsonDocument() - .id(String.valueOf(id)) - .put("sampleKey", id)) - .collect(Collectors.toList()); - int chunkSize = 20; // In between 1 and 20 - int threadCount = 10; // How many chunks processed in parallel - List result = collection - .insertManyChunkedJsonDocuments(largeList, chunkSize, threadCount); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java deleted file mode 100644 index 99d981f5..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/InsertOne.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import io.stargate.sdk.data.domain.JsonDocument; -import java.util.Map; - -public class InsertOne { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Assumes a collection with a vector field of dimension 14 - AstraCollection collection = db.getCollection("collection_vector1"); - - // You must delete any existing rows with the same IDs as the - // rows you want to insert - collection.deleteAll(); - - // Insert rows defined by key/value - collection.insertOne( - new JsonDocument() - .id("doc1") // uuid is generated if not explicitely set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99)); - - // Insert rows defined as a JSON String - collection.insertOne( - new JsonDocument() - .data( - "{" + - "\"_id\": \"doc2\", " + - "\"$vector\": [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], " + - "\"product_name\": \"HealthyFresh - Chicken raw dog food\", " + - "\"product_price\": 9.99" + - "}")); - - // Insert rows defined as a Map Asynchronously - collection.insertOneASync( - new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food"))); - - // If you do not provide an ID, they are generated automatically - JsonDocumentMutationResult result = collection.insertOne( - new JsonDocument().put("demo", 1)); - String generatedId = result.getDocument().getId(); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java deleted file mode 100644 index c9b59cde..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingClearCollection.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; - -public class ObjectMappingClearCollection { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository collection1 = - db.createCollection("collection_simple", Product.class); - - // Delete all rows in a collection - collection1.deleteAll(); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java deleted file mode 100644 index 486ad099..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingCreateCollection.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.CollectionDefinition; -import io.stargate.sdk.data.domain.SimilarityMetric; - -public class ObjectMappingCreateCollection { - - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Create a non-vector collection - AstraDBRepository collection1 = - db.createCollection("collection_simple", Product.class); - - // Create a vector collection with a builder - AstraDBRepository collection2 = - db.createCollection( - CollectionDefinition.builder() - .name("collection_vector2") - .vector(1536, SimilarityMetric.euclidean) - .build(), - Product.class); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java deleted file mode 100644 index 0ccd4092..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteMany.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.query.DeleteQuery; -import io.stargate.sdk.data.domain.query.DeleteResult; - -import static io.stargate.sdk.http.domain.FilterOperator.EQUALS_TO; - -public class ObjectMappingDeleteMany { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Create a vector collection - AstraDBRepository collection1 = - db.createCollection("collection_simple", Product.class); - - // Delete rows based on a query - DeleteQuery q = DeleteQuery.builder() - .where("product_price", EQUALS_TO, 9.99) - .build(); - DeleteResult res = collection1.deleteAll(q); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java deleted file mode 100644 index f41336dc..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingDeleteOne.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.Document; - -public class ObjectMappingDeleteOne { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository collection1 = - db.createCollection("collection_simple", Product.class); - - // Delete a document by ID - collection1.deleteById("id1"); - - // Delete a specific document - collection1.delete(new Document().id("id2")); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java deleted file mode 100644 index 9671e84c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFind.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.SelectQuery; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ObjectMappingFind { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.createCollection("collection_vector1", 14); - - // Retrieve the first document with a product_price - Filter filter = new Filter() - .where("product_price") - .exists(); - collection.find( - SelectQuery.builder() - .filter(filter) - .build()) - .forEach(System.out::println); - - // Retrieve the first document where product_price is 12.99 - Filter filter2 = new Filter() - .where("product_price") - .isEqualsTo(12.99); - collection.find( - SelectQuery.builder() - .filter(filter2) - .build()) - .forEach(System.out::println); - - // Only retrieve the product_name and product_price fields - collection.find( - SelectQuery.builder() - .select("product_name", "product_price") - .filter(filter2) - .build()) - .forEach(System.out::println); - - // Order the results by similarity - collection.find( - SelectQuery.builder() - .filter(filter2) - .orderByAnn(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .build()) - .forEach(System.out::println); - - // Order the results by a specific field - collection.find( - SelectQuery.builder() - .filter(filter2) - .orderBy("product_price", 1) - .build()) - .forEach(System.out::println); - - // Complex query with AND and OR: - // (product_price == 9.99 OR product_name == "HealthyFresh - Beef raw dog food") - // AND (product_price == 12.99 OR product_name == "HealthyFresh - Beef raw dog food") - SelectQuery sq2 = new SelectQuery(); - sq2.setFilter(new HashMap<>()); - Map>> or1Criteria = new HashMap<>(); - or1Criteria.put("$or", new ArrayList>()); - or1Criteria.get("$or").add(Map.of("product_price", 9.99)); - or1Criteria.get("$or").add(Map.of("product_name", "HealthyFresh - Beef raw dog food")); - Map>> or2Criteria = new HashMap<>(); - or2Criteria.put("$or", new ArrayList>()); - or2Criteria.get("$or").add(Map.of("product_price", 12.99)); - or2Criteria.get("$or").add(Map.of("product_name", "HealthyFresh - Beef raw dog food")); - List>>> andCriteria = new ArrayList<>(); - andCriteria.add(or1Criteria); - andCriteria.add(or2Criteria); - sq2.getFilter().put("$and", andCriteria); - collection.find(sq2).forEach(System.out::println); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java deleted file mode 100644 index 338520a8..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindOne.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import java.util.Optional; - -public class ObjectMappingFindOne { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Retrieve a products from its id - Optional> res1 = productRepository.findById("id1"); - - // Retrieve a product from its vector - float[] vector = new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Optional> res2 = productRepository.findByVector(vector); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java deleted file mode 100644 index bd00976a..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingFindVector.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.DocumentResult; -import io.stargate.sdk.data.domain.query.Filter; - -import java.util.List; - -public class ObjectMappingFindVector { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Perform a semantic search - float[] embeddings = new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - int maxRecord = 10; - List> res = productRepository.findVector(embeddings, metadataFilter, maxRecord); - - // If you do not have max record or metadata filter, you can use the following - productRepository.findVector(embeddings, maxRecord); - productRepository.findVector(embeddings, metadataFilter); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java deleted file mode 100644 index bdeed6a2..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertMany.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.DocumentMutationResult; -import io.stargate.sdk.data.domain.odm.Document; -import java.util.List; - -public class ObjectMappingInsertMany { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - Product(String name, Double price) { - this.name = name; - this.price = price; - } - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Insert documents into the collection (IDs are generated automatically) - List> identifiers = productRepository.saveAll( - List.of( - new Document() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product1", 9.99)), - new Document() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product2", 12.99)))); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java deleted file mode 100644 index 8a5a170e..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingInsertOne.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.Document; - -public class ObjectMappingInsertOne { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - Product(String name, Double price) { - this.name = name; - this.price = price; - } - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Upsert document - productRepository.save(new Document() - .id("product1") - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product1", 9.99))); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java deleted file mode 100644 index 9562e41c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingPaging.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.core.domain.Page; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.odm.DocumentResult; - -public class ObjectMappingPaging { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - } - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Retrieve page 1 of a search (up to 20 results) - float[] embeddings = new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - Page> page1 = productRepository.findVector(embeddings, metadataFilter); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java deleted file mode 100644 index 1e2d2c9c..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateMany.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.DocumentMutationResult; -import io.stargate.sdk.data.domain.odm.Document; -import java.util.List; - -public class ObjectMappingUpdateMany { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - Product(String name, Double price) { - this.name = name; - this.price = price; - } - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Insert documents into the collection (IDs are generated automatically) - List> identifiers = productRepository.saveAll( - List.of( - new Document() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product1", 9.99)), - new Document() - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product2", 12.99)))); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java deleted file mode 100644 index 666413bd..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/ObjectMappingUpdateOne.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraDBRepository; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.stargate.sdk.data.domain.odm.Document; - -public class ObjectMappingUpdateOne { - static class Product { - @JsonProperty("product_name") private String name; - @JsonProperty("product_price") private Double price; - Product(String name, Double price) { - this.name = name; - this.price = price; - } - } - - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraDBRepository productRepository = - db.createCollection("collection_vector1", 14, Product.class); - - // Upsert a document - productRepository.save(new Document() - .id("product1") - .vector(new float[]{1f, 0f, 1f, 1f, .5f, 1f, 0f, 0.3f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(new Product("product1", 9.99))); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java deleted file mode 100644 index 03d99801..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStart.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraDB; -import com.datastax.astradb.client.AstraCollection; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentResult; - -import java.util.Map; -import java.util.stream.Stream; - -public class QuickStart { - public static void main(String[] args) { - - // Initialize the client - AstraDB myDb = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Create a collection - AstraCollection demoCollection = myDb.createCollection("demo",14); - - // Insert vectors - demoCollection.insertOne( - new JsonDocument() - .id("doc1") // generated if not set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99)); - demoCollection.insertOne( - new JsonDocument() - .id("doc2") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)); - demoCollection.insertOne( - new JsonDocument() - .id("doc3") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .data(Map.of("product_name", "HealthyFresh - Chicken raw dog food"))); - demoCollection.insertOne( - new JsonDocument() - .id("doc4") - .vector(new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)); - - // Perform a similarity search - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); - int maxRecord = 10; - long top = System.currentTimeMillis(); - Stream resultsSet = demoCollection.findVector(embeddings, metadataFilter, maxRecord); - System.out.println(System.currentTimeMillis() - top); - - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java deleted file mode 100644 index 1725fb45..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/QuickStartAA.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDBAdmin; -import com.datastax.astradb.client.AstraDB; -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentResult; -import io.stargate.sdk.data.domain.query.Filter; - -import java.util.List; -import java.util.stream.Stream; - -public class QuickStartAA { - - public static void main(String[] args) { - - // Organization level token as describe in pre-requisites - AstraDBAdmin astraDBAdmin = new AstraDBAdmin(""); - - // Create a Database if needed - astraDBAdmin.createDatabase("quickstart", CloudProviderType.GCP, "us-east-1"); - - // Accessing the database - AstraDB myDb = astraDBAdmin.getDatabase("quickstart"); - - // Create a collection - AstraCollection demoCollection = myDb.createCollection("demo",14); - - // Insertions - demoCollection.insertManyJsonDocuments(List.of( - new JsonDocument() - .id("doc1") // generated if not set - .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99), - new JsonDocument() - .id("doc2") - .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) - .put("product_name", "HealthyFresh - Chicken raw dog food") - .put("product_price", 9.99)) - ); - - // Search - float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; - Filter metadataFilter = new Filter() - .where("product_price").isEqualsTo(9.99); - int maxRecord = 10; - Stream resultsSet = demoCollection. - findVector(embeddings, metadataFilter, maxRecord); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java deleted file mode 100644 index 6cd30107..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateMany.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.query.Filter; -import io.stargate.sdk.data.domain.query.UpdateQuery; -import io.stargate.sdk.http.domain.FilterOperator; - -public class UpdateMany { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.getCollection("collection_vector1"); - - // Update multiple documents based on a query - collection.updateMany(UpdateQuery.builder() - .updateSet("product_name", 12.99) - .filter(new Filter("product_name", FilterOperator.EQUALS_TO, "HealthyFresh - Beef raw dog food")) - .build()); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java deleted file mode 100644 index ccf139df..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpdateOne.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.query.UpdateQuery; - -import static io.stargate.sdk.http.domain.FilterOperator.EQUALS_TO; - -public class UpdateOne { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - AstraCollection collection = db.getCollection("collection_vector1"); - - // You must delete any existing rows with the same IDs as the - // rows you want to insert - collection.deleteAll(); - - // Upsert a document based on a query - collection.updateOne(UpdateQuery.builder() - .updateSet("product_name", 12.99) - .where("product_name", EQUALS_TO, "HealthyFresh - Beef raw dog food") - .build()); - - // Upsert a document by ID - collection.upsertOne(new JsonDocument() - .id("id1") - .put("product_name", 12.99)); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java b/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java deleted file mode 100644 index 44f5dbc9..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/documentation/UpsertOne.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.datastax.astradb.client.documentation; - -import com.datastax.astradb.client.AstraCollection; -import com.datastax.astradb.client.AstraDB; -import io.stargate.sdk.data.domain.JsonDocument; -import io.stargate.sdk.data.domain.JsonDocumentMutationResult; -import org.junit.jupiter.api.Assertions; - -import static io.stargate.sdk.data.domain.DocumentMutationStatus.CREATED; -import static io.stargate.sdk.data.domain.DocumentMutationStatus.UNCHANGED; -import static io.stargate.sdk.data.domain.DocumentMutationStatus.UPDATED; - -public class UpsertOne { - public static void main(String[] args) { - AstraDB db = new AstraDB("TOKEN", "API_ENDPOINT"); - - // Assumes a collection with a vector field of dimension 14 - AstraCollection collection = db.getCollection("collection_vector1"); - - // Insert rows defined by key/value - JsonDocument doc1 = new JsonDocument() - .id("doc1") // uuid is generated if not explicitely set - .put("product_name", "HealthyFresh - Beef raw dog food") - .put("product_price", 12.99); - - // Create the document - JsonDocumentMutationResult res1 = collection.upsertOne(doc1); - Assertions.assertEquals(CREATED, res1.getStatus()); - - // Nothing happened - JsonDocumentMutationResult res2 = collection.upsertOne(doc1); - Assertions.assertEquals(UNCHANGED, res1.getStatus()); - - // Document is updated (async) - doc1.put("new_property", "value"); - collection.upsertOneASync(doc1).thenAccept(res -> - Assertions.assertEquals(UPDATED, res.getStatus())); - } -} diff --git a/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java b/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java deleted file mode 100644 index 40794a50..00000000 --- a/astra-db-client/src/test/java/com/datastax/astradb/client/v2/AstraDataApiV2Test.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.datastax.astradb.client.v2; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.stream.Collectors; - -public class AstraDataApiV2Test { - - @Test - public void testData() throws IOException { - try(AstraDB db = new AstraDB( - "https://4391daae-016c-49e3-8d0a-b4633a86082c-us-east1.apps.astra.datastax.com", - "AstraCS:iLPiNPxSSIdefoRdkTWCfWXt:2b360d096e0e6cb732371925ffcc6485541ff78067759a2a1130390e231c2c7a") { - - } - System.out.println(db.listNamespaceNames().collect(Collectors.toList())); - } -} diff --git a/astra-db-client/src/test/resources/documentation.asciidoc b/astra-db-client/src/test/resources/documentation.asciidoc deleted file mode 100644 index 1499be63..00000000 --- a/astra-db-client/src/test/resources/documentation.asciidoc +++ /dev/null @@ -1,1433 +0,0 @@ -= Java client reference -:navtitle: Java reference -:page-toclevels: 3 - -Astra SDK Java is the official Java client for {product}. -See common usages below, or check out the https://github.com/datastax/astra-sdk-java[GitHub repo]. - -[.ds-feature-buttons] -xref:astra-api-docs:ROOT:attachment$java-client/com/dtsx/astra/sdk/package-summary.html[API reference,role="ds-button ds-button\--color-primary ds-button\--variant-solid"] - -== Prerequisites - -The code samples on this page assume the following: - -* You have an active https://astra.datastax.com/signup[Astra account^]. -* You have created an xref:administration:manage-application-tokens.adoc[application token] with the Database Administrator role. -* You have installed Java 11+. - -== Databases - -Use the `AstraDBAdmin` and `AstraDB` classes to work with databases. - -=== Connect to Astra - -Connect to Astra by initializing the `AstraDBAdmin` class. - -[source,java] ----- -AstraDBAdmin(); -AstraDBAdmin(String token); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `token` -| `String` -| The authentication token used to access AstraDB. This is optional if the `ASTRA_DB_APPLICATION_TOKEN` environment variable is set or the Astra CLI is used. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ConnectingAdmin.java[] ----- - -=== Connect to a database - -Connect to a database by initializing the `AstraDB` class. - -[source,java] ----- -AstraDB(String token, String apiEndpoint); -AstraDB(String token, String apiEndpoint, String keyspace); -AstraDB(String token, UUID databaseId); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `token` -| `String` -| The authentication token used to access AstraDB. - -| `apiEndpoint` -| `String` -| The API endpoint for the AstraDB instance. - -| `keyspace` -| `String` -| The keyspace to use, if not provided default is `default_keyspace` - -| `databaseId` -| `UUID` -| The database identifier. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Connecting.java[] ----- - -=== Create a database - -Create a database with the `AstraDBAdmin.createDatabase` method. - -[source,java] ----- -UUID createDatabase(String name); -UUID createDatabase(String name, CloudProviderType cloud, String cloudRegion); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the database to create. - -| `cloud` -| `CloudProviderType` -| The cloud provider where the database will be created. - -| `cloudRegion` -| `String` -| The region of the cloud provider where the database will be created. -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `UUID` -| The unique identifier of the created database. - -|=== - -NOTE: The service is blocking until the database is created and status is `ACTIVE`. - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateDatabase.java[] ----- - -=== Find a single database - -Find one database by ID or name, using the `AstraDBAdmin.findDatabaseById` and `AstraDBAdmin.findDatabaseByName` methods, respectively. - -[source,java] ----- -Optional findDatabaseById(UUID id); -Stream findDatabaseByName(String name); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `id` -| `UUID` -| The unique identifier of the database to find. - -| `name` -| `String` -| The name of the database to find. -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `Optional` -| Database information wrapped in an Optional object. UUID ensures the unicity of the database: you get one database or nothing. - -| `Stream` -| Database information list exposed as a Stream. Several databases can have the same name. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindDatabase.java[] ----- - -=== Find all databases - -Find all databases with the `AstraDBAdmin.findAllDatabases` method. - -[source,java] ----- -Stream findAllDatabases(); ----- - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `Stream` -| Database information list exposed as a Stream. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllDatabases.java[] ----- - -=== Delete a database - -Delete a database with the `AstraDBAdmin.deleteDatabase` method. - -[source,java] ----- -boolean deleteDatabase(String name); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the database to delete. -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `boolean` -| Flag indicating if the database was deleted. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteDatabase.java[] ----- - -== Collections - -Use the `AstraDB` and `AstraDBCollection` classes to work with collections. - -=== Create a collection - -Create a collection with the `AstraDB.createCollection` method. - -[source,java] ----- -AstraDBCollection createCollection(String name); -AstraDBCollection createCollection(String name, int vectorDimension); -AstraDBCollection createCollection(String name, int vectorDimension, SimilarityMetric metric); -AstraDBCollection createCollection(CollectionDefinition def); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the collection to create. - -| `vectorDimension` -| `int` -| The dimension for the vector in the collection. - -| `metric` -| `SimilarityMetric` -| The similarity metric to use for the vectors in the collection. - -| `def` -| `CollectionDefinition` -| The definition of the collection to create. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/CreateCollection.java[] ----- - -=== Find a single collection - -Find one collection with the `AstraDB.findCollection` method. - -[source,java] ----- -Optional findCollection(String name); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the collection to find. -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `Optional` -| Collection information wrapped in an Optional object. Collection name ensures unicity: you get one collection or nothing. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindCollection.java[] ----- - -=== Find all collections - -Find all collections with the `AstraDB.findAllCollections` method. - -[source,java] ----- -Stream findAllCollections(); ----- - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `Stream` -| Collections information list exposed as a Stream. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindAllCollections.java[] ----- - -=== Delete all documents in a collection - -Delete all documents in a collection with the `AstraDBCollection.deleteAll` method. - -[source,java] ----- -int deleteAll(); ----- - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `int` -| Number of deleted documents. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ClearCollection.java[] ----- - -=== Delete a collection - -Delete a collection with the `AstraDB.deleteCollection` method. - -[source,java] ----- -void deleteCollection(String name); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the store to delete. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteCollection.java[] ----- - -== Documents - -Use the `AstraDBCollection` class to work with documents. - -=== Insert a document - -Insert one document with the `AstraDBCollection.insertOne` method. -The system generates IDs automatically as needed. Each method is available in synchronous and asynchronous mode. - -[source,java] ----- -JsonDocumentMutationResult insertOne(String json); -CompletableFuture insertOneASync(String json); - -JsonDocumentMutationResult insertOne(JsonDocument jsonDocument); -CompletableFuture insertOneASync(JsonDocument jsonDocument); - -DocumentMutationResult insertOne(Document bean); -CompletableFuture> insertOneASync(Document bean); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `json` -| `String` -| The Json String representing the document to insert. - -| `bean` -| `Document` -| The bean representing the document to insert. - -| `jsonDocument` -| `JsonDocument` -| The JSON document to insert. -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `JsonDocumentMutationResult` -| An object containing the document amended with a generated id and a status `DocumentMutationStatus` which can take the values `CREATED`, `UPDATED`,`UNCHANGED`,`NOT_PROCESSED` or `ALREADY_EXISTS`. - -| `DocumentMutationResult` -| An object containing the document amended with a generated id and a status `DocumentMutationStatus` which can take the values `CREATED`, `UPDATED`,`UNCHANGED`,`NOT_PROCESSED` or `ALREADY_EXISTS`. - -|=== - -NOTE: You cannot insert a document with an existing ID, the exception `DataApiDocumentAlreadyExistException` is raised. To update a document if it already exists use the method `upsert`. - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertOne.java[] ----- - -=== Upsert a document - -Upsert one document with the `AstraDBCollection.upsertOne` method. - -- If the document does not exist it will be created -- If the document exists it will be updated. - -[source,java] ----- -JsonDocumentMutationResult - upsertOne(String json); -CompletableFuture - upsertOneAsync(String json); - -JsonDocumentMutationResult - upsertOne(JsonDocument jsonDocument); -CompletableFuture - upsertOneAsync(JsonDocument jsonDocument); - -DocumentMutationResult - upsertOne(Document bean); -CompletableFuture> - upsertOneAsync(Document bean); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `json` -| `String` -| The Json String representing the document to insert. - -| `jsonDocument` -| `JsonDocument` -| The JSON document to insert. - -| `bean` -| `Document` -| The bean representing the document to insert. - -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `JsonDocumentMutationResult` -| Key-Value Object containing the `JsonDocument` amended with a generated id and a status `DocumentMutationStatus`. - -| `DocumentMutationResult` -| An object containing the `Document` amended with a generated id and a status `DocumentMutationStatus`. - -|=== - -=== Insert many documents - -Insert many documents with the `AstraDBCollection.insertMany` method. -The system generates IDs automatically as needed. - -[source,java] ----- -List - insertMany(String json); -CompletableFuture> - insertManyASync(String json); - -List - insertManyJsonDocuments(List jsonDocuments); -CompletableFuture> - insertManyJsonDocumentsASync(List jsonDocuments); - -List> - insertMany(List documents); -CompletableFuture>> - insertManyASync(List> documents); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `json` -| `String` -| The Json String representing the document to insert. - -| `jsonDocument` -| `JsonDocument` -| The JSON document to insert. - -| `bean` -| `Document` -| The bean representing the document to insert. - -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `JsonDocumentMutationResult` -| Key-Value Object containing the `JsonDocument` amended with a generated id and a status `DocumentMutationStatus`. - -| `DocumentMutationResult` -| An object containing the `Document` amended with a generated id and a status `DocumentMutationStatus`. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/InsertMany.java[] ----- - -NOTE: The insertMany methods are limited to a maximum number of 20 documents in the list. If you need to insert more documents, use the `insertManyChunked*` method. - - -=== Insert many documents in chunks - -Insert many documents with the `AstraDBCollection.insertManyChunked` method. -The system generates IDs automatically as needed. The input list is split into chunks of `X` documents (chunk Size, default is 20). The processing of the different chunks can be parallelized to improve the performance. - -NOTE: Each method is presented in synchronous and asynchronous mode. The asynchronous mode returns a `CompletableFuture` object. - -[source,java] ----- -// Working with Key_value (JsonDocument) -List - insertManyChunkedJsonDocuments(List jsonDocuments); -CompletableFuture> - insertManyChunkedJsonDocumentsASync(List jsonDocuments); -List - insertManyJsonDocuments(List documents, boolean ordered, boolean upsert); - -// Working with Pojo (Document) -List> - insertManyChunked(List> beans); -CompletableFuture>> - insertManyChunkedASync(List> beans); -List> - insertManyChunked(List> beans, int chunkSize, int concurrency); -CompletableFuture>> - insertManyChunkedASync(List> beans, int chunkSize, int concurrency); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `jsonDocuments` -| `List` -| The list of `JsonDocument` (key/value) to insert. - -| `ordered` -| `boolean` -| Enforce the processing of the documents in the order of the list. If an error occurs, the processing is stopped. Default is `false` - -| `concurrency` -| `int` -| Set the number of parallel threads to process the chunks. Default is `1` - -| `bean` -| `Document` -| The list of `Documents` to insert. - -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `JsonDocumentMutationResult` -| Key-Value Object containing the `JsonDocument` amended with a generated id and a status `DocumentMutationStatus`. - -| `DocumentMutationResult` -| An object containing the `Document` amended with a generated id and a status `DocumentMutationStatus`. - -|=== - -=== Find a single document by query - -Find one document by query, using the `AstraDBCollection.find` method. - -[source,java] ----- -Stream find(SelectQuery query); -Stream> find(SelectQuery query, Class bean); -Stream> find(SelectQuery query, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `query` -| `SelectQuery` -| The filter used to search records. - -| `bean` -| `Class` -| The class for the target POJO. This is used for object mapping of the results. - -| `mapper` -| `ResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/Find.java[] ----- - -Find one document by query, using the `AstraDBCollection.findOne` method. - -[source,java] ----- -Optional findOne(String rawJsonQuery); -Optional findOne(SelectQuery query); -Optional> findOne(SelectQuery query, Class bean); -Optional> findOne(String query, Class bean); -Optional> findOne(SelectQuery query, DocumentResultMapper mapper); -Optional> findOne(String query, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `rawJsonQuery` -| `String` -| The raw JSON query string used to find a document. - -| `query` -| `SelectQuery` -| The query object used to find a document. - -| `bean` -| `Class` -| The class for the target POJO for object mapping. - -| `mapper` -| `DocumentResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindOne.java[] ----- - -=== Find a single document by ID - -Find one document by ID with the `AstraDBCollection.findById` method. - -[source,java] ----- -Optional findById(String id); -Optional> findById(String id, Class bean); -Optional> findById(String id, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `id` -| `String` -| The identifier of the document to find. - -| `bean` -| `Class` -| The class for the target POJO for object mapping. - -| `mapper` -| `ResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindById.java[] ----- - -=== Find a single document by vector - -Find one document by vector with the `AstraDBCollection.findOneByVector` method. - -[source,java] ----- -Optional findOneByVector(float[] vector); -Optional> findOneByVector(float[] vector, Class bean); -Optional> findOneByVector(float[] vector, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `vector` -| `float[]` -| The vector of the document to find. - -| `bean` -| `Class` -| The class for the target POJO for object mapping. - -| `mapper` -| `ResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindByVector.java[] ----- - -=== Perform a similarity search - -Perform a similarity search with the `AstraDBCollection.findVector` method. -This method returns documents with vectors that are close to a given vector. - -[source,java] ----- -Stream findVector(SelectQuery query); -Stream> findVector(SelectQuery query, Class bean); -Stream> findVector(SelectQuery query, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `query` -| `SelectQuery` -| The query object used to search records. - -| `bean` -| `Class` -| The class for the target POJO for object mapping. - -| `mapper` -| `ResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindVector.java[] ----- - -=== Paginate the results from a search - -Get a page of search results with the `AstraDBCollection.findPage` method. - -[source,java] ----- -Page findPage(SelectQuery pagedQuery); -Page findPage(String pagedQuery); -Page> findPage(SelectQuery query, Class bean); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `pagedQuery` -| `SelectQuery` or `String` -| The paged query object or string used to find documents. - -| `query` -| `SelectQuery` -| The query object used for finding documents in pages. - -| `bean` -| `Class` -| The class for the target POJO for object mapping. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/FindPage.java[] ----- - -=== Update a document - -Update one document with the `AstraDBCollection.updateOne` method. - -[source,java] ----- -UpdateStatus updateOne(UpdateQuery query); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `query` -| `UpdateQuery` -| The query object used to find and update a single record. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateOne.java[] ----- - -=== Update many documents - -Update many documents with the `AstraDBCollection.updateMany` method. - -[source,java] ----- -UpdateStatus updateMany(UpdateQuery query); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `query` -| `UpdateQuery` -| The query object used to find and update multiple records. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/UpdateMany.java[] ----- - -=== Delete a document - -Delete one document with the `AstraDBCollection.deleteOne` method. - -[source,java] ----- -int deleteOne(DeleteQuery deleteQuery); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `deleteQuery` -| `DeleteQuery` -| The delete query object used to remove a single record. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteOne.java[] ----- - -=== Delete many documents - -Delete many documents with the `AstraDBCollection.deleteMany` method. - -[source,java] ----- -int deleteMany(DeleteQuery deleteQuery); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `deleteQuery` -| `DeleteQuery` -| The delete query object used to remove multiple records. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/DeleteMany.java[] ----- - -== Object mapping - -An alternative way to work with databases is to use the `AstraDB` and `AstraDBRepository` classes to map documents to objects. - -=== Create a collection - -Create a collection with the `AstraDB.createCollection` method. - -[source,java] ----- -AstraDBRepository createCollection(String name, Class bean); -AstraDBRepository createCollection(String name, int vectorDimension, Class bean); -AstraDBRepository createCollection(CollectionDefinition def, Class bean); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `name` -| `String` -| The name of the store to create. - -| `vectorDimension` -| `int` -| The dimension for the vector in the collection. - -| `def` -| `CollectionDefinition` -| The definition of the collection to create. - -| `bean` -| `Class` -| The class type of the document used in the collection. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingCreateCollection.java[] ----- - -=== Upsert a document - -Upsert one document with the `AstraDBRepository.save` method. -The system generates IDs automatically as needed. - -[source,java] ----- -DocumentMutationResult insert(Document current); -CompletableFuture> insertASync(Document current); - -DocumentMutationResult save(Document current); -CompletableFuture> saveASync(Document current); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `current` -| `Document` -| The object representing the document to save. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertOne.java[] ----- - -=== Upsert Many documents - -Upsert many documents with the `AstraDBCollection.upsertManyChunked` method. -The system generates IDs automatically as needed. The input list is split into chunks of `X` documents (chunk Size, default is 20). The processing of the different chunks can be parallelized to improve the performance. - -NOTE: Each method is presented in synchronous and asynchronous mode. The asynchronous mode returns a `CompletableFuture` object. - -[source,java] ----- -// Upsert less than 20 -List> - upsertMany(List> beans); -CompletableFuture>> - upsertManyASync(List> beans); - -// Upsert in chunks -List> - upsertManyChunked(List> documents, int chunkSize, int concurrency) ; -CompletableFuture>> - upsertManyChunkedASync(List> documents, int chunkSize, int concurrency); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `chunkSize` -| `int` -| The size of the chunk. Default is `20` - -| `concurrency` -| `int` -| The number of parallel threads to process the chunks. Default is `1` - -| `beans` -| `List>` -| The list of `Documents` to insert. - -|=== - -Returned Values: - -[cols="1,4", options="header"] -|=== -| Type | Description - -| `JsonDocumentMutationResult` -| Key-Value Object containing the `JsonDocument` amended with a generated id and a status `DocumentMutationStatus`. - -| `DocumentMutationResult` -| An object containing the `Document` amended with a generated id and a status `DocumentMutationStatus`. - -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingInsertMany.java[] ----- - -=== Find a single document by query - -Find one document by query, using the `AstraDBCollection.find` method. - -[source,java] ----- -Stream find(SelectQuery query); -Stream> find(SelectQuery query, Class bean); -Stream> find(SelectQuery query, DocumentResultMapper mapper); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `query` -| `SelectQuery` -| The filter used to search records. - -| `bean` -| `Class` -| The class for the target POJO. This is used for object mapping of the results. - -| `mapper` -| `ResultMapper` -| The mapper to convert JSON into the expected POJO. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFind.java[] ----- - -=== Find a single document by ID or vector - -Find one document by ID or vector, using the `AstraDBRepository.findById` or `AstraDBRepository.findByVector` methods, respectively. - -[source,java] ----- -Optional> findById(String id); -Optional> findByVector(float[] vector); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `id` -| `String` -| The identifier of the document to find. - -| `vector` -| `float[]` -| The vector associated with the document to find. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindOne.java[] ----- - -=== Perform a similarity search - -Perform a similarity search with the `AstraDBRepository.findVector` method. -This method returns documents with vectors that are close to a given vector. - -[source,java] ----- -Page> findVector(float[] vector, Filter metadataFilter); -List> findVector(float[] vector, Integer limit); -List> findVector(float[] vector, Filter metadataFilter, Integer limit); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `vector` -| `float[]` -| The vector for similarity search. - -| `metadataFilter` -| `Filter` -| The metadata filter for refining the search. - -| `limit` -| `Integer` -| The limit for the number of results to return. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingFindVector.java[] ----- - -=== Paginate the results from a search - -Get a page of search results with the `AstraDBRepository.findVector` method. - -[source,java] ----- -Page> findVector(float[] vector, Filter metadataFilter); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `vector` -| `float[]` -| The vector for the similarity search - -| `metadataFilter` -| `Filter` -| The filter to apply to the search results -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingPaging.java[] ----- - -=== Update a document - -Update one document with the `AstraDBRepository.save` method. - -[source,java] ----- -DocumentMutationResult save(Document current); -CompletableFuture> saveASync(Document current); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `current` -| `Document` -| The object representing the document to save. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateOne.java[] ----- - -=== Update many documents - -Update many documents with the `AstraDBRepository.saveAll` method. - -[source,java] ----- -List> saveAll(List> documentList); -CompletableFuture>> saveAllASync(List> documentList); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `documentList` -| `List>` -| The list of documents to save. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingUpdateMany.java[] ----- - -=== Delete a document - -Delete one document with the `AstraDBRepository.delete` method. - -[source,java] ----- -boolean delete(Document document); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `document` -| `Document` -| The document to delete. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteOne.java[] ----- - -=== Delete many documents - -Delete many documents with the `AstraDBRepository.deleteAll` method. - -[source,java] ----- -int deleteAll(); -int deleteAll(List> documents); -int deleteAll(DeleteQuery deleteQuery); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `documents` -| `List>` -| The list of documents to delete. - -| `deleteQuery` -| `DeleteQuery` -| The delete query object used to remove multiple records. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingDeleteMany.java[] ----- - -=== Delete all documents in a collection - -Delete all documents in a collection with the `AstraDBRepository.deleteAll` method. - -[source,java] ----- -int deleteAll(); -int deleteAll(List> documents); -int deleteAll(DeleteQuery deleteQuery); ----- - -Parameters: - -[cols="1,1,3", options="header"] -|=== -| Name | Type | Description - -| `documents` -| `List>` -| The list of documents to delete. - -| `deleteQuery` -| `DeleteQuery` -| The delete query object used to remove multiple records. -|=== - -Example: - -[source,java] ----- -include::https://raw.githubusercontent.com/datastax/astra-sdk-java/main/astra-db-client/src/test/java/com/dtsx/astra/sdk/documentation/ObjectMappingClearCollection.java[] ----- \ No newline at end of file diff --git a/astra-db-client/src/test/resources/johnny.pdf b/astra-db-client/src/test/resources/johnny.pdf deleted file mode 100644 index d139c37233f94d7363e59b0d2173db55bef4fe01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66591 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 com.datastax.stargate - stargate-dataapi-client + stargate-sdk-java ${stargate-sdk.version} @@ -228,7 +229,11 @@ org.junit.jupiter junit-jupiter-engine ${junit-jupiter.version} - test + + + org.assertj + assertj-core + ${assertj.version} From fd06512b2f4448314a4133508e5c9d612e0b184f Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Wed, 13 Mar 2024 01:49:43 +0100 Subject: [PATCH 3/3] mapping --- .../com/datastax/astra/db/AstraDBClient.java | 77 ++++---------- .../datastax/astra/db/AstraDBCollection.java | 7 +- .../datastax/astra/db/AstraDBDatabase.java | 78 ++++++++++---- .../datastax/astra/db/AstraDBEndpoint.java | 10 -- .../com/datastax/astra/db/AstraDBOptions.java | 100 ++++++++++++++++-- .../astra/documentation/QuickStart.java | 57 ++++++++++ .../documentation/client/CreateDatabase.java | 19 ++++ .../documentation/client/DropDatabase.java | 17 +++ .../documentation/client/FindDatabase.java | 25 +++++ .../client/InitAstraDBClient.java | 23 ++++ .../collection/ClearCollection.java | 18 ++++ .../documentation/db/CreateCollection.java | 39 +++++++ .../documentation/db/CreateNamespace.java | 13 +++ .../documentation/db/DropCollection.java | 12 +++ .../astra/documentation/db/DropNamespace.java | 14 +++ .../{ => db}/FindCollection.java | 6 +- .../documentation/db/InitAstraDBDatabase.java | 26 +++++ .../integration/AstraCollectionITTest.java | 15 +++ .../astra/sdk/config/AstraClientConfig.java | 2 +- 19 files changed, 450 insertions(+), 108 deletions(-) create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/QuickStart.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/client/CreateDatabase.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/client/DropDatabase.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/client/FindDatabase.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/client/InitAstraDBClient.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/collection/ClearCollection.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateCollection.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateNamespace.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropCollection.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropNamespace.java rename astra-db-client/src/test/java/com/datastax/astra/documentation/{ => db}/FindCollection.java (73%) create mode 100644 astra-db-client/src/test/java/com/datastax/astra/documentation/db/InitAstraDBDatabase.java create mode 100644 astra-db-client/src/test/java/com/datastax/astra/integration/AstraCollectionITTest.java diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java index f55d648b..295a1d1e 100644 --- a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBClient.java @@ -53,6 +53,9 @@ public class AstraDBClient { /** Default keyspace (same created by the ui). */ public static final String DEFAULT_KEYSPACE = "default_keyspace"; + /** Default options. */ + public static final AstraDBOptions DEFAULT_OPTIONS = AstraDBOptions.builder().build(); + /** Client for Astra Devops Api. */ final AstraDBDevopsClient devopsDbClient; @@ -98,7 +101,19 @@ public AstraDBClient() { * authentication token */ public AstraDBClient(String token) { - this(token, AstraEnvironment.PROD, new AstraDBOptions()); + this(token, DEFAULT_OPTIONS); + } + + /** + * Constructor with an authentification token, defaulting to production environment, and default http options. + * + * @param token + * authentication token + * @param astraDbOptions + * options for AstraDb. + */ + public AstraDBClient(String token, AstraDBOptions astraDbOptions) { + this(token, astraDbOptions, AstraEnvironment.PROD); } /** @@ -111,7 +126,7 @@ public AstraDBClient(String token) { * @param astraDbOptions * options for AstraDb. */ - public AstraDBClient(String token, AstraEnvironment env, AstraDBOptions astraDbOptions) { + public AstraDBClient(String token, AstraDBOptions astraDbOptions, AstraEnvironment env) { this.env = env; this.token = token; this.devopsDbClient = new AstraDBDevopsClient(token, env); @@ -119,63 +134,11 @@ public AstraDBClient(String token, AstraEnvironment env, AstraDBOptions astraDbO // Local Agent for Resume HttpClient.Builder httpClientBuilder = HttpClient.newBuilder(); - httpClientBuilder.version(astraDbOptions.getHttpClientOptions().getHttpVersion()); - httpClientBuilder.connectTimeout(Duration.ofSeconds(astraDbOptions.getHttpClientOptions().getConnectionRequestTimeoutInSeconds())); + httpClientBuilder.version(astraDbOptions.asHttpClientOptions().getHttpVersion()); + httpClientBuilder.connectTimeout(Duration.ofSeconds(astraDbOptions.asHttpClientOptions().getConnectionRequestTimeoutInSeconds())); this.httpClient = httpClientBuilder.build(); } - // ------------------------------- - // -- Working with Namespaces --- - // ------------------------------- - - /** - * Create a keyspace. - * - * @param databaseName - * database name - * @param keyspaceName - * keyspace name - */ - public void createKeyspace(String databaseName, String keyspaceName) { - devopsDbClient.databaseByName(databaseName).keyspaces().create(keyspaceName); - } - - /** - * Create a keyspace. - * - * @param databaseId - * database unique identifier - * @param keyspaceName - * keyspace name - */ - public void createKeyspace(UUID databaseId, String keyspaceName) { - devopsDbClient.database(databaseId.toString()).keyspaces().create(keyspaceName); - } - - /** - * Delete a keyspace. - * - * @param databaseName - * database name - * @param keyspaceName - * keyspace name - */ - public void deleteKeyspace(String databaseName, String keyspaceName) { - devopsDbClient.databaseByName(databaseName).keyspaces().delete(keyspaceName); - } - - /** - * Delete a keyspace. - * - * @param databaseId - * database unique identifier - * @param keyspaceName - * keyspace name - */ - public void deleteKeyspace(UUID databaseId, String keyspaceName) { - devopsDbClient.database(databaseId.toString()).keyspaces().delete(keyspaceName); - } - // -------------------- // -- Databases --- // -------------------- @@ -316,7 +279,7 @@ public Stream getDatabaseInformations(String name) { * @return * if the database exists */ - public boolean isDatabaseExists(String name) { + public boolean databaseExists(String name) { return getDatabaseInformations(name).findFirst().isPresent(); } diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java index e6b878f8..0325b5b5 100644 --- a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBCollection.java @@ -11,17 +11,16 @@ public class AstraDBCollection extends DataApiCollectionImpl { /** - * Constructor for a collection. + * Full constructor. * * @param db - * database in use + * client namespace http * @param collectionName * collection identifier * @param clazz - * document class to use + * working pojo with this collection. */ protected AstraDBCollection(AstraDBDatabase db, String collectionName, Class clazz) { super(db, collectionName, clazz); } - } diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java index 6697daa2..07bd5792 100644 --- a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBDatabase.java @@ -3,12 +3,12 @@ import com.datastax.astra.devops.db.AstraDBDevopsClient; import io.stargate.sdk.data.client.DataApiClient; import io.stargate.sdk.data.client.DataApiClients; -import io.stargate.sdk.data.client.DataApiCollection; import io.stargate.sdk.data.client.DataApiNamespace; -import io.stargate.sdk.data.client.model.CreateCollectionOptions; -import io.stargate.sdk.data.client.model.CreateNamespaceOptions; +import io.stargate.sdk.data.client.model.Document; +import io.stargate.sdk.data.client.model.collections.CreateCollectionOptions; +import io.stargate.sdk.data.client.model.namespaces.CreateNamespaceOptions; import io.stargate.sdk.data.internal.model.ApiResponse; -import io.stargate.sdk.data.internal.model.CollectionInformation; +import io.stargate.sdk.data.internal.model.CollectionDefinition; import io.stargate.sdk.data.internal.model.NamespaceInformation; import io.stargate.sdk.http.LoadBalancedHttpClient; import io.stargate.sdk.http.ServiceHttp; @@ -83,7 +83,7 @@ public AstraDBDatabase(String apiEndpoint, String token) { * keyspace */ public AstraDBDatabase(String apiEndpoint, String token, String keyspace) { - this(apiEndpoint, token, keyspace, new AstraDBOptions()); + this(apiEndpoint, token, keyspace, AstraDBClient.DEFAULT_OPTIONS); } /** @@ -136,10 +136,9 @@ public AstraDBDatabase(AstraDBEndpoint apiEndpoint, String token, String namespa this.astraDbEndpoint = apiEndpoint; this.astraDbOptions = astraDbOptions; this.namespaceName = namespaceName; - this.dataApiClient = DataApiClients.create(astraDbEndpoint.getApiEndPoint(), token, astraDbOptions.getHttpClientOptions()); + this.dataApiClient = DataApiClients.create(astraDbEndpoint.getApiEndPoint(), token, astraDbOptions.asHttpClientOptions()); this.dataApiNamespace = dataApiClient.getNamespace(namespaceName); this.devopsApi = new AstraDBDevopsClient(token); - String version = AstraDBDatabase.class.getPackage().getImplementationVersion(); } // ------------------------------------------ @@ -148,8 +147,8 @@ public AstraDBDatabase(AstraDBEndpoint apiEndpoint, String token, String namespa /** {@inheritDoc} */ @Override - public DataApiNamespace getNamespace(String namespaceName) { - return dataApiClient.getNamespace(namespaceName); + public AstraDBDatabase getNamespace(String namespaceName) { + return new AstraDBDatabase(getAstraDbEndpoint().getApiEndPoint(), getToken(), namespaceName); } /** {@inheritDoc} */ @@ -172,23 +171,32 @@ public boolean isNamespaceExists(String namespace) { /** {@inheritDoc} */ @Override - public DataApiNamespace createNamespace(String namespace) { + public AstraDBDatabase createNamespace(String namespace) { // We will NOT use the Data API methods in the Astra context but some devops API devopsApi.database(astraDbEndpoint.getDatabaseId().toString()).keyspaces().create(namespace); return new AstraDBDatabase(astraDbEndpoint, token, namespace, astraDbOptions); } - /** {@inheritDoc} */ @Override - public void dropNamespace(String namespace) { - devopsApi.database(astraDbEndpoint.getDatabaseId().toString()).keyspaces().delete(namespace); - + public AstraDBDatabase createNamespace(String namespace, CreateNamespaceOptions options) { + throw new UnsupportedOperationException("Cannot provide replication factor with Astra"); } - /** {@inheritDoc} */ + /** + * Delete a namespace from current database. If the namespace does not exist not errors will be thrown. + * + *
{@code
+     *  // Initialize a db
+     *  AstraDBDatabase db = new AstraDBDatabase("API_ENDPOINT", "TOKEN");
+     *  // Drop a Namespace
+     *  db.dropNamespace("");
+     * }
+ * @param namespace + * current namespace + */ @Override - public DataApiNamespace createNamespace(String namespace, CreateNamespaceOptions options) { - throw new UnsupportedOperationException("Astra enforce the replication factor for you."); + public void dropNamespace(String namespace) { + devopsApi.database(astraDbEndpoint.getDatabaseId().toString()).keyspaces().delete(namespace); } // -------------------------------------------- @@ -219,14 +227,20 @@ public Stream listCollectionNames() { /** {@inheritDoc} */ @Override - public Stream listCollections() { + public Stream listCollections() { return dataApiNamespace.listCollections(); } /** {@inheritDoc} */ @Override - public DataApiCollection getCollection(String collectionName, Class documentClass) { - return dataApiNamespace.getCollection(collectionName, documentClass); + public AstraDBCollection getCollection(String collectionName) { + return getCollection(collectionName, Document.class); + } + + /** {@inheritDoc} */ + @Override + public AstraDBCollection getCollection(String collectionName, Class documentClass) { + return new AstraDBCollection<>(this, collectionName, documentClass); } /** {@inheritDoc} */ @@ -237,10 +251,30 @@ public void drop() { /** {@inheritDoc} */ @Override - public DataApiCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions, Class documentClass) { - return dataApiNamespace.createCollection(collectionName, createCollectionOptions, documentClass); + public AstraDBCollection createCollection(String collectionName) { + return createCollection(collectionName, null, Document.class); } + /** {@inheritDoc} */ + @Override + public AstraDBCollection createCollection(String collectionName, Class documentClass) { + return createCollection(collectionName, null, documentClass); + } + + /** {@inheritDoc} */ + @Override + public AstraDBCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions) { + return createCollection(collectionName, createCollectionOptions, Document.class); + } + + /** {@inheritDoc} */ + @Override + public AstraDBCollection createCollection(String collectionName, CreateCollectionOptions createCollectionOptions, Class documentClass) { + dataApiNamespace.createCollection(collectionName, createCollectionOptions, documentClass); + return new AstraDBCollection<>(this, collectionName, documentClass); + } + + /** {@inheritDoc} */ @Override public void dropCollection(String collectionName) { diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java index b12eeece..7cb367f5 100644 --- a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBEndpoint.java @@ -59,16 +59,6 @@ public static AstraDBEndpoint parse(String endpointUrl) { return endpoint; } - /** - * Constructor from an URL. - */ - public AstraDBEndpoint(String apiEndpoint) { - AstraDBEndpoint a = parse(apiEndpoint); - this.env = a.env; - this.databaseId = a.databaseId; - this.databaseRegion = a.databaseRegion; - } - /** * Constructor with chunk of the URL. * diff --git a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java index 1240f04c..c6128eb4 100644 --- a/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java +++ b/astra-db-client/src/main/java/com/datastax/astra/db/AstraDBOptions.java @@ -1,22 +1,100 @@ package com.datastax.astra.db; + import io.stargate.sdk.http.HttpClientOptions; +import lombok.Builder; import lombok.Data; +import java.net.http.HttpClient; + /** - * Astra DB Connections. + * Options to set up http Client. */ -@Data +@Data @Builder public class AstraDBOptions { + /** Default user agent. */ + public static final String DEFAULT_CALLER_NAME = "astra-db-java"; + + /** Default user agent. */ + public static final String DEFAULT_CALLER_VERSION = + AstraDBOptions.class.getPackage().getImplementationVersion() != null ? + AstraDBOptions.class.getPackage().getImplementationVersion() : "dev"; + + /** Default timeout for initiating connection. */ + public static final int DEFAULT_CONNECT_TIMEOUT_SECONDS = 20; + + /** Default timeout for initiating connection. */ + public static final int DEFAULT_REQUEST_TIMEOUT_SECONDS = 20; + + /** Default retry count. */ + public static final int DEFAULT_RETRY_COUNT = 3; + + /** Default retry delay. */ + public static final int DEFAULT_RETRY_DELAY_MILLIS = 100; + + /** path for json api. */ + public static final String DEFAULT_VERSION = "v1"; + + /** Caller name in User agent. */ + @Builder.Default + String apiVersion = DEFAULT_VERSION; + + /** Caller name in User agent. */ + @Builder.Default + String userAgentCallerName = DEFAULT_CALLER_NAME; + + /** Caller version in User agent. */ + @Builder.Default + String userAgentCallerVersion = DEFAULT_CALLER_VERSION; + + /** Http Connection timeout. */ + @Builder.Default + long connectionRequestTimeoutInSeconds = DEFAULT_CONNECT_TIMEOUT_SECONDS; + + /** Http Connection timeout. */ + @Builder.Default + long responseTimeoutInSeconds = DEFAULT_REQUEST_TIMEOUT_SECONDS; + + /** Enable retry count. */ + @Builder.Default + int retryCount = DEFAULT_RETRY_COUNT; + + /** How much to wait in between 2 calls. */ + @Builder.Default + int retryDelay = DEFAULT_RETRY_DELAY_MILLIS; + + /** The http client could work through a proxy. */ + HttpClientOptions.HttpProxy proxy; + + /** Moving to HTTP/2. */ + @Builder.Default + HttpClient.Version httpVersion = HttpClient.Version.HTTP_2; + + /** Redirect */ + @Builder.Default + HttpClient.Redirect httpRedirect = HttpClient.Redirect.NORMAL; + /** - * Http Connections. + * Map as a http client options. + * + * @return + * instance of HttpClientOptions */ - HttpClientOptions httpClientOptions = HttpClientOptions.builder() - .userAgentCallerName("astra-db-java") - .userAgentCallerVersion( - AstraDBOptions.class.getPackage().getImplementationVersion() != null ? - AstraDBOptions.class.getPackage().getImplementationVersion() : "dev") - .build(); - -} + public HttpClientOptions asHttpClientOptions() { + return HttpClientOptions.builder() + .apiVersion(apiVersion) + .userAgentCallerName(userAgentCallerName) + .userAgentCallerVersion(userAgentCallerVersion) + .connectionRequestTimeoutInSeconds(connectionRequestTimeoutInSeconds) + .connectionRequestTimeoutInSeconds(connectionRequestTimeoutInSeconds) + .responseTimeoutInSeconds(responseTimeoutInSeconds) + .retryCount(retryCount) + .retryDelay(retryDelay) + .proxy(proxy) + .httpVersion(httpVersion) + .httpRedirect(httpRedirect) + .build(); + } + +} \ No newline at end of file diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/QuickStart.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/QuickStart.java new file mode 100644 index 00000000..a326bae6 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/QuickStart.java @@ -0,0 +1,57 @@ +package com.datastax.astra.documentation; + +import com.datastax.astra.db.AstraDBCollection; +import com.datastax.astra.db.AstraDBDatabase; +import io.stargate.sdk.data.client.model.Document; +import io.stargate.sdk.data.client.model.Filter; +import io.stargate.sdk.data.client.model.FindIterable; +import io.stargate.sdk.data.client.model.SimilarityMetric; +import io.stargate.sdk.data.client.model.collections.CreateCollectionOptions; + +import static io.stargate.sdk.data.client.model.Filters.eq; + +public class QuickStart { + public static void main(String[] args) { + + // Connect to db + AstraDBDatabase myDb = new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Create collection with vector search + AstraDBCollection demoCollection = myDb.createCollection("demo", CreateCollectionOptions + .builder() + .withVectorDimension(14) + .withVectorSimilarityMetric(SimilarityMetric.cosine) + .build()); + + // Insert vectors + demoCollection.insertOne(new Document() + .id("doc1") // generated if not set + .vector(new float[]{1f, 0f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) + .append("product_name", "HealthyFresh - Beef raw dog food") + .append("product_price", 12.99)); + demoCollection.insertOne(new Document() + .id("doc2") + .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}) + .append("product_name", "HealthyFresh - Chicken raw dog food") + .append("product_price", 9.99)); + demoCollection.insertOne(new Document() + .id("doc3") + .vector(new float[]{1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f})); + demoCollection.insertOne(new Document() + .id("doc4") + .vector(new float[]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}) + .append("product_name", "HealthyFresh - Chicken raw dog food") + .append("product_price", 9.99)); + + // Perform a similarity search + float[] embeddings = new float[] {1f, 1f, 1f, 1f, 1f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}; + Filter metadataFilter = new Filter().where("product_price").isEqualsTo(9.99); + int maxRecord = 10; + long top = System.currentTimeMillis(); + FindIterable docs = demoCollection + .find(eq("product_price", 9.99)); + //TODO FindOptions + System.out.println(System.currentTimeMillis() - top); + + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/client/CreateDatabase.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/CreateDatabase.java new file mode 100644 index 00000000..13c62450 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/CreateDatabase.java @@ -0,0 +1,19 @@ +package com.datastax.astra.documentation.client; + +import com.datastax.astra.db.AstraDBClient; +import com.datastax.astra.devops.db.domain.CloudProviderType; + +import java.util.UUID; + +public class CreateDatabase { + public static void main(String[] args) { + AstraDBClient client = new AstraDBClient("TOKEN"); + + // Choose a cloud provider (GCP, AZURE, AWS) and a region + CloudProviderType cloudProvider = CloudProviderType.GCP; + String cloudRegion = "us-east1"; + + // Create a database + UUID newDbId = client.createDatabase("DATABASE_NAME", cloudProvider, cloudRegion); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/client/DropDatabase.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/DropDatabase.java new file mode 100644 index 00000000..c634e486 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/DropDatabase.java @@ -0,0 +1,17 @@ +package com.datastax.astra.documentation.client; + +import com.datastax.astra.db.AstraDBClient; + +import java.util.UUID; + +public class DropDatabase { + public static void main(String[] args) { + AstraDBClient client = new AstraDBClient("TOKEN"); + + // Delete an existing database + client.dropDatabase(""); + + // Delete an existing database by ID + client.dropDatabase(UUID.fromString("")); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/client/FindDatabase.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/FindDatabase.java new file mode 100644 index 00000000..2b9f8fc1 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/FindDatabase.java @@ -0,0 +1,25 @@ +package com.datastax.astra.documentation.client; + +import com.datastax.astra.db.AstraDBClient; +import com.datastax.astra.devops.db.domain.Database; + +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +public class FindDatabase { + public static void main(String[] args) { + AstraDBClient client = new AstraDBClient("TOKEN"); + + // Check if a database exists + boolean exists = client.databaseExists(""); + + // Find a database by name (names may not be unique) + Stream dbStream = client.getDatabaseInformations(""); + Optional dbByName = dbStream.findFirst(); + + // Find a database by ID + Optional dbById = client + .getDatabaseInformations(UUID.fromString("")); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/client/InitAstraDBClient.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/InitAstraDBClient.java new file mode 100644 index 00000000..be825cc3 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/client/InitAstraDBClient.java @@ -0,0 +1,23 @@ +package com.datastax.astra.documentation.client; + +import com.datastax.astra.db.AstraDBClient; +import com.datastax.astra.db.AstraDBOptions; + +public class InitAstraDBClient { + public static void main(String[] args) { + + // Default Initialization + AstraDBClient client = new AstraDBClient("TOKEN"); + + // Specialize with some extra options + AstraDBClient client2 = new AstraDBClient("TOKEN", AstraDBOptions.builder() + .connectionRequestTimeoutInSeconds(10) + .responseTimeoutInSeconds(10) + // more options + .build()); + + // You can omit the token if you defined the `ASTRA_DB_APPLICATION_TOKEN` + // environment variable or if you are using the Astra CLI. + AstraDBClient defaultClient = new AstraDBClient(); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/collection/ClearCollection.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/collection/ClearCollection.java new file mode 100644 index 00000000..a01606f0 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/collection/ClearCollection.java @@ -0,0 +1,18 @@ +package com.datastax.astra.documentation.collection; + +import com.datastax.astra.db.AstraDBCollection; +import com.datastax.astra.db.AstraDBDatabase; +import io.stargate.sdk.data.client.model.Document; + +public class ClearCollection { + public static void main(String[] args) { + // Connect to running dn + AstraDBDatabase db = new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Accessing the collection + AstraDBCollection collection = db.getCollection("collection_simple"); + + // Delete all rows from an existing collection + collection.deleteAll(); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateCollection.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateCollection.java new file mode 100644 index 00000000..320cbfbb --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateCollection.java @@ -0,0 +1,39 @@ +package com.datastax.astra.documentation.db; + +import com.datastax.astra.db.AstraDBCollection; +import com.datastax.astra.db.AstraDBDatabase; +import io.stargate.sdk.data.client.exception.DataApiException; +import io.stargate.sdk.data.client.model.Document; +import io.stargate.sdk.data.client.model.SimilarityMetric; +import io.stargate.sdk.data.client.model.collections.CreateCollectionOptions; + +public class CreateCollection { + public static void main(String[] args) { + AstraDBDatabase db = + new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Create a non-vector collection + AstraDBCollection col = + db.createCollection("col"); + + // Create a vector collection + AstraDBCollection col_v = db.createCollection("col_v", CreateCollectionOptions + .builder() + .withVectorDimension(1536) + .withVectorSimilarityMetric(SimilarityMetric.euclidean) + .build()); + + // Create a collection with indexing (deny) + AstraDBCollection col_i = db.createCollection("col_i", CreateCollectionOptions + .builder() + .withIndexingDeny("blob") + .build()); + + // Collection names should use snake case ([a-zA-Z][a-zA-Z0-9_]*) + try { + db.createCollection("invalid.name"); + } catch(DataApiException e) { + // invalid.name is not valid + } + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateNamespace.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateNamespace.java new file mode 100644 index 00000000..f7f9d915 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/CreateNamespace.java @@ -0,0 +1,13 @@ +package com.datastax.astra.documentation.db; + +import com.datastax.astra.db.AstraDBDatabase; + +public class CreateNamespace { + public static void main(String[] args) { + // Default initialization + AstraDBDatabase db = new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Create a new namespace + db.createNamespace(""); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropCollection.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropCollection.java new file mode 100644 index 00000000..6e5a1843 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropCollection.java @@ -0,0 +1,12 @@ +package com.datastax.astra.documentation.db; + +import com.datastax.astra.db.AstraDBDatabase; + +public class DropCollection { + public static void main(String[] args) { + AstraDBDatabase db = new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Delete an existing collection + db.dropCollection("collection_vector2"); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropNamespace.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropNamespace.java new file mode 100644 index 00000000..ec96a872 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/DropNamespace.java @@ -0,0 +1,14 @@ +package com.datastax.astra.documentation.db; + +import com.datastax.astra.db.AstraDBDatabase; + +public class DropNamespace { + + public static void main(String[] args) { + // Default initialization + AstraDBDatabase db = new AstraDBDatabase("API_ENDPOINT", "TOKEN"); + + // Drop a Namespace + db.dropNamespace(""); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/FindCollection.java similarity index 73% rename from astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java rename to astra-db-client/src/test/java/com/datastax/astra/documentation/db/FindCollection.java index 75a9383a..26f3856f 100644 --- a/astra-db-client/src/test/java/com/datastax/astra/documentation/FindCollection.java +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/FindCollection.java @@ -1,9 +1,9 @@ -package com.datastax.astra.documentation; +package com.datastax.astra.documentation.db; import com.datastax.astra.db.AstraDBDatabase; import io.stargate.sdk.data.client.DataApiCollection; -import io.stargate.sdk.data.client.model.CreateCollectionOptions; import io.stargate.sdk.data.client.model.Document; +import io.stargate.sdk.data.client.model.collections.CreateCollectionOptions; public class FindCollection { public static void main(String[] args) { @@ -16,6 +16,6 @@ public static void main(String[] args) { CreateCollectionOptions options = collection.getOptions(); // Check if a collection exists - boolean collectionExists = db.isCollectionExists("collection_vector2"); + boolean collectionExists = db.getCollection("collection_vector2").exists(); } } diff --git a/astra-db-client/src/test/java/com/datastax/astra/documentation/db/InitAstraDBDatabase.java b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/InitAstraDBDatabase.java new file mode 100644 index 00000000..fa57f2e7 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/documentation/db/InitAstraDBDatabase.java @@ -0,0 +1,26 @@ +package com.datastax.astra.documentation.db; + +import com.datastax.astra.db.AstraDBDatabase; +import com.datastax.astra.db.AstraDBOptions; + +public class InitAstraDBDatabase { + public static void main(String[] args) { + // Default initialization + AstraDBDatabase db = new AstraDBDatabase("TOKEN", "API_ENDPOINT"); + + // 'Options' allows fined-grained configuration. + AstraDBOptions options = AstraDBOptions.builder() + .connectionRequestTimeoutInSeconds(10) + .connectionRequestTimeoutInSeconds(10) + .build(); + AstraDBDatabase db2 = new AstraDBDatabase("TOKEN", "API_ENDPOINT", options); + + // Initialize with a non-default namespace. + AstraDBDatabase db3 = + new AstraDBDatabase("TOKEN", "API_ENDPOINT", "NAMESPACE"); + + // non-default namespace + options + AstraDBDatabase db4 = + new AstraDBDatabase("TOKEN", "API_ENDPOINT", "NAMESPACE", options); + } +} diff --git a/astra-db-client/src/test/java/com/datastax/astra/integration/AstraCollectionITTest.java b/astra-db-client/src/test/java/com/datastax/astra/integration/AstraCollectionITTest.java new file mode 100644 index 00000000..7b58c847 --- /dev/null +++ b/astra-db-client/src/test/java/com/datastax/astra/integration/AstraCollectionITTest.java @@ -0,0 +1,15 @@ +package com.datastax.astra.integration; + +import com.datastax.astra.devops.utils.AstraEnvironment; +import io.stargate.sdk.data.client.DataApiNamespace; +import io.stargate.sdk.data.test.integration.AbstractCollectionITTest; + +import static com.datastax.astra.AstraDBTestSupport.createDatabase; + +public class AstraCollectionITTest extends AbstractCollectionITTest { + + @Override + public DataApiNamespace initNamespace() { + return createDatabase(AstraEnvironment.PROD); + } +} diff --git a/astra-sdk/src/main/java/com/datastax/astra/sdk/config/AstraClientConfig.java b/astra-sdk/src/main/java/com/datastax/astra/sdk/config/AstraClientConfig.java index ef05e209..06f70a22 100644 --- a/astra-sdk/src/main/java/com/datastax/astra/sdk/config/AstraClientConfig.java +++ b/astra-sdk/src/main/java/com/datastax/astra/sdk/config/AstraClientConfig.java @@ -241,7 +241,7 @@ public String getDatabaseRegion() { public StargateClientBuilder getStargateConfig() { return stargateConfig; } - + // ------------------------------------------------ // ----------------- Grpc ------------------------- // ------------------------------------------------