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 ------------------------- // ------------------------------------------------ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy