From 03c1d457fbbf7e8780239842283de999f80125eb Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Wed, 25 Jun 2025 16:19:48 +0200 Subject: [PATCH 1/6] Update table support --- .../datastax/astra/client/DataAPIClient.java | 2 +- .../astra/client/admin/AstraDBAdmin.java | 27 ++ .../client/admin/AstraDBDatabaseAdmin.java | 12 +- .../client/admin/DataAPIDatabaseAdmin.java | 23 +- .../astra/client/admin/DatabaseAdmin.java | 24 +- .../commands/AstraAvailableRegionInfo.java | 71 ++++++ .../admin/{ => options}/AdminOptions.java | 2 +- .../AstraFindAvailableRegionsOptions.java | 35 +++ .../cursor/CollectionFindAndRerankCursor.java | 2 +- .../commands/cursor/CollectionFindCursor.java | 2 +- .../definition/documents/types/UUIDv6.java | 33 ++- .../definition/documents/types/UUIDv7.java | 10 + .../client/core/rerank/RerankProvider.java | 4 + .../core/vectorize/EmbeddingProvider.java | 3 + .../core/vectorize/SupportModelStatus.java | 32 +++ .../astra/client/databases/Database.java | 4 +- .../options/CreateKeyspaceOptions.java | 6 +- .../commands/options/DropKeyspaceOptions.java | 4 +- .../FindEmbeddingProvidersOptions.java | 56 +++++ .../FindRerankingProvidersOptions.java | 56 +++++ .../datastax/astra/client/tables/Table.java | 29 +++ .../client/tables/cursor/TableFindCursor.java | 4 +- .../tables/definition/TableDefinition.java | 10 + .../definition/columns/ColumnTypes.java | 10 + .../internal/command/AbstractCursor.java | 7 +- .../integration/TableGAIntegrationTest.java | 237 ++++++++++++++++++ .../local/Local_01_DatabaseAdminITTest.java | 2 +- .../local/Local_02_Database_ITTest.java | 2 +- .../Local_21_TableCollectionIndexTest.java | 5 + .../dtsx/astra/sdk/db/DbRegionsClient.java | 27 +- .../astra/sdk/db/domain/FilterByOrgType.java | 8 + docker-compose-hcd.yml | 51 ---- .../main/java/com/datastax/astra/Book.java | 2 - .../astra/client/tables/AaronSample.java | 38 +++ langchain4j-astradb/pom.xml | 11 +- 35 files changed, 756 insertions(+), 95 deletions(-) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java rename astra-db-java/src/main/java/com/datastax/astra/client/admin/{ => options}/AdminOptions.java (98%) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindEmbeddingProvidersOptions.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindRerankingProvidersOptions.java create mode 100644 astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java delete mode 100644 docker-compose-hcd.yml create mode 100644 examples/src/main/java/com/datastax/astra/client/tables/AaronSample.java diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/DataAPIClient.java b/astra-db-java/src/main/java/com/datastax/astra/client/DataAPIClient.java index db28f6bc..0317c40f 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/DataAPIClient.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/DataAPIClient.java @@ -21,7 +21,7 @@ */ import com.datastax.astra.client.admin.AstraDBAdmin; -import com.datastax.astra.client.admin.AdminOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.databases.DatabaseOptions; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java index 6c6c92b9..37fc4daf 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java @@ -20,6 +20,9 @@ * #L% */ +import com.datastax.astra.client.admin.commands.AstraAvailableRegionInfo; +import com.datastax.astra.client.admin.options.AdminOptions; +import com.datastax.astra.client.admin.options.AstraFindAvailableRegionsOptions; import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.databases.definition.DatabaseInfo; import com.datastax.astra.client.databases.DatabaseOptions; @@ -32,6 +35,8 @@ 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.domain.FilterByOrgType; +import com.dtsx.astra.sdk.db.domain.RegionType; import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; import com.dtsx.astra.sdk.utils.AstraRc; import com.dtsx.astra.sdk.utils.observability.ApiRequestObserver; @@ -41,6 +46,7 @@ import java.net.http.HttpClient; import java.time.Duration; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -120,6 +126,27 @@ public AstraDBAdmin(AdminOptions options) { this.httpClient = httpClientBuilder.build(); } + // -------------------- + // -- Regions --- + // -------------------- + + public List findAvailableRegions(AstraFindAvailableRegionsOptions options) { + FilterByOrgType filterByOrgType = FilterByOrgType.ENABLED; + /* + * This parameter would be a direct wrapper over the filter-by-org query parameter, where: + * - onlyOrgEnabledRegions: true or unset → filter-by-org=enabled + * - onlyOrgEnabledRegions: false → filter-by-org=disabled + */ + if (options !=null && !options.isOnlyOrgEnabledRegions()) { + filterByOrgType = FilterByOrgType.DISABLED; + } + return devopsDbClient + .regions() + .findAllServerless(RegionType.VECTOR,filterByOrgType) + .map(AstraAvailableRegionInfo::new) + .toList(); + } + // -------------------- // -- Databases --- // -------------------- diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBDatabaseAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBDatabaseAdmin.java index 2e402e12..83a7b5e2 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBDatabaseAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBDatabaseAdmin.java @@ -21,10 +21,12 @@ */ import com.datastax.astra.client.DataAPIDestination; -import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.databases.commands.options.CreateKeyspaceOptions; import com.datastax.astra.client.databases.commands.options.DropKeyspaceOptions; +import com.datastax.astra.client.databases.commands.options.FindEmbeddingProvidersOptions; +import com.datastax.astra.client.databases.commands.options.FindRerankingProvidersOptions; import com.datastax.astra.client.databases.commands.results.FindEmbeddingProvidersResult; import com.datastax.astra.client.databases.DatabaseOptions; import com.datastax.astra.client.databases.commands.results.FindRerankingProvidersResult; @@ -191,18 +193,18 @@ public Set listKeyspaceNames() { /** {@inheritDoc} */ @Override - public FindEmbeddingProvidersResult findEmbeddingProviders() { + public FindEmbeddingProvidersResult findEmbeddingProviders(FindEmbeddingProvidersOptions options) { log.debug("findEmbeddingProviders"); DataAPIDatabaseAdmin admin = new DataAPIDatabaseAdmin(db, this.options); - return new FindEmbeddingProvidersResult(admin.findEmbeddingProviders().getEmbeddingProviders()); + return new FindEmbeddingProvidersResult(admin.findEmbeddingProviders(options).getEmbeddingProviders()); } /** {@inheritDoc} */ @Override - public FindRerankingProvidersResult findRerankingProviders() { + public FindRerankingProvidersResult findRerankingProviders(FindRerankingProvidersOptions options) { log.debug("findRerankingProviders"); DataAPIDatabaseAdmin admin = new DataAPIDatabaseAdmin(db, this.options); - return new FindRerankingProvidersResult(admin.findRerankingProviders().getRerankingProviders()); + return new FindRerankingProvidersResult(admin.findRerankingProviders(options).getRerankingProviders()); } /** {@inheritDoc} */ diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DataAPIDatabaseAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DataAPIDatabaseAdmin.java index f3c1cfe0..9cdc64a4 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DataAPIDatabaseAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DataAPIDatabaseAdmin.java @@ -20,6 +20,7 @@ * #L% */ +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.commands.Command; import com.datastax.astra.client.core.commands.CommandType; import com.datastax.astra.client.core.rerank.RerankProvider; @@ -27,6 +28,8 @@ import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.databases.commands.options.CreateKeyspaceOptions; import com.datastax.astra.client.databases.commands.options.DropKeyspaceOptions; +import com.datastax.astra.client.databases.commands.options.FindEmbeddingProvidersOptions; +import com.datastax.astra.client.databases.commands.options.FindRerankingProvidersOptions; import com.datastax.astra.client.databases.commands.results.FindEmbeddingProvidersResult; import com.datastax.astra.client.databases.commands.results.FindRerankingProvidersResult; import com.datastax.astra.client.databases.definition.keyspaces.KeyspaceDefinition; @@ -105,16 +108,26 @@ public Set listKeyspaceNames() { /** {@inheritDoc} */ @Override - public FindEmbeddingProvidersResult findEmbeddingProviders() { - DataAPIResponse res = runCommand(Command.create("findEmbeddingProviders")); + public FindEmbeddingProvidersResult findEmbeddingProviders(FindEmbeddingProvidersOptions options) { + DataAPIResponse res = runCommand(Command + .create("findEmbeddingProviders") + .withOptions(options)); return new FindEmbeddingProvidersResult( res.getStatusKeyAsMap("embeddingProviders", - EmbeddingProvider.class)); + EmbeddingProvider.class)); } +// @Override +// public FindRerankingProvidersResult findRerankingProviders() { +// DataAPIResponse res = runCommand(Command.create("findRerankingProviders")); +// return new FindRerankingProvidersResult( +// res.getStatusKeyAsMap("rerankingProviders", +// RerankProvider.class)); +// } + @Override - public FindRerankingProvidersResult findRerankingProviders() { - DataAPIResponse res = runCommand(Command.create("findRerankingProviders")); + public FindRerankingProvidersResult findRerankingProviders(FindRerankingProvidersOptions options) { + DataAPIResponse res = runCommand(Command.create("findRerankingProviders").withOptions(options)); return new FindRerankingProvidersResult( res.getStatusKeyAsMap("rerankingProviders", RerankProvider.class)); diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java index fcb80e23..b4500f9c 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java @@ -22,11 +22,14 @@ import com.datastax.astra.client.core.options.BaseOptions; import com.datastax.astra.client.core.rerank.RerankProvider; +import com.datastax.astra.client.core.vectorize.SupportModelStatus; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.core.commands.CommandRunner; import com.datastax.astra.client.core.vectorize.EmbeddingProvider; import com.datastax.astra.client.databases.commands.options.CreateKeyspaceOptions; import com.datastax.astra.client.databases.commands.options.DropKeyspaceOptions; +import com.datastax.astra.client.databases.commands.options.FindEmbeddingProvidersOptions; +import com.datastax.astra.client.databases.commands.options.FindRerankingProvidersOptions; import com.datastax.astra.client.databases.commands.results.FindEmbeddingProvidersResult; import com.datastax.astra.client.databases.commands.results.FindRerankingProvidersResult; import com.datastax.astra.client.databases.definition.keyspaces.KeyspaceDefinition; @@ -36,6 +39,8 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; +import static com.datastax.astra.client.core.vectorize.SupportModelStatus.SUPPORTED; + /** * Defines the core client interface for interacting with the Data API, focusing on CRUD (Create, Read, Update, Delete) * operations for namespaces. This interface extends the {@link CommandRunner}, incorporating methods that @@ -85,7 +90,17 @@ public interface DatabaseAdmin { * @return * list of available providers */ - FindEmbeddingProvidersResult findEmbeddingProviders(); + FindEmbeddingProvidersResult findEmbeddingProviders(FindEmbeddingProvidersOptions options); + + /** + * Backward compatible method to retrieve the list of embedding providers available in the current database. + * + * @return + * list of available providers with default options + */ + default FindEmbeddingProvidersResult findEmbeddingProviders() { + return findEmbeddingProviders(null); + } /** * Retrieve the list of reranking providers available in the current database. Reranking providers are services @@ -103,7 +118,12 @@ public interface DatabaseAdmin { * @return * list of available providers */ - FindRerankingProvidersResult findRerankingProviders(); + FindRerankingProvidersResult findRerankingProviders(FindRerankingProvidersOptions options); + + default FindRerankingProvidersResult findRerankingProviders() { + return findRerankingProviders(null); + } + /** * Asynchronously retrieves a stream of keyspaces names available in the current database. This method facilitates diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java new file mode 100644 index 00000000..01df003a --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java @@ -0,0 +1,71 @@ +package com.datastax.astra.client.admin.commands; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.dtsx.astra.sdk.db.domain.DatabaseRegionServerless; +import lombok.Data; + +@Data +public class AstraAvailableRegionInfo { + + /** Region Name. */ + private String name; + + /** Cloud provider. */ + private String cloudProvider; + + /** Name of the region picked. */ + private String displayName; + + /** Zone. */ + private String zone; + + /** Classification. */ + private String classification; + + /** working region. */ + private boolean enabled; + + /** limited ? */ + private boolean reservedForQualifiedUsers; + + /** + * Default Constructor. + */ + public AstraAvailableRegionInfo() { + } + + /** + * Constructor from DatabaseRegionServerless. + * + * @param dbRegionServerless + * the database region serverless object + */ + public AstraAvailableRegionInfo(DatabaseRegionServerless dbRegionServerless) { + this.classification = dbRegionServerless.getClassification(); + this.cloudProvider = dbRegionServerless.getCloudProvider(); + this.displayName = dbRegionServerless.getDisplayName(); + this.enabled = dbRegionServerless.isEnabled(); + this.name = dbRegionServerless.getName(); + this.reservedForQualifiedUsers = dbRegionServerless.isReservedForQualifiedUsers(); + this.zone = dbRegionServerless.getZone(); + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AdminOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AdminOptions.java similarity index 98% rename from astra-db-java/src/main/java/com/datastax/astra/client/admin/AdminOptions.java rename to astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AdminOptions.java index be5a75ed..0866d8c1 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AdminOptions.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AdminOptions.java @@ -1,4 +1,4 @@ -package com.datastax.astra.client.admin; +package com.datastax.astra.client.admin.options; /*- * #%L diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java new file mode 100644 index 00000000..fc397c2b --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java @@ -0,0 +1,35 @@ +package com.datastax.astra.client.admin.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import lombok.Data; + +@Data +public class AstraFindAvailableRegionsOptions { + + private boolean onlyOrgEnabledRegions = true; + + public AstraFindAvailableRegionsOptions onlyOrgEnabledRegions(boolean onlyOrgEnabledRegions) { + this.onlyOrgEnabledRegions = onlyOrgEnabledRegions; + return this; + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindAndRerankCursor.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindAndRerankCursor.java index 4cacb473..c30c8465 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindAndRerankCursor.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindAndRerankCursor.java @@ -208,7 +208,7 @@ public CollectionFindAndRerankCursor includeSortVector() { /** * {PageState is always null, all is returned here } */ - public void fetchNextBatch() { + public void fetchNextPage() { // Only the first time if (currentPage == null) { currentPage = dataSource.findAndRerankPage(filter, options, newRowType); diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindCursor.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindCursor.java index cee96530..146a740d 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindCursor.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/cursor/CollectionFindCursor.java @@ -214,7 +214,7 @@ public CollectionFindCursor includeSortVector() { * Fetches the next batch of documents into the buffer. * This method handles paging, using the page state from the previous batch to fetch the next one. */ - public void fetchNextBatch() { + public void fetchNextPage() { if (currentPage == null) { // Searching First Page currentPage = dataSource.findPage(filter, collectionFindOptions, getRecordType()); diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java index 8d58e7c2..8ac45604 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java @@ -21,7 +21,9 @@ */ import com.fasterxml.uuid.Generators; +import com.fasterxml.uuid.impl.UUIDUtil; +import java.time.Instant; import java.util.UUID; /** @@ -51,6 +53,16 @@ public UUIDv6(UUID uuid) { this.uuid = uuid; } + /** + * Constructor. + * + * @param strUUID + * uuid + */ + public UUIDv6(String strUUID) { + this(UUID.fromString(strUUID)); + } + /** * Return the Java Utils UUID. * @@ -61,6 +73,25 @@ public UUID toUUID() { return uuid; } + /** + * Extract the hidden timestamp (100-nanosecond units since UUID epoch). + * + * @return the raw 60-bit timestamp value embedded in this UUIDv6 + */ + public long getTimeStamp() { + return UUIDUtil.extractTimestamp(uuid); + } + + /** + * Get the timestamp as an {@link Instant}. + * + * @return + * the timestamp as an Instant + */ + public Instant getInstant() { + return Instant.ofEpochMilli(getTimeStamp()); + } + /** {@inheritDoc} */ @Override public String toString() { @@ -76,7 +107,7 @@ public String toString() { * an instance of UUIDv6 */ public static UUIDv6 fromString(String strUUID) { - return new UUIDv6(UUID.fromString(strUUID)); + return new UUIDv6(strUUID); } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv7.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv7.java index 5255161a..60f61672 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv7.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv7.java @@ -21,6 +21,7 @@ */ import com.fasterxml.uuid.Generators; +import com.fasterxml.uuid.impl.UUIDUtil; import java.security.SecureRandom; import java.util.UUID; @@ -62,6 +63,15 @@ public UUID toUUID() { return uuid; } + /** + * Extract the hidden timestamp (100-nanosecond units since UUID epoch). + * + * @return the raw 60-bit timestamp value embedded in this UUIDv6 + */ + public long getTimeStamp() { + return UUIDUtil.extractTimestamp(uuid); + } + /** {@inheritDoc} */ @Override public String toString() { diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/core/rerank/RerankProvider.java b/astra-db-java/src/main/java/com/datastax/astra/client/core/rerank/RerankProvider.java index 30cf2b8b..e9f6cf25 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/core/rerank/RerankProvider.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/core/rerank/RerankProvider.java @@ -21,6 +21,7 @@ */ import com.datastax.astra.client.collections.definition.documents.Document; +import com.datastax.astra.client.core.vectorize.SupportModelStatus; import lombok.Data; import java.util.List; @@ -106,6 +107,9 @@ public static class Model { private Boolean isDefault; + /** Supported model or not */ + private Map apiModelSupport; + /** Parameters for the model. */ private List parameters; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/EmbeddingProvider.java b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/EmbeddingProvider.java index 7066f44a..7dae4985 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/EmbeddingProvider.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/EmbeddingProvider.java @@ -91,6 +91,9 @@ public static class Model { /** Model name */ private String name; + /** Supported model or not */ + private Map apiModelSupport; + /** Model dimension. */ private Integer vectorDimension; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java new file mode 100644 index 00000000..83335424 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java @@ -0,0 +1,32 @@ +package com.datastax.astra.client.core.vectorize; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +/** + * Enum representing the status of an embedding provider. + *

+ * - SUPPORTED: The provider is currently supported and available for use. + * - DEPRECATED: The provider is deprecated and may be removed in future versions. + * - END_OF_LIFE: The provider has reached its end of life and is no longer supported. + */ +public enum SupportModelStatus { + SUPPORTED,DEPRECATED, END_OF_LIFE +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java index 2f1054f9..7c3b3040 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java @@ -20,7 +20,7 @@ * #L% */ -import com.datastax.astra.client.admin.AdminOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.admin.AstraDBAdmin; import com.datastax.astra.client.admin.AstraDBDatabaseAdmin; import com.datastax.astra.client.admin.DataAPIDatabaseAdmin; @@ -35,7 +35,6 @@ import com.datastax.astra.client.collections.definition.documents.Document; import com.datastax.astra.client.core.commands.Command; import com.datastax.astra.client.core.options.DataAPIClientOptions; -import com.datastax.astra.client.core.vector.SimilarityMetric; import com.datastax.astra.client.databases.definition.DatabaseInfo; import com.datastax.astra.client.exceptions.InvalidConfigurationException; import com.datastax.astra.client.tables.Table; @@ -47,7 +46,6 @@ import com.datastax.astra.client.tables.commands.options.ListTablesOptions; import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.definition.TableDescriptor; -import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.definition.rows.Row; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.internal.api.AstraApiEndpoint; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/CreateKeyspaceOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/CreateKeyspaceOptions.java index 2b78b536..cbac887f 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/CreateKeyspaceOptions.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/CreateKeyspaceOptions.java @@ -20,16 +20,12 @@ * #L% */ -import com.datastax.astra.client.admin.AdminOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.commands.CommandType; import com.datastax.astra.client.core.options.BaseOptions; -import com.datastax.astra.client.core.options.DataAPIClientOptions; -import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; - /** * Set of options used when creating a table */ diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/DropKeyspaceOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/DropKeyspaceOptions.java index d93fe2b2..dea41370 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/DropKeyspaceOptions.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/DropKeyspaceOptions.java @@ -20,14 +20,12 @@ * #L% */ -import com.datastax.astra.client.admin.AdminOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.commands.CommandType; import com.datastax.astra.client.core.options.BaseOptions; import lombok.Setter; import lombok.experimental.Accessors; -import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; - /** * Set of options used when creating a table */ diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindEmbeddingProvidersOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindEmbeddingProvidersOptions.java new file mode 100644 index 00000000..bec34db8 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindEmbeddingProvidersOptions.java @@ -0,0 +1,56 @@ +package com.datastax.astra.client.databases.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.admin.options.AdminOptions; +import com.datastax.astra.client.core.commands.CommandType; +import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.core.vectorize.SupportModelStatus; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Setter +@Accessors(fluent = true, chain = true) +public class FindEmbeddingProvidersOptions extends BaseOptions { + + /** + * Condition to upsert the table. + */ + SupportModelStatus filterModelStatus = null; + + /** + * Default constructor + */ + public FindEmbeddingProvidersOptions() { + super(null, CommandType.DATABASE_ADMIN, AdminOptions.DEFAULT_SERIALIZER, null); + } + + /** + * Accessor for serialization. + * + * @return + * accessor for serialization + */ + public SupportModelStatus getFilterModelStatus() { + return this.filterModelStatus; + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindRerankingProvidersOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindRerankingProvidersOptions.java new file mode 100644 index 00000000..05fb805d --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/commands/options/FindRerankingProvidersOptions.java @@ -0,0 +1,56 @@ +package com.datastax.astra.client.databases.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.admin.options.AdminOptions; +import com.datastax.astra.client.core.commands.CommandType; +import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.core.vectorize.SupportModelStatus; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Setter +@Accessors(fluent = true, chain = true) +public class FindRerankingProvidersOptions extends BaseOptions { + + /** + * Condition to upsert the table. + */ + SupportModelStatus filterModelStatus = null; + + /** + * Default constructor + */ + public FindRerankingProvidersOptions() { + super(null, CommandType.DATABASE_ADMIN, AdminOptions.DEFAULT_SERIALIZER, null); + } + + /** + * Accessor for serialization. + * + * @return + * accessor for serialization + */ + public SupportModelStatus getFilterModelStatus() { + return this.filterModelStatus; + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/Table.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/Table.java index c8801114..df384ae9 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/Table.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/Table.java @@ -54,6 +54,7 @@ import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.definition.TableDescriptor; import com.datastax.astra.client.tables.definition.indexes.TableIndexDescriptor; +import com.datastax.astra.client.tables.definition.indexes.TableIndexMapTypes; import com.datastax.astra.client.tables.definition.indexes.TableRegularIndexDefinition; import com.datastax.astra.client.tables.definition.indexes.TableTextIndexDefinition; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; @@ -322,6 +323,20 @@ public void createIndex(String idxName, String columnName) { createIndex(idxName, new TableRegularIndexDefinition().column(columnName), null); } + /** + * Create a simple index on the given column with no special options + * + * @param idxName + * name of the index + * @param columnName + * column on which is the index + * @param type + * column type for the index, used for Map columns + */ + public void createIndex(String idxName, String columnName, TableIndexMapTypes type) { + createIndex(idxName, new TableRegularIndexDefinition().column(columnName, type), null); + } + /** * Create a simple index on the given column with no special options * @@ -336,6 +351,20 @@ public void createIndex(String idxName, String columnName, CreateIndexOptions id createIndex(idxName, new TableRegularIndexDefinition().column(columnName), idxOptions); } + /** + * Create a simple index on the given column with no special options + * + * @param idxName + * name of the index + * @param columnName + * column on which is the index + * @param type + * column type for the index, used for Map columns + */ + public void createIndex(String idxName, String columnName, TableIndexMapTypes type, CreateIndexOptions idxOptions) { + createIndex(idxName, new TableRegularIndexDefinition().column(columnName, type), idxOptions); + } + /** * Create a new index with the given description. * diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/cursor/TableFindCursor.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/cursor/TableFindCursor.java index 560f7bbd..fef98191 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/cursor/TableFindCursor.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/cursor/TableFindCursor.java @@ -206,7 +206,7 @@ public TableFindCursor includeSortVector() { * Fetches the next batch of documents into the buffer. * This method handles paging, using the page state from the previous batch to fetch the next one. */ - public void fetchNextBatch() { + public void fetchNextPage() { if (currentPage == null) { // Searching First Page currentPage = dataSource.findPage(filter, tableFindOptions, getRecordType()); @@ -216,6 +216,8 @@ public void fetchNextBatch() { tableFindOptions.pageState(currentPage.getPageState().get()); currentPage = dataSource.findPage(filter, tableFindOptions, getRecordType()); buffer.addAll(currentPage.getResults()); + } else { + // Error ? } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java index 3a7663fe..32330430 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java @@ -82,6 +82,16 @@ public TableDefinition addColumn(String name, ColumnTypes type) { return this; } + /** + * Adds a UUID column to the table. + * + * @param name the name of the column + * @return the updated {@link TableDefinition} instance + */ + public TableDefinition addColumnUuid(String name) { + return addColumn(name, ColumnTypes.UUID); + } + /** * Adds a text column to the table. * diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java index 5eb658cd..18117832 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java @@ -60,6 +60,11 @@ public enum ColumnTypes { */ BOOLEAN("boolean"), + /** + * Counter. + */ + COUNTER("counter"), + /** * Date type, storing only the date part without a time zone. */ @@ -130,6 +135,11 @@ public enum ColumnTypes { */ TIMESTAMP("timestamp"), + /** + * TimeUUID. + */ + TIMEUUID("timeuuid"), + /** * 8-bit signed integer. */ diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/command/AbstractCursor.java b/astra-db-java/src/main/java/com/datastax/astra/internal/command/AbstractCursor.java index d983b879..3dc03b22 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/command/AbstractCursor.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/command/AbstractCursor.java @@ -26,7 +26,6 @@ import com.datastax.astra.client.exceptions.CursorException; import lombok.Getter; -import java.io.Closeable; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -149,7 +148,7 @@ public Iterator iterator() { * Fetches the next batch of documents into the buffer. * This method handles paging, using the page state from the previous batch to fetch the next one. */ - protected abstract void fetchNextBatch(); + protected abstract void fetchNextPage(); /** * Checks if there are more elements in the cursor. @@ -219,7 +218,7 @@ public int getBufferedSize() { */ public Optional getSortVector() { if (currentPage == null && state == CursorState.IDLE) { - fetchNextBatch(); + fetchNextPage(); } if (currentPage == null) { return Optional.empty(); @@ -251,7 +250,7 @@ public boolean hasNext() { return true; } // Fetch next batch of documents into buffer (if buffer is empty) - fetchNextBatch(); + fetchNextPage(); return !buffer.isEmpty(); } diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java new file mode 100644 index 00000000..4f0a1a64 --- /dev/null +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java @@ -0,0 +1,237 @@ +package com.datastax.astra.test.integration; + +import com.datastax.astra.client.DataAPIClient; +import com.datastax.astra.client.DataAPIClients; +import com.datastax.astra.client.DataAPIDestination; +import com.datastax.astra.client.admin.options.AstraFindAvailableRegionsOptions; +import com.datastax.astra.client.collections.definition.documents.types.UUIDv6; +import com.datastax.astra.client.collections.definition.documents.types.UUIDv7; +import com.datastax.astra.client.core.options.DataAPIClientOptions; +import com.datastax.astra.client.core.query.Filter; +import com.datastax.astra.client.core.query.Filters; +import com.datastax.astra.client.core.vectorize.SupportModelStatus; +import com.datastax.astra.client.core.vectorize.VectorServiceOptions; +import com.datastax.astra.client.databases.Database; +import com.datastax.astra.client.databases.commands.options.FindEmbeddingProvidersOptions; +import com.datastax.astra.client.databases.commands.options.FindRerankingProvidersOptions; +import com.datastax.astra.client.tables.Table; +import com.datastax.astra.client.tables.commands.options.CreateIndexOptions; +import com.datastax.astra.client.tables.definition.TableDefinition; +import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.indexes.TableIndexDefinitionOptions; +import com.datastax.astra.client.tables.definition.indexes.TableIndexMapTypes; +import com.datastax.astra.client.tables.definition.indexes.TableRegularIndexDefinition; +import com.datastax.astra.client.tables.definition.rows.Row; +import com.datastax.astra.client.tables.mapping.Column; +import com.datastax.astra.client.tables.mapping.EntityTable; +import com.dtsx.astra.sdk.utils.JsonUtils; +import lombok.Data; +import org.junit.jupiter.api.Test; + +import java.time.Instant; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import static com.datastax.astra.client.core.query.Filters.eq; +import static com.datastax.astra.client.tables.commands.options.CreateTableOptions.IF_NOT_EXISTS; + +/* + * Flight DECK for Astra DEV + * + * https://flightdeck.dev.cloud-tools.datastax.com/database/f9754177-52e2-4b66-935e-78cfd0be0042 + */ +public class TableGAIntegrationTest { + + public static final String ASTRA_DB_TOKEN = + "AstraCS:PNfjXcyImIviUnrquSdiwlGq:8fa09440482105a921acf86d1ae6e70ebcae9ff2c5e42be62a1b0d451680d055"; + public static final String DB_URL_NON_VECTOR = + "https://f9754177-52e2-4b66-935e-78cfd0be0042-us-west-2.apps.astra-dev.datastax.com"; + public static final String DB_URL_VECTOR = + "https://853cb027-ae65-4bfa-94a3-5e1931268372-us-west-2.apps.astra-dev.datastax.com"; + + private DataAPIClient getAstraDevDataApiClient() { + DataAPIClientOptions options = new DataAPIClientOptions() + .destination(DataAPIDestination.ASTRA_DEV) + .rerankAPIKey(ASTRA_DB_TOKEN) + .embeddingAPIKey(ASTRA_DB_TOKEN) + .logRequests(); + return new DataAPIClient(ASTRA_DB_TOKEN, options); + } + private Database getDatabaseNonVector() { + return getAstraDevDataApiClient().getDatabase(DB_URL_NON_VECTOR); + } + private Database getDatabaseVector() { + return getAstraDevDataApiClient().getDatabase(DB_URL_VECTOR); + } + private Database getLocalDatabase() { + return DataAPIClients.localDbWithDefaultKeyspace(); + } + + /** + * Collection Name + */ + @Test + public void should_backwardCompatible_findEmbeddingProviders() { + getDatabaseVector().getDatabaseAdmin() + .findEmbeddingProviders() + .getEmbeddingProviders() + .forEach((k,v) -> { + v.getModels().forEach((model) -> { + System.out.println(" Model: " + model.getName() + " - " + model.getApiModelSupport()); + }); + }); + } + + @Test + public void should_findEmbeddingProviders() { + // No Model Status will return all models + getLocalDatabase() + .getDatabaseAdmin() + .findEmbeddingProviders() + .getEmbeddingProviders() + .forEach((k,v) -> { + System.out.println("Provider: " + k + " - " + v.getDisplayName()); + v.getModels().forEach((model) -> { + System.out.println(" Model: " + model.getName() + " - " + model.getApiModelSupport()); + }); + }); + + // filter on SUPPORTED + FindEmbeddingProvidersOptions options = new FindEmbeddingProvidersOptions() + .filterModelStatus(SupportModelStatus.SUPPORTED); + getLocalDatabase() + .getDatabaseAdmin() + .findEmbeddingProviders(options) + .getEmbeddingProviders() + .forEach((k,v) -> { + System.out.println("Provider: " + k + " - " + v.getDisplayName()); + v.getModels().forEach((model) -> { + System.out.println(" Model: " + model.getName() + " - " + model.getApiModelSupport()); + }); + }); + } + + + /** + * Collection Name + */ + @Test + public void should_backwardCompatible_findRerankingProviders() { + getLocalDatabase().getDatabaseAdmin() + .findRerankingProviders(new FindRerankingProvidersOptions() + .filterModelStatus(SupportModelStatus.SUPPORTED)) + .getRerankingProviders() + .forEach((k,v) -> { + v.getModels().forEach((model) -> { + System.out.println(" Model: " + model.getName() + " - " + model.getApiModelSupport()); + }); + }); + } + + @Test + public void should_findAvailableRegions() { + getDatabaseVector() + .getAdmin() + .findAvailableRegions(new AstraFindAvailableRegionsOptions().onlyOrgEnabledRegions(false)) + .forEach(region -> System.out.println(JsonUtils.marshall(region))); + } + + @Test + public void shouldCreateTableIndex() { + Table table = getLocalDatabase() + .createTable("demo_table_index", new TableDefinition() + .addColumnText("email") + .addColumnText("name") + .addColumnMap("example_map_column", ColumnTypes.TEXT, ColumnTypes.TEXT) + .partitionKey("email"), IF_NOT_EXISTS); + + + table.createIndex("idx_name", new TableRegularIndexDefinition() + .column("example_map_column", TableIndexMapTypes.KEYS), + CreateIndexOptions.IF_NOT_EXISTS); + } + + /** + * CREATE TABLE killrvideo.video_ratings ( + * videoid uuid PRIMARY KEY, + * rating_counter counter, + * rating_total counter + * ); + */ + @Data + @EntityTable("video_ratings") + public static final class VideoRatingTableEntity { + + @Column(name = "videoid", type = ColumnTypes.UUID) + UUID videoId; + + @Column(name = "rating_counter", type = ColumnTypes.COUNTER) + Integer ratingCounter; + + @Column(name = "rating_total", type = ColumnTypes.COUNTER) + Integer ratingTotal; + } + + /** + * CREATE TABLE default_keyspace.sample_table ( + * id timeuuid PRIMARY KEY, + * col1 text, + * col2 text + * ); + */ + @Data + @EntityTable("sample_table") + public static final class SampleTable { + + @Column(name = "id", type = ColumnTypes.TIMEUUID) + UUIDv6 videoId; + + @Column(name = "col1", type = ColumnTypes.TEXT) + String col1; + + @Column(name = "col2", type = ColumnTypes.TEXT) + String col2; + } + + /** + * CREATE TABLE killrvideo.video_ratings ( + * videoid uuid PRIMARY KEY, + * rating_counter counter, + * rating_total counter + * ); + */ + + @Test + public void should_create_table_with_timeuuid() { + Table table3 = getLocalDatabase().getTable(SampleTable.class); + + table3.findAll().forEach(row -> { + System.out.println("Entity: " + row.getVideoId().getInstant() + " - " + row.col1 + " - " + row.col2); + }); + } + + @Test + public void should_create_table_with_counters() { + + Table table2 = getLocalDatabase() + .getTable("video_ratings", VideoRatingTableEntity.class); + +// table2.findAll().forEach(entity -> { +// System.out.println("Entity: " + entity.videoId + " - " + entity.ratingCounter + " - " + entity.ratingTotal); +// }); + + Optional optional = table2.findOne( + eq("videoid", UUID.fromString("6f9619ff-8b86-d011-b42d-00cf4fc964ff")) + ); + if (optional.isPresent()) { + VideoRatingTableEntity entity = optional.get(); + System.out.println("Entity: " + entity.videoId + " - " + entity.ratingCounter + " - " + entity.ratingTotal); + } else { + System.out.println("No entity found for the given filter."); + } + } + + +} diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_01_DatabaseAdminITTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_01_DatabaseAdminITTest.java index 93a6a5a2..060dffb9 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_01_DatabaseAdminITTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_01_DatabaseAdminITTest.java @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -@EnabledIfSystemProperty(named = "ASTRA_DB_JAVA_TEST_ENV", matches = "local") +//@EnabledIfSystemProperty(named = "ASTRA_DB_JAVA_TEST_ENV", matches = "local") class Local_01_DatabaseAdminITTest extends AbstractDatabaseAdminITTest { @Test diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_02_Database_ITTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_02_Database_ITTest.java index 9d6f0c21..85052257 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_02_Database_ITTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_02_Database_ITTest.java @@ -3,7 +3,7 @@ import com.datastax.astra.client.DataAPIClient; import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.DataAPIDestination; -import com.datastax.astra.client.admin.AdminOptions; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.core.http.HttpClientOptions; import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.core.auth.UsernamePasswordTokenProvider; diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java index 0ab324fd..06bb7c67 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java @@ -1,6 +1,10 @@ package com.datastax.astra.test.integration.local; +import com.datastax.astra.client.DataAPIClient; import com.datastax.astra.client.DataAPIClients; +import com.datastax.astra.client.DataAPIDestination; +import com.datastax.astra.client.core.auth.UsernamePasswordTokenProvider; +import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.core.vector.SimilarityMetric; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.tables.commands.options.CreateIndexOptions; @@ -18,6 +22,7 @@ import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; +import static com.datastax.astra.client.core.options.DataAPIClientOptions.DEFAULT_KEYSPACE; import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java index 982a2220..93e8b5c4 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java @@ -1,6 +1,7 @@ package com.dtsx.astra.sdk.db; import com.dtsx.astra.sdk.AbstractApiClient; +import com.dtsx.astra.sdk.db.domain.FilterByOrgType; import com.dtsx.astra.sdk.db.domain.RegionType; import com.dtsx.astra.sdk.utils.AstraEnvironment; import com.dtsx.astra.sdk.utils.HttpClientWrapper; @@ -81,9 +82,10 @@ public Stream findAll() { * @return * serverless region */ - public Stream findAllServerless(RegionType regionType) { + public Stream findAllServerless(RegionType regionType, FilterByOrgType filterByOrg) { // Build Path String url = ApiLocator.getApiDevopsEndpoint(environment) + PATH_REGIONS_SERVERLESS; + switch (regionType) { case ALL: url += "?region-type=all"; @@ -92,15 +94,36 @@ public Stream findAllServerless(RegionType regionType) url += "?region-type=vector"; break; case SERVERLESS: - default: break; } + + switch (filterByOrg) { + case ENABLED -> { + url += "&filter-by-org=enabled"; + } + case DISABLED -> { + url += "&filter-by-org=disabled"; + } + } + // Invoke endpoint ApiResponseHttp res = GET(url, getOperationName("findServerless")); // Marshall response return JsonUtils.unmarshallType(res.getBody(), new TypeReference>(){}).stream(); } + /** + * List serverless regions. + * + * @param regionType + * provide the filter you want + * @return + * serverless region + */ + public Stream findAllServerless(RegionType regionType) { + return findAllServerless(regionType, FilterByOrgType.DISABLED); + } + /** * Map regions from plain list to Tier/Cloud/Region Structure. * diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java new file mode 100644 index 00000000..90b803c8 --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java @@ -0,0 +1,8 @@ +package com.dtsx.astra.sdk.db.domain; + +/** + * Encoded all values for 'filter-by-org' parameter when listing serverless databases. + */ +public enum FilterByOrgType { + DISABLED, ENABLED +} diff --git a/docker-compose-hcd.yml b/docker-compose-hcd.yml deleted file mode 100644 index 96b91f93..00000000 --- a/docker-compose-hcd.yml +++ /dev/null @@ -1,51 +0,0 @@ -version: '3' - -services: - hcd: - image: datastax/hcd:1.0.0 - networks: - - stargate - mem_limit: 2G - environment: - - MAX_HEAP_SIZE=1536M - - CLUSTER_NAME=hcd-1.0.0-early-preview.1-cluster - - DS_LICENSE=accept - - HCD_AUTO_CONF_OFF=cassandra.yaml - volumes: - - ./cassandra-hcd.yaml:/opt/hcd/resources/cassandra/conf/cassandra.yaml:rw - ports: - - "9042:9042" - healthcheck: - test: [ "CMD-SHELL", "cqlsh -u cassandra -p cassandra -e 'describe keyspaces'" ] - interval: 15s - timeout: 10s - retries: 20 - - data-api: - image: stargateio/data-api:v1.0.18 - depends_on: - hcd: - condition: service_healthy - networks: - - stargate - ports: - - "8181:8181" - mem_limit: 2G - environment: - - JAVA_MAX_MEM_RATIO=75 - - JAVA_INITIAL_MEM_RATIO=50 - - STARGATE_DATA_STORE_IGNORE_BRIDGE=true - - GC_CONTAINER_OPTIONS=-XX:+UseG1GC - - STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_CASSANDRA_END_POINTS=hcd - - STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_LOCAL_DATACENTER=dc1 - - QUARKUS_HTTP_ACCESS_LOG_ENABLED=FALSE - - QUARKUS_LOG_LEVEL=INFO - - STARGATE_JSONAPI_OPERATIONS_VECTORIZE_ENABLED=true - - JAVA_OPTS_APPEND=-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager - healthcheck: - test: curl -f http://localhost:8181/stargate/health || exit 1 - interval: 5s - timeout: 10s - retries: 10 -networks: - stargate: \ No newline at end of file diff --git a/examples/src/main/java/com/datastax/astra/Book.java b/examples/src/main/java/com/datastax/astra/Book.java index 6151bfe6..115783da 100644 --- a/examples/src/main/java/com/datastax/astra/Book.java +++ b/examples/src/main/java/com/datastax/astra/Book.java @@ -6,8 +6,6 @@ import com.datastax.astra.client.tables.mapping.ColumnVector; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.client.tables.mapping.PartitionBy; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; import lombok.Data; import java.util.Date; diff --git a/examples/src/main/java/com/datastax/astra/client/tables/AaronSample.java b/examples/src/main/java/com/datastax/astra/client/tables/AaronSample.java new file mode 100644 index 00000000..667fdc82 --- /dev/null +++ b/examples/src/main/java/com/datastax/astra/client/tables/AaronSample.java @@ -0,0 +1,38 @@ +package com.datastax.astra.client.tables; + +import com.datastax.astra.client.core.query.SortOrder; +import com.datastax.astra.client.tables.mapping.Column; +import com.datastax.astra.client.tables.mapping.EntityTable; +import com.datastax.astra.client.tables.mapping.PartitionBy; +import com.datastax.astra.client.tables.mapping.PartitionSort; + +import java.time.Instant; +import java.util.UUID; + +public class AaronSample { + + @EntityTable("latest_videos") + public static class LatestVideoTableEntity { + + @PartitionBy(0) + @Column(name = "yyyymmdd") + private String yyyymmdd; + + @PartitionSort(position = 1, order = SortOrder.DESCENDING) + @Column(name = "added_date") + private Instant addedDate; + + @PartitionSort(position = 2, order = SortOrder.ASCENDING) + @Column(name = "videoid") + private UUID videoId; + + @Column(name = "name") + private String name; + + @Column(name = "preview_image_location") + private String previewImageLocation; + + @Column(name = "userid") + private UUID userId; + } +} diff --git a/langchain4j-astradb/pom.xml b/langchain4j-astradb/pom.xml index 38b9f88e..695c3556 100644 --- a/langchain4j-astradb/pom.xml +++ b/langchain4j-astradb/pom.xml @@ -12,7 +12,8 @@ - 1.0.0-beta2 + 1.0.0-beta4 + 1.0.0-rc1 @@ -21,7 +22,7 @@ dev.langchain4j langchain4j-core - ${langchain4j.version} + ${langchain4j-rc.version} @@ -47,7 +48,7 @@ dev.langchain4j langchain4j-core - ${langchain4j.version} + ${langchain4j-rc.version} tests test-jar test @@ -61,13 +62,13 @@ dev.langchain4j langchain4j - ${langchain4j.version} + ${langchain4j-rc.version} test dev.langchain4j langchain4j-open-ai - ${langchain4j.version} + ${langchain4j-rc.version} test From 9945f4b99131f246bf26a73782787aa58c4cf6ef Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Wed, 25 Jun 2025 16:20:43 +0200 Subject: [PATCH 2/6] Update table support --- .../datastax/astra/test/integration/TableGAIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java index 4f0a1a64..c682a6b9 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java @@ -45,7 +45,7 @@ public class TableGAIntegrationTest { public static final String ASTRA_DB_TOKEN = - "AstraCS:PNfjXcyImIviUnrquSdiwlGq:8fa09440482105a921acf86d1ae6e70ebcae9ff2c5e42be62a1b0d451680d055"; + "1"; public static final String DB_URL_NON_VECTOR = "https://f9754177-52e2-4b66-935e-78cfd0be0042-us-west-2.apps.astra-dev.datastax.com"; public static final String DB_URL_VECTOR = From 8f73be1c7b4aecc87e3a05f7685629b80cea603d Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Fri, 4 Jul 2025 15:58:54 +0200 Subject: [PATCH 3/6] Update README.MD --- README.MD | 101 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/README.MD b/README.MD index 6bf11965..08371c09 100644 --- a/README.MD +++ b/README.MD @@ -4,18 +4,6 @@ [![License Apache2](https://img.shields.io/hexpm/l/plug.svg)](http://www.apache.org/licenses/LICENSE-2.0) [![Maven Central](https://img.shields.io/maven-central/v/com.datastax.astra/astra-db-java)](https://search.maven.org/artifact/com.datastax.astra/astra-db-java) -[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=clun_db-java) -[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=clun_astra-db-java) -[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=clun_astra-db-java) - -[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=bugs)](https://sonarcloud.io/summary/new_code?id=clun_astra-db-java) -[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=vulnerabilities)](https://sonarcloud.io/summary/overall?id=clun_astra-db-java) -[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=clun_astra-db-java) - -[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=ncloc)](https://sonarcloud.io/summary/new_code?id=clun_astra-db-java) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=clun_astra-db-java&metric=coverage)](https://sonarcloud.io/summary/new_code?id=clun_astra-db-java) - - This client library provides a simplified way to interact with Data API for AstraDB or local instances. For detailed documentation, each operation comes with a detailed description and examples. - [`astra-db-ts`](https://github.com/datastax/astra-db-ts) is the equivalent for typescript @@ -37,7 +25,7 @@ You can build it locally and install it in your local repository. 3. [QuickStart with Local Instances]() 1. [Start Data Api with DSE](#31-start-data-api-with-dse) 2. [Start Data Api with HCD](#32-start-data-api-with-hcd) - 3. [Datq Api Information](#33-datq-api-information) + 3. [Data Api Information](#33-datq-api-information) 4. [Using Java client with Local Instance](#34-using-java-client-with-local-instance) 4. [What's Next](#4-whats-next) @@ -184,36 +172,36 @@ public class GettingStarted { ## 3. QuickStart with Local Instances -### 3.1. Start Data Api with DSE - -- Start the 2 containers with the following command: - -```console -docker-compose up -d -``` +> Prequisite. You need HCD, DSE or CASSANDRA running on your machine and listening on `9042`. One good way is to run HCD as a docker image following the instruction [here](https://github.com/stargate/data-api/tree/main/docker-compose). -### 3.2. Start Data Api with HCD +### 3.1 Start Data API +- Clone the repository ``` -docker-compose -f docker-compose-hcd.yml up -d +git clone git@github.com:stargate/data-api.git ``` -- Check the status of the containers with the following command: +- Access the folder and start the data API. Note that we position cassandra endpoint to `localhost` and datacenter to `dc1`. -```console -docker-compose ps +``` +cd data-api + +STARGATE_DATA_STORE_SAI_ENABLED=true \ +STARGATE_DATA_STORE_VECTOR_SEARCH_ENABLED=true \ +STARGATE_JSONAPI_OPERATIONS_VECTORIZE_ENABLED=true \ +STARGATE_DATA_STORE_IGNORE_BRIDGE=true \ +STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_LOCAL_DATACENTER=dc1 \ +STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_CASSANDRA_END_POINTS=localhost \ +QUARKUS_HTTP_ACCESS_LOG_ENABLED=FALSE \ +QUARKUS_LOG_LEVEL=INFO \ +JAVA_MAX_MEM_RATIO=75 \ +JAVA_INITIAL_MEM_RATIO=50 \ +GC_CONTAINER_OPTIONS="-XX:+UseG1GC" \ +JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" \ +mvn quarkus:dev -Dstargate.data-store.ignore-bridge=true -Dstargate.jsonapi.operations.vectorize-enabled=true -Dstargate.jsonapi.operations.database-config.local-datacenter=dc1 -Dquarkus.log.console.darken=2 -Dstargate.feature.flags.tables=true -Dstargate.jsonapi.operations.extend-error=true -Dstargate.feature.flags.reranking=true ``` -### 3.3. Datq Api Information - -> _Output_ -> ```console -> NAME IMAGE COMMAND -> astra-db-java-coordinator-1 stargateio/coordinator-dse-next:v2.1.0-BETA-9 "./starctl" -> astra-db-java-jsonapi-1 stargateio/jsonapi:v1.0.6 -> ``` - -- Here are the information to connect to the local instance: +- To check the Data API is running | Field | Description | |--------------------------------------------|-----------------------------------------------------------------------------------------| @@ -231,21 +219,46 @@ docker-compose ps | **Data API Endpoint** | `/v1/{namespace}` | Interact with collections of a namespace | | **Token Header Key** | `/v1/{namespace}/{collection}` |Interact with documents of a collection | -- Sample curl to create a namespace: +- Create a keyspace call `default_keyspace` ```console -curl -X 'POST' \ - 'http://localhost:8181/v1' \ - -H 'accept: application/json' \ - -H 'Token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ - -H 'Content-Type: application/json' \ - -d '{ - "createNamespace": { - "name": "default_keyspace" +curl --location 'http://localhost:8181//v1' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data '{"createKeyspace":{"name":"default_keyspace"}}' +``` + +- Create a collection with CURL + +``` +curl --location 'http://localhost:8181//v1/default_keyspace' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data '{ + "createCollection": { + "name": "collection_jeremy", + "options": { + "indexing": { + "allow": [ + "property1", + "property2" + ] + }, + "vector": { + "dimension": 5, + "metric": "cosine" + } + } } }' ``` + + + + + + ### 3.4. Using Java client with Local Instance ```java From e5ac40e3df0de1998966b2fedc79097eb1a98d4c Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Fri, 4 Jul 2025 16:11:08 +0200 Subject: [PATCH 4/6] Update README.MD --- README.MD | 127 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 110 insertions(+), 17 deletions(-) diff --git a/README.MD b/README.MD index 08371c09..bfdba4e8 100644 --- a/README.MD +++ b/README.MD @@ -22,13 +22,8 @@ You can build it locally and install it in your local repository. 2. [Create a Database](#22-create-a-database) 3. [Get your credentials](#23-get-your-credentials) 4. [Create a new project and add the dependency](#24-create-a-new-project-and-add-the-dependency) -3. [QuickStart with Local Instances]() - 1. [Start Data Api with DSE](#31-start-data-api-with-dse) - 2. [Start Data Api with HCD](#32-start-data-api-with-hcd) - 3. [Data Api Information](#33-datq-api-information) - 4. [Using Java client with Local Instance](#34-using-java-client-with-local-instance) +3. [QuickStart with Local Instances](#3-quickstart-with-local-instances) 4. [What's Next](#4-whats-next) - ## 1. Installation @@ -219,7 +214,7 @@ mvn quarkus:dev -Dstargate.data-store.ignore-bridge=true -Dstargate.jsonapi.oper | **Data API Endpoint** | `/v1/{namespace}` | Interact with collections of a namespace | | **Token Header Key** | `/v1/{namespace}/{collection}` |Interact with documents of a collection | -- Create a keyspace call `default_keyspace` +- Create a keyspace called `default_keyspace` ```console curl --location 'http://localhost:8181//v1' \ @@ -228,38 +223,136 @@ curl --location 'http://localhost:8181//v1' \ --data '{"createKeyspace":{"name":"default_keyspace"}}' ``` -- Create a collection with CURL +- Create a collection `person` with CURL (indexing) -``` +```console curl --location 'http://localhost:8181//v1/default_keyspace' \ --header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ --header 'Content-Type: application/json' \ --data '{ "createCollection": { - "name": "collection_jeremy", + "name": "collection_person", "options": { "indexing": { "allow": [ - "property1", - "property2" + "firstname", + "lastname" ] - }, - "vector": { - "dimension": 5, - "metric": "cosine" } } } }' ``` +- List my collection it should be there + +```console +curl --location 'http://localhost:8181//v1/default_keyspace' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data '{ + "findCollections": {} +}' +``` +- Inserts a few documents + +```console +curl --location 'http://localhost:8181/v1/default_keyspace/collection_person' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "insertMany": { + "documents": [ + { + "_id": 1, + "firstname": "Lucas", + "lastname": "Hernandez", + "age": 22 + }, + { + "_id": 2, + "firstname": "Antoine", + "lastname": "Griezmann", + "age": 25 + }, + { + "_id": 3, + "firstname": "N'\''Golo", + "lastname": "Kanté", + "age": 29 + }, + { + "_id": 4, + "firstname": "Tanguy", + "lastname": "Ndombele", + "age": 24 + }, + { + "_id": 5, + "firstname": "Raphaël", + "lastname": "Varane", + "age": 10 + }, + { + "_id": 6, + "firstname": "Hugo", + "lastname": "Lloris", + "age": 41 + }, + { + "_id": 7, + "firstname": "Olivier", + "lastname": "Giroud", + "age": 36 + } + ] + } +}' + +``` +- Search on Valid property +```console +curl --location 'http://localhost:8181/v1/default_keyspace/collection_person' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "find": { + "filter": { + "lastname": "Varane" + }, + "projection": { + "lastname": true, + "firstname": true + }, + "sort": {"lastname":-1} + } +}' +``` +- Search on inValid property (exception expected) +```console +curl --location 'http://localhost:8181/v1/default_keyspace/collection_person' \ +--header 'token: Cassandra:Y2Fzc2FuZHJh:Y2Fzc2FuZHJh' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "find": { + "filter": { + "age": 24 + }, + "projection": { + "lastname": true, + "firstname": true + }, + "sort": {"lastname":-1} + } +}' +``` -### 3.4. Using Java client with Local Instance +### Using Java client with Local Instance ```java public class QuickStartLocal { From 51136637a25417d7b0f29f6cfa0d773d38f4d50c Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Tue, 15 Jul 2025 09:12:01 +0200 Subject: [PATCH 5/6] update table --- TEST.MD | 55 ++++ astra-db-java-tools/pom.xml | 2 +- .../rag/ingestion/RagIngestionConfig.java | 26 +- .../loader/rag/ingestion/RagIngestionJob.java | 18 +- .../tool/loader/rag/sources/RagSource.java | 20 +- .../tool/loader/rag/stores/RagStore.java | 42 +-- astra-db-java/pom.xml | 2 +- .../astra/client/admin/AstraDBAdmin.java | 10 + .../astra/client/admin/DatabaseAdmin.java | 10 +- .../commands/AstraAvailableRegionInfo.java | 8 + .../AstraFindAvailableRegionsOptions.java | 15 + .../options/ListCollectionOptions.java | 19 ++ .../definition/documents/types/TimeUUID.java | 128 ++++++++ .../definition/documents/types/UUIDv6.java | 9 +- .../core/vectorize/SupportModelStatus.java | 16 +- .../astra/client/databases/Database.java | 275 +++++++++++++++++- .../tables/commands/AlterTableAddColumns.java | 43 ++- .../tables/commands/AlterTypeAddFields.java | 58 ++++ .../tables/commands/AlterTypeOperation.java | 87 ++++++ .../commands/AlterTypeRenameFields.java | 44 +++ .../commands/options/AlterTypeOptions.java | 56 ++++ .../commands/options/CreateTypeOptions.java | 77 +++++ .../commands/options/DropTypeOptions.java | 74 +++++ .../commands/options/ListTypesOptions.java | 58 ++++ .../results/TableInsertManyResult.java | 4 +- .../results/TableInsertOneResult.java | 6 +- .../tables/definition/TableDefinition.java | 50 ++-- ...nition.java => TableColumnDefinition.java} | 23 +- ...a => TableColumnDefinitionApiSupport.java} | 5 +- ...st.java => TableColumnDefinitionList.java} | 16 +- ...Map.java => TableColumnDefinitionMap.java} | 16 +- ...Set.java => TableColumnDefinitionSet.java} | 16 +- .../TableColumnDefinitionUserDefined.java | 59 ++++ ....java => TableColumnDefinitionVector.java} | 16 +- ...Mapper.java => TableColumnTypeMapper.java} | 72 ++--- ...ColumnTypes.java => TableColumnTypes.java} | 9 +- .../types/TableDataAPIUserDefinedType.java | 33 +++ .../types/TableUserDefinedType.java | 40 +++ .../types/TableUserDefinedTypeDefinition.java | 203 +++++++++++++ .../types/TableUserDefinedTypeDescriptor.java | 85 ++++++ .../types/TableUserDefinedTypeField.java | 71 +++++ .../TableUserDefinedTypeFieldDefinition.java | 99 +++++++ ...bleUserDefinedTypeFieldDefinitionList.java | 69 +++++ ...ableUserDefinedTypeFieldDefinitionMap.java | 78 +++++ ...ableUserDefinedTypeFieldDefinitionSet.java | 68 +++++ .../TableUserDefinedTypeFieldTypeMapper.java | 122 ++++++++ .../types/TableUserDefinedTypeFieldTypes.java | 183 ++++++++++++ .../astra/client/tables/mapping/Column.java | 21 +- .../client/tables/mapping/ColumnVector.java | 1 - .../astra/internal/api/DataAPIStatus.java | 6 +- .../reflection/EntityBeanDefinition.java | 122 ++++++-- .../reflection/EntityFieldDefinition.java | 16 +- .../internal/serdes/DatabaseSerializer.java | 6 +- .../collections/TimeUUIDSerializer.java | 61 ++++ .../UdtDefinitionShortSerializer.java | 66 +++++ .../tables/AlterTypeOperationSerializer.java | 78 +++++ .../serdes/tables/ColumnTypeDeserializer.java | 8 +- .../serdes/tables/ColumnTypeSerializer.java | 8 +- .../internal/serdes/tables/RowSerializer.java | 6 +- .../tables/UdtFieldTypeDeserializer.java | 51 ++++ .../serdes/tables/UdtFieldTypeSerializer.java | 57 ++++ .../test/integration/AbstractDataAPITest.java | 5 + .../integration/AbstractDatabaseTest.java | 14 +- .../integration/TableGAIntegrationTest.java | 117 ++++++-- .../astra/Astra_05_TableITTest.java | 4 +- .../astra/DemoAstraDevVectorize.java | 47 +++ .../local/Local_20_TableITTest.java | 80 +++-- .../Local_21_TableCollectionIndexTest.java | 12 +- .../astra/test/model/SampleUdtAddress.java | 26 ++ .../model/TableCompositeAnnotatedRow.java | 4 +- ...TableEntityGameWithAnnotationAllHints.java | 11 +- .../test/model/TableSimpleAnnotatedRow.java | 6 +- .../test/unit/QuickStartTablesLocal.java | 4 +- .../astra/test/unit/WorkWithOptions.java | 14 +- astra-sdk-devops/pom.xml | 2 +- .../dtsx/astra/sdk/db/DbRegionsClient.java | 9 +- .../astra/sdk/db/domain/FilterByOrgType.java | 11 +- examples/pom.xml | 2 +- .../main/java/com/datastax/astra/Book.java | 4 +- .../astra/client/database/CreateTable.java | 14 +- .../client/tables/FindWithVectorize.java | 5 +- .../tables/GameWithAnnotationAllHints.java | 11 +- .../astra/client/tables/InsertManyRows.java | 8 - .../client/tables/InsertOneWithVectorize.java | 5 +- .../astra/client/tables/InsertRow.java | 5 +- .../astra/client/tables/WorkingWithRows.java | 9 +- .../astra/docs/AAronUserCollection.java | 78 +++++ .../datastax/astra/docs/UpdateOneExample.java | 14 +- langchain4j-astradb/pom.xml | 17 +- .../memory/tables/AstraDbTableChatMemory.java | 20 +- pom.xml | 2 +- 91 files changed, 3132 insertions(+), 430 deletions(-) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/TimeUUID.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeAddFields.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeOperation.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeRenameFields.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/AlterTypeOptions.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/CreateTypeOptions.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/DropTypeOptions.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/ListTypesOptions.java rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinition.java => TableColumnDefinition.java} (82%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinitionApiSupport.java => TableColumnDefinitionApiSupport.java} (95%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinitionList.java => TableColumnDefinitionList.java} (73%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinitionMap.java => TableColumnDefinitionMap.java} (79%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinitionSet.java => TableColumnDefinitionSet.java} (74%) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionUserDefined.java rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnDefinitionVector.java => TableColumnDefinitionVector.java} (84%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnTypeMapper.java => TableColumnTypeMapper.java} (53%) rename astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/{ColumnTypes.java => TableColumnTypes.java} (95%) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableDataAPIUserDefinedType.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedType.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDefinition.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDescriptor.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeField.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinition.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionList.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionMap.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionSet.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypeMapper.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypes.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/TimeUUIDSerializer.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/UdtDefinitionShortSerializer.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/AlterTypeOperationSerializer.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeDeserializer.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeSerializer.java create mode 100644 astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java create mode 100644 astra-db-java/src/test/java/com/datastax/astra/test/model/SampleUdtAddress.java create mode 100644 examples/src/main/java/com/datastax/astra/docs/AAronUserCollection.java diff --git a/TEST.MD b/TEST.MD index d001df69..f49ab110 100644 --- a/TEST.MD +++ b/TEST.MD @@ -1,3 +1,58 @@ +## Work with local HCD + +### Installation + +1. Prerequisites: + +- Docker +- Docker Compose +- Java 17+ +- Maven + +2. Make sure you have the `DATA_API_FOLDER` environment variable set to the root of your local Data API project. + +``` +export DATA_API_FOLDER=/Users/cedricklunven/dev/datastax/JAVA/data-api +``` + +### Start + +- Start HCD + +Locate the `docker-compose` folder and start with `-d`, you do not need the API + +```bash +cd $DATA_API_FOLDER/docker-compose` && start_hcd.sh -d +``` + +- Start the Data API + +```bash +cd $DATA_API_FOLDER +STARGATE_DATA_STORE_SAI_ENABLED=true \ +STARGATE_DATA_STORE_VECTOR_SEARCH_ENABLED=true \ +STARGATE_JSONAPI_OPERATIONS_VECTORIZE_ENABLED=true \ +STARGATE_DATA_STORE_IGNORE_BRIDGE=true \ +STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_LOCAL_DATACENTER=dc1 \ +STARGATE_JSONAPI_OPERATIONS_DATABASE_CONFIG_CASSANDRA_END_POINTS=localhost \ +QUARKUS_HTTP_ACCESS_LOG_ENABLED=FALSE \ +QUARKUS_LOG_LEVEL=INFO \ +JAVA_MAX_MEM_RATIO=75 \ +JAVA_INITIAL_MEM_RATIO=50 \ +GC_CONTAINER_OPTIONS="-XX:+UseG1GC" \ +JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" \ +mvn quarkus:dev -Dstargate.data-store.ignore-bridge=true -Dstargate.jsonapi.operations.vectorize-enabled=true -Dstargate.jsonapi.operations.database-config.local-datacenter=dc1 -Dquarkus.log.console.darken=2 -Dstargate.feature.flags.tables=true -Dstargate.jsonapi.operations.extend-error=true -Dstargate.feature.flags.reranking=true +``` + +- Access HCD with cqlh + +```asciidoc +docker run -it --rm --network container:$(docker ps | grep hcd | cut -b 1-12) cassandra:latest cqlsh -u cassandra -p cassandra +``` + +```asciidoc +podman exec -it $(podman ps | grep hcd | cut -b 1-12) cqlsh -u cassandra -p cassandra +``` ## Run against Local HCD Instance (_to run locally your must have the data api running locally on op of HCD or DSE_) diff --git a/astra-db-java-tools/pom.xml b/astra-db-java-tools/pom.xml index 05f99be7..a3d33f92 100644 --- a/astra-db-java-tools/pom.xml +++ b/astra-db-java-tools/pom.xml @@ -7,7 +7,7 @@ com.datastax.astra astra-db-java-parent - 2.0.0 + 2.1.0-SNAPSHOT diff --git a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionConfig.java b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionConfig.java index 2d47faa6..4c60de83 100644 --- a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionConfig.java +++ b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionConfig.java @@ -1,6 +1,6 @@ package com.datastax.astra.tool.loader.rag.ingestion; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.client.tables.mapping.PartitionBy; @@ -17,46 +17,46 @@ public class RagIngestionConfig { @PartitionBy(0) UUID uid = UUID.randomUUID(); - @Column(name = "name", type = ColumnTypes.TEXT) + @Column(name = "name", type = TableColumnTypes.TEXT) String name; - @Column(name = "description", type = ColumnTypes.TEXT) + @Column(name = "description", type = TableColumnTypes.TEXT) String description; // Splitting - @Column(name = "splitter", type = ColumnTypes.TEXT) + @Column(name = "splitter", type = TableColumnTypes.TEXT) String splitter; - @Column(name = "chunk_size", type = ColumnTypes.INT) + @Column(name = "chunk_size", type = TableColumnTypes.INT) Integer chunkSize; - @Column(name = "chunk_overlap", type = ColumnTypes.INT) + @Column(name = "chunk_overlap", type = TableColumnTypes.INT) Integer chunkOverlap; // Embedding - @Column(name = "embedding_model", type = ColumnTypes.TEXT) + @Column(name = "embedding_model", type = TableColumnTypes.TEXT) String embeddingModel; - @Column(name = "embedding_provider", type = ColumnTypes.TEXT) + @Column(name = "embedding_provider", type = TableColumnTypes.TEXT) String embeddingProvider; - @Column(name = "embedding_dimension", type = ColumnTypes.INT) + @Column(name = "embedding_dimension", type = TableColumnTypes.INT) Integer embeddingDimension; // Post Processing - @Column(name = "context_before", type = ColumnTypes.INT) + @Column(name = "context_before", type = TableColumnTypes.INT) Integer contextBefore = 1; - @Column(name = "context_after", type = ColumnTypes.INT) + @Column(name = "context_after", type = TableColumnTypes.INT) Integer contextAfter = 2; - @Column(name = "enable_nlp_filter", type = ColumnTypes.BOOLEAN) + @Column(name = "enable_nlp_filter", type = TableColumnTypes.BOOLEAN) boolean nlp; - @Column(name = "enable_hyde", type = ColumnTypes.BOOLEAN) + @Column(name = "enable_hyde", type = TableColumnTypes.BOOLEAN) boolean hyde; public RagIngestionConfig withEmbedding(RagEmbeddingsModels model) { diff --git a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionJob.java b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionJob.java index 33db4fb5..af9eae0b 100644 --- a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionJob.java +++ b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/ingestion/RagIngestionJob.java @@ -1,7 +1,7 @@ package com.datastax.astra.tool.loader.rag.ingestion; import com.datastax.astra.client.core.query.SortOrder; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.client.tables.mapping.PartitionBy; @@ -18,29 +18,29 @@ public class RagIngestionJob { public static final String TABLE_NAME = "rag_jobs"; @PartitionBy(0) - @Column(name ="source_id", type=ColumnTypes.UUID) + @Column(name ="source_id", type= TableColumnTypes.UUID) UUID sourceId; @PartitionSort(position = 0, order=SortOrder.ASCENDING) - @Column(name ="uid", type=ColumnTypes.UUID) + @Column(name ="uid", type= TableColumnTypes.UUID) UUID uid = UUID.randomUUID(); - @Column(name ="config_id", type=ColumnTypes.UUID) + @Column(name ="config_id", type= TableColumnTypes.UUID) UUID configId; - @Column(name ="start", type=ColumnTypes.TIMESTAMP) + @Column(name ="start", type= TableColumnTypes.TIMESTAMP) Instant start = Instant.now(); - @Column(name ="stop", type=ColumnTypes.TIMESTAMP) + @Column(name ="stop", type= TableColumnTypes.TIMESTAMP) Instant stop; - @Column(name ="elapsed", type=ColumnTypes.BIGINT) + @Column(name ="elapsed", type= TableColumnTypes.BIGINT) Long elapsed; - @Column(name ="chunk_count", type=ColumnTypes.INT) + @Column(name ="chunk_count", type= TableColumnTypes.INT) Integer chunkCount = 0; - @Column(name ="token_count", type=ColumnTypes.INT) + @Column(name ="token_count", type= TableColumnTypes.INT) Integer tokenCount = 0; } diff --git a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/sources/RagSource.java b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/sources/RagSource.java index 8a074541..2f92585b 100644 --- a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/sources/RagSource.java +++ b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/sources/RagSource.java @@ -1,6 +1,6 @@ package com.datastax.astra.tool.loader.rag.sources; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.client.tables.mapping.PartitionBy; @@ -12,9 +12,9 @@ import java.util.Map; import java.util.UUID; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.BOOLEAN; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.MAP; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.BOOLEAN; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.MAP; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; @Data @NoArgsConstructor @@ -26,10 +26,10 @@ public class RagSource { @PartitionBy(0) UUID uid = java.util.UUID.randomUUID(); - @Column(name ="created_at", type= ColumnTypes.TIMESTAMP) + @Column(name ="created_at", type= TableColumnTypes.TIMESTAMP) Instant createdAt = Instant.now(); - @Column(name ="created_by", type=ColumnTypes.UUID) + @Column(name ="created_by", type= TableColumnTypes.UUID) UUID createdBy; @Column(name ="name", type= TEXT) @@ -58,22 +58,22 @@ public class RagSource { @Column(name ="error_message", type= TEXT) String errorMessage; - @Column(name ="last_loaded", type=ColumnTypes.TIMESTAMP) + @Column(name ="last_loaded", type= TableColumnTypes.TIMESTAMP) Instant lastLoaded; - @Column(name ="expiration_date", type=ColumnTypes.TIMESTAMP) + @Column(name ="expiration_date", type= TableColumnTypes.TIMESTAMP) Instant expirationDate; @Column(name ="metadata", type= MAP, keyType = TEXT, valueType = TEXT) Map metadata = new HashMap<>(); - @Column(name ="binary_data", type=ColumnTypes.BLOB) + @Column(name ="binary_data", type= TableColumnTypes.BLOB) byte[] binaryData; @Column(name ="binary_data_md5", type= TEXT) String binaryDataMD5; - @Column(name ="binary_data_size", type=ColumnTypes.BIGINT) + @Column(name ="binary_data_size", type= TableColumnTypes.BIGINT) Long binaryDataSize; @Column(name ="is_text", type= BOOLEAN) diff --git a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/stores/RagStore.java b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/stores/RagStore.java index 4c685166..4876a3fa 100644 --- a/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/stores/RagStore.java +++ b/astra-db-java-tools/src/main/java/com/datastax/astra/tool/loader/rag/stores/RagStore.java @@ -5,8 +5,8 @@ import com.datastax.astra.client.core.vector.SimilarityMetric; import com.datastax.astra.client.core.vectorize.VectorServiceOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.tool.loader.rag.ingestion.RagEmbeddingsModels; @@ -26,59 +26,59 @@ public class RagStore { public static final String INDEX_NAME_PREFIX = "idx_embeddings_"; - @Column(name ="source_id", type=ColumnTypes.UUID) + @Column(name ="source_id", type= TableColumnTypes.UUID) UUID sourceId; - @Column(name ="job_id", type=ColumnTypes.UUID) + @Column(name ="job_id", type= TableColumnTypes.UUID) UUID jobId; // Could be a metadata later on - @Column(name ="contact°id", type=ColumnTypes.UUID) + @Column(name ="contact°id", type= TableColumnTypes.UUID) UUID contactId; - @Column(name ="created_at", type= ColumnTypes.TIMESTAMP) + @Column(name ="created_at", type= TableColumnTypes.TIMESTAMP) Instant createdAt = Instant.now(); - @Column(name ="chunk_idx", type= ColumnTypes.INT) + @Column(name ="chunk_idx", type= TableColumnTypes.INT) Integer chunkIdx = 0; - @Column(name ="chunk_md5", type= ColumnTypes.TEXT) + @Column(name ="chunk_md5", type= TableColumnTypes.TEXT) String chunkMd5; - @Column(name ="embedded", type= ColumnTypes.TEXT) + @Column(name ="embedded", type= TableColumnTypes.TEXT) String embedded; - @Column(name ="language", type= ColumnTypes.TEXT) + @Column(name ="language", type= TableColumnTypes.TEXT) String language; - @Column(name ="embeddings", type= ColumnTypes.VECTOR) + @Column(name ="embeddings", type= TableColumnTypes.VECTOR) DataAPIVector embeddings; - @Column(name ="context", type= ColumnTypes.TEXT) + @Column(name ="context", type= TableColumnTypes.TEXT) String context; - @Column(name ="questions", type= ColumnTypes.SET, valueType = ColumnTypes.TEXT) + @Column(name ="questions", type= TableColumnTypes.SET, valueType = TableColumnTypes.TEXT) Set questions; - @Column(name ="metadata", type= ColumnTypes.SET, valueType = ColumnTypes.TEXT) + @Column(name ="metadata", type= TableColumnTypes.SET, valueType = TableColumnTypes.TEXT) Map metadata; - @Column(name ="tags", type= ColumnTypes.SET, valueType = ColumnTypes.TEXT) + @Column(name ="tags", type= TableColumnTypes.SET, valueType = TableColumnTypes.TEXT) Set tags; public static TableDefinition getTableDefinition(int dimension, VectorServiceOptions vso) { return new TableDefinition() - .addColumn("source_id", ColumnTypes.UUID) - .addColumn("job_id", ColumnTypes.UUID) + .addColumn("source_id", TableColumnTypes.UUID) + .addColumn("job_id", TableColumnTypes.UUID) .addColumnTimestamp("created_at") .addColumnInt("chunk_idx") .addColumnText("chunk_md5") .addColumnText("embedded") .addColumnText("context") .addColumnText("language") - .addColumnSet("questions", ColumnTypes.TEXT) - .addColumnMap("metadata", ColumnTypes.TEXT, ColumnTypes.TEXT) - .addColumnSet("tags", ColumnTypes.TEXT) - .addColumnVector("embeddings", new ColumnDefinitionVector() + .addColumnSet("questions", TableColumnTypes.TEXT) + .addColumnMap("metadata", TableColumnTypes.TEXT, TableColumnTypes.TEXT) + .addColumnSet("tags", TableColumnTypes.TEXT) + .addColumnVector("embeddings", new TableColumnDefinitionVector() .dimension(dimension) .metric(SimilarityMetric.COSINE) .service(vso)) // nullable diff --git a/astra-db-java/pom.xml b/astra-db-java/pom.xml index a035234b..766f60f0 100644 --- a/astra-db-java/pom.xml +++ b/astra-db-java/pom.xml @@ -10,7 +10,7 @@ com.datastax.astra astra-db-java-parent - 2.0.0 + 2.1.0-SNAPSHOT diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java index 37fc4daf..564cc809 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java @@ -130,6 +130,16 @@ public AstraDBAdmin(AdminOptions options) { // -- Regions --- // -------------------- + /** + * Find all available regions for vector databases. + * This method will return all regions, including the ones that are not enabled for the current organization. + * + * @param options + * options to filter the regions, such as onlyOrgEnabledRegions + * + * @return + * list of available regions + */ public List findAvailableRegions(AstraFindAvailableRegionsOptions options) { FilterByOrgType filterByOrgType = FilterByOrgType.ENABLED; /* diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java index b4500f9c..d1295f38 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/DatabaseAdmin.java @@ -80,6 +80,9 @@ public interface DatabaseAdmin { * that provide embeddings for text, images, or other data types. This method returns a map of provider names to * {@link EmbeddingProvider} instances, allowing applications to access and utilize the embedding services. * + * @param options + * Defines options for the operation, such as filtering by model status or other criteria. + * *

Example usage:

*
      * {@code
@@ -120,11 +123,16 @@ default FindEmbeddingProvidersResult findEmbeddingProviders() {
      */
     FindRerankingProvidersResult findRerankingProviders(FindRerankingProvidersOptions options);
 
+    /**
+     * Backward compatible method to retrieve the list of reranking providers available in the current database.
+     *
+     * @return
+     *     list of available providers with default options
+     */
     default FindRerankingProvidersResult findRerankingProviders() {
         return findRerankingProviders(null);
     }
 
-
     /**
      * Asynchronously retrieves a stream of keyspaces names available in the current database. This method facilitates
      * non-blocking operations by allowing the application to continue executing other tasks while the list of keyspace
diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java
index 01df003a..281493e5 100644
--- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java
+++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/commands/AstraAvailableRegionInfo.java
@@ -23,6 +23,14 @@
 import com.dtsx.astra.sdk.db.domain.DatabaseRegionServerless;
 import lombok.Data;
 
+/**
+ * Information about an available region for Astra DB.
+ * 

+ * This class encapsulates details about a specific region where Astra DB can be deployed, + * including the region name, cloud provider, display name, zone, classification, and whether + * the region is enabled or reserved for qualified users. + *

+ */ @Data public class AstraAvailableRegionInfo { diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java index fc397c2b..710146de 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/AstraFindAvailableRegionsOptions.java @@ -22,11 +22,26 @@ import lombok.Data; +/** + * Options for finding available regions in Astra. + * This class allows users to specify whether to filter regions + * based on organization enabled status. + */ @Data public class AstraFindAvailableRegionsOptions { + /** + * Flag to indicate whether to return only regions enabled for the organization. + * Default is true, meaning only organization enabled regions will be returned. + */ private boolean onlyOrgEnabledRegions = true; + /** + * Constructs an instance of AstraFindAvailableRegionsOptions with default settings. + * + * @param onlyOrgEnabledRegions + * If true, only regions enabled for the organization will be returned. + */ public AstraFindAvailableRegionsOptions onlyOrgEnabledRegions(boolean onlyOrgEnabledRegions) { this.onlyOrgEnabledRegions = onlyOrgEnabledRegions; return this; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/options/ListCollectionOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/options/ListCollectionOptions.java index 635f06f4..c93871c7 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/options/ListCollectionOptions.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/commands/options/ListCollectionOptions.java @@ -21,19 +21,38 @@ */ import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.internal.serdes.collections.DocumentSerializer; +import lombok.Setter; +import lombok.experimental.Accessors; import static com.datastax.astra.client.core.commands.CommandType.COLLECTION_ADMIN; /** * Options for the listCollection operation. */ +@Setter +@Accessors(fluent = true, chain = true) public class ListCollectionOptions extends BaseOptions { + /** + * The keyspace to use for the database. + */ + String keyspace = DataAPIClientOptions.DEFAULT_KEYSPACE; + /** * Default constructor. */ public ListCollectionOptions() { super(null, COLLECTION_ADMIN, new DocumentSerializer(), null); } + + /** + * Gets keyspace + * + * @return value of keyspace + */ + public String getKeyspace() { + return keyspace; + } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/TimeUUID.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/TimeUUID.java new file mode 100644 index 00000000..70c3749a --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/TimeUUID.java @@ -0,0 +1,128 @@ +package com.datastax.astra.client.collections.definition.documents.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.internal.serdes.collections.TimeUUIDSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.uuid.Generators; +import com.fasterxml.uuid.impl.UUIDUtil; + +import java.time.Instant; +import java.util.UUID; + +/** + * Represents a time-based UUID (Version 1). + *

+ * This class encapsulates a UUID that is generated based on the current time, + * allowing for the extraction of the timestamp embedded within the UUID. + *

+ * + *

Example usage:

+ *
+ * {@code
+ * TimeUUID timeUUID = new TimeUUID();
+ * Instant timestamp = timeUUID.readInstant();
+ * }
+ * 
+ */ +@JsonSerialize(using = TimeUUIDSerializer.class) +public class TimeUUID { + + /** + * UUID. + */ + private final UUID uuid; + + /** + * Default constructor. + */ + public TimeUUID() { + // Create a time-based (Version-1) UUID generator + this(Generators.timeBasedGenerator().generate()); + } + + /** + * Constructor. + * + * @param uuid + * uuid + */ + public TimeUUID(UUID uuid) { + this.uuid = uuid; + } + + /** + * Constructor. + * + * @param strUUID + * uuid + */ + public TimeUUID(String strUUID) { + this(UUID.fromString(strUUID)); + } + + /** + * Return the Java Utils UUID. + * + * @return + * uuid value + */ + public UUID toUUID() { + return uuid; + } + + /** + * Extract the hidden timestamp (100-nanosecond units since UUID epoch). + * + * @return the raw 60-bit timestamp value embedded in this UUIDv6 + */ + public long readTimeStamp() { + return UUIDUtil.extractTimestamp(uuid); + } + + /** + * Get the timestamp as an {@link Instant}. + * + * @return + * the timestamp as an Instant + */ + public Instant readInstant() { + return Instant.ofEpochMilli(readTimeStamp()); + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return toUUID().toString(); + } + + /** + * Generate from a string. + * + * @param strUUID + * uuid as a String + * @return + * an instance of UUIDv6 + */ + public static UUIDv6 fromString(String strUUID) { + return new UUIDv6(strUUID); + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java index 8ac45604..53550f5b 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/collections/definition/documents/types/UUIDv6.java @@ -20,6 +20,8 @@ * #L% */ +import com.datastax.astra.internal.serdes.collections.UUID6Serializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.uuid.Generators; import com.fasterxml.uuid.impl.UUIDUtil; @@ -29,6 +31,7 @@ /** * Materializing the UUIDv6 as a specialization class to drive serialization and deserialization. */ +@JsonSerialize(using = UUID6Serializer.class) public class UUIDv6 { /** @@ -78,7 +81,7 @@ public UUID toUUID() { * * @return the raw 60-bit timestamp value embedded in this UUIDv6 */ - public long getTimeStamp() { + public long readTimeStamp() { return UUIDUtil.extractTimestamp(uuid); } @@ -88,8 +91,8 @@ public long getTimeStamp() { * @return * the timestamp as an Instant */ - public Instant getInstant() { - return Instant.ofEpochMilli(getTimeStamp()); + public Instant readInstant() { + return Instant.ofEpochMilli(readTimeStamp()); } /** {@inheritDoc} */ diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java index 83335424..77e487bc 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/core/vectorize/SupportModelStatus.java @@ -28,5 +28,19 @@ * - END_OF_LIFE: The provider has reached its end of life and is no longer supported. */ public enum SupportModelStatus { - SUPPORTED,DEPRECATED, END_OF_LIFE + + /** + * The provider is currently supported and available for use. + */ + SUPPORTED, + + /** + * The provider is deprecated and may be removed in future versions. + */ + DEPRECATED, + + /** + * The provider has reached its end of life and is no longer supported. + */ + END_OF_LIFE } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java b/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java index 7c3b3040..025a3b93 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/databases/Database.java @@ -20,11 +20,11 @@ * #L% */ -import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.admin.AstraDBAdmin; import com.datastax.astra.client.admin.AstraDBDatabaseAdmin; import com.datastax.astra.client.admin.DataAPIDatabaseAdmin; import com.datastax.astra.client.admin.DatabaseAdmin; +import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.collections.Collection; import com.datastax.astra.client.collections.CollectionOptions; import com.datastax.astra.client.collections.commands.options.CreateCollectionOptions; @@ -39,14 +39,22 @@ import com.datastax.astra.client.exceptions.InvalidConfigurationException; import com.datastax.astra.client.tables.Table; import com.datastax.astra.client.tables.TableOptions; +import com.datastax.astra.client.tables.commands.AlterTypeOperation; +import com.datastax.astra.client.tables.commands.options.AlterTypeOptions; import com.datastax.astra.client.tables.commands.options.CreateTableOptions; +import com.datastax.astra.client.tables.commands.options.CreateTypeOptions; import com.datastax.astra.client.tables.commands.options.CreateVectorIndexOptions; import com.datastax.astra.client.tables.commands.options.DropTableIndexOptions; import com.datastax.astra.client.tables.commands.options.DropTableOptions; +import com.datastax.astra.client.tables.commands.options.DropTypeOptions; import com.datastax.astra.client.tables.commands.options.ListTablesOptions; +import com.datastax.astra.client.tables.commands.options.ListTypesOptions; import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.definition.TableDescriptor; import com.datastax.astra.client.tables.definition.rows.Row; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedType; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeDescriptor; import com.datastax.astra.client.tables.mapping.EntityTable; import com.datastax.astra.internal.api.AstraApiEndpoint; import com.datastax.astra.internal.command.AbstractCommandRunner; @@ -460,6 +468,15 @@ public List listCollectionNames() { * according to the provided options. */ public List listCollectionNames(ListCollectionOptions listCollectionOptions) { + // Keyspace is part of the database, a new temporary database object is required. + if (listCollectionOptions != null && Utils.hasLength(listCollectionOptions.getKeyspace())) { + String otherKeyspace = listCollectionOptions.getKeyspace(); + listCollectionOptions.keyspace(null); + return new Database( + this.rootEndpoint, + this.options.clone().keyspace(otherKeyspace)) + .listCollectionNames(listCollectionOptions); + } return runCommand(Command.create("findCollections"), listCollectionOptions) .getStatusKeyAsStringStream("collections") .toList(); @@ -521,6 +538,15 @@ public List listCollections() { * @return A {@link List} of {@link CollectionDescriptor} objects representing the collections that match the criteria. */ public List listCollections(ListCollectionOptions listCollectionOptions) { + // Keyspace is part of the database, a new temporary database object is required. + if (listCollectionOptions != null && Utils.hasLength(listCollectionOptions.getKeyspace())) { + String otherKeyspace = listCollectionOptions.getKeyspace(); + listCollectionOptions.keyspace(null); + return new Database( + this.rootEndpoint, + this.options.clone().keyspace(otherKeyspace)) + .listCollections(listCollectionOptions); + } Command findCollections = Command.create("findCollections") .withOptions(new Document().append("explain", true)); return runCommand(findCollections, listCollectionOptions) @@ -1175,6 +1201,248 @@ public Table getTable(Class rowClass) { return getTable(ann.value(), rowClass); } + // ------------------------------------- + // ---- Type and Object Mapping --- + // ------------------------------------- + + public TableUserDefinedTypeDefinition getType(Class rowClass) { + TableUserDefinedType ann = rowClass.getAnnotation(TableUserDefinedType.class); + if (ann == null) { + InvalidConfigurationException.throwErrorMissingAnnotation( + TableUserDefinedType.class.getSimpleName(), + rowClass.getName(), + "getType(rowClass)"); + } + + //FIX Es + return null; + } + + /** + * Creates a table using default options and runtime configurations. + * + * @param the type of the row objects that the table will hold + * @param rowClass the class representing the row type; must not be null + * @return the created table object + */ + public String getTypeName(Class rowClass) { + notNull(rowClass, "typeClass"); + TableUserDefinedType ann = rowClass.getAnnotation(TableUserDefinedType.class); + if (ann == null) { + throw new IllegalArgumentException("Class " + rowClass.getName() + + " is not annotated with @" + TableUserDefinedType.class.getName()); + } + if (!Utils.hasLength(ann.value())) { + throw new IllegalArgumentException("Annotation @Udt on class " + rowClass.getName() + " has no name"); + } + return ann.value(); + } + + // ------------------------------------- + // ---- List Types ---- + // ------------------------------------- + + /** + * Retrieves the details of all tables in the database with default options. + * + * @return A list of {@link TableUserDefinedTypeDescriptor} objects representing all tables in the database. + * + *

Example usage:

+ *
+     * {@code
+     * List types = listTypes();
+     * }
+     * 
+ */ + public List listTypes() { + return listTypes(null); + } + + /** + * Retrieves the details of all types in the database. + * + * @param listTypesOptions Options for filtering or configuring the types listing operation. + * @return A list of {@link TableUserDefinedTypeDescriptor} objects representing all tables in the database. + */ + public List listTypes(ListTypesOptions listTypesOptions) { + // Keyspace is part of the database, a new temporary database object is required. + if (listTypesOptions != null && Utils.hasLength(listTypesOptions.getKeyspace())) { + String otherKeyspace = listTypesOptions.getKeyspace(); + listTypesOptions.keyspace(null); + return new Database( + this.rootEndpoint, + this.options.clone().keyspace(otherKeyspace)) + .listTypes(listTypesOptions); + } + Command listTypes = Command + .create("listTypes") + .withOptions(new Document().append("explain", true)); + return runCommand(listTypes, listTypesOptions) + .getStatusKeyAsList("types", TableUserDefinedTypeDescriptor.class); + } + + // ------------------------------------- + // ---- Create Type ---- + // ------------------------------------- + + /** + * Creates a user defined type in the system with the specified parameters. + * + * @param typeName the name of the type to be created; must not be null or empty + * @param typeDefinition the schema definition of the type; must not be null + * @param createTypeOptions additional options for creating the type; optional, can be null + * @throws IllegalArgumentException if any mandatory argument is null or invalid + * + *

Example usage:

+ *
+     * {@code
+     * TypeDefinition typeDefinition = new TypeDefinition()
+     *  .addField("field1", FieldTypes.TEXT)
+     *  .addField("field2", FieldTypes.INT);
+     *
+     * db.createType("MyType", typeDefinition, new CreateTypeOptions());
+     * }
+     * 
+ */ + public void createType(String typeName, TableUserDefinedTypeDefinition typeDefinition, CreateTypeOptions createTypeOptions) { + hasLength(typeName, "typeName"); + notNull(typeDefinition, "typeDefinition"); + + // We are on a different keyspace, create the table on that keyspace + if (createTypeOptions != null && Utils.hasLength(createTypeOptions.getKeyspace())) { + String otherKeyspace = createTypeOptions.getKeyspace(); + createTypeOptions.keyspace(null); + new Database( + this.rootEndpoint, + this.options.clone().keyspace(otherKeyspace)) + .createType(typeName, typeDefinition, createTypeOptions); + } + + Command createType = Command + .create("createType") + .append("name", typeName) + .append("definition", typeDefinition); + if (createTypeOptions != null) { + createType.append("options", createTypeOptions); + } + runCommand(createType, createTypeOptions); + + } + + /** + * Creates a table with a default row type of {@code Row}. + * + * @param typeName the name of the table to be created; must not be null or empty + * @param tableUserDefinedTypeDefinition the schema definition of the type; must not be null + * + */ + public void createType(String typeName, TableUserDefinedTypeDefinition tableUserDefinedTypeDefinition) { + createType(typeName, tableUserDefinedTypeDefinition, new CreateTypeOptions().ifNotExists(true)); + } + + public void createType(Class UdtBean, CreateTypeOptions createTypeOptions) { + notNull(UdtBean, "udtDefinition"); + TableUserDefinedType ann = UdtBean.getAnnotation(TableUserDefinedType.class); + Command createTypeCmd = new Command("createType", EntityBeanDefinition.createTypeCommand(UdtBean)); + if (createTypeOptions != null) { + createTypeCmd.append("options", createTypeOptions); + } + runCommand(createTypeCmd); + } + + // ------------------------------------- + // ---- Drop Type ---- + // ------------------------------------- + + /** + * Deletes a type from the database. + * This method delegates to {@link #dropType(String, DropTypeOptions)} + * with default options. + * + * @param udtName + * the name of the type to be deleted; must not be null or empty. + * @throws IllegalArgumentException + * if {@code udtName} is null or empty. + * + *

Example usage:

+ *
+     * {@code
+     * database.dropType("exampleUdt");
+     * }
+     * 
+ */ + public void dropType(String udtName) { + dropType(udtName, null); + } + + /** + * Deletes a type (UDT) from the database with specific options. + * + * @param udtName + * the name of the user defined type to be deleted; must not be null or empty. + * @param dropTypeOptions + * the options to configure the type deletion operation; can be null. + * @throws IllegalArgumentException + * if {@code udtName} is null or empty. + * + *

Example usage:

+ *
+     * {@code
+     * DropTypeOptions options = new DropTypeOptions();
+     * database.dropType("exampleUdt", options);
+     * }
+     * 
+ */ + public void dropType(String udtName, DropTypeOptions dropTypeOptions) { + hasLength(udtName, "udtName"); + + // We are on a different keyspace, drop the table on a different keyspace + if (dropTypeOptions != null && Utils.hasLength(dropTypeOptions.getKeyspace())) { + String otherKeyspace = dropTypeOptions.getKeyspace(); + dropTypeOptions.keyspace(null); + new Database( + this.rootEndpoint, + this.options.clone().keyspace(otherKeyspace)) + .dropType(udtName, dropTypeOptions); + } else { + // Command on current keyspace + Command dropTypeCmd = Command + .create("dropType") + .append("name", udtName); + if (dropTypeOptions != null) { + dropTypeCmd.withOptions(dropTypeOptions); + } + runCommand(dropTypeCmd, dropTypeOptions); + } + } + + // ------------------------------------- + // ---- Alter Type ---- + // ------------------------------------- + + /** + * Performs an alteration operation on the table with default options. + * + *

This method delegates to {@link #alterType(String, AlterTypeOperation, AlterTypeOptions)} + * with {@code options} set to {@code null}. + * + * @param udtName + * name of the user defined type to be altered; must not be null or empty. + * @param operation + * the alteration operation to be performed; must not be {@code null}. + */ + public final void alterType(String udtName, AlterTypeOperation operation) { + alterType(udtName, operation, null); + } + + public final void alterType(String udtName, AlterTypeOperation operation, AlterTypeOptions alterTypeOptions) { + notNull(operation, "operation"); + Command alterType = Command.create("alterType") + .append("name", udtName) + .append(operation.getOperationName(), Map.of("fields", operation.getFields())); + runCommand(alterType, alterTypeOptions); + } + // ------------------------------------- // ---- Create Table ---- // ------------------------------------- @@ -1395,7 +1663,7 @@ public String getTableName(Class rowClass) { notNull(rowClass, "rowClass"); EntityTable ann = rowClass.getAnnotation(EntityTable.class); if (ann == null) { - throw new IllegalArgumentException("Class " + rowClass.getName() + " is not annotated with @Table"); + throw new IllegalArgumentException("Class " + rowClass.getName() + " is not annotated with "+ EntityTable.class.getName()); } if (!Utils.hasLength(ann.value())) { throw new IllegalArgumentException("Annotation @Table on class " + rowClass.getName() + " has no name"); @@ -1432,7 +1700,7 @@ private CollectionOptions defaultCollectionOptions() { // ------------------------------------- /** - * Deletes a collection (table) from the database. + * Deletes a table from the database. * This method delegates to {@link #dropTable(String, DropTableOptions)} * with default options. * @@ -1492,6 +1760,7 @@ public void dropTable(String tableName, DropTableOptions dropTableOptions) { runCommand(dropTableCmd, dropTableOptions); } } + // ------------------------------------------ // ---- Drop Indexes --- // ------------------------------------------ diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTableAddColumns.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTableAddColumns.java index 648c89fe..c3e8b5e0 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTableAddColumns.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTableAddColumns.java @@ -20,20 +20,17 @@ * #L% */ -import com.datastax.astra.client.core.commands.CommandType; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionList; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionMap; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionSet; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionList; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionMap; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionSet; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import lombok.Getter; import lombok.Setter; import java.util.LinkedHashMap; -import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; - /** * Represents an operation to add columns to an existing table in a database schema. * This class implements the {@link AlterTableOperation} interface, providing functionality @@ -64,7 +61,7 @@ public final class AlterTableAddColumns implements AlterTableOperation { * A map of column names to their definitions. * The map preserves the order of added columns. */ - LinkedHashMap columns = new LinkedHashMap<>(); + LinkedHashMap columns = new LinkedHashMap<>(); /** * Constructs a new {@code AlterTableAddColumns} instance. @@ -90,19 +87,19 @@ public String getOperationName() { * @param type the type of the column. * @return the current instance for chaining. */ - public AlterTableAddColumns addColumn(String name, ColumnTypes type) { - columns.put(name, new ColumnDefinition(type)); + public AlterTableAddColumns addColumn(String name, TableColumnTypes type) { + columns.put(name, new TableColumnDefinition(type)); return this; } /** - * Adds a column defined by a {@link ColumnDefinitionVector}. + * Adds a column defined by a {@link TableColumnDefinitionVector}. * * @param name the name of the column. * @param cdv the column definition vector. * @return the current instance for chaining. */ - public AlterTableAddColumns addColumnVector(String name, ColumnDefinitionVector cdv) { + public AlterTableAddColumns addColumnVector(String name, TableColumnDefinitionVector cdv) { columns.put(name, cdv); return this; } @@ -114,7 +111,7 @@ public AlterTableAddColumns addColumnVector(String name, ColumnDefinitionVector * @return the current instance for chaining. */ public AlterTableAddColumns addColumnText(String name) { - return addColumn(name, ColumnTypes.TEXT); + return addColumn(name, TableColumnTypes.TEXT); } /** @@ -124,7 +121,7 @@ public AlterTableAddColumns addColumnText(String name) { * @return the current instance for chaining. */ public AlterTableAddColumns addColumnInt(String name) { - return addColumn(name, ColumnTypes.INT); + return addColumn(name, TableColumnTypes.INT); } /** @@ -134,7 +131,7 @@ public AlterTableAddColumns addColumnInt(String name) { * @return the current instance for chaining. */ public AlterTableAddColumns addColumnBoolean(String name) { - return addColumn(name, ColumnTypes.BOOLEAN); + return addColumn(name, TableColumnTypes.BOOLEAN); } /** @@ -144,8 +141,8 @@ public AlterTableAddColumns addColumnBoolean(String name) { * @param valueType the type of the values in the list. * @return the current instance for chaining. */ - public AlterTableAddColumns addColumnList(String name, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionList(valueType)); + public AlterTableAddColumns addColumnList(String name, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionList(valueType)); return this; } @@ -156,8 +153,8 @@ public AlterTableAddColumns addColumnList(String name, ColumnTypes valueType) { * @param valueType the type of the values in the set. * @return the current instance for chaining. */ - public AlterTableAddColumns addColumnSet(String name, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionSet(valueType)); + public AlterTableAddColumns addColumnSet(String name, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionSet(valueType)); return this; } @@ -169,8 +166,8 @@ public AlterTableAddColumns addColumnSet(String name, ColumnTypes valueType) { * @param valueType the type of the values in the map. * @return the current instance for chaining. */ - public AlterTableAddColumns addColumnMap(String name, ColumnTypes keyType, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionMap(keyType, valueType)); + public AlterTableAddColumns addColumnMap(String name, TableColumnTypes keyType, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionMap(keyType, valueType)); return this; } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeAddFields.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeAddFields.java new file mode 100644 index 00000000..d19be1c3 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeAddFields.java @@ -0,0 +1,58 @@ +package com.datastax.astra.client.tables.commands; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; +import lombok.Getter; +import lombok.Setter; + +/** + * Represents an operation to add columns to an existing table in a database schema. + * This class implements the {@link AlterTableOperation} interface, providing functionality + * to define new columns and their types for the "alter table add" operation. + * + *

Example usage:

+ *
+ * {@code
+ * AlterTypeAddFields operation = new AlterTypeAddFields()
+ *     .addField("name", ColumnTypes.TEXT)
+ *     .addFieldInt("age");
+ * }
+ * 
+ * + *

Key Features:

+ *
    + *
  • Supports adding fields with various data types
  • + *
  • Chainable methods for building operations fluently.
  • + *
+ */ +@Setter @Getter +public final class AlterTypeAddFields extends AlterTypeOperation { + + /** + * Constructs a new {@code AlterTableAddColumns} instance. + */ + public AlterTypeAddFields() { + super("add"); + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeOperation.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeOperation.java new file mode 100644 index 00000000..1bed352a --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeOperation.java @@ -0,0 +1,87 @@ +package com.datastax.astra.client.tables.commands; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.internal.serdes.tables.AlterTypeOperationSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; + +import java.util.LinkedHashMap; + +/** + * Represents a generic operation to alter a type schema. + * This interface provides a contract for implementing specific schema alteration operations. + *

+ * Implementations of this interface must define the name of the operation. + *

+ * + *

Example usage:

+ *
+ * {@code
+ * AlterTypeOperation operation = new AlterTypeOperation();
+ * String operationName = operation.getOperationName();
+ * }
+ * 
+ * + * @param + * the type of the fields in the operation. + * @param + * the type of the operation itself, used for method chaining. + */ +@Getter +@JsonSerialize(using = AlterTypeOperationSerializer.class) +public abstract class AlterTypeOperation> { + + /** + * The Operation name. + */ + final String operationName; + + /** + * A map of column names to their definitions. + * The map preserves the order of added columns. + */ + LinkedHashMap fields = new LinkedHashMap<>(); + + /** + * Gets the name of the operation. + * + * @param operationName + * the name of the operation. + */ + public AlterTypeOperation(String operationName) { + this.operationName = operationName; + } + + /** + * Adds a column with the specified name and type to the table. + * + * @param name the name of the column. + * @param type the type of the column. + * @return the current instance for chaining. + */ + @SuppressWarnings("unchecked") + public T addField(String name, FIELD_TYPE type) { + fields.put(name, type); + return (T) this; + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeRenameFields.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeRenameFields.java new file mode 100644 index 00000000..740ebd27 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/AlterTypeRenameFields.java @@ -0,0 +1,44 @@ +package com.datastax.astra.client.tables.commands; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldDefinition; + +import java.util.LinkedHashMap; + +/** + * Represents an operation to rename columns in a database table. + * This class implements the {@link AlterTableOperation} interface, + * providing the functionality to return the operation name as "rename". + * + *

This operation is typically used to rename one or more columns in a table + * during schema alterations.

+ */ +public class AlterTypeRenameFields extends AlterTypeOperation { + + /** + * Constructs a new {@code AlterTableAddColumns} instance. + */ + public AlterTypeRenameFields() { + super("rename"); + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/AlterTypeOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/AlterTypeOptions.java new file mode 100644 index 00000000..d558cef3 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/AlterTypeOptions.java @@ -0,0 +1,56 @@ +package com.datastax.astra.client.tables.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.core.commands.CommandType; +import com.datastax.astra.client.core.options.BaseOptions; +import lombok.Setter; +import lombok.experimental.Accessors; + +import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; + +/** + * Represents options for altering a type in a database schema. + * Extends {@link BaseOptions} to provide additional functionality for type alteration commands. + *

+ * This class supports a fluent, chainable API using the {@link Accessors} annotation. + *

+ * + *

Example usage:

+ *
+ * {@code
+ * AlterTypeOptions options = new AlterTypeOptions();
+ * }
+ * 
+ */ +@Setter +@Accessors(fluent = true, chain = true) +public class AlterTypeOptions extends BaseOptions { + + /** + * Constructs a new {@code AlterTypeOptions} instance with default settings. + * Initializes the options with {@link CommandType#TABLE_ADMIN} and the default table serializer. + */ + public AlterTypeOptions() { + super(null, CommandType.TABLE_ADMIN, DEFAULT_TABLE_SERIALIZER, null); + } +} + diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/CreateTypeOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/CreateTypeOptions.java new file mode 100644 index 00000000..1bb5193e --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/CreateTypeOptions.java @@ -0,0 +1,77 @@ +package com.datastax.astra.client.tables.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.core.commands.CommandType; +import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.core.options.DataAPIClientOptions; +import lombok.Setter; +import lombok.experimental.Accessors; + +import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; + +/** + * Set of options used when creating a table + */ +@Setter +@Accessors(fluent = true, chain = true) +public class CreateTypeOptions extends BaseOptions { + + /** Improve syntax. */ + public static final CreateTypeOptions IF_NOT_EXISTS = new CreateTypeOptions().ifNotExists(true); + + /** + * The keyspace to use for the database. + */ + String keyspace = DataAPIClientOptions.DEFAULT_KEYSPACE; + + /** + * Condition to upsert the table. + */ + boolean ifNotExists = true; + + /** + * Default constructor + */ + public CreateTypeOptions() { + super(null, CommandType.TABLE_ADMIN, DEFAULT_TABLE_SERIALIZER, null); + } + + /** + * Accessor for serialization. + * + * @return + * accessor for serialization + */ + public boolean isIfNotExists() { + return ifNotExists; + } + + /** + * Gets keyspace + * + * @return value of keyspace + */ + public String getKeyspace() { + return keyspace; + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/DropTypeOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/DropTypeOptions.java new file mode 100644 index 00000000..43eeee11 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/DropTypeOptions.java @@ -0,0 +1,74 @@ +package com.datastax.astra.client.tables.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.core.options.BaseOptions; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Setter; +import lombok.experimental.Accessors; + +import static com.datastax.astra.client.core.commands.CommandType.TABLE_ADMIN; +import static com.datastax.astra.client.tables.Table.DEFAULT_TABLE_SERIALIZER; + +/** + * Options for dropping a table. + */ +@Setter +@Accessors(fluent = true, chain = true) +public class DropTypeOptions extends BaseOptions { + + /** Improve syntax. */ + public static final DropTypeOptions IF_EXISTS = new DropTypeOptions().ifExists(true); + + private String keyspace; + + /** + * Condition to upsert the table. + */ + boolean ifExists = true; + + /** + * Default constructor + */ + public DropTypeOptions() { + super(null, TABLE_ADMIN, DEFAULT_TABLE_SERIALIZER, null); + } + + /** + * Accessor for serialization. + * + * @return + * accessor for serialization + */ + public boolean isIfExists() { + return ifExists; + } + + /** + * Gets keyspace + * + * @return value of keyspace + */ + @JsonIgnore + public String getKeyspace() { + return keyspace; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/ListTypesOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/ListTypesOptions.java new file mode 100644 index 00000000..ac0059b5 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/options/ListTypesOptions.java @@ -0,0 +1,58 @@ +package com.datastax.astra.client.tables.commands.options; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.core.options.BaseOptions; +import com.datastax.astra.client.core.options.DataAPIClientOptions; +import com.datastax.astra.internal.serdes.tables.RowSerializer; +import lombok.Setter; +import lombok.experimental.Accessors; + +import static com.datastax.astra.client.core.commands.CommandType.TABLE_ADMIN; + +/** + * Options for listing tables. + */ +@Setter +@Accessors(fluent = true, chain = true) +public class ListTypesOptions extends BaseOptions { + + /** + * The keyspace to use for the database. + */ + String keyspace = DataAPIClientOptions.DEFAULT_KEYSPACE; + + /** + * Default constructor + */ + public ListTypesOptions() { + super(null, TABLE_ADMIN, new RowSerializer(), null); + } + + /** + * Gets keyspace + * + * @return value of keyspace + */ + public String getKeyspace() { + return keyspace; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertManyResult.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertManyResult.java index 6812be36..7245a14e 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertManyResult.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertManyResult.java @@ -22,7 +22,7 @@ import com.datastax.astra.client.collections.definition.documents.Document; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -43,7 +43,7 @@ public class TableInsertManyResult { ArrayList> insertedIds; /** Schema on the response. */ - LinkedHashMap primaryKeySchema; + LinkedHashMap primaryKeySchema; /** Document Response with flag is there. */ List documentResponses; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertOneResult.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertOneResult.java index a913f966..1c705340 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertOneResult.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/commands/results/TableInsertOneResult.java @@ -20,7 +20,7 @@ * #L% */ -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; import com.datastax.astra.client.tables.definition.rows.Row; import lombok.AllArgsConstructor; import lombok.Data; @@ -46,9 +46,9 @@ public class TableInsertOneResult { /** * The schema of the primary key as a map, where keys are column names and values are - * {@link ColumnDefinition} objects describing the column details. + * {@link TableColumnDefinition} objects describing the column details. */ - private LinkedHashMap primaryKeySchema; + private LinkedHashMap primaryKeySchema; /** * No-argument constructor that initializes {@code insertedId} to an empty {@link ArrayList} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java index 32330430..a5842410 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/TableDefinition.java @@ -21,12 +21,12 @@ */ import com.datastax.astra.client.core.query.Sort; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionList; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionMap; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionSet; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionList; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionMap; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionSet; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.internal.serdes.tables.RowSerializer; import com.datastax.astra.internal.utils.Assert; import lombok.Data; @@ -43,7 +43,7 @@ public class TableDefinition { /** * The columns of the table. */ - private LinkedHashMap columns = new LinkedHashMap<>(); + private LinkedHashMap columns = new LinkedHashMap<>(); /** * The primary key of the table. @@ -64,7 +64,7 @@ public TableDefinition() { * @return the updated {@link TableDefinition} instance * @throws IllegalArgumentException if {@code columnName} is null */ - public TableDefinition addColumn(String columnName, ColumnDefinition columnDefinition) { + public TableDefinition addColumn(String columnName, TableColumnDefinition columnDefinition) { Assert.notNull(columnName, "Column columnName"); columns.put(columnName, columnDefinition); return this; @@ -77,8 +77,8 @@ public TableDefinition addColumn(String columnName, ColumnDefinition columnDefin * @param type the type of the column * @return the updated {@link TableDefinition} instance */ - public TableDefinition addColumn(String name, ColumnTypes type) { - columns.put(name, new ColumnDefinition(type)); + public TableDefinition addColumn(String name, TableColumnTypes type) { + columns.put(name, new TableColumnDefinition(type)); return this; } @@ -89,7 +89,7 @@ public TableDefinition addColumn(String name, ColumnTypes type) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnUuid(String name) { - return addColumn(name, ColumnTypes.UUID); + return addColumn(name, TableColumnTypes.UUID); } /** @@ -99,7 +99,7 @@ public TableDefinition addColumnUuid(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnText(String name) { - return addColumn(name, ColumnTypes.TEXT); + return addColumn(name, TableColumnTypes.TEXT); } /** @@ -109,7 +109,7 @@ public TableDefinition addColumnText(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnAscii(String name) { - return addColumn(name, ColumnTypes.ASCII); + return addColumn(name, TableColumnTypes.ASCII); } /** @@ -119,7 +119,7 @@ public TableDefinition addColumnAscii(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnInt(String name) { - return addColumn(name, ColumnTypes.INT); + return addColumn(name, TableColumnTypes.INT); } /** @@ -129,7 +129,7 @@ public TableDefinition addColumnInt(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnTimestamp(String name) { - return addColumn(name, ColumnTypes.TIMESTAMP); + return addColumn(name, TableColumnTypes.TIMESTAMP); } /** @@ -139,7 +139,7 @@ public TableDefinition addColumnTimestamp(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnBoolean(String name) { - return addColumn(name, ColumnTypes.BOOLEAN); + return addColumn(name, TableColumnTypes.BOOLEAN); } /** @@ -149,7 +149,7 @@ public TableDefinition addColumnBoolean(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnBigInt(String name) { - return addColumn(name, ColumnTypes.BIGINT); + return addColumn(name, TableColumnTypes.BIGINT); } /** @@ -159,7 +159,7 @@ public TableDefinition addColumnBigInt(String name) { * @return the updated {@link TableDefinition} instance */ public TableDefinition addColumnBlob(String name) { - return addColumn(name, ColumnTypes.BLOB); + return addColumn(name, TableColumnTypes.BLOB); } /** @@ -169,8 +169,8 @@ public TableDefinition addColumnBlob(String name) { * @param valueType the type of the elements in the list * @return the updated {@link TableDefinition} instance */ - public TableDefinition addColumnList(String name, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionList(valueType)); + public TableDefinition addColumnList(String name, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionList(valueType)); return this; } @@ -181,8 +181,8 @@ public TableDefinition addColumnList(String name, ColumnTypes valueType) { * @param valueType the type of the elements in the set * @return the updated {@link TableDefinition} instance */ - public TableDefinition addColumnSet(String name, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionSet(valueType)); + public TableDefinition addColumnSet(String name, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionSet(valueType)); return this; } @@ -194,8 +194,8 @@ public TableDefinition addColumnSet(String name, ColumnTypes valueType) { * @param valueType the type of the values in the map * @return the updated {@link TableDefinition} instance */ - public TableDefinition addColumnMap(String name, ColumnTypes keyType, ColumnTypes valueType) { - columns.put(name, new ColumnDefinitionMap(keyType, valueType)); + public TableDefinition addColumnMap(String name, TableColumnTypes keyType, TableColumnTypes valueType) { + columns.put(name, new TableColumnDefinitionMap(keyType, valueType)); return this; } @@ -206,7 +206,7 @@ public TableDefinition addColumnMap(String name, ColumnTypes keyType, ColumnType * @param colDefVector the definition of the vector column * @return the updated {@link TableDefinition} instance */ - public TableDefinition addColumnVector(String name, ColumnDefinitionVector colDefVector) { + public TableDefinition addColumnVector(String name, TableColumnDefinitionVector colDefVector) { columns.put(name, colDefVector); return this; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinition.java similarity index 82% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinition.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinition.java index d660ebdc..26717090 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinition.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinition.java @@ -22,9 +22,6 @@ import com.datastax.astra.internal.serdes.tables.RowSerializer; import lombok.Data; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; /** * Represents a column definition in a database schema. @@ -39,8 +36,8 @@ * *

Fields:

*
    - *
  • {@code type} - Specifies the type of the column, represented by {@link ColumnTypes}.
  • - *
  • {@code apiSupport} - Provides API support details for the column, defined by {@link ColumnDefinitionApiSupport}.
  • + *
  • {@code type} - Specifies the type of the column, represented by {@link TableColumnTypes}.
  • + *
  • {@code apiSupport} - Provides API support details for the column, defined by {@link TableColumnDefinitionApiSupport}.
  • *
* *

Constructors:

@@ -64,16 +61,22 @@ *
*/ @Data -public class ColumnDefinition { +public class TableColumnDefinition { - private ColumnTypes type; + /** + * The type of the column. + */ + private TableColumnTypes type; - private ColumnDefinitionApiSupport apiSupport; + /** + * API support details for the column when not fully supported by the Data API. + */ + private TableColumnDefinitionApiSupport apiSupport; /** * Default constructor. */ - public ColumnDefinition() { + public TableColumnDefinition() { } /** @@ -81,7 +84,7 @@ public ColumnDefinition() { * * @param type the column type */ - public ColumnDefinition(ColumnTypes type) { + public TableColumnDefinition(TableColumnTypes type) { this.type = type; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionApiSupport.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionApiSupport.java similarity index 95% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionApiSupport.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionApiSupport.java index 18831a25..8bdcec28 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionApiSupport.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionApiSupport.java @@ -22,7 +22,6 @@ import com.datastax.astra.internal.serdes.tables.RowSerializer; import lombok.Data; -import lombok.NoArgsConstructor; /** * Represents the API support configuration for a column definition. @@ -58,7 +57,7 @@ * */ @Data -public class ColumnDefinitionApiSupport { +public class TableColumnDefinitionApiSupport { /** * Specifies whether the column is included in table creation. @@ -83,7 +82,7 @@ public class ColumnDefinitionApiSupport { /** * Default constructor. */ - public ColumnDefinitionApiSupport() { + public TableColumnDefinitionApiSupport() { } /** diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionList.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionList.java similarity index 73% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionList.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionList.java index 2dc5c8a1..5f09197a 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionList.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionList.java @@ -25,9 +25,9 @@ /** * Represents a column definition for a list type in a database schema. - * Extends {@link ColumnDefinition} to include details about the type of elements stored in the list. + * Extends {@link TableColumnDefinition} to include details about the type of elements stored in the list. *

- * This class is used to configure columns of type {@link ColumnTypes#LIST}, allowing the specification + * This class is used to configure columns of type {@link TableColumnTypes#LIST}, allowing the specification * of the data type for the values stored in the list. *

* @@ -41,18 +41,18 @@ */ @Getter @Setter -public class ColumnDefinitionList extends ColumnDefinition { +public class TableColumnDefinitionList extends TableColumnDefinition { /** * The data type of the values stored in the list. */ - private ColumnTypes valueType; + private TableColumnTypes valueType; /** - * Constructs a new {@code ColumnDefinitionList} instance with the column type set to {@link ColumnTypes#LIST}. + * Constructs a new {@code ColumnDefinitionList} instance with the column type set to {@link TableColumnTypes#LIST}. */ - public ColumnDefinitionList() { - super(ColumnTypes.LIST); + public TableColumnDefinitionList() { + super(TableColumnTypes.LIST); } /** @@ -60,7 +60,7 @@ public ColumnDefinitionList() { * * @param valueType the data type of the values in the list */ - public ColumnDefinitionList(ColumnTypes valueType) { + public TableColumnDefinitionList(TableColumnTypes valueType) { this(); this.valueType = valueType; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionMap.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionMap.java similarity index 79% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionMap.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionMap.java index 27ccd639..a461ad48 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionMap.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionMap.java @@ -25,7 +25,7 @@ /** * Represents a column definition for a map type in a database schema. - * Extends {@link ColumnDefinition} to include specific details about the key and value types + * Extends {@link TableColumnDefinition} to include specific details about the key and value types * for map columns. *

* This class facilitates the configuration of map columns, allowing specification of @@ -43,23 +43,23 @@ */ @Getter @Setter -public class ColumnDefinitionMap extends ColumnDefinition { +public class TableColumnDefinitionMap extends TableColumnDefinition { /** * The data type of the keys in the map. */ - private ColumnTypes keyType; + private TableColumnTypes keyType; /** * The data type of the values in the map. */ - private ColumnTypes valueType; + private TableColumnTypes valueType; /** - * Constructs a new {@code ColumnDefinitionMap} instance with the column type set to {@link ColumnTypes#MAP}. + * Constructs a new {@code ColumnDefinitionMap} instance with the column type set to {@link TableColumnTypes#MAP}. */ - public ColumnDefinitionMap() { - super(ColumnTypes.MAP); + public TableColumnDefinitionMap() { + super(TableColumnTypes.MAP); } /** @@ -68,7 +68,7 @@ public ColumnDefinitionMap() { * @param keyType the data type of the keys in the map * @param valueType the data type of the values in the map */ - public ColumnDefinitionMap(ColumnTypes keyType, ColumnTypes valueType) { + public TableColumnDefinitionMap(TableColumnTypes keyType, TableColumnTypes valueType) { this(); this.keyType = keyType; this.valueType = valueType; diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionSet.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionSet.java similarity index 74% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionSet.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionSet.java index 2445ffa5..59819285 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionSet.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionSet.java @@ -25,9 +25,9 @@ /** * Represents a column definition for a set type in a database schema. - * Extends {@link ColumnDefinition} to include details about the type of elements stored in the set. + * Extends {@link TableColumnDefinition} to include details about the type of elements stored in the set. *

- * This class is used to configure columns of type {@link ColumnTypes#SET}, allowing the specification + * This class is used to configure columns of type {@link TableColumnTypes#SET}, allowing the specification * of the data type for the values stored in the set. *

* @@ -40,18 +40,18 @@ * */ @Getter @Setter -public class ColumnDefinitionSet extends ColumnDefinition { +public class TableColumnDefinitionSet extends TableColumnDefinition { /** * The data type of the values stored in the set. */ - private ColumnTypes valueType; + private TableColumnTypes valueType; /** - * Constructs a new {@code ColumnDefinitionSet} instance with the column type set to {@link ColumnTypes#SET}. + * Constructs a new {@code ColumnDefinitionSet} instance with the column type set to {@link TableColumnTypes#SET}. */ - public ColumnDefinitionSet() { - super(ColumnTypes.SET); + public TableColumnDefinitionSet() { + super(TableColumnTypes.SET); } /** @@ -59,7 +59,7 @@ public ColumnDefinitionSet() { * * @param valueType the data type of the values in the set */ - public ColumnDefinitionSet(ColumnTypes valueType) { + public TableColumnDefinitionSet(TableColumnTypes valueType) { this(); this.valueType = valueType; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionUserDefined.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionUserDefined.java new file mode 100644 index 00000000..6405e57e --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionUserDefined.java @@ -0,0 +1,59 @@ +package com.datastax.astra.client.tables.definition.columns; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import lombok.Getter; +import lombok.Setter; + +/** + * Represents a column definition for a user Defined Type (UDT) in a database schema. + * Extends {@link TableColumnDefinition} to include details about the type of elements stored in the list. + *

+ * This class is used to configure columns of type {@link TableColumnTypes#USER_DEFINED}, allowing the specification + * of the data type for user defined values stored in the column. + *

+ */ +@Getter +@Setter +public class TableColumnDefinitionUserDefined extends TableColumnDefinition { + + /** + * The data type of the values stored in the list. + */ + private String udtName; + + /** + * Constructs a new {@code ColumnDefinitionList} instance with the column type set to {@link TableColumnTypes#LIST}. + */ + public TableColumnDefinitionUserDefined() { + super(TableColumnTypes.USER_DEFINED); + } + + /** + * Constructs a new {@code TableColumnDefinitionUserDefined} instance with the specified value type. + * + * @param udtName the name of the user defined type (UDT) + */ + public TableColumnDefinitionUserDefined(String udtName) { + this(); + this.udtName = udtName; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionVector.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionVector.java similarity index 84% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionVector.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionVector.java index 3c64672b..3c5119b8 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnDefinitionVector.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnDefinitionVector.java @@ -27,7 +27,7 @@ /** * Represents a column definition for vector-based data. - * Extends {@link ColumnDefinition} to include properties and methods + * Extends {@link TableColumnDefinition} to include properties and methods * specific to vector data such as dimension, similarity metric, and vectorization service. *

* This class facilitates the configuration of vector columns in a data schema. @@ -44,7 +44,7 @@ */ @Getter @Setter -public class ColumnDefinitionVector extends ColumnDefinition { +public class TableColumnDefinitionVector extends TableColumnDefinition { /** * The dimension of the vector. @@ -66,10 +66,10 @@ public class ColumnDefinitionVector extends ColumnDefinition { /** * Constructs a new {@code ColumnDefinitionVector} instance - * with the column type set to {@link ColumnTypes#VECTOR}. + * with the column type set to {@link TableColumnTypes#VECTOR}. */ - public ColumnDefinitionVector() { - super(ColumnTypes.VECTOR); + public TableColumnDefinitionVector() { + super(TableColumnTypes.VECTOR); } /** @@ -78,7 +78,7 @@ public ColumnDefinitionVector() { * @param dimension the dimension of the vector * @return this {@code ColumnDefinitionVector} instance */ - public ColumnDefinitionVector dimension(int dimension) { + public TableColumnDefinitionVector dimension(int dimension) { this.dimension = dimension; return this; } @@ -89,7 +89,7 @@ public ColumnDefinitionVector dimension(int dimension) { * @param m the similarity metric * @return this {@code ColumnDefinitionVector} instance */ - public ColumnDefinitionVector metric(SimilarityMetric m) { + public TableColumnDefinitionVector metric(SimilarityMetric m) { this.metric = m; return this; } @@ -100,7 +100,7 @@ public ColumnDefinitionVector metric(SimilarityMetric m) { * @param service the vectorization service options * @return this {@code ColumnDefinitionVector} instance */ - public ColumnDefinitionVector service(VectorServiceOptions service) { + public TableColumnDefinitionVector service(VectorServiceOptions service) { this.service = service; return this; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypeMapper.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypeMapper.java similarity index 53% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypeMapper.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypeMapper.java index 467989b5..7cd57bf8 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypeMapper.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypeMapper.java @@ -21,6 +21,7 @@ */ import com.datastax.astra.client.core.vector.DataAPIVector; +import com.datastax.astra.client.tables.definition.types.TableDataAPIUserDefinedType; import java.math.BigDecimal; import java.math.BigInteger; @@ -58,68 +59,71 @@ *

  • Default fallback for unsupported types: {@code UNSUPPORTED}
  • * */ -public class ColumnTypeMapper { +public class TableColumnTypeMapper { /** - * A static mapping of Java classes to their corresponding {@link ColumnTypes}. + * A static mapping of Java classes to their corresponding {@link TableColumnTypes}. */ - private static final Map, ColumnTypes> typeMapping = new HashMap<>(); + private static final Map, TableColumnTypes> typeMapping = new HashMap<>(); /** * Static initializer block that populates the type mapping. */ static { // Primitive and wrapper types - typeMapping.put(Integer.class, ColumnTypes.INT); - typeMapping.put(int.class, ColumnTypes.INT); - typeMapping.put(Long.class, ColumnTypes.BIGINT); - typeMapping.put(long.class, ColumnTypes.BIGINT); - typeMapping.put(Double.class, ColumnTypes.DOUBLE); - typeMapping.put(double.class, ColumnTypes.DOUBLE); - typeMapping.put(Float.class, ColumnTypes.FLOAT); - typeMapping.put(float.class, ColumnTypes.FLOAT); - typeMapping.put(Boolean.class, ColumnTypes.BOOLEAN); - typeMapping.put(boolean.class, ColumnTypes.BOOLEAN); - typeMapping.put(Byte.class, ColumnTypes.TINYINT); - typeMapping.put(byte.class, ColumnTypes.TINYINT); - typeMapping.put(Short.class, ColumnTypes.SMALLINT); - typeMapping.put(short.class, ColumnTypes.SMALLINT); + typeMapping.put(Integer.class, TableColumnTypes.INT); + typeMapping.put(int.class, TableColumnTypes.INT); + typeMapping.put(Long.class, TableColumnTypes.BIGINT); + typeMapping.put(long.class, TableColumnTypes.BIGINT); + typeMapping.put(Double.class, TableColumnTypes.DOUBLE); + typeMapping.put(double.class, TableColumnTypes.DOUBLE); + typeMapping.put(Float.class, TableColumnTypes.FLOAT); + typeMapping.put(float.class, TableColumnTypes.FLOAT); + typeMapping.put(Boolean.class, TableColumnTypes.BOOLEAN); + typeMapping.put(boolean.class, TableColumnTypes.BOOLEAN); + typeMapping.put(Byte.class, TableColumnTypes.TINYINT); + typeMapping.put(byte.class, TableColumnTypes.TINYINT); + typeMapping.put(Short.class, TableColumnTypes.SMALLINT); + typeMapping.put(short.class, TableColumnTypes.SMALLINT); // Commonly used Java types - typeMapping.put(String.class, ColumnTypes.TEXT); - typeMapping.put(UUID.class, ColumnTypes.UUID); - typeMapping.put(BigDecimal.class, ColumnTypes.DECIMAL); - typeMapping.put(BigInteger.class, ColumnTypes.VARINT); - typeMapping.put(InetAddress.class, ColumnTypes.INET); + typeMapping.put(String.class, TableColumnTypes.TEXT); + typeMapping.put(UUID.class, TableColumnTypes.UUID); + typeMapping.put(BigDecimal.class, TableColumnTypes.DECIMAL); + typeMapping.put(BigInteger.class, TableColumnTypes.VARINT); + typeMapping.put(InetAddress.class, TableColumnTypes.INET); // Date and time types - typeMapping.put(Instant.class, ColumnTypes.TIMESTAMP); - typeMapping.put(LocalDate.class, ColumnTypes.DATE); - typeMapping.put(LocalTime.class, ColumnTypes.TIME); + typeMapping.put(Instant.class, TableColumnTypes.TIMESTAMP); + typeMapping.put(LocalDate.class, TableColumnTypes.DATE); + typeMapping.put(LocalTime.class, TableColumnTypes.TIME); // Collection types - typeMapping.put(List.class, ColumnTypes.LIST); - typeMapping.put(Set.class, ColumnTypes.SET); - typeMapping.put(Map.class, ColumnTypes.MAP); - typeMapping.put(DataAPIVector.class, ColumnTypes.VECTOR); + typeMapping.put(List.class, TableColumnTypes.LIST); + typeMapping.put(Set.class, TableColumnTypes.SET); + typeMapping.put(Map.class, TableColumnTypes.MAP); + typeMapping.put(DataAPIVector.class, TableColumnTypes.VECTOR); + + // Generic User Defined Types (UDTs) + typeMapping.put(TableDataAPIUserDefinedType.class, TableColumnTypes.USER_DEFINED); // Unsupported or undefined types - typeMapping.put(Object.class, ColumnTypes.UNSUPPORTED); + typeMapping.put(Object.class, TableColumnTypes.UNSUPPORTED); } /** * Private constructor to prevent instantiation. */ - private ColumnTypeMapper() {} + private TableColumnTypeMapper() {} /** * Retrieves the Cassandra column type corresponding to the given Java class. * If the type is not explicitly mapped, {@code ColumnTypes.UNSUPPORTED} is returned. * * @param clazz the Java class to map - * @return the corresponding {@link ColumnTypes}, or {@code UNSUPPORTED} if the type is not mapped + * @return the corresponding {@link TableColumnTypes}, or {@code UNSUPPORTED} if the type is not mapped */ - public static ColumnTypes getColumnType(Class clazz) { - return typeMapping.getOrDefault(clazz, ColumnTypes.UNSUPPORTED); + public static TableColumnTypes getColumnType(Class clazz) { + return typeMapping.getOrDefault(clazz, TableColumnTypes.UNSUPPORTED); } } \ No newline at end of file diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypes.java similarity index 95% rename from astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java rename to astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypes.java index 18117832..ba8f759f 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/ColumnTypes.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/columns/TableColumnTypes.java @@ -38,7 +38,7 @@ * */ @Getter -public enum ColumnTypes { +public enum TableColumnTypes { /** * ASCII string type. @@ -100,6 +100,11 @@ public enum ColumnTypes { */ INT("int"), + /** + * JSON type, storing JSON formatted data. + */ + USER_DEFINED("userDefined"), + /** * List collection type. */ @@ -180,7 +185,7 @@ public enum ColumnTypes { * * @param value the string representation of the column type */ - ColumnTypes(String value) { + TableColumnTypes(String value) { this.value = value; } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableDataAPIUserDefinedType.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableDataAPIUserDefinedType.java new file mode 100644 index 00000000..c6b6f213 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableDataAPIUserDefinedType.java @@ -0,0 +1,33 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.io.Serializable; + +/** + * Represents a user-defined type (UDT) in the Data API. + * This class is a placeholder for user-defined types and can be extended + * to include specific fields and methods as needed. + * + * @param the type of the user-defined type + */ +public class TableDataAPIUserDefinedType implements Serializable { +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedType.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedType.java new file mode 100644 index 00000000..5de8103e --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedType.java @@ -0,0 +1,40 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * EntityType annotation to define a user-defined type (UDT) in the context of mapping. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface TableUserDefinedType { + + /** + * Table Name, if not provided the class name will be used + * @return the table name + */ + String value() default ""; +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDefinition.java new file mode 100644 index 00000000..931af90c --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDefinition.java @@ -0,0 +1,203 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.internal.utils.Assert; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.Data; + +import java.util.Arrays; +import java.util.LinkedHashMap; + +/** + * Definition of a User-Defined Type (UDT) in Cassandra. + */ +@Data +//@JsonSerialize(using = UdtDefinitionSerializer.class) +public class TableUserDefinedTypeDefinition { + + /** + * The columns of the table. + */ + private LinkedHashMap fields = new LinkedHashMap<>(); + + /** + * Default constructor. + */ + public TableUserDefinedTypeDefinition() { + } + + /** + * Adds a column to the table definition. + * + * @param fieldName the name of the column + * @param fieldDefinition the definition of the field + * @return the updated {@link TableUserDefinedTypeDefinition} instance + * @throws IllegalArgumentException if {@code columnName} is null + */ + public TableUserDefinedTypeDefinition addField(String fieldName, TableUserDefinedTypeFieldDefinition fieldDefinition) { + Assert.notNull(fieldName, "Column columnName"); + fields.put(fieldName, fieldDefinition); + return this; + } + + /** + * Adds a column to the table with a specific type. + * + * @param name the name of the column + * @param type the type of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addField(String name, TableUserDefinedTypeFieldTypes type) { + fields.put(name, new TableUserDefinedTypeFieldDefinition(type)); + return this; + } + + /** + * Adds a UUID column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldUuid(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.UUID); + } + + /** + * Adds a text column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldText(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.TEXT); + } + + /** + * Adds an ascii column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldAscii(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.ASCII); + } + + /** + * Adds an integer column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldInt(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.INT); + } + + /** + * Adds a timestamp column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldTimestamp(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.TIMESTAMP); + } + + /** + * Adds a boolean column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldBoolean(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.BOOLEAN); + } + + /** + * Adds a boolean column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldBigInt(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.BIGINT); + } + + /** + * Adds a blob column to the table. + * + * @param name the name of the column + * @return the updated {@link TableUserDefinedTypeDefinition} instance + */ + public TableUserDefinedTypeDefinition addFieldBlob(String name) { + return addField(name, TableUserDefinedTypeFieldTypes.BLOB); + } + +// /** +// * Adds a list column to the table. +// * +// * @param name the name of the column +// * @param valueType the type of the elements in the list +// * @return the updated {@link UdtDefinition} instance +// */ +// public UdtDefinition addFieldList(String name, UdtFieldTypes valueType) { +// fields.put(name, new UdtFieldDefinitionList(valueType)); +// return this; +// } +// +// /** +// * Adds a set column to the table. +// * +// * @param name the name of the column +// * @param valueType the type of the elements in the set +// * @return the updated {@link UdtDefinition} instance +// */ +// public UdtDefinition addFieldSet(String name, UdtFieldTypes valueType) { +// fields.put(name, new UdtFieldDefinitionSet(valueType)); +// return this; +// } +// +// /** +// * Adds a map column to the table. +// * +// * @param name the name of the column +// * @param keyType the type of the keys in the map +// * @param valueType the type of the values in the map +// * @return the updated {@link UdtDefinition} instance +// */ +// public UdtDefinition addFieldMap(String name, UdtFieldTypes keyType, UdtFieldTypes valueType) { +// fields.put(name, new UdtFieldDefinitionMap(keyType, valueType)); +// return this; +// } + + /** {@inheritDoc} */ + @Override + public String toString() { + try { + return new ObjectMapper().writeValueAsString(this); + } catch (JsonProcessingException e) { + return "TypeDefinition{" + + "fields=" + Arrays.toString(fields.entrySet().toArray()) + + '}'; + } + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDescriptor.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDescriptor.java new file mode 100644 index 00000000..ff3eb577 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeDescriptor.java @@ -0,0 +1,85 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.TableDefinition; +import com.datastax.astra.internal.serdes.tables.RowSerializer; +import lombok.Getter; +import lombok.Setter; + +/** + * Represents the User Defined Type definition with its name and metadata. + */ +@Getter @Setter +public class TableUserDefinedTypeDescriptor { + + /** + * Name of the table. + */ + private String name; + + /** + * Options for the table. + */ + private TableUserDefinedTypeDefinition definition; + + /** + * Default constructor. + */ + public TableUserDefinedTypeDescriptor() { + // left blank, serialization with jackson + } + + /** + * Default constructor. + * @param name the name of the table + */ + public TableUserDefinedTypeDescriptor(String name) { + // left blank, serialization with jackson + this.name = name; + } + + /** + * Set the name of the table. + * @param name the name of the table + * @return the descriptor + */ + public TableUserDefinedTypeDescriptor name(String name) { + this.name = name; + return this; + } + + /** + * Set the definition of the table. + * @param def the definition of the table + * @return the descriptor + */ + public TableUserDefinedTypeDescriptor definition(TableUserDefinedTypeDefinition def) { + this.definition = def; + return this; + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return new RowSerializer().marshall(this); + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeField.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeField.java new file mode 100644 index 00000000..61b5a91c --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeField.java @@ -0,0 +1,71 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Annotation to define properties for a udt field. This annotation can be used on fields + * to specify custom column names, types, and additional properties. + * + *

    The {@code Column} annotation provides flexibility for mapping fields to database columns, + * with options to customize column name, type, and other attributes.

    + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface TableUserDefinedTypeField { + + /** + * Specifies the name of the column. If not provided, the field's name will be used. + * + * @return the custom column name or an empty string if not set + */ + String name(); + + /** + * Specifies the type of the column. If not provided, the field's type will be used. + * + * @return the column type or {@link TableColumnTypes#UNDEFINED} if not set + */ + TableUserDefinedTypeFieldTypes type() default TableUserDefinedTypeFieldTypes.UNDEFINED; + + /** + * Specifies the value type of the column, typically used for complex data structures. + * If not provided, defaults to {@link TableColumnTypes#UNDEFINED}. + * + * @return the value type or {@link TableColumnTypes#UNDEFINED} if not set + */ + TableUserDefinedTypeFieldTypes valueType() default TableUserDefinedTypeFieldTypes.UNDEFINED; + + /** + * Specifies the key type of the column, typically used for mapping keys in key-value pairs. + * If not provided, defaults to {@link TableColumnTypes#UNDEFINED}. + * + * @return the key type or {@link TableColumnTypes#UNDEFINED} if not set + */ + TableUserDefinedTypeFieldTypes keyType() default TableUserDefinedTypeFieldTypes.UNDEFINED; + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinition.java new file mode 100644 index 00000000..afb68dd0 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinition.java @@ -0,0 +1,99 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionApiSupport; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; +import com.datastax.astra.internal.serdes.tables.RowSerializer; +import lombok.Data; + +/** + * Represents a column definition in a database schema. + *

    + * This class encapsulates the type of the column and its associated API support + * configurations, providing a structure for managing column-specific details. + *

    + *

    + * The class uses Lombok annotations to automatically generate getter, setter, and + * no-argument constructor methods. + *

    + * + *

    Fields:

    + *
      + *
    • {@code type} - Specifies the type of the column, represented by {@link TableColumnTypes}.
    • + *
    • {@code apiSupport} - Provides API support details for the column, defined by {@link TableColumnDefinitionApiSupport}.
    • + *
    + * + *

    Constructors:

    + *
      + *
    • A no-argument constructor for creating a default instance of the class.
    • + *
    • A parameterized constructor for initializing the column definition with a specified type.
    • + *
    + * + *

    Example usage:

    + *
    + * {@code
    + * ColumnTypes columnType = ColumnTypes.STRING;
    + * ColumnDefinition columnDefinition = new ColumnDefinition(columnType);
    + *
    + * columnDefinition.setApiSupport(new ColumnDefinitionApiSupport());
    + * columnDefinition.getApiSupport().setCreateTable(true);
    + * columnDefinition.getApiSupport().setInsert(false);
    + *
    + * System.out.println(columnDefinition);
    + * }
    + * 
    + */ +@Data +public class TableUserDefinedTypeFieldDefinition { + + /** + * The type of the column. + */ + private TableUserDefinedTypeFieldTypes type; + + /** + * API support details for the column when not fully supported by the Data API. + */ + private TableColumnDefinitionApiSupport apiSupport; + + /** + * Default constructor. + */ + public TableUserDefinedTypeFieldDefinition() { + } + + /** + * Constructor with type. + * + * @param type the column type + */ + public TableUserDefinedTypeFieldDefinition(TableUserDefinedTypeFieldTypes type) { + this.type = type; + } + + /** {@inheritDoc} */ + @Override + public String toString() { + return new RowSerializer().marshall(this); + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionList.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionList.java new file mode 100644 index 00000000..57a29463 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionList.java @@ -0,0 +1,69 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; +import lombok.Getter; +import lombok.Setter; + +/** + * Represents a column definition for a list type in a database schema. + * Extends {@link TableColumnDefinition} to include details about the type of elements stored in the list. + *

    + * This class is used to configure columns of type {@link TableColumnTypes#LIST}, allowing the specification + * of the data type for the values stored in the list. + *

    + * + *

    Example usage:

    + *
    + * {@code
    + * ColumnDefinitionList listColumn = new ColumnDefinitionList(ColumnTypes.TEXT);
    + * ColumnTypes valueType = listColumn.getValueType();
    + * }
    + * 
    + */ +@Getter +@Setter +public class TableUserDefinedTypeFieldDefinitionList extends TableUserDefinedTypeFieldDefinition { + + /** + * The data type of the values stored in the list. + */ + private TableUserDefinedTypeFieldTypes valueType; + + /** + * Constructs a new {@code ColumnDefinitionList} instance with the column type set to {@link TableColumnTypes#LIST}. + */ + public TableUserDefinedTypeFieldDefinitionList() { + super(TableUserDefinedTypeFieldTypes.UNSUPPORTED); + } + + /** + * Constructs a new {@code ColumnDefinitionList} instance with the specified value type. + * + * @param valueType the data type of the values in the list + */ + public TableUserDefinedTypeFieldDefinitionList(TableUserDefinedTypeFieldTypes valueType) { + this(); + this.valueType = valueType; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionMap.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionMap.java new file mode 100644 index 00000000..f556a6b6 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionMap.java @@ -0,0 +1,78 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; +import lombok.Getter; +import lombok.Setter; + +/** + * Represents a column definition for a map type in a database schema. + * Extends {@link TableColumnDefinition} to include specific details about the key and value types + * for map columns. + *

    + * This class facilitates the configuration of map columns, allowing specification of + * the types of keys and values stored in the map. + *

    + * + *

    Example usage:

    + *
    + * {@code
    + * ColumnDefinitionMap mapColumn = new ColumnDefinitionMap(ColumnTypes.TEXT, ColumnTypes.INT);
    + * ColumnTypes keyType = mapColumn.getKeyType();
    + * ColumnTypes valueType = mapColumn.getValueType();
    + * }
    + * 
    + */ +@Getter +@Setter +public class TableUserDefinedTypeFieldDefinitionMap extends TableUserDefinedTypeFieldDefinition { + + /** + * The data type of the keys in the map. + */ + private TableUserDefinedTypeFieldTypes keyType; + + /** + * The data type of the values in the map. + */ + private TableUserDefinedTypeFieldTypes valueType; + + /** + * Constructs a new {@code ColumnDefinitionMap} instance with the column type set to {@link TableColumnTypes#MAP}. + */ + public TableUserDefinedTypeFieldDefinitionMap() { + super(TableUserDefinedTypeFieldTypes.UNSUPPORTED); + } + + /** + * Constructs a new {@code ColumnDefinitionMap} instance with the specified key and value types. + * + * @param keyType the data type of the keys in the map + * @param valueType the data type of the values in the map + */ + public TableUserDefinedTypeFieldDefinitionMap(TableUserDefinedTypeFieldTypes keyType, TableUserDefinedTypeFieldTypes valueType) { + this(); + this.keyType = keyType; + this.valueType = valueType; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionSet.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionSet.java new file mode 100644 index 00000000..7003b826 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldDefinitionSet.java @@ -0,0 +1,68 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; +import lombok.Getter; +import lombok.Setter; + +/** + * Represents a column definition for a set type in a database schema. + * Extends {@link TableColumnDefinition} to include details about the type of elements stored in the set. + *

    + * This class is used to configure columns of type {@link TableColumnTypes#SET}, allowing the specification + * of the data type for the values stored in the set. + *

    + * + *

    Example usage:

    + *
    + * {@code
    + * ColumnDefinitionSet setColumn = new ColumnDefinitionSet(ColumnTypes.TEXT);
    + * ColumnTypes valueType = setColumn.getValueType();
    + * }
    + * 
    + */ +@Getter @Setter +public class TableUserDefinedTypeFieldDefinitionSet extends TableUserDefinedTypeFieldDefinition { + + /** + * The data type of the values stored in the set. + */ + private TableUserDefinedTypeFieldTypes valueType; + + /** + * Constructs a new {@code ColumnDefinitionSet} instance with the column type set to {@link TableColumnTypes#SET}. + */ + public TableUserDefinedTypeFieldDefinitionSet() { + super(TableUserDefinedTypeFieldTypes.UNSUPPORTED); + } + + /** + * Constructs a new {@code ColumnDefinitionSet} instance with the specified value type. + * + * @param valueType the data type of the values in the set + */ + public TableUserDefinedTypeFieldDefinitionSet(TableUserDefinedTypeFieldTypes valueType) { + this(); + this.valueType = valueType; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypeMapper.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypeMapper.java new file mode 100644 index 00000000..2fb569e9 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypeMapper.java @@ -0,0 +1,122 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.InetAddress; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +/** + * Maps Java types to corresponding Cassandra column types. + *

    + * The {@code ColumnTypeMapper} provides a utility method to determine the appropriate + * Cassandra column type for a given Java class. Commonly used Java types, such as + * primitives, wrapper types, collections, and date/time classes, are mapped to their + * respective Cassandra types. + *

    + * + *

    Example usage:

    + *
    {@code
    + * ColumnTypes columnType = ColumnTypeMapper.getColumnType(String.class);
    + * System.out.println(columnType); // Outputs: TEXT
    + * }
    + * + *

    Supported mappings include:

    + *
      + *
    • Primitives and wrappers (e.g., {@code int -> INT}, {@code boolean -> BOOLEAN})
    • + *
    • Common Java types (e.g., {@code String -> TEXT}, {@code UUID -> UUID})
    • + *
    • Date and time types (e.g., {@code LocalDate -> DATE}, {@code Instant -> TIMESTAMP})
    • + *
    • Collection types (e.g., {@code List -> LIST}, {@code Set -> SET}, {@code Map -> MAP})
    • + *
    • Default fallback for unsupported types: {@code UNSUPPORTED}
    • + *
    + */ +public class TableUserDefinedTypeFieldTypeMapper { + + /** + * A static mapping of Java classes to their corresponding {@link TableColumnTypes}. + */ + private static final Map, TableUserDefinedTypeFieldTypes> typeMapping = new HashMap<>(); + + /** + * Static initializer block that populates the type mapping. + */ + static { + // Primitive and wrapper types + typeMapping.put(Integer.class, TableUserDefinedTypeFieldTypes.INT); + typeMapping.put(int.class, TableUserDefinedTypeFieldTypes.INT); + typeMapping.put(Long.class, TableUserDefinedTypeFieldTypes.BIGINT); + typeMapping.put(long.class, TableUserDefinedTypeFieldTypes.BIGINT); + typeMapping.put(Double.class, TableUserDefinedTypeFieldTypes.DOUBLE); + typeMapping.put(double.class, TableUserDefinedTypeFieldTypes.DOUBLE); + typeMapping.put(Float.class, TableUserDefinedTypeFieldTypes.FLOAT); + typeMapping.put(float.class, TableUserDefinedTypeFieldTypes.FLOAT); + typeMapping.put(Boolean.class, TableUserDefinedTypeFieldTypes.BOOLEAN); + typeMapping.put(boolean.class, TableUserDefinedTypeFieldTypes.BOOLEAN); + typeMapping.put(Byte.class, TableUserDefinedTypeFieldTypes.TINYINT); + typeMapping.put(byte.class, TableUserDefinedTypeFieldTypes.TINYINT); + typeMapping.put(Short.class, TableUserDefinedTypeFieldTypes.SMALLINT); + typeMapping.put(short.class, TableUserDefinedTypeFieldTypes.SMALLINT); + + // Commonly used Java types + typeMapping.put(String.class, TableUserDefinedTypeFieldTypes.TEXT); + typeMapping.put(UUID.class, TableUserDefinedTypeFieldTypes.UUID); + typeMapping.put(BigDecimal.class, TableUserDefinedTypeFieldTypes.DECIMAL); + typeMapping.put(BigInteger.class, TableUserDefinedTypeFieldTypes.VARINT); + typeMapping.put(InetAddress.class, TableUserDefinedTypeFieldTypes.INET); + + // Date and time types + typeMapping.put(Instant.class, TableUserDefinedTypeFieldTypes.TIMESTAMP); + typeMapping.put(LocalDate.class, TableUserDefinedTypeFieldTypes.DATE); + typeMapping.put(LocalTime.class, TableUserDefinedTypeFieldTypes.TIME); + + // Collection types +// typeMapping.put(List.class, UdtFieldTypes.LIST); +// typeMapping.put(Set.class, UdtFieldTypes.SET); +// typeMapping.put(Map.class, UdtFieldTypes.MAP); + + // Unsupported or undefined types + typeMapping.put(Object.class, TableUserDefinedTypeFieldTypes.UNSUPPORTED); + } + + /** + * Private constructor to prevent instantiation. + */ + private TableUserDefinedTypeFieldTypeMapper() {} + + /** + * Retrieves the Cassandra column type corresponding to the given Java class. + * If the type is not explicitly mapped, {@code ColumnTypes.UNSUPPORTED} is returned. + * + * @param clazz the Java class to map + * @return the corresponding {@link TableColumnTypes}, or {@code UNSUPPORTED} if the type is not mapped + */ + public static TableUserDefinedTypeFieldTypes getUdtFieldType(Class clazz) { + return typeMapping.getOrDefault(clazz, TableUserDefinedTypeFieldTypes.UNSUPPORTED); + } +} \ No newline at end of file diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypes.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypes.java new file mode 100644 index 00000000..b80db695 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/types/TableUserDefinedTypeFieldTypes.java @@ -0,0 +1,183 @@ +package com.datastax.astra.client.tables.definition.types; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.internal.serdes.tables.UdtFieldTypeDeserializer; +import com.datastax.astra.internal.serdes.tables.UdtFieldTypeSerializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import lombok.Getter; + +/** + * Represents the various column types supported in a database schema. + * Each column type is associated with a string representation. + *

    + * This enum includes common types like {@code TEXT}, {@code INT}, and {@code UUID}, + * as well as specialized types such as {@code VECTOR} and {@code UNSUPPORTED}. + *

    + * + *

    Example usage:

    + *
    + * {@code
    + * ColumnTypes columnType = ColumnTypes.TEXT;
    + * String columnValue = columnType.getValue();
    + * }
    + * 
    + */ +@Getter +@JsonSerialize(using = UdtFieldTypeSerializer.class) +@JsonDeserialize(using = UdtFieldTypeDeserializer.class) +public enum TableUserDefinedTypeFieldTypes { + + /** + * ASCII string type. + */ + ASCII("ascii"), + + /** + * 64-bit signed integer. + */ + BIGINT("bigint"), + + /** + * Binary large object (BLOB) type. + */ + BLOB("blob"), + + /** + * Boolean type, representing true or false values. + */ + BOOLEAN("boolean"), + + /** + * Date type, storing only the date part without a time zone. + */ + DATE("date"), + + /** + * Arbitrary precision decimal number. + */ + DECIMAL("decimal"), + + /** + * Double-precision floating-point number. + */ + DOUBLE("double"), + + /** + * Time duration type. + */ + DURATION("duration"), + + /** + * Single-precision floating-point number. + */ + FLOAT("float"), + + /** + * IP address type. + */ + INET("inet"), + + /** + * 32-bit signed integer. + */ + INT("int"), + +// /** +// * List collection type. +// */ +// LIST("list"), +// +// /** +// * Map collection type, storing key-value pairs. +// */ +// MAP("map"), +// +// /** +// * Set collection type, storing unique elements. +// */ +// SET("set"), + + /** + * 16-bit signed integer. + */ + SMALLINT("smallint"), + + /** + * Text or string type. + */ + TEXT("text"), + + /** + * Time type, storing only the time part. + */ + TIME("time"), + + /** + * Timestamp type, representing a specific date and time. + */ + TIMESTAMP("timestamp"), + + /** + * TimeUUID. + */ + TIMEUUID("timeuuid"), + + /** + * 8-bit signed integer. + */ + TINYINT("tinyint"), + + /** + * Arbitrary precision integer type. + */ + VARINT("varint"), + + /** + * Universally Unique Identifier (UUID) type. + */ + UUID("uuid"), + + /** + * Represents unsupported column types. + */ + UNSUPPORTED("UNSUPPORTED"), + + /** + * Represents an undefined column type. + */ + UNDEFINED("undefined"); + + /** + * The string representation of the column type. + */ + private final String value; + + /** + * Constructs a {@code ColumnTypes} enum constant with the specified string value. + * + * @param value the string representation of the column type + */ + TableUserDefinedTypeFieldTypes(String value) { + this.value = value; + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Column.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Column.java index 0ac10e99..be496261 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Column.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/Column.java @@ -20,15 +20,12 @@ * #L% */ -import com.datastax.astra.client.core.vector.SimilarityMetric; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.util.HashMap; -import java.util.Map; /** * Annotation to define properties for a database column. This annotation can be used on fields @@ -51,24 +48,24 @@ /** * Specifies the type of the column. If not provided, the field's type will be used. * - * @return the column type or {@link ColumnTypes#UNDEFINED} if not set + * @return the column type or {@link TableColumnTypes#UNDEFINED} if not set */ - ColumnTypes type() default ColumnTypes.UNDEFINED; + TableColumnTypes type() default TableColumnTypes.UNDEFINED; /** * Specifies the value type of the column, typically used for complex data structures. - * If not provided, defaults to {@link ColumnTypes#UNDEFINED}. + * If not provided, defaults to {@link TableColumnTypes#UNDEFINED}. * - * @return the value type or {@link ColumnTypes#UNDEFINED} if not set + * @return the value type or {@link TableColumnTypes#UNDEFINED} if not set */ - ColumnTypes valueType() default ColumnTypes.UNDEFINED; + TableColumnTypes valueType() default TableColumnTypes.UNDEFINED; /** * Specifies the key type of the column, typically used for mapping keys in key-value pairs. - * If not provided, defaults to {@link ColumnTypes#UNDEFINED}. + * If not provided, defaults to {@link TableColumnTypes#UNDEFINED}. * - * @return the key type or {@link ColumnTypes#UNDEFINED} if not set + * @return the key type or {@link TableColumnTypes#UNDEFINED} if not set */ - ColumnTypes keyType() default ColumnTypes.UNDEFINED; + TableColumnTypes keyType() default TableColumnTypes.UNDEFINED; } diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/ColumnVector.java b/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/ColumnVector.java index f1b38d5c..4230ec18 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/ColumnVector.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/tables/mapping/ColumnVector.java @@ -21,7 +21,6 @@ */ import com.datastax.astra.client.core.vector.SimilarityMetric; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/api/DataAPIStatus.java b/astra-db-java/src/main/java/com/datastax/astra/internal/api/DataAPIStatus.java index 868ad1a8..1f8ff0be 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/api/DataAPIStatus.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/api/DataAPIStatus.java @@ -23,7 +23,7 @@ import com.datastax.astra.client.collections.definition.documents.Document; import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.exceptions.DataAPIErrorDescriptor; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; import com.datastax.astra.internal.serdes.DataAPISerializer; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -70,12 +70,12 @@ public class DataAPIStatus { /** * PrimaryKey Schema returned */ - private LinkedHashMap primaryKeySchema; + private LinkedHashMap primaryKeySchema; /** * PrimaryKey Schema returned */ - private LinkedHashMap projectionSchema; + private LinkedHashMap projectionSchema; /** * Inserted ids. diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityBeanDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityBeanDefinition.java index d67fc6f2..fa39e365 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityBeanDefinition.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityBeanDefinition.java @@ -23,10 +23,13 @@ import com.datastax.astra.client.collections.definition.documents.Document; import com.datastax.astra.client.exceptions.DataAPIClientException; import com.datastax.astra.client.exceptions.ErrorCodesClient; -import com.datastax.astra.client.exceptions.InvalidConfigurationException; -import com.datastax.astra.client.tables.definition.columns.ColumnTypeMapper; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedType; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypeMapper; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeField; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypeMapper; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.ColumnVector; import com.datastax.astra.client.tables.mapping.EntityTable; @@ -92,11 +95,13 @@ public class EntityBeanDefinition { public EntityBeanDefinition(Class clazz) { this.clazz = clazz; this.fields = new HashMap<>(); - // Table Name EntityTable tableAnn = clazz.getAnnotation(EntityTable.class); + TableUserDefinedType tableUserDefinedTypeAnn = clazz.getAnnotation(TableUserDefinedType.class); if (tableAnn != null) { this.name = tableAnn.value(); + } else if (tableUserDefinedTypeAnn !=null) { + this.name = tableUserDefinedTypeAnn.value(); } else { this.name = clazz.getSimpleName().toLowerCase(); } @@ -142,25 +147,42 @@ public EntityBeanDefinition(Class clazz) { .getAnnotation(Column.class); ColumnVector columnVector = annfield.getAnnotated() .getAnnotation(ColumnVector.class); + TableUserDefinedTypeField tableUserDefinedTypeField = annfield.getAnnotated() + .getAnnotation(TableUserDefinedTypeField.class); + if (column != null && columnVector != null) { throw new IllegalArgumentException(String.format("Field '%s' in class '%s' cannot be annotated " + "with both @Column or @ColumnVector", field.getName(), clazz.getName())); } + if (tableUserDefinedTypeField != null && (column != null || columnVector != null)) { + throw new IllegalArgumentException(String.format("Field '%s' in class '%s' cannot be annotated " + + "with both @UdtField and @Column or @ColumnVector", field.getName(), clazz.getName())); + } + if ((column!=null || columnVector!=null) && tableUserDefinedTypeAnn != null) { + throw new IllegalArgumentException(String.format("Field '%s' in class '%s' cannot be annotated " + + "with @Column or @ColumnVector as it is markerd as @Udt, please use @UdtField instead", field.getName(), clazz.getName())); + } + if (tableUserDefinedTypeField != null && tableAnn != null) { + throw new IllegalArgumentException(String.format("Field '%s' in class '%s' cannot be annotated " + + "with @UdtField as it is marked as @EntityTable, please use @Column/@ColumnVector instead", field.getName(), clazz.getName())); + } + if (column != null) { if (Utils.hasLength(column.name())) { field.setColumnName(column.name()); } - if (column.type() != ColumnTypes.UNDEFINED) { + if (column.type() != TableColumnTypes.UNDEFINED) { field.setColumnType(column.type()); } - if (column.valueType() != ColumnTypes.UNDEFINED) { + if (column.valueType() != TableColumnTypes.UNDEFINED) { field.setValueType(column.valueType()); } - if (column.keyType() != ColumnTypes.UNDEFINED) { + if (column.keyType() != TableColumnTypes.UNDEFINED) { field.setKeyType(column.keyType()); } } else if (columnVector != null) { - field.setColumnType(ColumnTypes.VECTOR); + + field.setColumnType(TableColumnTypes.VECTOR); field.setSimilarityMetric(columnVector.metric()); field.setVectorDimension(columnVector.dimension()); if (Utils.hasLength(columnVector.name())) { @@ -181,6 +203,27 @@ public EntityBeanDefinition(Class clazz) { if (columnVector.parameters().length > 0) { field.setVectorParameters(EntityFieldDefinition.toMap(columnVector.parameters())); } + } else if (tableUserDefinedTypeField != null) { + if (tableUserDefinedTypeAnn != null) { + field.setUdtName(tableUserDefinedTypeAnn.value()); + } + if (Utils.hasLength(tableUserDefinedTypeField.name())) { + field.setUdtFieldName(tableUserDefinedTypeField.name()); + } else { + field.setUdtFieldName(field.getName()); + } + field.setUdtFieldType(tableUserDefinedTypeField.type()); + if (tableUserDefinedTypeField.valueType() != TableUserDefinedTypeFieldTypes.UNDEFINED) { + field.setUdtFieldValueType(tableUserDefinedTypeField.valueType()); + } + if (tableUserDefinedTypeField.keyType() != TableUserDefinedTypeFieldTypes.UNDEFINED) { + field.setUdtFieldKeyType(tableUserDefinedTypeField.keyType()); + } + } else { + // No annotation, using the name as column name + field.setColumnName(field.getName()); + // No @UdtField, using the name as UDT field name + field.setUdtFieldName(field.getName()); } PartitionBy partitionBy = annfield.getAnnotated().getAnnotation(PartitionBy.class); @@ -257,8 +300,8 @@ public static List listVectorIndexDefinitions(String } List idxList = new ArrayList<>(); bean.getFields().forEach((name, field) -> { - ColumnTypes colType = field.getColumnType(); - if (colType == ColumnTypes.VECTOR) { + TableColumnTypes colType = field.getColumnType(); + if (colType == TableColumnTypes.VECTOR) { TableVectorIndexDefinition idx = new TableVectorIndexDefinition(); if (Utils.hasLength(field.getColumnName())) { idx = idx.column(field.getColumnName()); @@ -273,6 +316,37 @@ public static List listVectorIndexDefinitions(String return idxList; } + /** + * Create a Type command based on the annotated fields. + * + * @param clazz + * the class + * @return + * a document representing the table command + */ + public static Document createTypeCommand(Class clazz) { + EntityBeanDefinition bean = new EntityBeanDefinition<>(clazz); + Document doc = new Document(); + doc.append("name", bean.getName()); + Document definition = new Document(); + doc.append("definition", definition); + Document fields = new Document(); + bean.getFields().forEach((name, field) -> { + Document udtfield = new Document(); + TableUserDefinedTypeFieldTypes fieldType = field.getUdtFieldType(); + // No types has been provided, trying to map from Java types + if (fieldType == null) { + fieldType = TableUserDefinedTypeFieldTypeMapper.getUdtFieldType(field.getType()); + if (fieldType == TableUserDefinedTypeFieldTypes.UNSUPPORTED) { + throw new IllegalArgumentException("Unsupported type '" + field.getType().getName() + "' for field '" + field.getName() + "'"); + } + } + udtfield.append(field.getUdtFieldName(), fieldType.getValue()); + }); + + return doc; + } + /** * Create a table command based on the annotated fields. * @@ -296,18 +370,18 @@ public static Document createTableCommand(String tableName, Class clazz) { Document columns = new Document(); bean.getFields().forEach((name, field) -> { Document column = new Document(); - ColumnTypes colType = field.getColumnType(); + TableColumnTypes colType = field.getColumnType(); // No types has been provided, trying to map from Java types if (colType == null) { - colType = ColumnTypeMapper.getColumnType(field.getType()); - if (colType == ColumnTypes.UNSUPPORTED) { + colType = TableColumnTypeMapper.getColumnType(field.getType()); + if (colType == TableColumnTypes.UNSUPPORTED) { throw new IllegalArgumentException("Unsupported type '" + field.getType().getName() + "' for field '" + field.getName() + "'"); } } column.append("type", colType.getValue()); // Vector: Dimension and Metric - if (colType == ColumnTypes.VECTOR) { + if (colType == TableColumnTypes.VECTOR) { if (field.getVectorDimension() <= 0 || field.getVectorDimension() > 8192 ) { throw new DataAPIClientException(ErrorCodesClient.INVALID_ANNOTATION, "ColumnVector", field.getName(), "dimension is required and must be in between 1 amd 8192"); } @@ -329,11 +403,11 @@ public static Document createTableCommand(String tableName, Class clazz) { } // KeyType with MAPS - if (colType == ColumnTypes.MAP) { - ColumnTypes keyType = field.getKeyType(); + if (colType == TableColumnTypes.MAP) { + TableColumnTypes keyType = field.getKeyType(); if (keyType == null) { - keyType = ColumnTypeMapper.getColumnType(field.getGenericKeyType()); - if (keyType == ColumnTypes.UNSUPPORTED) { + keyType = TableColumnTypeMapper.getColumnType(field.getGenericKeyType()); + if (keyType == TableColumnTypes.UNSUPPORTED) { throw new IllegalArgumentException("Unsupported type '" + field.getType().getName() + "' for key in field '" + field.getName() + "'"); } } @@ -341,13 +415,13 @@ public static Document createTableCommand(String tableName, Class clazz) { } // ValueType with MAPS, LISTS and SETS - if (colType == ColumnTypes.MAP || - colType == ColumnTypes.LIST || - colType == ColumnTypes.SET) { - ColumnTypes valueType = field.getValueType(); + if (colType == TableColumnTypes.MAP || + colType == TableColumnTypes.LIST || + colType == TableColumnTypes.SET) { + TableColumnTypes valueType = field.getValueType(); if (valueType == null) { - valueType = ColumnTypeMapper.getColumnType(field.getGenericValueType()); - if (valueType == ColumnTypes.UNSUPPORTED) { + valueType = TableColumnTypeMapper.getColumnType(field.getGenericValueType()); + if (valueType == TableColumnTypes.UNSUPPORTED) { throw new IllegalArgumentException("Unsupported type '" + field.getType().getName() + "' for value in field '" + field.getName() + "'"); } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityFieldDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityFieldDefinition.java index 9658070e..72ce5d4c 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityFieldDefinition.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/reflection/EntityFieldDefinition.java @@ -22,7 +22,8 @@ import com.datastax.astra.client.core.query.SortOrder; import com.datastax.astra.client.core.vector.SimilarityMetric; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; import com.datastax.astra.client.tables.mapping.KeyValue; import com.fasterxml.jackson.databind.JavaType; import lombok.Data; @@ -51,9 +52,16 @@ public class EntityFieldDefinition { // @Column private String columnName; - private ColumnTypes columnType; - private ColumnTypes valueType; - private ColumnTypes keyType; + private TableColumnTypes columnType; + private TableColumnTypes valueType; + private TableColumnTypes keyType; + + // @UdtField + private String udtName; + private String udtFieldName; + private TableUserDefinedTypeFieldTypes udtFieldType; + private TableUserDefinedTypeFieldTypes udtFieldValueType; + private TableUserDefinedTypeFieldTypes udtFieldKeyType; // @ColumnVector private Integer vectorDimension; diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/DatabaseSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/DatabaseSerializer.java index 5df44037..3cb1d87f 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/DatabaseSerializer.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/DatabaseSerializer.java @@ -40,7 +40,7 @@ import com.datastax.astra.client.core.lexical.Analyzer; import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.core.vector.SimilarityMetric; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.internal.serdes.collections.CollectionDefaultIdTypeDeserializer; import com.datastax.astra.internal.serdes.collections.CollectionDefaultIdTypeSerializer; import com.datastax.astra.internal.serdes.core.AnalyzerSerializer; @@ -104,8 +104,8 @@ public ObjectMapper getMapper() { .setAnnotationIntrospector(new JacksonAnnotationIntrospector()); SimpleModule module = new SimpleModule(); - module.addSerializer(ColumnTypes.class, new ColumnTypeSerializer()); - module.addDeserializer(ColumnTypes.class, new ColumnTypeDeserializer()); + module.addSerializer(TableColumnTypes.class, new ColumnTypeSerializer()); + module.addDeserializer(TableColumnTypes.class, new ColumnTypeDeserializer()); // DefaultId module.addSerializer(CollectionDefaultIdTypes.class, new CollectionDefaultIdTypeSerializer()); module.addDeserializer(CollectionDefaultIdTypes.class, new CollectionDefaultIdTypeDeserializer()); diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/TimeUUIDSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/TimeUUIDSerializer.java new file mode 100644 index 00000000..86463f48 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/TimeUUIDSerializer.java @@ -0,0 +1,61 @@ +package com.datastax.astra.internal.serdes.collections; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.collections.definition.documents.types.TimeUUID; +import com.datastax.astra.client.collections.definition.documents.types.UUIDv6; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +/** + * Object Id Could be + * objectId|uuid|uuidv6|uuidv7 + */ +public class TimeUUIDSerializer extends StdSerializer { + + /** + * Default constructor. + */ + public TimeUUIDSerializer() { + this(null); + } + + /** + * Constructor with type + * @param t + * type + */ + public TimeUUIDSerializer(Class t) { + super(t); + } + + /** {@inheritDoc} */ + @Override + public void serialize(TimeUUID uuidv6, JsonGenerator gen, SerializerProvider provider) throws IOException { +// gen.writeStartObject(); +// gen.writeStringField("$uuid", uuidv6.toString()); + // gen.writeEndObject(); + gen.writeString(uuidv6 != null ? uuidv6.toString() : null); + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/UdtDefinitionShortSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/UdtDefinitionShortSerializer.java new file mode 100644 index 00000000..77df537d --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/collections/UdtDefinitionShortSerializer.java @@ -0,0 +1,66 @@ +package com.datastax.astra.internal.serdes.collections; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldDefinition; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; +import java.util.Map; + +/** + * This would serialize a UDT definition with the short format, (not showing the type) + */ +public class UdtDefinitionShortSerializer extends StdSerializer { + + /** + * Default constructor. + */ + public UdtDefinitionShortSerializer() { + this(null); + } + + /** + * Constructor with type + * @param t + * type + */ + public UdtDefinitionShortSerializer(Class t) { + super(t); + } + + /** {@inheritDoc} */ + @Override + public void serialize(TableUserDefinedTypeDefinition type, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeStartObject(); + gen.writeObjectFieldStart("fields"); + if (type.getFields() != null) { + for (Map.Entry entry : type.getFields().entrySet()) { + gen.writeStringField(entry.getKey(), entry.getValue().getType().getValue()); + } + } + gen.writeEndObject(); // end of "fields" + gen.writeEndObject(); // end of root object + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/AlterTypeOperationSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/AlterTypeOperationSerializer.java new file mode 100644 index 00000000..ccbb650e --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/AlterTypeOperationSerializer.java @@ -0,0 +1,78 @@ +package com.datastax.astra.internal.serdes.tables; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 - 2025 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + + +import com.datastax.astra.client.tables.commands.AlterTypeOperation; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +/** + * Serializer for {@link AlterTypeOperation}. + *

    + * This class is responsible for serializing an {@link AlterTypeOperation} instance into JSON format. + *

    + * + *

    Example usage:

    + *
    + * {@code
    + * AlterTypeOperation operation = new AlterTypeOperation();
    + * String json = new ObjectMapper().writeValueAsString(operation);
    + * }
    + * 
    + */ +public class AlterTypeOperationSerializer extends StdSerializer> { + + /** + * Default constructor. + */ + public AlterTypeOperationSerializer() { + this(null); + } + + /** + * Constructor with type + * @param t + * type + */ + public AlterTypeOperationSerializer(Class> t) { + super(t); + } + + /** {@inheritDoc} */ + @Override + public void serialize(AlterTypeOperation def, JsonGenerator gen, SerializerProvider provider) + throws IOException { + if (def == null) { + gen.writeNull(); + return; + } + // {"def.getOperationName":{ "fields": {"name": "type"}}} + gen.writeStartObject(); + gen.writeFieldName(def.getOperationName()); + gen.writeObjectField("fields", def.getFields()); + gen.writeEndObject(); + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeDeserializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeDeserializer.java index 8e29cc7f..6f178d2d 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeDeserializer.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeDeserializer.java @@ -20,7 +20,7 @@ * #L% */ -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; @@ -31,7 +31,7 @@ /** * Custom deserializer for EJson Date type. */ -public class ColumnTypeDeserializer extends JsonDeserializer { +public class ColumnTypeDeserializer extends JsonDeserializer { /** * Default constructor. @@ -42,10 +42,10 @@ public ColumnTypeDeserializer() { /** {@inheritDoc} */ @Override - public ColumnTypes deserialize(JsonParser jp, DeserializationContext ctxt) + public TableColumnTypes deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonNode node = jp.getCodec().readTree(jp); - return ColumnTypes.valueOf(node.asText().toUpperCase()); + return TableColumnTypes.valueOf(node.asText().toUpperCase()); } } diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeSerializer.java index 0688c4b1..bf059bf6 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeSerializer.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/ColumnTypeSerializer.java @@ -20,7 +20,7 @@ * #L% */ -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; @@ -31,7 +31,7 @@ * Object Id Could be * objectId|uuid|uuidv6|uuidv7 */ -public class ColumnTypeSerializer extends StdSerializer { +public class ColumnTypeSerializer extends StdSerializer { /** * Default constructor. @@ -45,13 +45,13 @@ public ColumnTypeSerializer() { * @param t * type */ - public ColumnTypeSerializer(Class t) { + public ColumnTypeSerializer(Class t) { super(t); } /** {@inheritDoc} */ @Override - public void serialize(ColumnTypes columnType, JsonGenerator gen, SerializerProvider provider) + public void serialize(TableColumnTypes columnType, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeString(columnType.getValue()); } diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/RowSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/RowSerializer.java index 81d00767..55bf61ab 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/RowSerializer.java +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/RowSerializer.java @@ -41,7 +41,7 @@ import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.core.vector.SimilarityMetric; import com.datastax.astra.client.tables.definition.TableDuration; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableIndexColumnDefinition; import com.datastax.astra.internal.serdes.DataAPISerializer; import com.datastax.astra.internal.serdes.collections.HybridLimitsSerializer; @@ -115,7 +115,7 @@ public ObjectMapper getMapper() { SimpleModule module = new SimpleModule(); // Serialization - module.addSerializer(ColumnTypes.class, new ColumnTypeSerializer()); + module.addSerializer(TableColumnTypes.class, new ColumnTypeSerializer()); module.addSerializer(Float.class, new FloatSerializer()); module.addSerializer(float.class, new FloatSerializer()); module.addSerializer(Double.class, new DoubleSerializer()); @@ -137,7 +137,7 @@ public ObjectMapper getMapper() { module.addDeserializer(TableIndexColumnDefinition.class, new TableIndexColumnDefinitionDeserializer()); // De-Serialization - module.addDeserializer(ColumnTypes.class, new ColumnTypeDeserializer()); + module.addDeserializer(TableColumnTypes.class, new ColumnTypeDeserializer()); module.addDeserializer(Float.class, new FloatDeserializer()); module.addDeserializer(float.class, new FloatDeserializer()); module.addDeserializer(Double.class, new DoubleDeserializer()); diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeDeserializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeDeserializer.java new file mode 100644 index 00000000..1a6e9f90 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeDeserializer.java @@ -0,0 +1,51 @@ +package com.datastax.astra.internal.serdes.tables; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; + +import java.io.IOException; + +/** + * Custom deserializer for EJson Date type. + */ +public class UdtFieldTypeDeserializer extends JsonDeserializer { + + /** + * Default constructor. + */ + public UdtFieldTypeDeserializer() { + // left blank, will be populated by jackson + } + + /** {@inheritDoc} */ + @Override + public TableUserDefinedTypeFieldTypes deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException { + JsonNode node = jp.getCodec().readTree(jp); + return TableUserDefinedTypeFieldTypes.valueOf(node.asText().toUpperCase()); + } + +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeSerializer.java b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeSerializer.java new file mode 100644 index 00000000..22d192fb --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/internal/serdes/tables/UdtFieldTypeSerializer.java @@ -0,0 +1,57 @@ +package com.datastax.astra.internal.serdes.tables; + +/*- + * #%L + * Data API Java Client + * -- + * Copyright (C) 2024 DataStax + * -- + * Licensed under the Apache License, Version 2.0 + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * #L% + */ + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; + +/** + * Object Id Could be + */ +public class UdtFieldTypeSerializer extends StdSerializer { + + /** + * Default constructor. + */ + public UdtFieldTypeSerializer() { + this(null); + } + + /** + * Constructor with type + * @param t + * type + */ + public UdtFieldTypeSerializer(Class t) { + super(t); + } + + /** {@inheritDoc} */ + @Override + public void serialize(TableUserDefinedTypeFieldTypes columnType, JsonGenerator gen, SerializerProvider provider) + throws IOException { + gen.writeString(columnType.getValue()); + } +} diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDataAPITest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDataAPITest.java index dbbf9e7e..24479d5d 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDataAPITest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDataAPITest.java @@ -182,6 +182,11 @@ protected void dropTable(String name) { log.info("Table {} dropped", name); } + protected void dropType(String name) { + getDatabase().dropType(name); + log.info("Table {} dropped", name); + } + protected void dropAllCollections() { Database db = getDatabase(); db.listCollectionNames().forEach(db::dropCollection); diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDatabaseTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDatabaseTest.java index bf706bc6..028266a5 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDatabaseTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/AbstractDatabaseTest.java @@ -18,8 +18,8 @@ import com.datastax.astra.client.tables.commands.options.ListTablesOptions; import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.definition.TableDescriptor; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.rows.Row; import com.datastax.astra.internal.api.DataAPIResponse; import com.datastax.astra.test.model.TableEntityGameWithAnnotation; @@ -373,11 +373,11 @@ public void shouldCreateTables() { TableDefinition tableDefinition = new TableDefinition() .addColumnText("match_id") .addColumnInt("round") - .addColumnVector("m_vector", new ColumnDefinitionVector().dimension(3).metric(COSINE)) - .addColumn("score", ColumnTypes.INT) - .addColumn("when", ColumnTypes.TIMESTAMP) - .addColumn("winner", ColumnTypes.TEXT) - .addColumnSet("fighters", ColumnTypes.UUID) + .addColumnVector("m_vector", new TableColumnDefinitionVector().dimension(3).metric(COSINE)) + .addColumn("score", TableColumnTypes.INT) + .addColumn("when", TableColumnTypes.TIMESTAMP) + .addColumn("winner", TableColumnTypes.TEXT) + .addColumnSet("fighters", TableColumnTypes.UUID) .addPartitionBy("match_id") .addPartitionSort(ascending("round")); assertThat(tableDefinition).isNotNull(); diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java index c682a6b9..8ebd6d1d 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/TableGAIntegrationTest.java @@ -4,38 +4,44 @@ import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.DataAPIDestination; import com.datastax.astra.client.admin.options.AstraFindAvailableRegionsOptions; -import com.datastax.astra.client.collections.definition.documents.types.UUIDv6; -import com.datastax.astra.client.collections.definition.documents.types.UUIDv7; +import com.datastax.astra.client.collections.definition.documents.types.TimeUUID; import com.datastax.astra.client.core.options.DataAPIClientOptions; -import com.datastax.astra.client.core.query.Filter; -import com.datastax.astra.client.core.query.Filters; import com.datastax.astra.client.core.vectorize.SupportModelStatus; -import com.datastax.astra.client.core.vectorize.VectorServiceOptions; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.databases.commands.options.FindEmbeddingProvidersOptions; import com.datastax.astra.client.databases.commands.options.FindRerankingProvidersOptions; import com.datastax.astra.client.tables.Table; +import com.datastax.astra.client.tables.commands.AlterTypeAddFields; +import com.datastax.astra.client.tables.commands.AlterTypeRenameFields; import com.datastax.astra.client.tables.commands.options.CreateIndexOptions; +import com.datastax.astra.client.tables.commands.options.CreateTypeOptions; +import com.datastax.astra.client.tables.commands.options.DropTypeOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; -import com.datastax.astra.client.tables.definition.indexes.TableIndexDefinitionOptions; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableIndexMapTypes; import com.datastax.astra.client.tables.definition.indexes.TableRegularIndexDefinition; import com.datastax.astra.client.tables.definition.rows.Row; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldDefinition; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldDefinitionList; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.EntityTable; +import com.datastax.astra.test.model.SampleUdtAddress; import com.dtsx.astra.sdk.utils.JsonUtils; import lombok.Data; import org.junit.jupiter.api.Test; -import java.time.Instant; -import java.util.Map; import java.util.Optional; import java.util.UUID; import static com.datastax.astra.client.core.query.Filters.eq; import static com.datastax.astra.client.tables.commands.options.CreateTableOptions.IF_NOT_EXISTS; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.BIGINT; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.BLOB; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.BOOLEAN; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.INT; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.TEXT; +import static com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes.TIMESTAMP; /* * Flight DECK for Astra DEV @@ -45,7 +51,7 @@ public class TableGAIntegrationTest { public static final String ASTRA_DB_TOKEN = - "1"; + "REDACTED"; public static final String DB_URL_NON_VECTOR = "https://f9754177-52e2-4b66-935e-78cfd0be0042-us-west-2.apps.astra-dev.datastax.com"; public static final String DB_URL_VECTOR = @@ -113,7 +119,6 @@ public void should_findEmbeddingProviders() { }); } - /** * Collection Name */ @@ -144,7 +149,7 @@ public void shouldCreateTableIndex() { .createTable("demo_table_index", new TableDefinition() .addColumnText("email") .addColumnText("name") - .addColumnMap("example_map_column", ColumnTypes.TEXT, ColumnTypes.TEXT) + .addColumnMap("example_map_column", TableColumnTypes.TEXT, TableColumnTypes.TEXT) .partitionKey("email"), IF_NOT_EXISTS); @@ -164,13 +169,13 @@ public void shouldCreateTableIndex() { @EntityTable("video_ratings") public static final class VideoRatingTableEntity { - @Column(name = "videoid", type = ColumnTypes.UUID) + @Column(name = "videoid", type = TableColumnTypes.UUID) UUID videoId; - @Column(name = "rating_counter", type = ColumnTypes.COUNTER) + @Column(name = "rating_counter", type = TableColumnTypes.COUNTER) Integer ratingCounter; - @Column(name = "rating_total", type = ColumnTypes.COUNTER) + @Column(name = "rating_total", type = TableColumnTypes.COUNTER) Integer ratingTotal; } @@ -185,13 +190,13 @@ public static final class VideoRatingTableEntity { @EntityTable("sample_table") public static final class SampleTable { - @Column(name = "id", type = ColumnTypes.TIMEUUID) - UUIDv6 videoId; + @Column(name = "id", type = TableColumnTypes.TIMEUUID) + TimeUUID videoId; - @Column(name = "col1", type = ColumnTypes.TEXT) + @Column(name = "col1", type = TableColumnTypes.TEXT) String col1; - @Column(name = "col2", type = ColumnTypes.TEXT) + @Column(name = "col2", type = TableColumnTypes.TEXT) String col2; } @@ -204,16 +209,24 @@ public static final class SampleTable { */ @Test - public void should_create_table_with_timeuuid() { + public void should_read_table_with_timeuuid() { Table table3 = getLocalDatabase().getTable(SampleTable.class); + // Read table3.findAll().forEach(row -> { - System.out.println("Entity: " + row.getVideoId().getInstant() + " - " + row.col1 + " - " + row.col2); + System.out.println("Entity: " + row.getVideoId().readInstant() + " - " + row.col1 + " - " + row.col2); }); + + // Insert + SampleTable sample = new SampleTable(); + sample.setVideoId(new TimeUUID()); + sample.setCol1("Sample Column 1"); + sample.setCol2("Sample Column 2"); + table3.insertOne(sample); } @Test - public void should_create_table_with_counters() { + public void should_read_table_with_counters() { Table table2 = getLocalDatabase() .getTable("video_ratings", VideoRatingTableEntity.class); @@ -223,8 +236,12 @@ public void should_create_table_with_counters() { // }); Optional optional = table2.findOne( - eq("videoid", UUID.fromString("6f9619ff-8b86-d011-b42d-00cf4fc964ff")) + eq("videoid", java.util.UUID.fromString("6f9619ff-8b86-d011-b42d-00cf4fc964ff")) ); + + // Insert + + if (optional.isPresent()) { VideoRatingTableEntity entity = optional.get(); System.out.println("Entity: " + entity.videoId + " - " + entity.ratingCounter + " - " + entity.ratingTotal); @@ -233,5 +250,57 @@ public void should_create_table_with_counters() { } } + @Test + public void should_create_type() { + getLocalDatabase().createType("udt_one", new TableUserDefinedTypeDefinition() + .addFieldUuid("f_uuid") + .addFieldText("f_text") + .addFieldAscii("f_ascii") + .addFieldBigInt("f_bigint") + .addFieldBlob("f_blob") + .addFieldBoolean("f_boolean") + .addFieldTimestamp("f_timestamp") + .addFieldInt("f_int") + , CreateTypeOptions.IF_NOT_EXISTS); + } + + @Test + public void should_drop_type() { + getLocalDatabase().dropType("udt_one",DropTypeOptions.IF_EXISTS); + } + + @Test + public void should_alter_type_rename_fields() { + getLocalDatabase().alterType("udt_one", + new AlterTypeRenameFields().addField("f_bigint", "f_bigint2")); + } + + @Test + public void should_alter_type_add_fields() { + getLocalDatabase().alterType("udt_one", + new AlterTypeAddFields() + .addField("x_bigint2", new TableUserDefinedTypeFieldDefinition(BIGINT)) + .addField("x_text2", new TableUserDefinedTypeFieldDefinition(TEXT)) + .addField("x_blob2", new TableUserDefinedTypeFieldDefinition(BLOB)) + .addField("x_boolean2", new TableUserDefinedTypeFieldDefinition(BOOLEAN)) + .addField("x_timestamp3", new TableUserDefinedTypeFieldDefinition(TIMESTAMP)) + .addField("x_int2", new TableUserDefinedTypeFieldDefinition(INT))); + } + + @Test + public void should_create_type_bean() { + getLocalDatabase().createType(SampleUdtAddress.class, null); + } + + @Test + public void should_create_table_withudts() { +// getLocalDatabase().createTable("demo_table_with_udts",) +// new TableDefinition() +// .addColumnText("email") +// .addColumnText("name") +// //.addColumnUserDefinedType("address", "udt_one") +// .partitionKey("email"), IF_NOT_EXISTS); + } + } diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/Astra_05_TableITTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/Astra_05_TableITTest.java index 1d5ded41..0f7abdbe 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/Astra_05_TableITTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/Astra_05_TableITTest.java @@ -6,7 +6,7 @@ import com.datastax.astra.client.tables.commands.options.CreateVectorIndexOptions; import com.datastax.astra.client.tables.commands.options.TableFindOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinitionOptions; import com.datastax.astra.client.tables.definition.rows.Row; @@ -32,7 +32,7 @@ private Table createTable() { Table table = getDatabase().createTable(TABLE_NAME, new TableDefinition() .addColumnText("email") .addColumnText("name") - .addColumnVector("vector", new ColumnDefinitionVector() + .addColumnVector("vector", new TableColumnDefinitionVector() .dimension(1024) .service( new VectorServiceOptions() .provider("nvidia") diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java new file mode 100644 index 00000000..b0378428 --- /dev/null +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java @@ -0,0 +1,47 @@ +package com.datastax.astra.test.integration.astra; + +import com.datastax.astra.client.DataAPIClient; +import com.datastax.astra.client.DataAPIDestination; +import com.datastax.astra.client.collections.Collection; +import com.datastax.astra.client.collections.definition.documents.Document; +import com.datastax.astra.client.core.options.DataAPIClientOptions; +import com.datastax.astra.client.databases.Database; +import org.junit.jupiter.api.Test; + +public class DemoAstraDevVectorize { + + public static final String ASTRA_DB_TOKEN_TEST = + "AstraCS:EEdyFLdZCZqGEkWyHCdjRFxB:1204d23e42803a9bcae9c712a89eed75678ec7cdfc89c07a27af945bf1cfbaa9"; + + public static final String ASTRA_URL = + "https://71589bc7-a75f-4153-ab16-9fce04ddf573-westus2.apps.astra-test.datastax.com"; + //"https://b527003e-aefb-43fe-a1e9-92eef7ba4f2b-us-east-1.apps.astra-test.datastax.com"; + + private DataAPIClient getAstraDevDataApiClient() { + DataAPIClientOptions options = new DataAPIClientOptions() + .destination(DataAPIDestination.ASTRA_TEST) + .logRequests(); + return new DataAPIClient(ASTRA_DB_TOKEN_TEST, options); + } + + private Database getDatabase() { + return getAstraDevDataApiClient().getDatabase(ASTRA_URL); + } + + @Test + public void should_list_collection() { + getDatabase().listCollections().forEach(System.out::println); + } + + @Test + public void should_insert_vectorized_documents() { + Collection collec = getDatabase() + .getCollection("collectiion_openai"); +// +// collec.insertOne(new Document().id("doc1") +// .vectorize("IT IS WORKING") +// .append("model", "cedrick")); + } + + +} diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_20_TableITTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_20_TableITTest.java index 96a67937..b694fc7e 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_20_TableITTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_20_TableITTest.java @@ -1,7 +1,6 @@ package com.datastax.astra.test.integration.local; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.DataAPIDestination; import com.datastax.astra.client.core.headers.EmbeddingAPIKeyHeaderProvider; import com.datastax.astra.client.core.http.HttpClientOptions; @@ -33,8 +32,8 @@ import com.datastax.astra.client.tables.commands.results.TableInsertOneResult; import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.definition.TableDuration; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableIndexDescriptor; import com.datastax.astra.client.tables.definition.indexes.TableRegularIndexDefinition; import com.datastax.astra.client.tables.definition.indexes.TableIndexDefinitionOptions; @@ -45,11 +44,8 @@ import com.datastax.astra.test.model.TableCompositeAnnotatedRow; import com.datastax.astra.test.model.TableCompositeRow; import com.datastax.astra.test.model.TableCompositeRowGenerator; -import com.dtsx.astra.sdk.db.domain.CloudProviderType; -import com.dtsx.astra.sdk.utils.AstraEnvironment; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import java.math.BigDecimal; @@ -157,37 +153,37 @@ public void shouldCreateTableComposite() { @Order(4) public void shouldCreateTableAllReturns() { com.datastax.astra.client.tables.Table tableAllReturns = getDatabase().createTable(TABLE_ALL_RETURNS, new TableDefinition() - .addColumn("p_ascii", ColumnTypes.ASCII) - .addColumn("p_bigint", ColumnTypes.BIGINT) - .addColumn("p_blob", ColumnTypes.BLOB) - .addColumn("p_boolean", ColumnTypes.BOOLEAN) - .addColumn("p_date", ColumnTypes.DATE) - .addColumn("p_decimal", ColumnTypes.DECIMAL) - .addColumn("p_tinyint", ColumnTypes.TINYINT) - .addColumn("p_double", ColumnTypes.DOUBLE) - .addColumn("p_duration", ColumnTypes.DURATION) - .addColumn("p_duration2", ColumnTypes.DURATION) - .addColumn("p_float", ColumnTypes.FLOAT) - .addColumn("p_int", ColumnTypes.INT) - .addColumn("p_inet", ColumnTypes.INET) - .addColumn("p_smallint", ColumnTypes.SMALLINT) - .addColumn("p_text", ColumnTypes.TEXT) - .addColumn("p_text_nulled", ColumnTypes.TEXT) - .addColumn("p_text_omitted", ColumnTypes.TEXT) - .addColumn("p_time", ColumnTypes.TIME) - .addColumn("p_timestamp", ColumnTypes.TIMESTAMP) - .addColumn("p_tinyint", ColumnTypes.TINYINT) - .addColumn("p_uuid", ColumnTypes.UUID) - .addColumn("p_varint", ColumnTypes.VARINT) - .addColumnVector("p_vector", new ColumnDefinitionVector() + .addColumn("p_ascii", TableColumnTypes.ASCII) + .addColumn("p_bigint", TableColumnTypes.BIGINT) + .addColumn("p_blob", TableColumnTypes.BLOB) + .addColumn("p_boolean", TableColumnTypes.BOOLEAN) + .addColumn("p_date", TableColumnTypes.DATE) + .addColumn("p_decimal", TableColumnTypes.DECIMAL) + .addColumn("p_tinyint", TableColumnTypes.TINYINT) + .addColumn("p_double", TableColumnTypes.DOUBLE) + .addColumn("p_duration", TableColumnTypes.DURATION) + .addColumn("p_duration2", TableColumnTypes.DURATION) + .addColumn("p_float", TableColumnTypes.FLOAT) + .addColumn("p_int", TableColumnTypes.INT) + .addColumn("p_inet", TableColumnTypes.INET) + .addColumn("p_smallint", TableColumnTypes.SMALLINT) + .addColumn("p_text", TableColumnTypes.TEXT) + .addColumn("p_text_nulled", TableColumnTypes.TEXT) + .addColumn("p_text_omitted", TableColumnTypes.TEXT) + .addColumn("p_time", TableColumnTypes.TIME) + .addColumn("p_timestamp", TableColumnTypes.TIMESTAMP) + .addColumn("p_tinyint", TableColumnTypes.TINYINT) + .addColumn("p_uuid", TableColumnTypes.UUID) + .addColumn("p_varint", TableColumnTypes.VARINT) + .addColumnVector("p_vector", new TableColumnDefinitionVector() .dimension(3) .metric(COSINE)) - .addColumnList("p_list_int", ColumnTypes.INT) - .addColumnSet("p_set_int", ColumnTypes.INT) - .addColumnMap("p_map_text_text", ColumnTypes.TEXT, ColumnTypes.TEXT) - .addColumn("p_double_minf", ColumnTypes.DOUBLE) - .addColumn("p_double_pinf", ColumnTypes.DOUBLE) - .addColumn("p_float_nan", ColumnTypes.FLOAT) + .addColumnList("p_list_int", TableColumnTypes.INT) + .addColumnSet("p_set_int", TableColumnTypes.INT) + .addColumnMap("p_map_text_text", TableColumnTypes.TEXT, TableColumnTypes.TEXT) + .addColumn("p_double_minf", TableColumnTypes.DOUBLE) + .addColumn("p_double_pinf", TableColumnTypes.DOUBLE) + .addColumn("p_float_nan", TableColumnTypes.FLOAT) .partitionKey("p_ascii", "p_bigint") .clusteringColumns(ascending("p_int"), descending("p_boolean")), new CreateTableOptions().ifNotExists(true)); @@ -214,12 +210,12 @@ public void shouldCreateTableAllReturns() { public void shouldCreateTableAllCassio() { assertThat(getDatabase().tableExists(TABLE_CASSIO)).isFalse(); getDatabase().createTable(TABLE_CASSIO, new TableDefinition() - .addColumn("partition_id", ColumnTypes.TEXT) - .addColumn("attributes_blob", ColumnTypes.TEXT) - .addColumn("body_blob", ColumnTypes.TEXT) - .addColumn("row_id", ColumnTypes.UUID) - .addColumnMap("metadata_s", ColumnTypes.TEXT, ColumnTypes.TEXT) - .addColumnVector("vector", new ColumnDefinitionVector() + .addColumn("partition_id", TableColumnTypes.TEXT) + .addColumn("attributes_blob", TableColumnTypes.TEXT) + .addColumn("body_blob", TableColumnTypes.TEXT) + .addColumn("row_id", TableColumnTypes.UUID) + .addColumnMap("metadata_s", TableColumnTypes.TEXT, TableColumnTypes.TEXT) + .addColumnVector("vector", new TableColumnDefinitionVector() .dimension(1536).metric(COSINE)) .partitionKey("partition_id") .clusteringColumns(Sort.descending("row_id"))); @@ -414,7 +410,7 @@ public void shouldAlterAddColumns() { // Add Column (Vector) assertThat(t.getDefinition().getColumns().containsKey("vv")).isFalse(); t.alter(new AlterTableAddColumns().addColumnVector("vv", - new ColumnDefinitionVector().dimension(1024).metric(COSINE))); + new TableColumnDefinitionVector().dimension(1024).metric(COSINE))); assertThat(t.getDefinition().getColumns().containsKey("vv")).isTrue(); // Add Vectorize diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java index 06bb7c67..b2f1ad8b 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/local/Local_21_TableCollectionIndexTest.java @@ -1,17 +1,13 @@ package com.datastax.astra.test.integration.local; -import com.datastax.astra.client.DataAPIClient; import com.datastax.astra.client.DataAPIClients; -import com.datastax.astra.client.DataAPIDestination; -import com.datastax.astra.client.core.auth.UsernamePasswordTokenProvider; -import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.core.vector.SimilarityMetric; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.tables.commands.options.CreateIndexOptions; import com.datastax.astra.client.tables.commands.options.CreateVectorIndexOptions; import com.datastax.astra.client.tables.commands.options.DropTableOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; import com.datastax.astra.client.tables.definition.indexes.TableRegularIndexDefinition; import com.datastax.astra.client.tables.definition.indexes.TableIndexMapTypes; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; @@ -19,11 +15,9 @@ import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.condition.DisabledIfSystemProperty; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; -import static com.datastax.astra.client.core.options.DataAPIClientOptions.DEFAULT_KEYSPACE; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @EnabledIfSystemProperty(named = "ASTRA_DB_JAVA_TEST_ENV", matches = "xxx") @@ -50,7 +44,7 @@ public void should_create_yuki_table() { .addColumnMap("mapcolumn", TEXT, TEXT) .addColumnSet("setcolumn", TEXT) .addColumnList("listcolumn", TEXT) - .addColumnVector("vectorcolumn", new ColumnDefinitionVector() + .addColumnVector("vectorcolumn", new TableColumnDefinitionVector() .dimension(1536).metric(SimilarityMetric.DOT_PRODUCT)) .partitionKey("name")); diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/model/SampleUdtAddress.java b/astra-db-java/src/test/java/com/datastax/astra/test/model/SampleUdtAddress.java new file mode 100644 index 00000000..9bef4a90 --- /dev/null +++ b/astra-db-java/src/test/java/com/datastax/astra/test/model/SampleUdtAddress.java @@ -0,0 +1,26 @@ +package com.datastax.astra.test.model; + +import com.datastax.astra.client.tables.definition.types.TableUserDefinedType; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeField; +import com.datastax.astra.client.tables.definition.types.TableUserDefinedTypeFieldTypes; +import lombok.Data; +import lombok.NoArgsConstructor; + + +@Data +@TableUserDefinedType("udt_address") +@NoArgsConstructor +public class SampleUdtAddress { + + @TableUserDefinedTypeField(name ="street", type = TableUserDefinedTypeFieldTypes.TEXT) + String street; + + @TableUserDefinedTypeField(name ="street", type = TableUserDefinedTypeFieldTypes.TEXT) + String city; + + @TableUserDefinedTypeField(name ="state", type = TableUserDefinedTypeFieldTypes.TEXT) + String state; + + @TableUserDefinedTypeField(name ="zip_code", type = TableUserDefinedTypeFieldTypes.INT) + String zipCode; +} diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableCompositeAnnotatedRow.java b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableCompositeAnnotatedRow.java index 9712cf91..c7c32f4f 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableCompositeAnnotatedRow.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableCompositeAnnotatedRow.java @@ -7,8 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.INT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.INT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; @Data @EntityTable("table_composite_pk_annotated") diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableEntityGameWithAnnotationAllHints.java b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableEntityGameWithAnnotationAllHints.java index 22436bc0..6fac6927 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableEntityGameWithAnnotationAllHints.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableEntityGameWithAnnotationAllHints.java @@ -15,12 +15,11 @@ import java.time.Instant; import java.util.Set; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.INT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.SET; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TIMESTAMP; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.UUID; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.VECTOR; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.INT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.SET; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TIMESTAMP; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.UUID; @Data @EntityTable("game_ann1") diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableSimpleAnnotatedRow.java b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableSimpleAnnotatedRow.java index 93f32a6f..5e23a714 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/model/TableSimpleAnnotatedRow.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/model/TableSimpleAnnotatedRow.java @@ -9,9 +9,9 @@ import lombok.Data; import static com.datastax.astra.client.core.query.SortOrder.ASCENDING; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.BOOLEAN; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.INT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.BOOLEAN; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.INT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; @Data @Builder diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/unit/QuickStartTablesLocal.java b/astra-db-java/src/test/java/com/datastax/astra/test/unit/QuickStartTablesLocal.java index 35608641..eb67509f 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/unit/QuickStartTablesLocal.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/unit/QuickStartTablesLocal.java @@ -18,8 +18,8 @@ import java.util.Optional; import static com.datastax.astra.client.core.options.DataAPIClientOptions.DEFAULT_KEYSPACE; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.INT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.INT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; import static com.datastax.astra.client.tables.commands.options.CreateTableOptions.IF_NOT_EXISTS; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/unit/WorkWithOptions.java b/astra-db-java/src/test/java/com/datastax/astra/test/unit/WorkWithOptions.java index 69c941ed..0918a140 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/unit/WorkWithOptions.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/unit/WorkWithOptions.java @@ -13,8 +13,8 @@ import com.datastax.astra.client.tables.Table; import com.datastax.astra.client.tables.definition.TableDefinition; import com.datastax.astra.client.tables.TableOptions; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.commands.options.CreateTableOptions; import com.datastax.astra.client.tables.definition.rows.Row; import org.junit.jupiter.api.Test; @@ -48,11 +48,11 @@ public void shouldListCollection() { TableDefinition tableDefinition = new TableDefinition() .addColumnText("match_id") .addColumnInt("round") - .addColumnVector("m_vector", new ColumnDefinitionVector().dimension(3).metric(COSINE)) - .addColumn("score", ColumnTypes.INT) - .addColumn("when", ColumnTypes.TIMESTAMP) - .addColumn("winner", ColumnTypes.TEXT) - .addColumnSet("fighters", ColumnTypes.UUID) + .addColumnVector("m_vector", new TableColumnDefinitionVector().dimension(3).metric(COSINE)) + .addColumn("score", TableColumnTypes.INT) + .addColumn("when", TableColumnTypes.TIMESTAMP) + .addColumn("winner", TableColumnTypes.TEXT) + .addColumnSet("fighters", TableColumnTypes.UUID) .addPartitionBy("match_id") .addPartitionSort(Sort.ascending("round")); diff --git a/astra-sdk-devops/pom.xml b/astra-sdk-devops/pom.xml index ee35b2bd..98680e93 100644 --- a/astra-sdk-devops/pom.xml +++ b/astra-sdk-devops/pom.xml @@ -7,7 +7,7 @@ com.datastax.astra astra-db-java-parent - 2.0.0 + 2.1.0-SNAPSHOT diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java index 93e8b5c4..6a59692d 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/DbRegionsClient.java @@ -1,15 +1,14 @@ package com.dtsx.astra.sdk.db; import com.dtsx.astra.sdk.AbstractApiClient; -import com.dtsx.astra.sdk.db.domain.FilterByOrgType; -import com.dtsx.astra.sdk.db.domain.RegionType; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import com.dtsx.astra.sdk.utils.HttpClientWrapper; import com.dtsx.astra.sdk.db.domain.CloudProviderType; import com.dtsx.astra.sdk.db.domain.DatabaseRegion; import com.dtsx.astra.sdk.db.domain.DatabaseRegionServerless; +import com.dtsx.astra.sdk.db.domain.FilterByOrgType; +import com.dtsx.astra.sdk.db.domain.RegionType; import com.dtsx.astra.sdk.utils.ApiLocator; import com.dtsx.astra.sdk.utils.ApiResponseHttp; +import com.dtsx.astra.sdk.utils.AstraEnvironment; import com.dtsx.astra.sdk.utils.JsonUtils; import com.fasterxml.jackson.core.type.TypeReference; @@ -79,6 +78,8 @@ public Stream findAll() { * List serverless regions. * @param regionType * provide the filter you want + * @param filterByOrg + * define if you want to filter by org enabled or disabled * @return * serverless region */ diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java index 90b803c8..c7877780 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/FilterByOrgType.java @@ -4,5 +4,14 @@ * Encoded all values for 'filter-by-org' parameter when listing serverless databases. */ public enum FilterByOrgType { - DISABLED, ENABLED + + /** + * Filter by organization ID. + */ + DISABLED, + + /** + * Filter by organization type. + */ + ENABLED } diff --git a/examples/pom.xml b/examples/pom.xml index a713ef01..9bc63130 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -8,7 +8,7 @@ com.datastax.astra astra-db-java-parent - 2.0.0 + 2.1.0-SNAPSHOT diff --git a/examples/src/main/java/com/datastax/astra/Book.java b/examples/src/main/java/com/datastax/astra/Book.java index 115783da..4766a0a3 100644 --- a/examples/src/main/java/com/datastax/astra/Book.java +++ b/examples/src/main/java/com/datastax/astra/Book.java @@ -1,7 +1,7 @@ package com.datastax.astra; import com.datastax.astra.client.core.vector.DataAPIVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.mapping.Column; import com.datastax.astra.client.tables.mapping.ColumnVector; import com.datastax.astra.client.tables.mapping.EntityTable; @@ -40,7 +40,7 @@ public class Book { boolean checkedOut; - @Column(name = "dueDate", type = ColumnTypes.DATE) + @Column(name = "dueDate", type = TableColumnTypes.DATE) Date dueDate; @ColumnVector( diff --git a/examples/src/main/java/com/datastax/astra/client/database/CreateTable.java b/examples/src/main/java/com/datastax/astra/client/database/CreateTable.java index 5235db3d..3ab27e91 100644 --- a/examples/src/main/java/com/datastax/astra/client/database/CreateTable.java +++ b/examples/src/main/java/com/datastax/astra/client/database/CreateTable.java @@ -6,8 +6,8 @@ import com.datastax.astra.client.tables.Game; import com.datastax.astra.client.tables.Table; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.commands.options.CreateTableOptions; import com.datastax.astra.client.tables.definition.rows.Row; @@ -26,11 +26,11 @@ public static void main(String[] args) { .addColumnText("match_id") .addColumnInt("round") .addColumnVector("m_vector", - new ColumnDefinitionVector().dimension(3).metric(COSINE)) - .addColumn("score", ColumnTypes.INT) - .addColumn("when", ColumnTypes.TIMESTAMP) - .addColumn("winner", ColumnTypes.TEXT) - .addColumnSet("fighters", ColumnTypes.UUID) + new TableColumnDefinitionVector().dimension(3).metric(COSINE)) + .addColumn("score", TableColumnTypes.INT) + .addColumn("when", TableColumnTypes.TIMESTAMP) + .addColumn("winner", TableColumnTypes.TEXT) + .addColumnSet("fighters", TableColumnTypes.UUID) .addPartitionBy("match_id") .addPartitionSort(ascending("round")); diff --git a/examples/src/main/java/com/datastax/astra/client/tables/FindWithVectorize.java b/examples/src/main/java/com/datastax/astra/client/tables/FindWithVectorize.java index 944f338d..ad2a8272 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/FindWithVectorize.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/FindWithVectorize.java @@ -1,7 +1,6 @@ package com.datastax.astra.client.tables; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.core.query.Filter; import com.datastax.astra.client.core.query.Filters; import com.datastax.astra.client.core.query.Sort; @@ -13,7 +12,7 @@ import com.datastax.astra.client.tables.commands.options.TableFindOneOptions; import com.datastax.astra.client.tables.commands.options.TableFindOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.definition.rows.Row; @@ -29,7 +28,7 @@ public static void main(String[] args) { VectorServiceOptions openAI = new VectorServiceOptions() .provider("openai") .modelName("text-embedding-3-small"); - ColumnDefinitionVector vectorDef = new ColumnDefinitionVector() + TableColumnDefinitionVector vectorDef = new TableColumnDefinitionVector() .dimension(512) .metric(DOT_PRODUCT) .service(openAI); // no provider key we use the header diff --git a/examples/src/main/java/com/datastax/astra/client/tables/GameWithAnnotationAllHints.java b/examples/src/main/java/com/datastax/astra/client/tables/GameWithAnnotationAllHints.java index f9310cb2..af6767c6 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/GameWithAnnotationAllHints.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/GameWithAnnotationAllHints.java @@ -15,12 +15,11 @@ import java.time.Instant; import java.util.Set; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.INT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.SET; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TEXT; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.TIMESTAMP; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.UUID; -import static com.datastax.astra.client.tables.definition.columns.ColumnTypes.VECTOR; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.INT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.SET; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TEXT; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.TIMESTAMP; +import static com.datastax.astra.client.tables.definition.columns.TableColumnTypes.UUID; @Data @EntityTable("game_ann1") diff --git a/examples/src/main/java/com/datastax/astra/client/tables/InsertManyRows.java b/examples/src/main/java/com/datastax/astra/client/tables/InsertManyRows.java index f07d798b..34aa5907 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/InsertManyRows.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/InsertManyRows.java @@ -1,23 +1,15 @@ package com.datastax.astra.client.tables; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; -import com.datastax.astra.client.DataAPIDestination; -import com.datastax.astra.client.core.auth.UsernamePasswordTokenProvider; -import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.databases.Database; -import com.datastax.astra.client.databases.DatabaseOptions; import com.datastax.astra.client.tables.commands.options.TableInsertManyOptions; import com.datastax.astra.client.tables.commands.results.TableInsertManyResult; -import com.datastax.astra.client.tables.commands.results.TableInsertOneResult; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; import com.datastax.astra.client.tables.definition.rows.Row; import java.time.Instant; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.UUID; diff --git a/examples/src/main/java/com/datastax/astra/client/tables/InsertOneWithVectorize.java b/examples/src/main/java/com/datastax/astra/client/tables/InsertOneWithVectorize.java index c4751325..a212dd2c 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/InsertOneWithVectorize.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/InsertOneWithVectorize.java @@ -1,14 +1,13 @@ package com.datastax.astra.client.tables; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.core.query.Filters; import com.datastax.astra.client.core.vectorize.VectorServiceOptions; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.tables.commands.options.CreateTableOptions; import com.datastax.astra.client.tables.commands.options.CreateVectorIndexOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.definition.rows.Row; @@ -23,7 +22,7 @@ public static void main(String[] args) { VectorServiceOptions openAI = new VectorServiceOptions() .provider("openai") .modelName("text-embedding-3-small"); - ColumnDefinitionVector vectorDef = new ColumnDefinitionVector() + TableColumnDefinitionVector vectorDef = new TableColumnDefinitionVector() .dimension(512) .metric(DOT_PRODUCT) .service(openAI); // no provider key we use the header diff --git a/examples/src/main/java/com/datastax/astra/client/tables/InsertRow.java b/examples/src/main/java/com/datastax/astra/client/tables/InsertRow.java index 6323014d..da0d7658 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/InsertRow.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/InsertRow.java @@ -1,11 +1,10 @@ package com.datastax.astra.client.tables; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.tables.commands.results.TableInsertOneResult; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinition; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinition; import com.datastax.astra.client.tables.definition.rows.Row; import java.time.Instant; @@ -28,7 +27,7 @@ public static void main(String[] args) { .addSet("fighters", Set.of(UUID.fromString("0193539a-2770-8c09-a32a-111111111111")))); List youPk = result.getInsertedId(); - Map yourPkSchema = result.getPrimaryKeySchema(); + Map yourPkSchema = result.getPrimaryKeySchema(); // Leveraging object mapping Game match1 = new Game() diff --git a/examples/src/main/java/com/datastax/astra/client/tables/WorkingWithRows.java b/examples/src/main/java/com/datastax/astra/client/tables/WorkingWithRows.java index 6361bfa0..7e822ee1 100644 --- a/examples/src/main/java/com/datastax/astra/client/tables/WorkingWithRows.java +++ b/examples/src/main/java/com/datastax/astra/client/tables/WorkingWithRows.java @@ -1,11 +1,10 @@ package com.datastax.astra.client.tables; import com.datastax.astra.client.DataAPIClient; -import com.datastax.astra.client.DataAPIClients; import com.datastax.astra.client.core.vector.DataAPIVector; import com.datastax.astra.client.databases.Database; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.rows.Row; import com.datastax.astra.internal.serdes.tables.RowSerializer; @@ -24,7 +23,7 @@ public static void main(String[] args) { public static void workingWithList() { Database db = new DataAPIClient("token").getDatabase("endpoint"); TableDefinition def = new TableDefinition() - .addColumnSet("set_column", ColumnTypes.INT); + .addColumnSet("set_column", TableColumnTypes.INT); Table table = db.createTable("TABLE_NAME", def); table.insertOne(new Row().addSet("set_column", Set.of(9,8,7))); } @@ -32,7 +31,7 @@ public static void workingWithList() { public static void workingWithSet() { Database db = new DataAPIClient("token").getDatabase("endpoint"); TableDefinition def = new TableDefinition() - .addColumnList("list_column", ColumnTypes.TEXT); + .addColumnList("list_column", TableColumnTypes.TEXT); Table table = db.createTable("TABLE_NAME", def); table.insertOne(new Row().addList("list_column", List.of("Hello", "World"))); } @@ -40,7 +39,7 @@ public static void workingWithSet() { public static void workingWithMap() { Database db = new DataAPIClient("token").getDatabase("endpoint"); TableDefinition def = new TableDefinition() - .addColumnMap("map_column", ColumnTypes.TEXT, ColumnTypes.INT); + .addColumnMap("map_column", TableColumnTypes.TEXT, TableColumnTypes.INT); Table table = db.createTable("TABLE_NAME", def); table.insertOne(new Row().addMap("map_column", Map.of("key1", 1))); } diff --git a/examples/src/main/java/com/datastax/astra/docs/AAronUserCollection.java b/examples/src/main/java/com/datastax/astra/docs/AAronUserCollection.java new file mode 100644 index 00000000..a148e73a --- /dev/null +++ b/examples/src/main/java/com/datastax/astra/docs/AAronUserCollection.java @@ -0,0 +1,78 @@ +package com.datastax.astra.docs; + +import com.datastax.astra.client.DataAPIClient; +import com.datastax.astra.client.collections.Collection; +import com.datastax.astra.client.core.query.Filters; +import com.datastax.astra.client.databases.Database; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class AAronUserCollection { + + @Data + @NoArgsConstructor + public static class AaronUserPojo { + private String userId; + private String lastname; + private String firstname; + private String hashedPassword; + private List roles = new ArrayList<>(); + private String email; + } + + public static void main(String[] args) { + // Connection + String astraToken = System.getenv("ASTRA_DB_APPLICATION_TOKEN"); + //String astraApiEndpoint = System.getenv("ASTRA_DB_API_ENDPOINT"); + String astraApiEndpoint = "https://4d3d14ac-5e95-4121-a38f-de3f1491f1ea-us-east-2.apps.astra.datastax.com"; + + // Initialize the client. + DataAPIClient client = new DataAPIClient(astraToken); + System.out.println("Connected to AstraDB"); + Database db = client.getDatabase(astraApiEndpoint); + System.out.println("Connected to Database."); + + Collection userCollection = db + .getCollection("aaron_users", AaronUserPojo.class); + userCollection.deleteAll(); + + AaronUserPojo user = new AaronUserPojo(); + user.setUserId( "250575bb-3ff6-4c58-886c-04e4d29c1fae"); + user.setLastname("Ploetz"); + user.setFirstname("Aaron"); + user.setHashedPassword("$2a$10$IKE8Ph5TephKrVQHrUdwGe7s/5HF4.i.EleVjJpGcBklCZoLHoQCa"); + user.setRoles(Collections.singletonList("USER")); + user.setEmail("aaronploetz3@gmail.com"); + userCollection.insertOne(user); + + userCollection + .findOne(Filters.eq("email", "aaronploetz3@gmail.com")) + .map(AaronUserPojo::getRoles) + .ifPresent(System.out::println); + + +// // Create a collection. The default similarity metric is cosine. +// Collection userCollection = db.createCollection("aaron_users"); +// System.out.println("Created a collection"); +// +// userCollection.insertOne(new Document() +// .append("user_id", "250575bb-3ff6-4c58-886c-04e4d29c1fae") +// .append("lastname", "Ploetz") +// .append("firstname", "Aaron") +// .append("hashed_password", "$2a$10$IKE8Ph5TephKrVQHrUdwGe7s/5HF4.i.EleVjJpGcBklCZoLHoQCa") +// .append("roles", Collections.singletonList("USER")) +// .append("email", "aaronploetz2@gmail.com")); +// +// +// +// Optional doc = userCollection +// .findOne(Filters.eq("email", "aaronploetz2@gmail.com")); +// List roles = doc.orElse(null).getList("roles", String.class); +// System.out.println("User roles: " + roles); + + } +} diff --git a/examples/src/main/java/com/datastax/astra/docs/UpdateOneExample.java b/examples/src/main/java/com/datastax/astra/docs/UpdateOneExample.java index c1801b31..d70178b8 100644 --- a/examples/src/main/java/com/datastax/astra/docs/UpdateOneExample.java +++ b/examples/src/main/java/com/datastax/astra/docs/UpdateOneExample.java @@ -16,8 +16,8 @@ import com.datastax.astra.client.tables.commands.options.TableFindOptions; import com.datastax.astra.client.tables.commands.results.TableInsertManyResult; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnDefinitionVector; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnDefinitionVector; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.client.tables.definition.indexes.TableVectorIndexDefinition; import com.datastax.astra.client.tables.definition.rows.Row; import com.fasterxml.jackson.core.type.TypeReference; @@ -69,17 +69,17 @@ public static void createSchema(Database database) { .addColumnText("title") .addColumnText("author") .addColumnInt("numberOfPages") - .addColumn("rating", ColumnTypes.FLOAT) + .addColumn("rating", TableColumnTypes.FLOAT) .addColumnInt("publicationYear") .addColumnText("summary") - .addColumnSet("genres", ColumnTypes.TEXT) - .addColumnMap("metadata", ColumnTypes.TEXT, ColumnTypes.TEXT) + .addColumnSet("genres", TableColumnTypes.TEXT) + .addColumnMap("metadata", TableColumnTypes.TEXT, TableColumnTypes.TEXT) .addColumnBoolean("isCheckedOut") .addColumnText("borrower") - .addColumn("dueDate", ColumnTypes.DATE) + .addColumn("dueDate", TableColumnTypes.DATE) .addColumnVector( "summaryGenresVector", - new ColumnDefinitionVector() + new TableColumnDefinitionVector() .dimension(1024) .metric(SimilarityMetric.COSINE) .service(new VectorServiceOptions().provider("nvidia").modelName("NV-Embed-QA"))) diff --git a/langchain4j-astradb/pom.xml b/langchain4j-astradb/pom.xml index 695c3556..f69de20a 100644 --- a/langchain4j-astradb/pom.xml +++ b/langchain4j-astradb/pom.xml @@ -8,12 +8,12 @@ com.datastax.astra astra-db-java-parent - 2.0.0 + 2.1.0-SNAPSHOT - 1.0.0-beta4 - 1.0.0-rc1 + 1.1.0 + 1.1.0-beta7 @@ -22,10 +22,9 @@ dev.langchain4j langchain4j-core - ${langchain4j-rc.version} + ${langchain4j.version} - com.datastax.astra @@ -48,7 +47,7 @@ dev.langchain4j langchain4j-core - ${langchain4j-rc.version} + ${langchain4j.version} tests test-jar test @@ -56,19 +55,19 @@ dev.langchain4j langchain4j-embeddings-all-minilm-l6-v2-q - ${langchain4j.version} + ${langchain4j-beta.version} test dev.langchain4j langchain4j - ${langchain4j-rc.version} + ${langchain4j.version} test dev.langchain4j langchain4j-open-ai - ${langchain4j-rc.version} + ${langchain4j.version} test diff --git a/langchain4j-astradb/src/main/java/com/datastax/astra/langchain4j/store/memory/tables/AstraDbTableChatMemory.java b/langchain4j-astradb/src/main/java/com/datastax/astra/langchain4j/store/memory/tables/AstraDbTableChatMemory.java index a43eceab..9c8425e3 100644 --- a/langchain4j-astradb/src/main/java/com/datastax/astra/langchain4j/store/memory/tables/AstraDbTableChatMemory.java +++ b/langchain4j-astradb/src/main/java/com/datastax/astra/langchain4j/store/memory/tables/AstraDbTableChatMemory.java @@ -26,7 +26,7 @@ import com.datastax.astra.client.tables.Table; import com.datastax.astra.client.tables.commands.options.TableFindOptions; import com.datastax.astra.client.tables.definition.TableDefinition; -import com.datastax.astra.client.tables.definition.columns.ColumnTypes; +import com.datastax.astra.client.tables.definition.columns.TableColumnTypes; import com.datastax.astra.langchain4j.store.memory.AstraDbChatMessage; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.memory.ChatMemory; @@ -71,15 +71,15 @@ public AstraDbTableChatMemory(Database db, String tableName, UUID id) { this.filter = eq(AstraDbChatMessage.PROP_CHAT_ID, id); if (!db.tableExists(tableName)) { TableDefinition definition = new TableDefinition() - .addColumn("chat_id", ColumnTypes.UUID) - .addColumn("message_id", ColumnTypes.UUID) - .addColumn("message_type", ColumnTypes.TEXT) - .addColumn("message_time", ColumnTypes.TIMESTAMP) - .addColumn("text", ColumnTypes.TEXT) - .addColumn("name", ColumnTypes.TEXT) - .addColumnMap("contents", ColumnTypes.TEXT, ColumnTypes.TEXT) - .addColumnMap("tools_arguments", ColumnTypes.TEXT, ColumnTypes.TEXT) - .addColumnMap("tools_name", ColumnTypes.TEXT, ColumnTypes.TEXT) + .addColumn("chat_id", TableColumnTypes.UUID) + .addColumn("message_id", TableColumnTypes.UUID) + .addColumn("message_type", TableColumnTypes.TEXT) + .addColumn("message_time", TableColumnTypes.TIMESTAMP) + .addColumn("text", TableColumnTypes.TEXT) + .addColumn("name", TableColumnTypes.TEXT) + .addColumnMap("contents", TableColumnTypes.TEXT, TableColumnTypes.TEXT) + .addColumnMap("tools_arguments", TableColumnTypes.TEXT, TableColumnTypes.TEXT) + .addColumnMap("tools_name", TableColumnTypes.TEXT, TableColumnTypes.TEXT) .partitionKey("chat_id") .addPartitionSort(Sort.descending("message_time")) .addPartitionSort(Sort.ascending("message_id")); diff --git a/pom.xml b/pom.xml index aeae4036..0ec51da4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.datastax.astra astra-db-java-parent AstraDB Java SDK - 2.0.0 + 2.1.0-SNAPSHOT pom https://github.com/datastax/astra-db-java 2024 From 2bd50e3f853763e9d5ef9f4b3fc18eb0a3acc6e7 Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Tue, 15 Jul 2025 09:13:17 +0200 Subject: [PATCH 6/6] remove token --- .../astra/test/integration/astra/DemoAstraDevVectorize.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java index b0378428..99acc83e 100644 --- a/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java +++ b/astra-db-java/src/test/java/com/datastax/astra/test/integration/astra/DemoAstraDevVectorize.java @@ -11,7 +11,7 @@ public class DemoAstraDevVectorize { public static final String ASTRA_DB_TOKEN_TEST = - "AstraCS:EEdyFLdZCZqGEkWyHCdjRFxB:1204d23e42803a9bcae9c712a89eed75678ec7cdfc89c07a27af945bf1cfbaa9"; + "REDACTED"; // Replace with your actual Astra DB token for testing public static final String ASTRA_URL = "https://71589bc7-a75f-4153-ab16-9fce04ddf573-westus2.apps.astra-test.datastax.com"; 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