From 3a716eda15ed049417215fe680b70a22d3b50ef6 Mon Sep 17 00:00:00 2001 From: Aaron Morton Date: Wed, 3 Dec 2025 08:46:16 +1300 Subject: [PATCH 1/8] WIP - initial work to improve the tenant etc --- .../stargate/sgv2/jsonapi/JsonApiStartUp.java | 21 ++- .../api/model/command/CommandContext.java | 4 +- .../tracing/DefaultRequestTracing.java | 4 +- .../model/command/tracing/TraceSession.java | 9 +- .../api/request/EmbeddingCredentials.java | 9 +- .../request/EmbeddingCredentialsResolver.java | 9 + .../request/EmbeddingCredentialsSupplier.java | 94 ---------- ...aderBasedEmbeddingCredentialsResolver.java | 36 ++++ .../jsonapi/api/request/RequestContext.java | 161 ++++++++++-------- .../api/request/RerankingCredentials.java | 14 +- .../request/RerankingCredentialsResolver.java | 9 + .../sgv2/jsonapi/api/request/UserAgent.java | 108 ++++++++++++ .../{impl => }/FixedTenantResolver.java | 20 +-- ...solver.java => RequestTenantResolver.java} | 5 +- ...ava => RequestTenantResolverProducer.java} | 26 ++- .../{impl => }/SubdomainTenantResolver.java | 26 +-- .../jsonapi/api/request/tenant/Tenant.java | 112 ++++++++++++ .../api/request/tenant/TenantFactory.java | 58 +++++++ .../token/{impl => }/FixedTokenResolver.java | 19 +-- .../token/{impl => }/HeaderTokenResolver.java | 15 +- .../{impl => }/PrincipalTokenResolver.java | 13 +- ...ver.java => RequestAuthTokenResolver.java} | 5 +- ... => RequestAuthTokenResolverProducer.java} | 32 +--- .../sgv2/jsonapi/config/AuthConfig.java | 16 +- .../sgv2/jsonapi/config/DatabaseType.java | 38 ++++- .../jsonapi/config/MultiTenancyConfig.java | 5 +- .../sgv2/jsonapi/config/OperationsConfig.java | 1 + .../jsonapi/logging/LoggingMDCContext.java | 14 ++ .../JsonProcessingMetricsReporter.java | 2 +- .../MetricsTenantDeactivationConsumer.java | 17 +- .../metrics/TenantRequestMetricsFilter.java | 9 +- .../service/cqldriver/CQLSessionCache.java | 58 +++---- .../cqldriver/CqlSessionCacheSupplier.java | 4 +- .../service/cqldriver/CqlSessionFactory.java | 45 ++--- .../TenantAwareCqlSessionBuilder.java | 15 +- .../executor/CommandQueryExecutor.java | 14 +- .../cqldriver/executor/SchemaCache.java | 64 +++---- .../embedding/DataVectorizerService.java | 5 +- .../gateway/EmbeddingGatewayClient.java | 13 +- .../operation/EmbeddingProviderFactory.java | 9 +- .../operation/MeteredEmbeddingProvider.java | 2 +- .../service/operation/GenericOperation.java | 4 +- .../embeddings/EmbeddingTaskBuilder.java | 4 +- .../operation/reranking/RerankingMetrics.java | 5 +- .../jsonapi/service/processor/CommandLog.java | 4 +- .../processor/MeteredCommandProcessor.java | 11 +- .../jsonapi/service/provider/ModelUsage.java | 26 +-- .../service/provider/ProviderBase.java | 9 +- .../reranking/gateway/RerankingEGWClient.java | 22 ++- .../operation/RerankingProviderFactory.java | 9 +- .../service/resolver/CommandResolver.java | 2 +- .../FindAndRerankOperationBuilder.java | 4 +- .../service/resolver/ValidateCredentials.java | 4 +- .../sgv2/jsonapi/util/DynamicTTLCache.java | 9 +- .../sgv2/jsonapi/util/StringUtil.java | 16 ++ .../jsonapi/api/request/UserAgentTests.java | 48 ++++++ .../request/tenant/TenantFactoryTests.java | 54 ++++++ .../api/request/tenant/TenantTests.java | 135 +++++++++++++++ .../operation/EmbeddingGatewayClientTest.java | 2 +- 59 files changed, 1011 insertions(+), 497 deletions(-) create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsResolver.java delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsSupplier.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/HeaderBasedEmbeddingCredentialsResolver.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentialsResolver.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/UserAgent.java rename src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/{impl => }/FixedTenantResolver.java (50%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/{DataApiTenantResolver.java => RequestTenantResolver.java} (87%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/{configuration/TenantConfiguration.java => RequestTenantResolverProducer.java} (66%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/{impl => }/SubdomainTenantResolver.java (75%) create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/Tenant.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactory.java rename src/main/java/io/stargate/sgv2/jsonapi/api/request/token/{impl => }/FixedTokenResolver.java (51%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/token/{impl => }/HeaderTokenResolver.java (60%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/token/{impl => }/PrincipalTokenResolver.java (60%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/token/{DataApiTokenResolver.java => RequestAuthTokenResolver.java} (88%) rename src/main/java/io/stargate/sgv2/jsonapi/api/request/token/{configuration/DataApiTokenConfiguration.java => RequestAuthTokenResolverProducer.java} (54%) create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/logging/LoggingMDCContext.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/util/StringUtil.java create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/api/request/UserAgentTests.java create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactoryTests.java create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantTests.java diff --git a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java index 0272e9b141..8b833b15ce 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/JsonApiStartUp.java @@ -1,16 +1,29 @@ package io.stargate.sgv2.jsonapi; import io.quarkus.runtime.StartupEvent; -import io.stargate.sgv2.jsonapi.config.DebugConfigAccess; +import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; import io.stargate.sgv2.jsonapi.config.DebugModeConfig; +import io.stargate.sgv2.jsonapi.config.OperationsConfig; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JsonApiStartUp { + + private static final Logger LOGGER = LoggerFactory.getLogger(JsonApiStartUp.class); + + // TODO: why is the DebugModeConfig here ? it is never used + private final DebugModeConfig config; + private final OperationsConfig operationsConfig; + @Inject - public JsonApiStartUp(DebugModeConfig config) { - DebugConfigAccess.setDebugEnabled(config.enabled()); + public JsonApiStartUp(DebugModeConfig config, OperationsConfig operationsConfig) { + this.config = config; + this.operationsConfig = operationsConfig; } - void onStart(@Observes StartupEvent ev) {} + void onStart(@Observes StartupEvent ev) { + TenantFactory.initialize(operationsConfig.databaseConfig().type()); + } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java index 556403a477..77db77b143 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java @@ -98,8 +98,8 @@ private CommandContext( this.requestTracing = anyTracing ? new DefaultRequestTracing( - requestContext.getRequestId(), - requestContext.getTenantId().orElse(""), + requestContext.requestId(), + requestContext.tenant(), apiFeatures().isFeatureEnabled(ApiFeature.REQUEST_TRACING_FULL)) : RequestTracing.NO_OP; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java index d8752de208..edaab656c0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import java.util.*; + +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +16,7 @@ public class DefaultRequestTracing extends RequestTracing { private final TraceSession session; - public DefaultRequestTracing(String requestId, String tenantId, boolean includeData) { + public DefaultRequestTracing(String requestId, Tenant tenantId, boolean includeData) { super(true); Objects.requireNonNull(requestId, "requestId must not be null"); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/TraceSession.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/TraceSession.java index e49a8d71d2..2c899b6ed2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/TraceSession.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/TraceSession.java @@ -5,6 +5,7 @@ import com.fasterxml.uuid.Generators; import com.fasterxml.uuid.NoArgGenerator; import com.google.common.base.Stopwatch; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.time.Instant; @@ -32,7 +33,7 @@ public class TraceSession implements Recordable { .formatted(ApiFeature.REQUEST_TRACING_FULL.httpHeaderName())); private final String requestId; - private final String tenantId; + private final Tenant tenant; private final Stopwatch watch; private final Instant startedAt; @@ -40,9 +41,9 @@ public class TraceSession implements Recordable { private final boolean includeData; - TraceSession(String requestId, String tenantId, boolean includeData) { + TraceSession(String requestId, Tenant tenant, boolean includeData) { this.requestId = requestId; - this.tenantId = tenantId; + this.tenant = tenant; this.includeData = includeData; watch = Stopwatch.createStarted(); @@ -97,7 +98,7 @@ public DataRecorder recordTo(DataRecorder dataRecorder) { synchronized (events) { return dataRecorder .append("requestId", requestId) - .append("tenantId", tenantId) + .append("tenantId", tenant) .append("startedAt", ISO_FORMATTER.format(startedAt)) .append("durationMicroseconds", elapsedMicroseconds()) .append("events", events); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentials.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentials.java index 171cb61745..5706f61fce 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentials.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentials.java @@ -6,16 +6,9 @@ * EmbeddingCredentials is a record that holds the embedding provider credentials for the embedding * service passed as header. * - *

Includes the tenantID, so we can fully identify the usage when creating the {@link - * io.stargate.sgv2.jsonapi.service.provider.ModelUsage} - * - * @param tenantId - Tenant Id that called the API. * @param apiKey - API token for the embedding service * @param accessId - Access Id used for AWS Bedrock embedding service * @param secretId - Secret Id used for AWS Bedrock embedding service */ public record EmbeddingCredentials( - String tenantId, - Optional apiKey, - Optional accessId, - Optional secretId) {} + Optional apiKey, Optional accessId, Optional secretId) {} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsResolver.java new file mode 100644 index 0000000000..bd14ba0b15 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsResolver.java @@ -0,0 +1,9 @@ +package io.stargate.sgv2.jsonapi.api.request; + +import io.vertx.ext.web.RoutingContext; + +/** Functional interface to resolve the embedding api key from the request context. */ +@FunctionalInterface +public interface EmbeddingCredentialsResolver { + EmbeddingCredentials resolveEmbeddingCredentials(RoutingContext context); +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsSupplier.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsSupplier.java deleted file mode 100644 index e479b4c94c..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/EmbeddingCredentialsSupplier.java +++ /dev/null @@ -1,94 +0,0 @@ -package io.stargate.sgv2.jsonapi.api.request; - -import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig; -import java.util.Map; -import java.util.Optional; - -/** - * A supplier for creating {@link EmbeddingCredentials} based on the current request context, - * collection authentication configuration, and embedding provider configuration. - * - *

This class centralizes the logic for determining which credentials to use for embedding - * service calls. - */ -public class EmbeddingCredentialsSupplier { - private final String authTokenHeaderName; - private final String embeddingApiKeyHeaderName; - private final String embeddingAccessIdHeaderName; - private final String embeddingsecretIdHeaderName; - private Map authConfigFromCollection; - - public EmbeddingCredentialsSupplier( - String authTokenHeaderName, - String embeddingApiKeyHeaderName, - String embeddingAccessIdHeaderName, - String embeddingsecretIdHeaderName) { - this.authTokenHeaderName = authTokenHeaderName; - this.embeddingApiKeyHeaderName = embeddingApiKeyHeaderName; - this.embeddingAccessIdHeaderName = embeddingAccessIdHeaderName; - this.embeddingsecretIdHeaderName = embeddingsecretIdHeaderName; - } - - /** Sets the authentication configuration defined at the createCollection command. */ - public void withAuthConfigFromCollection(Map authConfigFromCollection) { - this.authConfigFromCollection = authConfigFromCollection; - } - - /** - * Creates an {@link EmbeddingCredentials} instance based on the current request context and - * provider configuration. - * - * @param requestContext The current request context containing HTTP headers. - * @param providerConfig The configuration for the embedding provider. - * @return An instance of {@link EmbeddingCredentials} with the appropriate credentials. - */ - public EmbeddingCredentials create( - RequestContext requestContext, - EmbeddingProvidersConfig.EmbeddingProviderConfig providerConfig) { - - var embeddingApi = requestContext.getHttpHeaders().getHeader(this.embeddingApiKeyHeaderName); - var accessId = requestContext.getHttpHeaders().getHeader(this.embeddingAccessIdHeaderName); - var secretId = requestContext.getHttpHeaders().getHeader(this.embeddingsecretIdHeaderName); - - // If these three conditions are met, we use the auth token as the embeddingApiKey to pass - // through to Embedding Providers: - - // 1: User did not provide x-embedding-api-key - boolean isEmbeddingApiKeyMissing = (embeddingApi == null); - - // 2: Provider has authTokenPassThroughForNoneAuth set to true - boolean isAuthTokenPassThroughEnabled = - providerConfig != null && providerConfig.authTokenPassThroughForNoneAuth(); - - // 3: Provider supports NONE auth it's enabled in the config - boolean providerSupportsNoneAuth = false; - if (providerConfig != null) { - var noneAuthConfig = - providerConfig - .supportedAuthentications() - .get(EmbeddingProvidersConfig.EmbeddingProviderConfig.AuthenticationType.NONE); - providerSupportsNoneAuth = noneAuthConfig != null && noneAuthConfig.enabled(); - } - - // 4: Collection supports NONE auth - no "authentication" in "options.vector.service" - boolean collectionSupportsNoneAuth = (authConfigFromCollection == null); - - if (isEmbeddingApiKeyMissing - && isAuthTokenPassThroughEnabled - && providerSupportsNoneAuth - && collectionSupportsNoneAuth) { - var authToken = requestContext.getHttpHeaders().getHeader(this.authTokenHeaderName); - return new EmbeddingCredentials( - requestContext.getTenantId().orElse(""), - Optional.ofNullable(authToken), - Optional.empty(), - Optional.empty()); - } - - return new EmbeddingCredentials( - requestContext.getTenantId().orElse(""), - Optional.ofNullable(embeddingApi), - Optional.ofNullable(accessId), - Optional.ofNullable(secretId)); - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/HeaderBasedEmbeddingCredentialsResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/HeaderBasedEmbeddingCredentialsResolver.java new file mode 100644 index 0000000000..e9802611b0 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/HeaderBasedEmbeddingCredentialsResolver.java @@ -0,0 +1,36 @@ +package io.stargate.sgv2.jsonapi.api.request; + +import io.vertx.core.http.HttpServerRequest; +import io.vertx.ext.web.RoutingContext; +import java.util.Objects; +import java.util.Optional; + +/** + * Implementation to resolve the embedding api key, access id and secret id from the request header. + */ +public class HeaderBasedEmbeddingCredentialsResolver implements EmbeddingCredentialsResolver { + private final String tokenHeaderName; + private final String accessIdHeaderName; + private final String secretIdHeaderName; + + public HeaderBasedEmbeddingCredentialsResolver( + String tokenHeaderName, String accessIdHeaderName, String secretIdHeaderName) { + this.tokenHeaderName = + Objects.requireNonNull(tokenHeaderName, "Token header name cannot be null"); + this.accessIdHeaderName = + Objects.requireNonNull(accessIdHeaderName, "Access Id header name cannot be null"); + this.secretIdHeaderName = + Objects.requireNonNull(secretIdHeaderName, "Secret Id header name cannot be null"); + } + + public EmbeddingCredentials resolveEmbeddingCredentials(RoutingContext context) { + HttpServerRequest request = context.request(); + String headerValue = request.getHeader(this.tokenHeaderName); + String accessId = request.getHeader(this.accessIdHeaderName); + String secretId = request.getHeader(this.secretIdHeaderName); + return new EmbeddingCredentials( + Optional.ofNullable(headerValue), + Optional.ofNullable(accessId), + Optional.ofNullable(secretId)); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/RequestContext.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RequestContext.java index c1f0f1738b..19fe871b44 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/RequestContext.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RequestContext.java @@ -1,11 +1,14 @@ package io.stargate.sgv2.jsonapi.api.request; +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + import com.fasterxml.uuid.Generators; import com.fasterxml.uuid.NoArgGenerator; import com.google.common.annotations.VisibleForTesting; -import io.stargate.sgv2.jsonapi.api.request.tenant.DataApiTenantResolver; -import io.stargate.sgv2.jsonapi.api.request.token.DataApiTokenResolver; -import io.stargate.sgv2.jsonapi.config.constants.HttpConstants; +import io.stargate.sgv2.jsonapi.api.request.tenant.RequestTenantResolver; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.api.request.token.RequestAuthTokenResolver; +import io.stargate.sgv2.jsonapi.logging.LoggingMDCContext; import io.vertx.ext.web.RoutingContext; import jakarta.enterprise.context.RequestScoped; import jakarta.enterprise.inject.Instance; @@ -13,108 +16,110 @@ import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.SecurityContext; import java.util.List; -import java.util.Optional; +import java.util.Objects; +import org.slf4j.MDC; /** - * This class is used to get the request info like tenantId, cassandraToken and embeddingApiKey. - * This is a replacement to StargateRequestInfo so bridge connection is removed. - * - *

Note: aaron feb 3 2025 - leaving with injection for now for the building, it may make - * sense but moving it to be part of the CommandContext rather than handed around everywhere. + * The context of the request to the API, this is the first set of information we extract from + * the request, such as the tenant, auth token, user agent, and request ID. + *

+ * It needs to integrate with the Quarkus request lifecycle, so is keeping the + * CDI and {@link RequestScoped} scope for now. + *

+ * See the method accessors for the invariants of things you can rely on if you have an + * instance of this class. */ @RequestScoped -public class RequestContext { +public class RequestContext implements LoggingMDCContext { private static final NoArgGenerator UUID_V7_GENERATOR = Generators.timeBasedEpochGenerator(); - private final Optional tenantId; - private final Optional cassandraToken; - private final EmbeddingCredentialsSupplier embeddingCredentialsSupplier; - private final RerankingCredentials rerankingCredentials; - private final HttpHeaderAccess httpHeaders; + private final String authToken; private final String requestId; + private final UserAgent userAgent; + private final Tenant tenant; - private final String userAgent; + private final EmbeddingCredentials embeddingCredentials; + private final HttpHeaderAccess httpHeaders; + private final RerankingCredentials rerankingCredentials; - /** FOR TESTING ONLY - so we can bypass pulling things the headers, still messy, getting better */ + /** For testing purposes only. */ @VisibleForTesting - public RequestContext( - Optional tenantId, - Optional cassandraToken, - RerankingCredentials rerankingCredentials, - String userAgent) { - this.tenantId = tenantId; - this.cassandraToken = cassandraToken; - embeddingCredentialsSupplier = - new EmbeddingCredentialsSupplier( - HttpConstants.AUTHENTICATION_TOKEN_HEADER_NAME, - HttpConstants.EMBEDDING_AUTHENTICATION_TOKEN_HEADER_NAME, - HttpConstants.EMBEDDING_AUTHENTICATION_ACCESS_ID_HEADER_NAME, - HttpConstants.EMBEDDING_AUTHENTICATION_SECRET_ID_HEADER_NAME); - this.rerankingCredentials = rerankingCredentials; - this.userAgent = userAgent; - this.httpHeaders = new HttpHeaderAccess(io.vertx.core.MultiMap.caseInsensitiveMultiMap()); - requestId = generateRequestId(); + public RequestContext(Tenant tenant) { + + this.authToken = normalizeOptionalString((String) null); + this.requestId = generateRequestId(); + this.userAgent = new UserAgent(null); + this.tenant = Objects.requireNonNull(tenant, "tenant must not be null"); + + this.embeddingCredentials = null; + this.rerankingCredentials = null; + this.httpHeaders = null; } @Inject public RequestContext( RoutingContext routingContext, SecurityContext securityContext, - Instance tenantResolver, - Instance tokenResolver, - HttpConstants httpConstants) { - - tenantId = tenantResolver.get().resolve(routingContext, securityContext); - cassandraToken = tokenResolver.get().resolve(routingContext, securityContext); - httpHeaders = new HttpHeaderAccess(routingContext.request().headers()); - requestId = generateRequestId(); - userAgent = httpHeaders.getHeader(HttpHeaders.USER_AGENT); - - embeddingCredentialsSupplier = - new EmbeddingCredentialsSupplier( - httpConstants.authToken(), - httpConstants.embeddingApiKey(), - httpConstants.embeddingAccessId(), - httpConstants.embeddingSecretId()); - - // if x-reranking-api-key is present, then use it, else use cassandraToken - Optional rerankingApiKeyFromHeader = - HeaderBasedRerankingKeyResolver.resolveRerankingKey(routingContext); - rerankingCredentials = - rerankingApiKeyFromHeader - .map(apiKey -> new RerankingCredentials(this.tenantId.orElse(""), Optional.of(apiKey))) - .orElse( - this.cassandraToken - .map( - cassandraToken -> - new RerankingCredentials( - this.tenantId.orElse(""), Optional.of(cassandraToken))) - .orElse(new RerankingCredentials(this.tenantId.orElse(""), Optional.empty()))); + Instance tenantResolver, + Instance tokenResolver, + Instance embeddingCredentialsResolver) { + + this.httpHeaders = new HttpHeaderAccess(routingContext.request().headers()); + + this.authToken = normalizeOptionalString(tokenResolver.get().resolve(routingContext, securityContext)); + this.requestId = generateRequestId(); + this.userAgent = new UserAgent(httpHeaders.getHeader(HttpHeaders.USER_AGENT)); + this.tenant = tenantResolver.get().resolve(routingContext, securityContext); + + this.embeddingCredentials = + embeddingCredentialsResolver.get().resolveEmbeddingCredentials(routingContext); + + // user specified the reranking key in the request header, use that. + // fall back to whatever they provided as the auth token for the API + this.rerankingCredentials = + HeaderBasedRerankingKeyResolver.resolveRerankingKey(routingContext) + .map(s -> new RerankingCredentials(normalizeOptionalString(s))) + .orElseGet(() -> new RerankingCredentials(normalizeOptionalString(this.authToken))); } private static String generateRequestId() { return UUID_V7_GENERATOR.generate().toString(); } - public String getRequestId() { + /** + * String correlation ID for the request, generated at the start of the request processing. + *

+ * Implemented as a V7 UUID. + */ + public String requestId() { return requestId; } - public Optional getTenantId() { - return tenantId; + /** + * Non-null {@link Tenant} for the request, resolved from the request. + */ + public Tenant tenant() { + return tenant; } - public Optional getCassandraToken() { - return cassandraToken; + /** + * Non-null authToken from the request processed with {@link + * io.stargate.sgv2.jsonapi.util.StringUtil#normalizeOptionalString(String)} + */ + public String authToken() { + return authToken; } - public Optional getUserAgent() { - return Optional.ofNullable(userAgent); + /** + * Non-null {@link UserAgent} for the request, resolved from the request. + */ + public UserAgent userAgent() { + return userAgent; } - public EmbeddingCredentialsSupplier getEmbeddingCredentialsSupplier() { - return embeddingCredentialsSupplier; + public EmbeddingCredentials getEmbeddingCredentials() { + return embeddingCredentials; } public RerankingCredentials getRerankingCredentials() { @@ -125,6 +130,16 @@ public HttpHeaderAccess getHttpHeaders() { return this.httpHeaders; } + @Override + public void addToMDC() { + MDC.put("tenantId", tenant.toString()); + } + + @Override + public void removeFromMDC() { + MDC.remove("tenantId"); + } + /** * Simple wrapper around internal HTTP header container, providing safe(r) access to typed header * values. Minimal API, currently mainly used for feature flags. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentials.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentials.java index 89a0d8d1c0..e800a3b0af 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentials.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentials.java @@ -1,14 +1,18 @@ package io.stargate.sgv2.jsonapi.api.request; -import java.util.Optional; +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + +import jakarta.validation.constraints.NotNull; /** * This is the RerankingCredentials record that holds the API key for the reranking. String will be * resolved from the request header 'reranking-api-key', if it is not present, then we will use the * cassandra token as the reranking api key. Note, both cassandra token and reranking-api-key could * be absent in Data API request, although it is invalid for authentication. - * - *

Includes the tenantId, so we can fully identify the usage when creating the {@link - * io.stargate.sgv2.jsonapi.service.provider.ModelUsage} */ -public record RerankingCredentials(String tenantId, Optional apiKey) {} +public record RerankingCredentials(@NotNull String apiKey) { + + public RerankingCredentials { + apiKey = normalizeOptionalString(apiKey); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentialsResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentialsResolver.java new file mode 100644 index 0000000000..a60d6ff250 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/RerankingCredentialsResolver.java @@ -0,0 +1,9 @@ +package io.stargate.sgv2.jsonapi.api.request; + +import io.vertx.ext.web.RoutingContext; + +/** Functional interface to resolve the reranking api key from the request context. */ +@FunctionalInterface +public interface RerankingCredentialsResolver { + RerankingCredentials resolveRerankingCredentials(RoutingContext context); +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/UserAgent.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/UserAgent.java new file mode 100644 index 0000000000..46813a4fb9 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/UserAgent.java @@ -0,0 +1,108 @@ +package io.stargate.sgv2.jsonapi.api.request; + +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + +import io.stargate.sgv2.jsonapi.metrics.TenantRequestMetricsFilter; +import io.stargate.sgv2.jsonapi.metrics.TenantRequestMetricsTagProvider; +import java.util.regex.Pattern; + +/** + * The User-Agent making the call to the API, we always have a User-Agent even if + * the header was missing or empty. + * + *

This class extracts the product name and version from the User-Agent string, which is used for + * metrics and logging purposes. + *

+ * The raw user agent string is normalized to be an empty string, and can be obtained using + * {@link #toString()}. NOTE: you should normally compare UserAgent instances, not the raw string. + * + *

It is used in {@link TenantRequestMetricsFilter} and {@link TenantRequestMetricsTagProvider} + *

+ * See examples in the unit tests. + */ +public class UserAgent { + + // Match on the product name, and then optional version. See {@link #extractProduct(String)} + private static final Pattern PRODUCT_VERSION_REGEX = + Pattern.compile("^([^\\s\\/]+)(?:\\/([^\\s]+))?"); + + private final String rawUserAgent; + private final ProductVersion productVersion; + + /** + * Constructs a UserAgent instance from the raw user agent string. + * + * @param rawUserAgent nullable or empty string is normalized with + * {@link io.stargate.sgv2.jsonapi.util.StringUtil#normalizeOptionalString(String)} to be non-null. + */ + public UserAgent(String rawUserAgent) { + this.rawUserAgent = normalizeOptionalString(rawUserAgent); + this.productVersion = extractProduct(this.rawUserAgent); + } + + /** + * Gets the left most product name from the user agent. + */ + public String product() { + return productVersion.product; + } + + /** + * Gets the raw user agent string from the request. + */ + @Override + public String toString() { + return rawUserAgent; + } + + + /** + * Extract the first product from the user agent. + * + *

We assume the agent string has the following format: + * + *

+   *   User-Agent: product/version (system-information) [additional-details]
+   *
+   *   e.g. Mozilla/5.0 (Macintosh; Intel Mac OS X 13_3_1)
+   * 
+ * + * In the above example, the product is "Mozilla". + * + *

This logic used to be in {@link TenantRequestMetricsFilter} and {@link + * TenantRequestMetricsTagProvider} + */ + private static ProductVersion extractProduct(String rawUserAgent) { + + var matcher = PRODUCT_VERSION_REGEX.matcher(rawUserAgent); + + if (matcher.find()) { + return new ProductVersion(matcher.group(1), matcher.group(2)); + } + // no match, default to using the full user agent as the product name + return new ProductVersion( + normalizeOptionalString(rawUserAgent), normalizeOptionalString((String) null)); + } + + /** + * Compares this UserAgent with another object for equality, using the full raw string + * as comparing case-insensitive. + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof UserAgent that)) { + return false; + } + return rawUserAgent.equalsIgnoreCase(that.rawUserAgent); + } + + @Override + public int hashCode() { + return rawUserAgent.toLowerCase().hashCode(); + } + + private record ProductVersion(String product, String version) {} +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/FixedTenantResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/FixedTenantResolver.java similarity index 50% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/FixedTenantResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/FixedTenantResolver.java index f428651a0e..0c6f815317 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/FixedTenantResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/FixedTenantResolver.java @@ -15,27 +15,23 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.tenant.impl; +package io.stargate.sgv2.jsonapi.api.request.tenant; -import io.stargate.sgv2.jsonapi.api.request.tenant.DataApiTenantResolver; -import io.stargate.sgv2.jsonapi.config.MultiTenancyConfig; import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; -/** The {@link TenantResolver} that uses a fixed tenant ID supplied by the configuration. */ -public class FixedTenantResolver implements DataApiTenantResolver { +/** The {@link RequestTenantResolver} that uses a fixed tenant ID supplied by the configuration. */ +public class FixedTenantResolver implements RequestTenantResolver { - private final MultiTenancyConfig.TenantResolverConfig.FixedTenantResolverConfig config; + private final Tenant fixedTenantId; - public FixedTenantResolver( - MultiTenancyConfig.TenantResolverConfig.FixedTenantResolverConfig config) { - this.config = config; + public FixedTenantResolver(String fixedTenantId) { + this.fixedTenantId = TenantFactory.instance().create(fixedTenantId); } /** {@inheritDoc} */ @Override - public Optional resolve(RoutingContext context, SecurityContext securityContext) { - return config.tenantId(); + public Tenant resolve(RoutingContext context, SecurityContext securityContext) { + return fixedTenantId; } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/DataApiTenantResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolver.java similarity index 87% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/DataApiTenantResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolver.java index 6fe9c26001..665e40b2ec 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/DataApiTenantResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolver.java @@ -19,11 +19,10 @@ import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; /** Resolver of the tenant ID, in case multi-tenancy is used. */ @FunctionalInterface -public interface DataApiTenantResolver { +public interface RequestTenantResolver { /** * Returns a tenant identifier given a {@link RoutingContext} and a {@link SecurityContext}. @@ -32,5 +31,5 @@ public interface DataApiTenantResolver { * @param securityContext the security context * @return The tenant identifier. If empty, indicates that the multi-tenancy is disabled. */ - Optional resolve(RoutingContext context, SecurityContext securityContext); + Tenant resolve(RoutingContext context, SecurityContext securityContext); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/configuration/TenantConfiguration.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolverProducer.java similarity index 66% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/configuration/TenantConfiguration.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolverProducer.java index 2fcb056662..e2f719b2c8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/configuration/TenantConfiguration.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/RequestTenantResolverProducer.java @@ -15,25 +15,21 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.tenant.configuration; +package io.stargate.sgv2.jsonapi.api.request.tenant; import io.quarkus.arc.lookup.LookupIfProperty; -import io.stargate.sgv2.jsonapi.api.request.tenant.DataApiTenantResolver; -import io.stargate.sgv2.jsonapi.api.request.tenant.impl.FixedTenantResolver; -import io.stargate.sgv2.jsonapi.api.request.tenant.impl.SubdomainTenantResolver; import io.stargate.sgv2.jsonapi.config.MultiTenancyConfig; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; -import java.util.Optional; -/** Configuration for activating a correct {@link TenantResolver}. */ -public class TenantConfiguration { +/** Configuration for activating a correct {@link RequestTenantResolver}. */ +public class RequestTenantResolverProducer { @Produces @ApplicationScoped @LookupIfProperty(name = "stargate.multi-tenancy.tenant-resolver.type", stringValue = "subdomain") @LookupIfProperty(name = "stargate.multi-tenancy.enabled", stringValue = "true") - DataApiTenantResolver subdomainTenantResolver(MultiTenancyConfig config) { + RequestTenantResolver subdomainTenantResolver(MultiTenancyConfig config) { return new SubdomainTenantResolver(config.tenantResolver().subdomain()); } @@ -41,21 +37,19 @@ DataApiTenantResolver subdomainTenantResolver(MultiTenancyConfig config) { @ApplicationScoped @LookupIfProperty(name = "stargate.multi-tenancy.tenant-resolver.type", stringValue = "fixed") @LookupIfProperty(name = "stargate.multi-tenancy.enabled", stringValue = "true") - DataApiTenantResolver fixedTenantResolver(MultiTenancyConfig config) { - return new FixedTenantResolver(config.tenantResolver().fixed()); + RequestTenantResolver fixedTenantResolver(MultiTenancyConfig config) { + return new FixedTenantResolver(config.tenantResolver().fixed().tenantId().orElse("")); } @Produces @ApplicationScoped - @LookupIfProperty( - name = "stargate.multi-tenancy.tenant-resolver.type", - stringValue = "noop", - lookupIfMissing = true) @LookupIfProperty( name = "stargate.multi-tenancy.enabled", stringValue = "false", lookupIfMissing = true) - DataApiTenantResolver noopTenantResolver() { - return (context, securityContext) -> Optional.empty(); + RequestTenantResolver noopTenantResolver() { + var none = TenantFactory.instance().create(null); + + return (context, securityContext) -> none; } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/SubdomainTenantResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/SubdomainTenantResolver.java similarity index 75% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/SubdomainTenantResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/SubdomainTenantResolver.java index 9964121397..b3bb880570 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/impl/SubdomainTenantResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/SubdomainTenantResolver.java @@ -15,23 +15,22 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.tenant.impl; +package io.stargate.sgv2.jsonapi.api.request.tenant; -import io.stargate.sgv2.jsonapi.api.request.tenant.DataApiTenantResolver; import io.stargate.sgv2.jsonapi.config.MultiTenancyConfig; import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; import java.util.regex.Pattern; /** - * {@link TenantResolver} that finds the tenant ID in the left most domain part of the host name. + * {@link RequestTenantResolver} that finds the tenant ID in the left most domain part of the host + * name. * *

For example, having tenant-id.domain.com will resolve tenant identifier to the * tenant-id. In case of top-level domain, domain.com will resolve tenant * identifier to the domain. */ -public class SubdomainTenantResolver implements DataApiTenantResolver { +public class SubdomainTenantResolver implements RequestTenantResolver { private final Pattern validationPattern; private final int maxChars; @@ -54,7 +53,8 @@ public SubdomainTenantResolver( /** {@inheritDoc} */ @Override - public Optional resolve(RoutingContext context, SecurityContext securityContext) { + public Tenant resolve(RoutingContext context, SecurityContext securityContext) { + // get host and first index of the dot String host = context.request().host(); int index = host.indexOf('.'); @@ -73,14 +73,18 @@ public Optional resolve(RoutingContext context, SecurityContext security // if regex defined check if (null != validationPattern) { boolean matches = validationPattern.matcher(tenantId).matches(); - if (!matches) { - return Optional.empty(); - } + + // TODO: this was returned as empty, but we cannot have a missing tenant + throw new RuntimeException("TODO XXX BANG!"); + // if (!matches) { + // return Optional.empty(); + // } } - return Optional.of(tenantId); + return TenantFactory.instance().create(tenantId); } else { - return Optional.empty(); + // it's up to the tenant factory to know what to do with null + return TenantFactory.instance().create(null); } } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/Tenant.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/Tenant.java new file mode 100644 index 0000000000..af09fc230e --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/Tenant.java @@ -0,0 +1,112 @@ +package io.stargate.sgv2.jsonapi.api.request.tenant; + +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + +import com.google.common.annotations.VisibleForTesting; +import io.stargate.sgv2.jsonapi.config.DatabaseType; +import io.stargate.sgv2.jsonapi.util.recordable.Recordable; +import jakarta.validation.constraints.NotNull; +import java.util.Objects; + +/** + * The Tenant in the API, we always have a tenant even if the database is single-tenant. + *

+ * Tenant is bound to the {@link DatabaseType} because that tells if the DB is a single tenant + * or multi-tenant database. + *

+ * Create instances using the {@link TenantFactory} because it will be configured with the correct + * DatabaseType. Use the {@link Tenant#create(DatabaseType, String)} method to create for tests + * where you want to set the DB type. + *

+ * A tenant is identifier by non-null String tenant id, it is normalised and validated with + * {@link DatabaseType#normalizeValidateTenantId(String)}. Which will make it UPPER CASE and is compared as such. + * We assumed the tenantID is something like a UUID, that should compare as case-insensitive, + * see {@link #equals(Object)}. + *

+ * IMPORTANT: Work with Tenant instances, rather than get the string tenant id. + *

+ * Safe for multi threading. + */ +public class Tenant implements Recordable { + + // TenantID used when the DB is single-tenant. + private static final String SINGLE_TENANT_ID = "SINGLE-TENANT"; + + private static final Tenant SINGLE_TENANT_CASSANDRA = + new Tenant(DatabaseType.CASSANDRA, SINGLE_TENANT_ID); + + private final DatabaseType databaseType; + private final String tenantId; + + private Tenant(DatabaseType databaseType, String tenantId) { + this.databaseType = databaseType; + // this is just for sanity checking, the DB Type should have uppercased it + this.tenantId = tenantId.toUpperCase(); + } + + /** + * Factory method to create a Tenant instance. + *

+ * Visible for testing, you should use the {@link TenantFactory} to create instances + * + * @param databaseType the type of database this tenant is for, must not be null. + * @param tenantId the tenant id, must be null or blank for single-tenant. Otherwise, null is normalized, + * and validated to be non-blank. + * @return a Tenant instance + */ + @VisibleForTesting + public static Tenant create(DatabaseType databaseType, String tenantId) { + Objects.requireNonNull(databaseType, "databaseType must not be null"); + + var normalizedValidated = databaseType.normalizeValidateTenantId(tenantId); + + if (databaseType.isSingleTenant()) { + // use switch to reduce static instance based on database type + return switch (databaseType) { + case CASSANDRA -> SINGLE_TENANT_CASSANDRA; + default -> throw new IllegalStateException("Unsupported single tenant database type: " + databaseType); + }; + } + return new Tenant(databaseType, normalizedValidated); + } + + public DatabaseType databaseType() { + return databaseType; + } + + /** + * Get the tenant id, this is a non-null String. + */ + @Override + public String toString() { + return tenantId; + } + + /** + * Hashed on the combined values of {@link #databaseType} and {@link #tenantId}. + */ + @Override + public int hashCode() { + return Objects.hash(databaseType, tenantId); + } + + /** + * Equals based on the combined values of {@link #databaseType} and a CASE INSENSITIVE {@link #tenantId}. + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof Tenant that)) { + return false; + } + return Objects.equals(databaseType, that.databaseType) + && Objects.equals(tenantId, that.tenantId); + } + + @Override + public Recordable.DataRecorder recordTo(Recordable.DataRecorder dataRecorder) { + return dataRecorder.append("tenantId", tenantId).append("databaseType", databaseType); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactory.java new file mode 100644 index 0000000000..2d4177515e --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactory.java @@ -0,0 +1,58 @@ +package io.stargate.sgv2.jsonapi.api.request.tenant; + +import com.google.common.annotations.VisibleForTesting; +import io.stargate.sgv2.jsonapi.config.DatabaseType; + +import java.lang.reflect.Field; +import java.util.Objects; + +/** + * Singleton instance factory for creating {@link Tenant} instances. It must be initialized + * at application startup by calling {@link #initialize(DatabaseType)} with the + * database type from the configuration. + *

+ * Then call {@link #create(String)} on the {@link #instance()} to create tenant instances. + *

+ * Safe for multi threading. + */ +public class TenantFactory { + + private static TenantFactory singleton; + + private final DatabaseType databaseType; + + private TenantFactory(DatabaseType databaseType) { + this.databaseType = databaseType; + } + + public static void initialize(DatabaseType databaseType) { + Objects.requireNonNull(databaseType, "databaseType must not be null"); + + if (singleton == null) { + singleton = new TenantFactory(databaseType); + } + else{ + throw new IllegalStateException("TenantFactory already initialized"); + } + } + + public static TenantFactory instance() { + if (singleton == null) { + throw new IllegalStateException("TenantIdFactory not initialized"); + } + return singleton; + } + + public Tenant create(String tenantId) { + return Tenant.create(databaseType, tenantId); + } + + /** + * FOR TEST ONLY: Resets the singleton instance to allow re-initialization. + */ + @VisibleForTesting + public static void reset(){ + singleton = null; + + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/FixedTokenResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/FixedTokenResolver.java similarity index 51% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/FixedTokenResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/token/FixedTokenResolver.java index 77c6548ff8..9dbed81aba 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/FixedTokenResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/FixedTokenResolver.java @@ -15,26 +15,23 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.token.impl; +package io.stargate.sgv2.jsonapi.api.request.token; -import io.stargate.sgv2.jsonapi.api.request.token.DataApiTokenResolver; -import io.stargate.sgv2.jsonapi.config.AuthConfig; import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; -/** The {@link DataApiTokenResolver} that uses a fixed token supplied by the configuration. */ -public class FixedTokenResolver implements DataApiTokenResolver { +/** The {@link RequestAuthTokenResolver} that uses a fixed token supplied by the configuration. */ +public class FixedTokenResolver implements RequestAuthTokenResolver { - private final AuthConfig.TokenResolverConfig.FixedTokenResolverConfig config; + private final String fixedToken; - public FixedTokenResolver(AuthConfig.TokenResolverConfig.FixedTokenResolverConfig config) { - this.config = config; + public FixedTokenResolver(String fixedToken) { + this.fixedToken = fixedToken; } /** {@inheritDoc} */ @Override - public Optional resolve(RoutingContext context, SecurityContext securityContext) { - return config.token(); + public String resolve(RoutingContext context, SecurityContext securityContext) { + return fixedToken; } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/HeaderTokenResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/HeaderTokenResolver.java similarity index 60% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/HeaderTokenResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/token/HeaderTokenResolver.java index e52ff5843f..99b285c2cb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/HeaderTokenResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/HeaderTokenResolver.java @@ -15,16 +15,13 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.token.impl; +package io.stargate.sgv2.jsonapi.api.request.token; -import io.stargate.sgv2.jsonapi.api.request.token.DataApiTokenResolver; -import io.vertx.core.http.HttpServerRequest; import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; -/** The {@link DataApiTokenResolver} that resolves a token from the HTTP header. */ -public class HeaderTokenResolver implements DataApiTokenResolver { +/** The {@link RequestAuthTokenResolver} that resolves a token from the HTTP header. */ +public class HeaderTokenResolver implements RequestAuthTokenResolver { /** The name of the header to extract the token from. */ private final String headerName; @@ -35,9 +32,7 @@ public HeaderTokenResolver(String headerName) { /** {@inheritDoc} */ @Override - public Optional resolve(RoutingContext context, SecurityContext securityContext) { - HttpServerRequest request = context.request(); - String headerValue = request.getHeader(headerName); - return Optional.ofNullable(headerValue); + public String resolve(RoutingContext context, SecurityContext securityContext) { + return context.request().getHeader(headerName); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/PrincipalTokenResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/PrincipalTokenResolver.java similarity index 60% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/PrincipalTokenResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/token/PrincipalTokenResolver.java index 7e96f1e53f..e6112812f1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/impl/PrincipalTokenResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/PrincipalTokenResolver.java @@ -15,20 +15,19 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.token.impl; +package io.stargate.sgv2.jsonapi.api.request.token; -import io.stargate.sgv2.jsonapi.api.request.token.DataApiTokenResolver; import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; import java.security.Principal; -import java.util.Optional; -/** {@link DataApiTokenResolver} that reads the token from the {@link Principal#getName()}. */ -public class PrincipalTokenResolver implements DataApiTokenResolver { +/** {@link RequestAuthTokenResolver} that reads the token from the {@link Principal#getName()}. */ +public class PrincipalTokenResolver implements RequestAuthTokenResolver { /** {@inheritDoc} */ @Override - public Optional resolve(RoutingContext context, SecurityContext securityContext) { - return Optional.ofNullable(securityContext.getUserPrincipal()).map(Principal::getName); + public String resolve(RoutingContext context, SecurityContext securityContext) { + var principal = securityContext.getUserPrincipal(); + return principal != null ? principal.getName() : null; } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/DataApiTokenResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolver.java similarity index 88% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/token/DataApiTokenResolver.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolver.java index 481ed89fb8..082639d4d9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/DataApiTokenResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolver.java @@ -19,7 +19,6 @@ import io.vertx.ext.web.RoutingContext; import jakarta.ws.rs.core.SecurityContext; -import java.util.Optional; /** * Resolver of the Cassandra token. @@ -28,7 +27,7 @@ * SecurityContext} to obtain the token. */ @FunctionalInterface -public interface DataApiTokenResolver { +public interface RequestAuthTokenResolver { /** * Returns a Cassandra token given a {@link RoutingContext} and a {@link SecurityContext}. @@ -37,5 +36,5 @@ public interface DataApiTokenResolver { * @param securityContext the security context * @return The Cassandra token. If empty, indicates that no token should be used. */ - Optional resolve(RoutingContext context, SecurityContext securityContext); + String resolve(RoutingContext context, SecurityContext securityContext); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/configuration/DataApiTokenConfiguration.java b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolverProducer.java similarity index 54% rename from src/main/java/io/stargate/sgv2/jsonapi/api/request/token/configuration/DataApiTokenConfiguration.java rename to src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolverProducer.java index deb803a287..83e000ebc2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/configuration/DataApiTokenConfiguration.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/request/token/RequestAuthTokenResolverProducer.java @@ -15,50 +15,34 @@ * */ -package io.stargate.sgv2.jsonapi.api.request.token.configuration; +package io.stargate.sgv2.jsonapi.api.request.token; import io.quarkus.arc.lookup.LookupIfProperty; -import io.stargate.sgv2.jsonapi.api.request.token.DataApiTokenResolver; -import io.stargate.sgv2.jsonapi.api.request.token.impl.FixedTokenResolver; -import io.stargate.sgv2.jsonapi.api.request.token.impl.HeaderTokenResolver; -import io.stargate.sgv2.jsonapi.api.request.token.impl.PrincipalTokenResolver; import io.stargate.sgv2.jsonapi.config.AuthConfig; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; -import java.util.Optional; -/** Configuration for activating a correct {@link DataApiTokenResolver}. */ -public class DataApiTokenConfiguration { +/** Configuration for activating a correct {@link RequestAuthTokenResolver}. */ +public class RequestAuthTokenResolverProducer { @Produces @ApplicationScoped @LookupIfProperty(name = "stargate.auth.token-resolver.type", stringValue = "header") - DataApiTokenResolver headerTokenResolver(AuthConfig config) { - String headerName = config.tokenResolver().header().headerName(); - return new HeaderTokenResolver(headerName); + RequestAuthTokenResolver headerTokenResolver(AuthConfig config) { + return new HeaderTokenResolver(config.tokenResolver().header().headerName()); } @Produces @ApplicationScoped @LookupIfProperty(name = "stargate.auth.token-resolver.type", stringValue = "principal") - DataApiTokenResolver principalTokenResolver() { + RequestAuthTokenResolver principalTokenResolver() { return new PrincipalTokenResolver(); } @Produces @ApplicationScoped @LookupIfProperty(name = "stargate.auth.token-resolver.type", stringValue = "fixed") - DataApiTokenResolver fixedTokenResolver(AuthConfig config) { - return new FixedTokenResolver(config.tokenResolver().fixed()); - } - - @Produces - @ApplicationScoped - @LookupIfProperty( - name = "stargate.auth.token-resolver.type", - stringValue = "noop", - lookupIfMissing = true) - DataApiTokenResolver noopCassandraTokenResolver() { - return (context, securityContext) -> Optional.empty(); + RequestAuthTokenResolver fixedTokenResolver(AuthConfig config) { + return new FixedTokenResolver(config.tokenResolver().fixed().token().orElse(null)); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/AuthConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/AuthConfig.java index 4c949d3496..9cdcfa9fd1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/AuthConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/AuthConfig.java @@ -18,6 +18,10 @@ import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; +import io.stargate.sgv2.jsonapi.api.request.token.FixedTokenResolver; +import io.stargate.sgv2.jsonapi.api.request.token.HeaderTokenResolver; +import io.stargate.sgv2.jsonapi.api.request.token.PrincipalTokenResolver; +import io.stargate.sgv2.jsonapi.api.request.token.RequestAuthTokenResolver; import io.stargate.sgv2.jsonapi.config.constants.HttpConstants; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; @@ -72,21 +76,19 @@ interface TokenResolverConfig { * *

    *
  1. header - reads Cassandra token from the HTTP request header (see {@link - * io.stargate.sgv2.jsonapi.api.request.token.impl.HeaderTokenResolver}} + * HeaderTokenResolver}} *
  2. principal - reads Cassandra token from the security {@link - * java.security.Principal} name (see {@link - * io.stargate.sgv2.jsonapi.api.request.token.impl.PrincipalTokenResolver}} + * java.security.Principal} name (see {@link PrincipalTokenResolver}} *
  3. fixed - fixed token supplied by the configuration (see {@link - * io.stargate.sgv2.jsonapi.api.request.token.impl.FixedTokenResolver}} - *
  4. custom - allows configuring custom token resolver + * FixedTokenResolver}} *
* * If unset, noop resolver will be used. * - * @return The type of the {@link DataApiTokenResolver} used. + * @return The type of the {@link RequestAuthTokenResolver} used. */ @WithDefault("principal") - Optional<@Pattern(regexp = "header|principal|fixed|custom") String> type(); + Optional<@Pattern(regexp = "header|principal|fixed") String> type(); /** * @return Specific settings for the header token resolver type. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/DatabaseType.java b/src/main/java/io/stargate/sgv2/jsonapi/config/DatabaseType.java index adb57f9d8c..f78d389f83 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/DatabaseType.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/DatabaseType.java @@ -4,6 +4,8 @@ import java.util.Objects; import org.eclipse.microprofile.config.spi.Converter; +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + /** * The back end database the API is running against. * @@ -11,9 +13,39 @@ * CqlCredentialsFactory}. */ public enum DatabaseType { - ASTRA, - CASSANDRA, - OFFLINE_WRITER; + ASTRA(false), + CASSANDRA(true), + OFFLINE_WRITER(false); + + private final boolean singleTenant; + + DatabaseType(boolean singleTenant) { + this.singleTenant = singleTenant; + } + + public boolean isSingleTenant() { + return singleTenant; + } + + public String normalizeValidateTenantId(String tenantId) { + + var normalized = normalizeOptionalString(tenantId).toUpperCase(); + if (isSingleTenant()) { + if (!normalized.isEmpty()){ + throw new IllegalArgumentException( + "DatabaseType %s is singleTenant, tenantId must be empty, but was: '%s'" + .formatted(this.name(), normalized)); + } + return normalized; + } + + // For multi-tenant databases, must not be + if (normalized.isEmpty()){ + throw new IllegalArgumentException( + "DatabaseType %s is multi-tenant, tenantId must not be empty".formatted(this.name())); + } + return normalized; + } /** * Constants should only be used where we need a string constant for defaults etc, use the enum diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/MultiTenancyConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/MultiTenancyConfig.java index 4d1998f9bb..2b7b7b14c1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/MultiTenancyConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/MultiTenancyConfig.java @@ -18,6 +18,9 @@ import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; +import io.stargate.sgv2.jsonapi.api.request.tenant.FixedTenantResolver; +import io.stargate.sgv2.jsonapi.api.request.tenant.RequestTenantResolver; +import io.stargate.sgv2.jsonapi.api.request.tenant.SubdomainTenantResolver; import jakarta.validation.Valid; import jakarta.validation.constraints.Pattern; import java.util.Optional; @@ -55,7 +58,7 @@ interface TenantResolverConfig { * * If unset, noop resolver will be used. * - * @return The type of the {@link TenantResolver} used. + * @return The type of the {@link RequestTenantResolver} used. */ Optional<@Pattern(regexp = "subdomain|fixed|custom") String> type(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/config/OperationsConfig.java b/src/main/java/io/stargate/sgv2/jsonapi/config/OperationsConfig.java index 65b88e6d5d..87c89f1950 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/config/OperationsConfig.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/config/OperationsConfig.java @@ -220,6 +220,7 @@ interface DatabaseConfig { List cassandraEndPoints(); /** Cassandra port (when type is {@link DatabaseType#CASSANDRA}) */ + @Nullable @WithDefault("9042") int cassandraPort(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/logging/LoggingMDCContext.java b/src/main/java/io/stargate/sgv2/jsonapi/logging/LoggingMDCContext.java new file mode 100644 index 0000000000..43a11b2cd2 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/logging/LoggingMDCContext.java @@ -0,0 +1,14 @@ +package io.stargate.sgv2.jsonapi.logging; + +/** + * Simple interface for objects can update the Mapped Diagnostic Context (MDC) for logging purposes. + *

+ * see https://quarkus.io/guides/logging#mdc-propagation + *

+ * */ +public interface LoggingMDCContext { + + void addToMDC(); + + void removeFromMDC(); +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/metrics/JsonProcessingMetricsReporter.java b/src/main/java/io/stargate/sgv2/jsonapi/metrics/JsonProcessingMetricsReporter.java index 6ed7af74c8..5eaf5c776d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/metrics/JsonProcessingMetricsReporter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/metrics/JsonProcessingMetricsReporter.java @@ -71,7 +71,7 @@ public void reportJsonReadDocsMetrics(String commandName, int docCount) { private Tags getCustomTags(String commandName) { Tag tenantTag = - Tag.of(tenantConfig.tenantTag(), requestContext.getTenantId().orElse(UNKNOWN_VALUE)); + Tag.of(tenantConfig.tenantTag(), requestContext.tenant().toString()); Tag commandTag = Tag.of(jsonApiMetricsConfig.command(), commandName); return Tags.of(commandTag, tenantTag); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/metrics/MetricsTenantDeactivationConsumer.java b/src/main/java/io/stargate/sgv2/jsonapi/metrics/MetricsTenantDeactivationConsumer.java index 0e217ebdf2..037f5005c6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/metrics/MetricsTenantDeactivationConsumer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/metrics/MetricsTenantDeactivationConsumer.java @@ -5,6 +5,7 @@ import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import java.util.*; import org.slf4j.Logger; @@ -28,28 +29,28 @@ public MetricsTenantDeactivationConsumer(MeterRegistry meterRegistry) { /** * Called by {@link CQLSessionCache} when a tenant's session is removed. This method iterates * through all registered meters in the {@link MeterRegistry} and removes any that are tagged with - * the specified {@code tenantId} using either the {@link MetricsConstants.MetricTags#TENANT_TAG} + * the specified {@code tenant} using either the {@link MetricsConstants.MetricTags#TENANT_TAG} * or {@link MetricsConstants.MetricTags#SESSION_TAG} key. * - * @param tenantId The ID of the tenant whose session was deactivated. This value will be used to + * @param tenant The ID of the tenant whose session was deactivated. This value will be used to * find metrics with a matching tag. */ @Override - public void accept(String tenantId) { - if (tenantId == null) { - LOGGER.warn("Received null tenantId for deactivation"); + public void accept(Tenant tenant) { + if (tenant == null) { + LOGGER.warn("Received null tenant for deactivation"); return; } for (Meter meter : meterRegistry.getMeters()) { // Check TENANT_TAG first, if not found, check SESSION_TAG - if (Objects.equals(meter.getId().getTag(TENANT_TAG), tenantId) - || Objects.equals(meter.getId().getTag(SESSION_TAG), tenantId)) { + if (Objects.equals(meter.getId().getTag(TENANT_TAG), tenant.toString()) + || Objects.equals(meter.getId().getTag(SESSION_TAG), tenant.toString())) { if (meterRegistry.remove(meter.getId()) == null) { LOGGER.debug( "Attempted to remove metric with ID {} for tenant {} but it was not found in the registry during the removal phase.", meter.getId(), - tenantId); + tenant); } } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/metrics/TenantRequestMetricsFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/metrics/TenantRequestMetricsFilter.java index 9178b7b2b1..f9dab7aadb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/metrics/TenantRequestMetricsFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/metrics/TenantRequestMetricsFilter.java @@ -58,8 +58,6 @@ public class TenantRequestMetricsFilter { /** The tag for error being false, created only once. */ private final Tag errorFalse; - /** The tag for tenant being unknown, created only once. */ - Tag tenantUnknown; /** Default constructor. */ @Inject @@ -70,7 +68,6 @@ public TenantRequestMetricsFilter( this.config = metricsConfig.tenantRequestCounter(); errorTrue = Tag.of(config.errorTag(), "true"); errorFalse = Tag.of(config.errorTag(), "false"); - tenantUnknown = Tag.of(config.tenantTag(), UNKNOWN_VALUE); } /** @@ -87,11 +84,7 @@ public void record( if (config.enabled()) { // resolve tenant - Tag tenantTag = - this.requestContext - .getTenantId() - .map(id -> Tag.of(config.tenantTag(), id)) - .orElse(tenantUnknown); + Tag tenantTag = Tag.of(config.tenantTag(), this.requestContext.tenant().toString()); // resolve error boolean error = responseContext.getStatus() >= 500; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java index 0b8b8ce7af..633405f57f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java @@ -8,6 +8,8 @@ import io.micrometer.core.instrument.MeterRegistry; import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; import java.time.Duration; @@ -43,17 +45,11 @@ * *

NOTE: There is no method to get the size of the cache because it is not a reliable * measure, it's only an estimate. We can assume the size feature works. For testing use {@link - * #peekSession(String, String, String)} + * #peekSession(Tenant, String, UserAgent)} */ public class CQLSessionCache extends DynamicTTLCache { private static final Logger LOGGER = LoggerFactory.getLogger(CQLSessionCache.class); - /** - * Default tenant to be used when the backend is OSS cassandra and when no tenant is passed in the - * request amorton; 17 Nov 2025 - will be removed soon, will refactor so we have a Tenant objext - */ - public static final String DEFAULT_TENANT = "default_tenant"; - private final DynamicTTLSupplier ttlSupplier; private final CqlCredentialsFactory credentialsFactory; @@ -66,7 +62,7 @@ public class CQLSessionCache extends DynamicTTLCache getSession(RequestContext requestContext) { // Validation happens when creating the credentials and session key return getSession( - requestContext.getTenantId().orElse(DEFAULT_TENANT), - requestContext.getCassandraToken().orElse(""), - requestContext.getUserAgent().orElse("")); + requestContext.tenant(), + requestContext.authToken(), + requestContext.userAgent()); } /** @@ -203,9 +199,9 @@ public Uni getSession(CommandQueryExecutor.DBRequestContext requestC // Validation happens when creating the credentials and session key return getSession( - requestContext.tenantId().orElse(DEFAULT_TENANT), - requestContext.authToken().orElse(""), - requestContext.userAgent().orElse("")); + requestContext.tenant(), + requestContext.authToken(), + requestContext.userAgent()); } /** @@ -218,14 +214,14 @@ public Uni getSession(CommandQueryExecutor.DBRequestContext requestC * @return A Uni with the {@link CqlSession} for this tenant and credentials, the session maybe * newly created or reused from the cache. */ - public Uni getSession(String tenant, String authToken, String userAgent) { + public Uni getSession(Tenant tenant, String authToken, UserAgent userAgent) { return get(createCacheKey(tenant, authToken, userAgent)); } /** * Evicts a session from the cache based on the provided {@link RequestContext}. * - * @see #evictSession(String, String, String) for details on eviction. + * @see #evictSession(Tenant, String, UserAgent) for details on eviction. * @param requestContext The request context containing tenant, auth, and user agent info. * @return {@code true} if a session was evicted, {@code false} otherwise. */ @@ -234,9 +230,9 @@ public boolean evictSession(RequestContext requestContext) { // Validation happens when creating the credentials and session key return evictSession( - requestContext.getTenantId().orElse(""), - requestContext.getCassandraToken().orElse(""), - requestContext.getUserAgent().orElse(null)); + requestContext.tenant(), + requestContext.authToken(), + requestContext.userAgent()); } /** @@ -249,7 +245,7 @@ public boolean evictSession(RequestContext requestContext) { * @param userAgent Nullable user agent * @return {@code true} if a session was evicted, {@code false} otherwise. */ - public boolean evictSession(String tenantId, String authToken, String userAgent) { + public boolean evictSession(Tenant tenantId, String authToken, UserAgent userAgent) { var cacheKey = createCacheKey(tenantId, authToken, userAgent); @@ -261,12 +257,12 @@ public boolean evictSession(String tenantId, String authToken, String userAgent) * authToken, and userAgent. */ @VisibleForTesting - protected Optional peekSession(String tenant, String authToken, String userAgent) { + protected Optional peekSession(Tenant tenant, String authToken, UserAgent userAgent) { return getIfPresent(createCacheKey(tenant, authToken, userAgent)); } /** Builds the cache key to use for the supplied tenant and authentication token. */ - private SessionCacheKey createCacheKey(String tenant, String authToken, String userAgent) { + private SessionCacheKey createCacheKey(Tenant tenant, String authToken, UserAgent userAgent) { Objects.requireNonNull(tenant, "tenant must not be null"); Objects.requireNonNull(authToken, "authToken must not be null"); @@ -285,11 +281,11 @@ private SessionCacheKey createCacheKey(String tenant, String authToken, String u /** Key for CQLSession cache. */ static class SessionCacheKey implements DynamicTTLCache.CacheKey { - private final String tenant; + private final Tenant tenant; private final CqlCredentials credentials; private final Duration ttl; // user agent only added for logging and debugging - private final String userAgent; + private final UserAgent userAgent; /** * Creates a new instance of {@link SessionCacheKey}. @@ -301,7 +297,7 @@ static class SessionCacheKey implements DynamicTTLCache.CacheKey { * @param userAgent Optional user agent for the request, not used in the equality of the key * just for logging. */ - SessionCacheKey(String tenant, CqlCredentials credentials, Duration ttl, String userAgent) { + SessionCacheKey(Tenant tenant, CqlCredentials credentials, Duration ttl, UserAgent userAgent) { // tenant is only used to identify the session, not passed to backend db // normalising the unset value to null @@ -311,7 +307,7 @@ static class SessionCacheKey implements DynamicTTLCache.CacheKey { this.userAgent = Objects.requireNonNull(userAgent, "userAgent must not be null"); } - String tenant() { + Tenant tenant() { return tenant; } @@ -393,8 +389,8 @@ public void onRemoved(SessionCacheKey key, CqlSession value, RemovalCause cause) /** Callback when a tenant is deactivated. */ @FunctionalInterface - public interface DeactivatedTenantListener extends Consumer { - void accept(String tenant); + public interface DeactivatedTenantListener extends Consumer { + void accept(Tenant tenant); } /** Called to create credentials used with the session and session cache key. */ @@ -406,7 +402,7 @@ public interface CredentialsFactory extends Function { /** Called to create a new session when one is needed. */ @FunctionalInterface public interface SessionFactory - extends BiFunction> { - CompletionStage apply(String tenant, CqlCredentials credentials); + extends BiFunction> { + CompletionStage apply(Tenant tenant, CqlCredentials credentials); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java index 292108f1d0..01628af6a1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java @@ -1,6 +1,7 @@ package io.stargate.sgv2.jsonapi.service.cqldriver; import io.micrometer.core.instrument.MeterRegistry; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.metrics.MetricsTenantDeactivationConsumer; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; @@ -48,7 +49,6 @@ public CqlSessionCacheSupplier( var sessionFactory = new CqlSessionFactory( applicationName, - dbConfig.type(), dbConfig.localDatacenter(), dbConfig.cassandraEndPoints(), dbConfig.cassandraPort(), @@ -58,7 +58,7 @@ public CqlSessionCacheSupplier( new CQLSessionCache( dbConfig.sessionCacheMaxSize(), Duration.ofSeconds(dbConfig.sessionCacheTtlSeconds()), - operationsConfig.slaUserAgent().orElse(null), + operationsConfig.slaUserAgent().map(UserAgent::new).orElse(null), Duration.ofSeconds(dbConfig.slaSessionCacheTtlSeconds()), credentialsFactory, sessionFactory, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionFactory.java index 0a4154cf23..a893f6c84b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionFactory.java @@ -10,6 +10,7 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigRenderOptions; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.DatabaseType; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.optvector.SubtypeOnlyFloatVectorToArrayCodec; import java.net.InetSocketAddress; @@ -78,7 +79,6 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { private final String applicationName; - private final DatabaseType databaseType; private final String localDatacenter; private final Collection contactPoints; private final Supplier schemaChangeListenerSupplier; @@ -88,7 +88,6 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { * Constructor for the CqlSessionFactory, normally this overload is used for non-testing code. * * @param applicationName the name of the application, set on the CQL session - * @param databaseType the type of database, controls contact points and other settings * @param localDatacenter the local datacenter for the client connection. * @param cassandraEndPoints the Cassandra endpoints, only used when the database type is * CASSANDRA @@ -98,14 +97,12 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { */ CqlSessionFactory( String applicationName, - DatabaseType databaseType, String localDatacenter, List cassandraEndPoints, Integer cassandraPort, Supplier schemaChangeListenerSupplier) { this( applicationName, - databaseType, localDatacenter, cassandraEndPoints, cassandraPort, @@ -118,7 +115,6 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { * be mocked. * * @param applicationName the name of the application, set on the CQL session - * @param databaseType the type of database, controls contact points and other settings * @param localDatacenter the local datacenter for the client connection. * @param cassandraEndPoints the Cassandra endpoints, only used when the database type is * CASSANDRA @@ -131,7 +127,6 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { @VisibleForTesting CqlSessionFactory( String applicationName, - DatabaseType databaseType, String localDatacenter, List cassandraEndPoints, Integer cassandraPort, @@ -143,7 +138,6 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { if (applicationName.isBlank()) { throw new IllegalArgumentException("applicationName must not be blank"); } - this.databaseType = Objects.requireNonNull(databaseType, "databaseType must not be null"); this.localDatacenter = Objects.requireNonNull(localDatacenter, "localDatacenter must not be null"); @@ -151,37 +145,30 @@ public class CqlSessionFactory implements CQLSessionCache.SessionFactory { this.sessionBuilderSupplier = Objects.requireNonNull(sessionBuilderSupplier, "sessionBuilderSupplier must not be null"); - // these never change, and we do not have them in astra, so we can cache - if (databaseType == DatabaseType.CASSANDRA) { - if (cassandraEndPoints == null || cassandraEndPoints.isEmpty()) { - throw new IllegalArgumentException( - "Database type is %s but cassandraEndPoints is null or empty.".formatted(databaseType)); - } - contactPoints = - cassandraEndPoints.stream() - .map(host -> new InetSocketAddress(host, cassandraPort)) - .toList(); - } else { - contactPoints = List.of(); - } + // these never change, so we can cache + // we cannot test if we need these to be provided until we create the session, because we do not + // know the DB type until we know the tenant. + contactPoints = cassandraEndPoints != null + ? cassandraEndPoints.stream().map(host -> new InetSocketAddress(host, cassandraPort)).toList() + : List.of(); } @Override - public CompletionStage apply(String tenantId, CqlCredentials credentials) { + public CompletionStage apply(Tenant tenant, CqlCredentials credentials) { Objects.requireNonNull(credentials, "credentials must not be null"); - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("Creating CQL Session tenantId={}, credentials={}", tenantId, credentials); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Creating CQL Session tenant={}, credentials={}", tenant, credentials); } // the driver TypedDriverOption is only used with DriverConfigLoader.fromMap() // The ConfigLoader is held by the session and closed when the session closes, do not close it // here. - // Setting the session name to the tenantId, this is used by the driver to identify the session, + // Setting the session name to the tenant, this is used by the driver to identify the session, // used in logging and metrics var configLoader = DriverConfigLoader.programmaticBuilder() - .withString(DefaultDriverOption.SESSION_NAME, tenantId == null ? "" : tenantId) + .withString(DefaultDriverOption.SESSION_NAME, tenant.toString()) .build(); var builder = @@ -193,7 +180,7 @@ public CompletionStage apply(String tenantId, CqlCredentials credent .withApplicationName(applicationName); if (builder instanceof TenantAwareCqlSessionBuilder tenantAwareBuilder) { - tenantAwareBuilder.withTenantId(tenantId); + tenantAwareBuilder.withTenant(tenant); } if (null != schemaChangeListenerSupplier) { @@ -208,7 +195,11 @@ public CompletionStage apply(String tenantId, CqlCredentials credent builder = credentials.addToSessionBuilder(builder); // for astra it will default to 127.0.0.1 which is routed to the astra proxy - if (databaseType == DatabaseType.CASSANDRA) { + if (tenant.databaseType() == DatabaseType.CASSANDRA) { + if (contactPoints.isEmpty()) { + throw new IllegalStateException( + "Database type is %s but contactPoints is empty.".formatted(tenant.databaseType())); + } builder = builder.addContactPoints(contactPoints); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/TenantAwareCqlSessionBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/TenantAwareCqlSessionBuilder.java index 7e220dbb15..eed7791dba 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/TenantAwareCqlSessionBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/TenantAwareCqlSessionBuilder.java @@ -6,8 +6,10 @@ import com.datastax.oss.driver.api.core.session.ProgrammaticArguments; import com.datastax.oss.driver.internal.core.context.DefaultDriverContext; import com.datastax.oss.protocol.internal.util.collection.NullAllowingImmutableMap; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import java.util.Map; +import java.util.Objects; /** * This is an extension of the {@link CqlSessionBuilder} that allows to pass a tenant ID to the @@ -24,14 +26,11 @@ public class TenantAwareCqlSessionBuilder extends CqlSessionBuilder { */ public static final String TENANT_ID_PROPERTY_KEY = "TENANT_ID"; - /** Tenant ID that will be passed to the CQLSession via TenantAwareDriverContext */ - private String tenantId; + /** Tenant that will be passed to the CQLSession via TenantAwareDriverContext */ + private Tenant tenant; - public TenantAwareCqlSessionBuilder withTenantId(String tenantId) { - if (tenantId == null || tenantId.isEmpty()) { - throw ErrorCodeV1.SERVER_INTERNAL_ERROR.toApiException("Tenant ID cannot be null or empty"); - } - this.tenantId = tenantId; + public TenantAwareCqlSessionBuilder withTenant(Tenant tenant) { + this.tenant = Objects.requireNonNull(tenant, "tenant must not be null"); return this; } @@ -45,7 +44,7 @@ public TenantAwareCqlSessionBuilder withTenantId(String tenantId) { @Override protected DriverContext buildContext( DriverConfigLoader configLoader, ProgrammaticArguments programmaticArguments) { - return new TenantAwareDriverContext(tenantId, configLoader, programmaticArguments); + return new TenantAwareDriverContext(tenant.toString(), configLoader, programmaticArguments); } /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java index 3732b97d04..ad8e1ac623 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java @@ -11,6 +11,8 @@ import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.service.cqldriver.AccumulatingAsyncResultSet; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import java.util.Objects; @@ -213,16 +215,16 @@ public Uni executeAndWrap(SimpleStatement statement) { // Aaron - Feb 3 - temp rename while factoring full RequestContext public record DBRequestContext( - Optional tenantId, - Optional authToken, - Optional userAgent, + Tenant tenant, + String authToken, + UserAgent userAgent, boolean tracingEnabled) { public DBRequestContext(CommandContext commandContext) { this( - commandContext.requestContext().getTenantId(), - commandContext.requestContext().getCassandraToken(), - commandContext.requestContext().getUserAgent(), + commandContext.requestContext().tenant(), + commandContext.requestContext().authToken(), + commandContext.requestContext().userAgent(), commandContext.requestTracing().enabled()); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java index 1f6ac092ec..9a728afc88 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.cqldriver.executor; -import static io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache.DEFAULT_TENANT; import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; @@ -13,6 +12,7 @@ import com.google.common.annotations.VisibleForTesting; import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.DatabaseType; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; @@ -111,16 +111,8 @@ public Uni getSchemaObject( Objects.requireNonNull(namespace, "namespace must not be null"); - // Aaron 1 may 2025 - Based on existing logic I thought we should have a non null tenantId in - // all cases other than - // when using cassandra as a backend. - var resolvedTenantId = - (databaseType == DatabaseType.CASSANDRA) - ? requestContext.getTenantId().orElse(DEFAULT_TENANT) - : requestContext.getTenantId().orElseThrow(); - var tableBasedSchemaCache = - keyspaceCache.get(new KeyspaceCacheKey(resolvedTenantId, namespace)); + keyspaceCache.get(new KeyspaceCacheKey(requestContext.tenant(), namespace)); Objects.requireNonNull( tableBasedSchemaCache, "keyspaceCache must not return null tableBasedSchemaCache"); return tableBasedSchemaCache.getSchemaObject(requestContext, collectionName, forceRefresh); @@ -128,7 +120,7 @@ public Uni getSchemaObject( private TableBasedSchemaCache onLoad(SchemaCache.KeyspaceCacheKey key) { if (LOGGER.isTraceEnabled()) { - LOGGER.trace("onLoad() - tenantId: {}, keyspace: {}", key.tenantId(), key.keyspace()); + LOGGER.trace("onLoad() - tenant: {}, keyspace: {}", key.tenant(), key.keyspace()); } // Cannot get a session from the sessionCacheSupplier in the constructor because @@ -140,10 +132,10 @@ private TableBasedSchemaCache onLoad(SchemaCache.KeyspaceCacheKey key) { /** For testing only - peek to see if the schema object is in the cache without loading it. */ @VisibleForTesting - Optional peekSchemaObject(String tenantId, String keyspaceName, String tableName) { + Optional peekSchemaObject(Tenant tenant, String keyspaceName, String tableName) { var tableBasedSchemaCache = - keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenantId, keyspaceName)); + keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, keyspaceName)); if (tableBasedSchemaCache != null) { return tableBasedSchemaCache.peekSchemaObject(tableName); } @@ -152,48 +144,48 @@ Optional peekSchemaObject(String tenantId, String keyspaceName, St ; /** Removes the table from the cache if present. */ - void evictTable(String tenantId, String keyspace, String tableName) { + void evictTable(Tenant tenant, String keyspace, String tableName) { if (LOGGER.isTraceEnabled()) { LOGGER.trace( - "evictTable() - tenantId: {}, keyspace: {}, tableName: {}", - tenantId, + "evictTable() - tenant: {}, keyspace: {}, tableName: {}", + tenant, keyspace, tableName); } var tableBasedSchemaCache = - keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenantId, keyspace)); + keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, keyspace)); if (tableBasedSchemaCache != null) { tableBasedSchemaCache.evictCollectionSettingCacheEntry(tableName); } } - /** Removes all keyspaces and table entries for the given tenantId from the cache. */ - void evictAllKeyspaces(String tenantId) { + /** Removes all keyspaces and table entries for the given tenant from the cache. */ + void evictAllKeyspaces(Tenant tenant) { if (LOGGER.isTraceEnabled()) { - LOGGER.trace("evictAllKeyspaces() - tenantId: {}", tenantId); + LOGGER.trace("evictAllKeyspaces() - tenant: {}", tenant); } - keyspaceCache.asMap().keySet().removeIf(key -> key.tenantId().equals(tenantId)); + keyspaceCache.asMap().keySet().removeIf(key -> key.tenant().equals(tenant)); } /** Removes the keyspace from the cache if present. */ - void evictKeyspace(String tenant, String keyspace) { + void evictKeyspace(Tenant tenant, String keyspace) { if (LOGGER.isTraceEnabled()) { - LOGGER.trace("evictKeyspace() - tenantId: {}, keyspace: {}", tenant, keyspace); + LOGGER.trace("evictKeyspace() - tenant: {}, keyspace: {}", tenant, keyspace); } keyspaceCache.invalidate(new KeyspaceCacheKey(tenant, keyspace)); } /** Key for the Keyspace cache, we rely on the record hash and equals */ - record KeyspaceCacheKey(String tenantId, String keyspace) { + record KeyspaceCacheKey(Tenant tenant, String keyspace) { KeyspaceCacheKey { - Objects.requireNonNull(tenantId, "tenantId must not be null"); + Objects.requireNonNull(tenant, "tenant must not be null"); Objects.requireNonNull(keyspace, "namespace must not be null"); } } @@ -209,7 +201,7 @@ record KeyspaceCacheKey(String tenantId, String keyspace) { * created because the listener will first listen for {@link SchemaChangeListener#onSessionReady} * and get the tenantID from the session name via {@link Session#getName}. * - *

If the tenantId is not set, null or blank, we log at ERROR rather than throw because the + *

If the tenant is not set, null or blank, we log at ERROR rather than throw because the * callback methods are called on driver async threads and exceptions there are unlikely to be * passed back in the request response. * @@ -223,16 +215,16 @@ static class SchemaCacheSchemaChangeListener extends SchemaChangeListenerBase { private final SchemaCache schemaCache; - private String tenantId = null; + private Tenant tenant = null; public SchemaCacheSchemaChangeListener(SchemaCache schemaCache) { this.schemaCache = Objects.requireNonNull(schemaCache, "schemaCache must not be null"); } private boolean hasTenantId(String context) { - if (tenantId == null || tenantId.isBlank()) { + if (tenant == null || tenant.isBlank()) { LOGGER.error( - "SchemaCacheSchemaChangeListener tenantId is null or blank when expected to be set - {}", + "SchemaCacheSchemaChangeListener tenant is null or blank when expected to be set - {}", context); return false; } @@ -242,7 +234,7 @@ private boolean hasTenantId(String context) { private void evictTable(String context, TableMetadata tableMetadata) { if (hasTenantId(context)) { schemaCache.evictTable( - tenantId, + tenant, tableMetadata.getKeyspace().asInternal(), tableMetadata.getName().asInternal()); } @@ -250,9 +242,9 @@ private void evictTable(String context, TableMetadata tableMetadata) { @Override public void onSessionReady(@NonNull Session session) { - // This is called when the session is ready, we can get the tenantId from the session name + // This is called when the session is ready, we can get the tenant from the session name // and set it in the listener so we can use it in the other methods. - tenantId = session.getName(); + tenant = session.getName(); hasTenantId("onSessionReady called but sessionName() is null or blank"); } @@ -282,7 +274,7 @@ public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadat @Override public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { if (hasTenantId("onKeyspaceDropped")) { - schemaCache.evictKeyspace(tenantId, keyspace.getName().asInternal()); + schemaCache.evictKeyspace(tenant, keyspace.getName().asInternal()); } } } @@ -301,10 +293,10 @@ public SchemaCacheDeactivatedTenantConsumer(SchemaCache schemaCache) { } @Override - public void accept(String tenantId) { + public void accept(Tenant tenant) { // the sessions are keyed on the tenantID and the credentials, and one session can work with - // multiple keyspaces. So we need to evict all the keyspaces for the tenantId - schemaCache.evictAllKeyspaces(tenantId); + // multiple keyspaces. So we need to evict all the keyspaces for the tenant + schemaCache.evictAllKeyspaces(tenant); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java index d69243fc71..46968de17e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java @@ -90,10 +90,7 @@ public DataVectorizer constructDataVectorizer( objectMapper.getNodeFactory(), commandContext .requestContext() - .getEmbeddingCredentialsSupplier() - .create( - commandContext.requestContext(), - embeddingProvider == null ? null : embeddingProvider.providerConfig()), + .getEmbeddingCredentials(), commandContext.schemaObject()); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/gateway/EmbeddingGatewayClient.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/gateway/EmbeddingGatewayClient.java index 6d53be8a95..2442851924 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/gateway/EmbeddingGatewayClient.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/gateway/EmbeddingGatewayClient.java @@ -6,6 +6,7 @@ import io.stargate.embedding.gateway.EmbeddingGateway; import io.stargate.embedding.gateway.EmbeddingService; import io.stargate.sgv2.jsonapi.api.request.EmbeddingCredentials; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig; @@ -36,8 +37,8 @@ public class EmbeddingGatewayClient extends EmbeddingProvider { private ServiceConfigStore.ServiceRequestProperties requestProperties; - private Optional tenant; - private Optional authToken; + private Tenant tenant; + private String authToken; private EmbeddingService grpcGatewayClient; Map authentication; private String commandName; @@ -50,8 +51,8 @@ public EmbeddingGatewayClient( ServiceConfigStore.ServiceConfig serviceConfig, int dimension, Map vectorizeServiceParameters, - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, EmbeddingService grpcGatewayClient, Map authentication, String commandName) { @@ -141,8 +142,8 @@ else if (value instanceof Boolean) var contextBuilder = EmbeddingGateway.ProviderEmbedRequest.ProviderContext.newBuilder() .setProviderName(modelProvider().apiName()) - .setTenantId(tenant.orElse(DEFAULT_TENANT_ID)) - .putAuthTokens(DATA_API_TOKEN, authToken.orElse("")); + .setTenantId(tenant.toString()) + .putAuthTokens(DATA_API_TOKEN, authToken); embeddingCredentials .apiKey() diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingProviderFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingProviderFactory.java index 51ffe68b17..7e1c0ceb5c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingProviderFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingProviderFactory.java @@ -2,6 +2,7 @@ import io.quarkus.grpc.GrpcClient; import io.stargate.embedding.gateway.EmbeddingService; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig; @@ -56,8 +57,8 @@ EmbeddingProvider create( Map.entry(ModelProvider.VOYAGE_AI, VoyageAIEmbeddingProvider::new)); public EmbeddingProvider create( - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, String serviceName, String modelName, int dimension, @@ -98,8 +99,8 @@ public EmbeddingProvider create( } public EmbeddingProvider create( - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, ModelProvider modelProvider, String modelName, int dimension, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/MeteredEmbeddingProvider.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/MeteredEmbeddingProvider.java index 20afc92e13..b4548eaadc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/MeteredEmbeddingProvider.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/operation/MeteredEmbeddingProvider.java @@ -165,7 +165,7 @@ public int maxBatchSize() { */ private Tags getCustomTags() { Tag commandTag = Tag.of(jsonApiMetricsConfig.command(), commandName); - Tag tenantTag = Tag.of(TENANT_TAG, requestContext.getTenantId().orElse(UNKNOWN_VALUE)); + Tag tenantTag = Tag.of(TENANT_TAG, requestContext.tenant().toString()); Tag embeddingProviderTag = Tag.of( jsonApiMetricsConfig.embeddingProvider(), embeddingProvider.getClass().getSimpleName()); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java index 652fdb7666..72a5603880 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java @@ -95,9 +95,9 @@ protected Multi startMulti(CommandContext commandContext) { new CommandQueryExecutor( commandContext.cqlSessionCache(), new CommandQueryExecutor.DBRequestContext( - commandContext.requestContext().getTenantId(), + commandContext.requestContext().tenant(), commandContext.requestContext().getCassandraToken(), - commandContext.requestContext().getUserAgent(), + commandContext.requestContext().userAgent(), commandContext.requestTracing().enabled()), CommandQueryExecutor.QueryTarget.TABLE); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java index b19f5b49d4..bb2a34b90a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java @@ -82,8 +82,8 @@ public EmbeddingTask build() { commandContext .embeddingProviderFactory() .create( - commandContext.requestContext().getTenantId(), - commandContext.requestContext().getCassandraToken(), + commandContext.requestContext().tenant(), + commandContext.requestContext().authToken(), vectorizeDefinition.provider(), vectorizeDefinition.modelName(), dimension, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java index faf15992f9..76e9534ad6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java @@ -8,6 +8,7 @@ import io.micrometer.core.instrument.*; import io.micrometer.core.instrument.Timer; import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.metrics.MetricsConstants; import io.stargate.sgv2.jsonapi.metrics.MicrometerConfiguration; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; @@ -176,8 +177,8 @@ public RerankingTagsBuilder() { this.tagsMap = new HashMap<>(); } - public RerankingTagsBuilder withTenant(String tenantId) { - putOrThrow(TENANT_TAG, tenantId); + public RerankingTagsBuilder withTenant(Tenant tenant) { + putOrThrow(TENANT_TAG, tenant.toString()); return this; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java index 2a9ece6820..dbeabde119 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java @@ -1,6 +1,8 @@ package io.stargate.sgv2.jsonapi.service.processor; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; + import java.util.List; /** @@ -10,7 +12,7 @@ */ public record CommandLog( String commandName, - String tenant, + Tenant tenant, String namespaceName, String collectionName, // leave as collectionName for logging analysis String schemaType, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java index b06b427f9c..cdc400f4fc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java @@ -55,7 +55,6 @@ public class MeteredCommandProcessor { // Pre-computed common tags for efficiency private final Tag errorTrue; private final Tag errorFalse; - private final Tag tenantUnknown; private final Tag defaultErrorCode; private final Tag defaultErrorClass; @@ -75,7 +74,6 @@ public MeteredCommandProcessor( // Pre-compute common tags for efficiency errorTrue = Tag.of(tenantConfig.errorTag(), "true"); errorFalse = Tag.of(tenantConfig.errorTag(), "false"); - tenantUnknown = Tag.of(tenantConfig.tenantTag(), UNKNOWN_VALUE); defaultErrorCode = Tag.of(jsonApiMetricsConfig.errorCode(), NA); defaultErrorClass = Tag.of(jsonApiMetricsConfig.errorClass(), NA); } @@ -98,7 +96,7 @@ public Uni String buildCommandLog( CommandLog commandLog = new CommandLog( command.getClass().getSimpleName(), - commandContext.requestContext().getTenantId().orElse(UNKNOWN_VALUE), + commandContext.requestContext().tenant(), commandContext.schemaObject().name().keyspace(), commandContext.schemaObject().name().table(), commandContext.schemaObject().type().name(), @@ -239,7 +237,7 @@ private boolean isCommandLevelLoggingEnabled( commandLevelLoggingConfig.enabledTenants().orElse(Collections.singleton(ALL_TENANTS)); if (!allowedTenants.contains(ALL_TENANTS) && !allowedTenants.contains( - commandContext.requestContext().getTenantId().orElse(UNKNOWN_VALUE))) { + commandContext.requestContext().tenant().toString())) { // Logging disabled for this tenant return false; } @@ -271,8 +269,7 @@ private Tags getCustomTags( // --- Basic Tags --- // Identify the command being executed and the tenant associated with the request Tag commandTag = Tag.of(jsonApiMetricsConfig.command(), command.getClass().getSimpleName()); - String tenant = commandContext.requestContext().getTenantId().orElse(UNKNOWN_VALUE); - Tag tenantTag = Tag.of(tenantConfig.tenantTag(), tenant); + Tag tenantTag = Tag.of(tenantConfig.tenantTag(), commandContext.requestContext().tenant().toString()); // --- Error Tags --- // Determine if the command resulted in an error and capture details diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ModelUsage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ModelUsage.java index 7877b00674..c65c0525a6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ModelUsage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ModelUsage.java @@ -1,6 +1,8 @@ package io.stargate.sgv2.jsonapi.service.provider; import io.stargate.embedding.gateway.EmbeddingGateway; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Objects; @@ -16,7 +18,7 @@ public final class ModelUsage implements Recordable { private final ModelProvider modelProvider; private final ModelType modelType; private final String modelName; - private final String tenantId; + private final Tenant tenant; private final ModelInputType inputType; private final int promptTokens; private final int totalTokens; @@ -29,7 +31,7 @@ public ModelUsage( ModelProvider modelProvider, ModelType modelType, String modelName, - String tenantId, + Tenant tenant, ModelInputType inputType, int promptTokens, int totalTokens, @@ -40,7 +42,7 @@ public ModelUsage( modelProvider, modelType, modelName, - tenantId, + tenant, inputType, promptTokens, totalTokens, @@ -54,7 +56,7 @@ private ModelUsage( ModelProvider modelProvider, ModelType modelType, String modelName, - String tenantId, + Tenant tenant, ModelInputType inputType, int promptTokens, int totalTokens, @@ -65,7 +67,7 @@ private ModelUsage( this.modelProvider = Objects.requireNonNull(modelProvider, "modelProvider must not be null"); this.modelType = Objects.requireNonNull(modelType, "modelType must not be null"); this.modelName = Objects.requireNonNull(modelName, "modelName must not be null"); - this.tenantId = Objects.requireNonNull(tenantId, "tenantId must not be null"); + this.tenant = Objects.requireNonNull(tenant, "tenant must not be null"); this.inputType = Objects.requireNonNull(inputType, "inputType must not be null"); if (promptTokens < 0) { throw new IllegalArgumentException("promptTokens must not be negative"); @@ -110,7 +112,7 @@ public static ModelUsage fromEmbeddingGateway(EmbeddingGateway.ModelUsage grpcMo "ModelUsage() - Unknown grpcModelUsage.getModelType(): '%s'" .formatted(grpcModelUsage.getModelType()))), grpcModelUsage.getModelName(), - grpcModelUsage.getTenantId(), + TenantFactory.instance().create( grpcModelUsage.getTenantId()), ModelInputType.fromEmbeddingGateway(grpcModelUsage.getInputType()) .orElseThrow( () -> @@ -129,7 +131,7 @@ public EmbeddingGateway.ModelUsage toEmbeddingGateway() { .setModelProvider(modelProvider.apiName()) .setModelType(modelType.toEmbeddingGateway()) .setModelName(modelName) - .setTenantId(tenantId) + .setTenantId(tenant.toString()) .setInputType(inputType.toEmbeddingGateway()) .setPromptTokens(promptTokens) .setTotalTokens(totalTokens) @@ -150,7 +152,7 @@ public ModelUsage merge(ModelUsage other) { if (!this.modelProvider.equals(other.modelProvider) || !this.modelType.equals(other.modelType) || !this.modelName.equals(other.modelName) - || !this.tenantId.equals(other.tenantId) + || !this.tenant.equals(other.tenant) || !this.inputType.equals(other.inputType)) { throw new IllegalArgumentException( "Cannot merge ModelUsage with different properties, this: %s, other: %s" @@ -161,7 +163,7 @@ public ModelUsage merge(ModelUsage other) { this.modelProvider, this.modelType, this.modelName, - this.tenantId, + this.tenant, this.inputType, this.promptTokens + other.promptTokens, this.totalTokens + other.totalTokens, @@ -183,8 +185,8 @@ public String modelName() { return modelName; } - public String tenantId() { - return tenantId; + public Tenant tenant() { + return tenant; } public ModelInputType inputType() { @@ -221,7 +223,7 @@ public DataRecorder recordTo(DataRecorder dataRecorder) { .append("modelProvider", modelProvider) .append("modelType", modelType) .append("modelName", modelName) - .append("tenantId", tenantId) + .append("tenant", tenant) .append("inputType", inputType) .append("promptTokens", promptTokens) .append("totalTokens", totalTokens) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ProviderBase.java b/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ProviderBase.java index 1e209b3aeb..7a53f4a29f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ProviderBase.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/provider/ProviderBase.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import io.smallrye.mutiny.Uni; import io.stargate.embedding.gateway.EmbeddingGateway; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.exception.SchemaException; import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.core.MediaType; @@ -299,7 +300,7 @@ protected void checkEOLModelUsage() { } protected ModelUsage createModelUsage( - String tenantId, + Tenant tenant, ModelInputType modelInputType, int promptTokens, int totalTokens, @@ -311,7 +312,7 @@ protected ModelUsage createModelUsage( modelProvider, modelType, modelName(), - tenantId, + tenant, modelInputType, promptTokens, totalTokens, @@ -321,7 +322,7 @@ protected ModelUsage createModelUsage( } protected ModelUsage createModelUsage( - String tenantId, + Tenant tenant, ModelInputType modelInputType, int promptTokens, int totalTokens, @@ -329,7 +330,7 @@ protected ModelUsage createModelUsage( long durationNanos) { return createModelUsage( - tenantId, + tenant, modelInputType, promptTokens, totalTokens, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/gateway/RerankingEGWClient.java b/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/gateway/RerankingEGWClient.java index c3837c9c10..b8d3290d4e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/gateway/RerankingEGWClient.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/gateway/RerankingEGWClient.java @@ -6,6 +6,7 @@ import io.stargate.embedding.gateway.EmbeddingGateway; import io.stargate.embedding.gateway.RerankingService; import io.stargate.sgv2.jsonapi.api.request.RerankingCredentials; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.service.provider.ModelProvider; @@ -17,16 +18,14 @@ /** Grpc client to make reranking Grpc requests to reranking API inside EmbeddingGatewayService */ public class RerankingEGWClient extends RerankingProvider { - private static final String DEFAULT_TENANT_ID = "default"; - /** Key of authTokens map, for passing Data API token to EGW in grpc request. */ private static final String DATA_API_TOKEN = "DATA_API_TOKEN"; /** Key in the authTokens map, for passing Reranking API key to EGW in grpc request. */ private static final String RERANKING_API_KEY = "RERANKING_API_KEY"; - private final Optional tenant; - private final Optional authToken; + private final Tenant tenant; + private final String authToken; private final RerankingService grpcGatewayService; Map authentication; private final String commandName; @@ -34,8 +33,8 @@ public class RerankingEGWClient extends RerankingProvider { public RerankingEGWClient( ModelProvider modelProvider, RerankingProvidersConfig.RerankingProviderConfig.ModelConfig modelConfig, - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, RerankingService grpcGatewayService, Map authentication, String commandName) { @@ -70,12 +69,11 @@ public Uni rerank( var contextBuilder = EmbeddingGateway.ProviderRerankingRequest.ProviderContext.newBuilder() .setProviderName(modelProvider().apiName()) - .setTenantId(tenant.orElse(DEFAULT_TENANT_ID)) - .putAuthTokens(DATA_API_TOKEN, authToken.orElse("")); - rerankingCredentials - .apiKey() - .ifPresent(v -> contextBuilder.putAuthTokens(RERANKING_API_KEY, v)); - + .setTenantId(tenant.toString()) + .putAuthTokens(DATA_API_TOKEN, authToken); + if (!rerankingCredentials.apiKey().isEmpty()){ + contextBuilder.putAuthTokens(RERANKING_API_KEY, rerankingCredentials.apiKey()); + } var gatewayRequest = EmbeddingGateway.ProviderRerankingRequest.newBuilder() .setRerankingRequest(gatewayReranking) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/operation/RerankingProviderFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/operation/RerankingProviderFactory.java index c0d1917e1e..d20e97307d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/operation/RerankingProviderFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/reranking/operation/RerankingProviderFactory.java @@ -2,6 +2,7 @@ import io.quarkus.grpc.GrpcClient; import io.stargate.embedding.gateway.RerankingService; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.provider.ModelProvider; @@ -34,8 +35,8 @@ RerankingProvider create( Map.ofEntries(Map.entry(ModelProvider.NVIDIA, NvidiaRerankingProvider::new)); public RerankingProvider create( - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, String serviceName, String modelName, Map authentication, @@ -60,8 +61,8 @@ public RerankingProvider create( } private synchronized RerankingProvider create( - Optional tenant, - Optional authToken, + Tenant tenant, + String authToken, ModelProvider modelProvider, String modelName, Map authentication, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java index c0c24ec3e3..12d95810e4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java @@ -210,7 +210,7 @@ default void addToMetrics( // that // it's only here because of the use of records and interfaces, move to a base class Tag commandTag = Tag.of(jsonApiMetricsConfig.command(), command.getClass().getSimpleName()); - Tag tenantTag = Tag.of(TENANT_TAG, requestContext.getTenantId().orElse(UNKNOWN_VALUE)); + Tag tenantTag = Tag.of(TENANT_TAG, requestContext.tenant().toString()); Tags tags = Tags.of(commandTag, tenantTag); getIndexUsageTags(dbLogicalExpression, baseIndexUsage); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindAndRerankOperationBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindAndRerankOperationBuilder.java index 15fe1e5d53..635d081cfe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindAndRerankOperationBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindAndRerankOperationBuilder.java @@ -195,8 +195,8 @@ private void checkSupported() { commandContext .rerankingProviderFactory() .create( - commandContext.requestContext().getTenantId(), - commandContext.requestContext().getCassandraToken(), + commandContext.requestContext().tenant(), + commandContext.requestContext().authToken(), providerConfig.provider(), providerConfig.modelName(), providerConfig.authentication(), diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ValidateCredentials.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ValidateCredentials.java index 18d5dba841..f846388f9e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ValidateCredentials.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ValidateCredentials.java @@ -31,9 +31,9 @@ public boolean validate(String provider, String value) { EmbeddingGateway.ValidateCredentialRequest.Builder validateCredentialRequest = EmbeddingGateway.ValidateCredentialRequest.newBuilder(); validateCredentialRequest.setCredential(value); - validateCredentialRequest.setTenantId(dataApiRequestInfo.getTenantId().orElse("default")); + validateCredentialRequest.setTenantId(dataApiRequestInfo.tenant().toString()); validateCredentialRequest.setProviderName(provider); - validateCredentialRequest.setToken(dataApiRequestInfo.getCassandraToken().orElse("")); + validateCredentialRequest.setToken(dataApiRequestInfo.authToken()); EmbeddingServiceGrpc.EmbeddingServiceBlockingStub embeddingService = EmbeddingServiceGrpc.newBlockingStub(channel); final EmbeddingGateway.ValidateCredentialResponse validateCredentialResponse = diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java index d3dc71572a..a33219e823 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java @@ -10,6 +10,7 @@ import io.micrometer.core.instrument.binder.cache.CaffeineCacheMetrics; import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlCredentials; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; import java.time.Duration; @@ -366,7 +367,7 @@ public long expireAfterRead( protected static class DynamicTTLSupplier { private final Duration cacheTTL; - private final String slaUserAgent; + private final UserAgent slaUserAgent; private final Duration slaUserTTL; /** @@ -378,7 +379,7 @@ protected static class DynamicTTLSupplier { * @param slaUserTTL The TTL to use for SLA users, must be non-null and positive if slaUserAgent * is set. */ - public DynamicTTLSupplier(Duration cacheTTL, String slaUserAgent, Duration slaUserTTL) { + public DynamicTTLSupplier(Duration cacheTTL, UserAgent slaUserAgent, Duration slaUserTTL) { this.cacheTTL = Objects.requireNonNull(cacheTTL, "cacheTTL must not be null"); if (cacheTTL.isNegative() || cacheTTL.isZero()) { @@ -386,7 +387,7 @@ public DynamicTTLSupplier(Duration cacheTTL, String slaUserAgent, Duration slaUs } this.slaUserAgent = slaUserAgent; - if (!Strings.isNullOrEmpty(slaUserAgent)) { + if (slaUserAgent != null) { this.slaUserTTL = Objects.requireNonNull( slaUserTTL, "slaUserTTL must not be null is slaUserAgent is set"); @@ -398,7 +399,7 @@ public DynamicTTLSupplier(Duration cacheTTL, String slaUserAgent, Duration slaUs } } - public Duration ttlForUsageAgent(String userAgent) { + public Duration ttlForUsageAgent(UserAgent userAgent) { // slaUserAgent can be null return slaUserAgent == null || !slaUserAgent.equals(userAgent) ? cacheTTL : slaUserTTL; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/StringUtil.java b/src/main/java/io/stargate/sgv2/jsonapi/util/StringUtil.java new file mode 100644 index 0000000000..9e34040f8d --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/StringUtil.java @@ -0,0 +1,16 @@ +package io.stargate.sgv2.jsonapi.util; + +import java.util.Optional; + +public class StringUtil { + + private StringUtil() {} + + public static String normalizeOptionalString(String string) { + return string == null || string.isBlank() ? "" : string; + } + + public static String normalizeOptionalString(Optional string) { + return normalizeOptionalString(string.orElse("")); + } +} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/request/UserAgentTests.java b/src/test/java/io/stargate/sgv2/jsonapi/api/request/UserAgentTests.java new file mode 100644 index 0000000000..76fbe8c7f8 --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/request/UserAgentTests.java @@ -0,0 +1,48 @@ +package io.stargate.sgv2.jsonapi.api.request; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.stream.Stream; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class UserAgentTests { + + @Test + public void shouldCompareCaseInsensitive() { + var ua1 = new UserAgent("LangChain/0.3.49"); + var ua2 = new UserAgent("langchain/0.3.49"); + var ua3 = new UserAgent("LANGCHAIN/0.3.49"); + + // equals + assertThat(ua1).isEqualTo(ua2); + assertThat(ua2).isEqualTo(ua3); + assertThat(ua1).isEqualTo(ua3); + + // hashCode + assertThat(ua1.hashCode()).isEqualTo(ua2.hashCode()); + assertThat(ua2.hashCode()).isEqualTo(ua3.hashCode()); + } + + @ParameterizedTest + @MethodSource("userAgentExamples") + public void shouldExtractCorrectProduct(String rawAgent, String expectedProduct) { + var userAgent = new UserAgent(rawAgent); + assertThat(userAgent.product()).isEqualTo(expectedProduct); + } + + static Stream userAgentExamples() { + return Stream.of( + Arguments.of("langchain/0.3.49 langchain_vectorstore/0.6.0 astrapy/2.0.1", "langchain"), + Arguments.of("astrapy/2.0.1", "astrapy"), + Arguments.of("langflow/1.4.2 langchain/0.3.59 langchain_vectorstore/0.6.0 astrapy/2.0.1", "langflow"), + Arguments.of("NoVersionString", "NoVersionString"), + Arguments.of("", ""), + Arguments.of(null, ""), + Arguments.of("Datastax-SLA-Checker", "Datastax-SLA-Checker") + ); + } +} \ No newline at end of file diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactoryTests.java b/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactoryTests.java new file mode 100644 index 0000000000..f8d98fddc6 --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantFactoryTests.java @@ -0,0 +1,54 @@ +package io.stargate.sgv2.jsonapi.api.request.tenant; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import io.stargate.sgv2.jsonapi.config.DatabaseType; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; + +public class TenantFactoryTests { + + @AfterEach + public void resetSingleton() { + TenantFactory.reset(); + } + + @Test + public void shouldInitializeOnce() { + TenantFactory.initialize(DatabaseType.ASTRA); + TenantFactory instance = TenantFactory.instance(); + + assertThat(instance).isNotNull(); + } + + @Test + public void shouldFailIfInitializedTwice() { + TenantFactory.initialize(DatabaseType.ASTRA); + + assertThatThrownBy(() -> TenantFactory.initialize(DatabaseType.CASSANDRA)) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("already initialized"); + } + + @Test + public void shouldFailIfAccessedBeforeInit() { + assertThatThrownBy(TenantFactory::instance) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("not initialized"); + } + + @Test + public void shouldCreateTenantWithCorrectDatabaseType() { + TenantFactory.initialize(DatabaseType.ASTRA); + TenantFactory factory = TenantFactory.instance(); + + Tenant tenant = factory.create("abc"); + + assertThat(tenant).isNotNull(); + assertThat(tenant.databaseType()).isEqualTo(DatabaseType.ASTRA); + assertThat(tenant.toString()).isEqualTo("ABC"); + } +} \ No newline at end of file diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantTests.java b/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantTests.java new file mode 100644 index 0000000000..1b617932e7 --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/request/tenant/TenantTests.java @@ -0,0 +1,135 @@ +package io.stargate.sgv2.jsonapi.api.request.tenant; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import io.stargate.sgv2.jsonapi.config.DatabaseType; +import io.stargate.sgv2.jsonapi.util.recordable.Jsonable; +import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Tests for the {@link Tenant} class + */ +public class TenantTests { + + private static final String SINGLE_TENANT_ID = "SINGLE-TENANT"; + @Test + public void astraDbRequiresTenantID() { + + assertThrows( + IllegalArgumentException.class, + () -> Tenant.create(DatabaseType.ASTRA, null), + "ASTRA DB throws on null tenant ID" + ); + + assertThrows( + IllegalArgumentException.class, + () -> Tenant.create(DatabaseType.ASTRA, ""), + "ASTRA DB throws on empty tenant ID" + ); + + assertThrows( + IllegalArgumentException.class, + () -> Tenant.create(DatabaseType.ASTRA, " "), + "ASTRA DB throws on blank tenant ID" + ); + } + + @Test + public void astraDbCreation() { + + var lowercase = Tenant.create(DatabaseType.ASTRA, "aa11zz"); + assertThat(lowercase.databaseType()) + .isEqualTo(DatabaseType.ASTRA); + assertThat(lowercase.toString()) + .isEqualTo("AA11ZZ"); + } + + @Test + public void cassandraDbRejectsTenantId() { + + assertThrows( + IllegalArgumentException.class, + () -> Tenant.create(DatabaseType.CASSANDRA, "aa"), + "Cassandra DB throws on non blank tenant ID" + ); + } + + @Test + public void cassandraDbCreation() { + + var nullTenant = Tenant.create(DatabaseType.CASSANDRA, null); + assertThat(nullTenant.databaseType()) + .isEqualTo(DatabaseType.CASSANDRA); + assertThat(nullTenant.toString()) + .isEqualTo(SINGLE_TENANT_ID); + + var emptyTenant = Tenant.create(DatabaseType.CASSANDRA, ""); + assertThat(nullTenant.toString()) + .isEqualTo(SINGLE_TENANT_ID); + + var blankTenant = Tenant.create(DatabaseType.CASSANDRA, " "); + assertThat(blankTenant.toString()) + .isEqualTo(SINGLE_TENANT_ID); + } + + + @Test + public void equalsAndHashCode() { + var tenantA = Tenant.create(DatabaseType.ASTRA, "Tenant-123"); + var tenantB = Tenant.create(DatabaseType.ASTRA, "tenant-123"); + var tenantC = Tenant.create(DatabaseType.ASTRA, "TENANT-123"); + + // Reflexivity + assertThat(tenantA).isEqualTo(tenantA); + + // Symmetry + assertThat(tenantA).isEqualTo(tenantB); + assertThat(tenantB).isEqualTo(tenantA); + + // Transitivity + assertThat(tenantA).isEqualTo(tenantB); + assertThat(tenantB).isEqualTo(tenantC); + assertThat(tenantA).isEqualTo(tenantC); + + // Hash code consistency + assertThat(tenantA.hashCode()).isEqualTo(tenantB.hashCode()); + assertThat(tenantB.hashCode()).isEqualTo(tenantC.hashCode()); + } + + @Test + public void notEqualDifferentDbType() { + var tenant1 = Tenant.create(DatabaseType.ASTRA, SINGLE_TENANT_ID); + var tenant2 = Tenant.create(DatabaseType.CASSANDRA, null); + + assertThat(tenant1) + .isNotEqualTo(tenant2); + assertThat(tenant1.hashCode()) + .isNotEqualTo(tenant2.hashCode()); + } + + @Test + public void recordTo(){ + + var tenant = Tenant.create(DatabaseType.ASTRA, "Tenant-123"); + + assertThat(PrettyPrintable.pprint(tenant)) + .as("Recording to pretty print") + .contains("tenantId", "TENANT-123") + .contains("databaseType", DatabaseType.ASTRA.name()); + + var tenantJson = Jsonable.toJson(tenant); + var expected = JsonNodeFactory.instance.objectNode(); + // Top level node with the class name + var contents = expected.withObjectProperty("Tenant"); + contents.put("tenantId", "TENANT-123"); + contents.put("databaseType", DatabaseType.ASTRA.name()); + + assertThat(tenantJson) + .as("Recording to JSON") + .isEqualTo(expected); + } +} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingGatewayClientTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingGatewayClientTest.java index 5d31cc84be..3a630ba61b 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingGatewayClientTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/EmbeddingGatewayClientTest.java @@ -175,7 +175,7 @@ void handleValidResponse() { assertThat(response.modelUsage().modelProvider()).isEqualTo(ModelProvider.OPENAI); assertThat(response.modelUsage().modelType()).isEqualTo(ModelType.EMBEDDING); assertThat(response.modelUsage().modelName()).isEqualTo("test-model"); - assertThat(response.modelUsage().tenantId()).isEqualTo("test-tenant"); + assertThat(response.modelUsage().tenant()).isEqualTo("test-tenant"); assertThat(response.modelUsage().inputType()).isEqualTo(ModelInputType.INDEX); assertThat(response.modelUsage().promptTokens()).isEqualTo(5); From fb95600acc5b1bb2e6d2f4b7b5157a6488f5d799 Mon Sep 17 00:00:00 2001 From: Aaron Morton Date: Fri, 5 Dec 2025 21:14:42 +1300 Subject: [PATCH 2/8] initial with changes based on tenant changes --- .../api/model/command/CommandContext.java | 77 ++- .../api/model/command/CommandTarget.java | 2 +- .../command/builders/FilterClauseBuilder.java | 4 +- .../command/builders/SortClauseBuilder.java | 4 +- .../builders/TableFilterClauseBuilder.java | 2 +- .../builders/TableSortClauseBuilder.java | 2 +- .../jsonapi/api/v1/CollectionResource.java | 51 +- .../sgv2/jsonapi/api/v1/GeneralResource.java | 51 +- .../sgv2/jsonapi/api/v1/KeyspaceResource.java | 69 ++- .../jsonapi/exception/ErrorFormatters.java | 31 +- .../executor/CommandQueryExecutor.java | 3 +- .../executor/DatabaseSchemaObject.java | 20 - .../DefaultDriverExceptionHandler.java | 1 + .../executor/KeyspaceSchemaObject.java | 61 --- .../cqldriver/executor/SchemaCache.java | 2 + .../cqldriver/executor/SchemaObject.java | 76 --- .../cqldriver/executor/SchemaObjectName.java | 46 -- .../executor/TableBasedSchemaCache.java | 6 +- .../executor/TableBasedSchemaObject.java | 42 -- .../service/embedding/DataVectorizer.java | 14 +- .../embedding/DataVectorizerService.java | 4 +- .../service/operation/DeleteDBTask.java | 3 +- .../service/operation/DeleteDBTaskPage.java | 3 +- .../service/operation/GenericOperation.java | 4 +- .../service/operation/InsertAttempt.java | 3 +- .../service/operation/InsertDBTask.java | 3 +- .../service/operation/InsertDBTaskPage.java | 3 +- .../operation/InsertOperationPage.java | 3 +- .../service/operation/ListIndexesDBTask.java | 2 +- .../service/operation/ListTablesDBTask.java | 3 +- .../service/operation/ListTypesDBTask.java | 3 +- .../service/operation/MetadataDBTask.java | 2 +- .../service/operation/MetadataDBTaskPage.java | 2 +- .../jsonapi/service/operation/Operation.java | 2 +- .../service/operation/OperationAttempt.java | 2 +- .../OperationAttemptAccumulator.java | 2 +- .../operation/OperationAttemptContainer.java | 2 +- .../operation/OperationAttemptPage.java | 2 +- .../OperationAttemptPageBuilder.java | 2 +- .../jsonapi/service/operation/ReadDBTask.java | 2 + .../service/operation/ReadDBTaskPage.java | 3 +- .../service/operation/SchemaDBTask.java | 2 +- .../service/operation/SchemaDBTaskPage.java | 2 +- .../service/operation/TruncateDBTask.java | 3 +- .../service/operation/TruncateDBTaskPage.java | 3 +- .../service/operation/UpdateDBTask.java | 2 +- .../operation/UpdateDBTaskBuilder.java | 2 +- .../service/operation/UpdateDBTaskPage.java | 2 +- .../CreateCollectionOperation.java | 3 +- .../DeleteCollectionCollectionOperation.java | 3 +- ...matedDocumentCountCollectionOperation.java | 2 +- .../FindCollectionsCollectionOperation.java | 3 +- .../embeddings/EmbeddingOperationFactory.java | 2 +- .../operation/embeddings/EmbeddingTask.java | 3 +- .../embeddings/EmbeddingTaskBuilder.java | 3 +- .../embeddings/EmbeddingTaskGroupBuilder.java | 3 +- .../filters/table/InTableFilter.java | 2 +- .../filters/table/MapSetListTableFilter.java | 2 +- .../filters/table/NativeTypeTableFilter.java | 2 +- .../service/operation/query/TableFilter.java | 2 +- .../operation/query/WhereBehaviour.java | 2 +- .../FindRerankingProvidersOperation.java | 2 +- .../IntermediateCollectionReadTask.java | 4 +- .../operation/reranking/RerankingMetrics.java | 24 +- .../operation/reranking/RerankingTask.java | 3 +- .../reranking/RerankingTaskBuilder.java | 3 +- .../reranking/RerankingTaskPage.java | 3 +- .../operation/tables/AlterTableDBTask.java | 2 +- .../tables/AlterTableDBTaskBuilder.java | 2 +- .../tables/AlterTableExceptionHandler.java | 2 +- .../operation/tables/AlterTypeDBTask.java | 5 +- .../tables/AlterTypeDBTaskBuilder.java | 3 +- .../tables/AlterTypeExceptionHandler.java | 3 +- .../operation/tables/CreateIndexDBTask.java | 2 +- .../tables/CreateIndexDBTaskBuilder.java | 2 +- .../tables/CreateIndexExceptionHandler.java | 2 +- .../operation/tables/CreateTableDBTask.java | 3 +- .../tables/CreateTableDBTaskBuilder.java | 3 +- .../tables/CreateTableExceptionHandler.java | 3 +- .../operation/tables/CreateTypeDBTask.java | 3 +- .../tables/CreateTypeDBTaskBuilder.java | 3 +- .../tables/CreateTypeExceptionHandler.java | 3 +- .../operation/tables/DropIndexDBTask.java | 3 +- .../tables/DropIndexDBTaskBuilder.java | 3 +- .../tables/DropIndexExceptionHandler.java | 3 +- .../operation/tables/DropTableDBTask.java | 3 +- .../tables/DropTableDBTaskBuilder.java | 3 +- .../tables/DropTableExceptionHandler.java | 3 +- .../operation/tables/DropTypeDBTask.java | 3 +- .../tables/DropTypeDBTaskBuilder.java | 3 +- .../tables/DropTypeExceptionHandler.java | 3 +- .../KeyspaceDriverExceptionHandler.java | 3 +- .../tables/TableDeleteDBTaskBuilder.java | 2 +- .../tables/TableDriverExceptionHandler.java | 3 +- .../operation/tables/TableInsertDBTask.java | 2 +- .../tables/TableInsertDBTaskBuilder.java | 2 +- .../tables/TableInsertValuesCQLClause.java | 2 +- .../tables/TableMutationOperation.java | 2 +- .../operation/tables/TableOperation.java | 2 +- .../operation/tables/TableProjection.java | 2 +- .../tables/TableReadDBTaskBuilder.java | 2 +- .../tables/TableSimilarityFunction.java | 2 +- .../operation/tables/TableWhereCQLClause.java | 2 +- .../tables/WhereCQLClauseAnalyzer.java | 3 +- .../tables/WriteableTableRowBuilder.java | 2 +- .../service/operation/tasks/BaseTask.java | 4 +- .../operation/tasks/CompositeTask.java | 2 +- .../tasks/CompositeTaskInnerPage.java | 2 +- .../tasks/CompositeTaskOperationBuilder.java | 2 +- .../tasks/CompositeTaskOuterPage.java | 2 +- .../service/operation/tasks/DBTask.java | 2 +- .../service/operation/tasks/DBTaskPage.java | 2 +- .../jsonapi/service/operation/tasks/Task.java | 2 +- .../operation/tasks/TaskAccumulator.java | 2 +- .../operation/tasks/TaskAndDeferrables.java | 2 +- .../service/operation/tasks/TaskBuilder.java | 2 +- .../service/operation/tasks/TaskGroup.java | 2 +- .../tasks/TaskGroupAndDeferrables.java | 2 +- .../operation/tasks/TaskOperation.java | 2 +- .../service/operation/tasks/TaskPage.java | 2 +- .../service/processor/CommandProcessor.java | 5 +- .../processor/MeteredCommandProcessor.java | 18 +- .../resolver/AlterTableCommandResolver.java | 2 +- .../resolver/AlterTypeCommandResolver.java | 3 +- .../service/resolver/ClauseResolver.java | 2 +- .../service/resolver/CommandResolver.java | 10 +- .../CreateCollectionCommandResolver.java | 3 +- .../resolver/CreateIndexCommandResolver.java | 2 +- .../CreateKeyspaceCommandResolver.java | 2 +- .../CreateNamespaceCommandResolver.java | 2 +- .../resolver/CreateTableCommandResolver.java | 1 + .../CreateTextIndexCommandResolver.java | 2 +- .../resolver/CreateTypeCommandResolver.java | 2 +- .../CreateVectorIndexCommandResolver.java | 2 +- .../DeleteCollectionCommandResolver.java | 3 +- .../resolver/DeleteManyCommandResolver.java | 2 +- .../resolver/DeleteOneCommandResolver.java | 2 +- .../resolver/DropIndexCommandResolver.java | 3 +- .../resolver/DropKeyspaceCommandResolver.java | 2 +- .../DropNamespaceCommandResolver.java | 2 +- .../resolver/DropTableCommandResolver.java | 3 +- .../resolver/DropTypeCommandResolver.java | 3 +- .../FindCollectionsCommandResolver.java | 3 +- .../service/resolver/FindCommandResolver.java | 2 +- ...FindEmbeddingProvidersCommandResolver.java | 2 +- .../FindKeyspacesCommandResolver.java | 2 +- .../FindNamespacesCommandResolver.java | 3 +- .../resolver/FindOneCommandResolver.java | 2 +- ...FindRerankingProvidersCommandResolver.java | 2 +- .../resolver/InsertManyCommandResolver.java | 2 +- .../resolver/InsertOneCommandResolver.java | 2 +- .../resolver/ListIndexesCommandResolver.java | 2 +- .../resolver/ListTablesCommandResolver.java | 3 +- .../resolver/ListTypesCommandResolver.java | 3 +- .../resolver/TableReadDBOperationBuilder.java | 2 +- .../resolver/UpdateOneCommandResolver.java | 2 +- .../resolver/matcher/FilterResolver.java | 2 +- .../resolver/matcher/TableFilterResolver.java | 2 +- .../sort/TableCqlSortClauseResolver.java | 2 +- .../sort/TableMemorySortClauseResolver.java | 2 +- .../sort/TableSortClauseResolver.java | 2 +- .../resolver/update/TableUpdateAnalyzer.java | 3 +- .../update/TableUpdateOperatorResolver.java | 2 +- .../update/TableUpdatePullAllResolver.java | 2 +- .../update/TableUpdatePushResolver.java | 2 +- .../resolver/update/TableUpdateResolver.java | 2 +- .../update/TableUpdateSetResolver.java | 2 +- .../update/TableUpdateUnsetResolver.java | 2 +- .../resolver/update/UpdateResolver.java | 2 +- .../service/schema/DatabaseSchemaObject.java | 35 ++ .../service/schema/KeyspaceSchemaObject.java | 52 ++ .../jsonapi/service/schema/SchemaObject.java | 59 +++ .../service/schema/SchemaObjectCache.java | 483 ++++++++++++++++++ .../schema/SchemaObjectCacheSupplier.java | 41 ++ .../service/schema/SchemaObjectFactory.java | 150 ++++++ .../schema/SchemaObjectIdentifier.java | 237 +++++++++ .../service/schema/SchemaObjectType.java | 37 ++ .../UnscopedSchemaObjectIdentifier.java | 37 ++ .../collections/CollectionSchemaObject.java | 132 +++-- .../schema/naming/CollectionNamingRule.java | 4 +- .../schema/naming/IndexNamingRule.java | 4 +- .../schema/naming/KeyspaceNamingRule.java | 4 +- .../schema/naming/SchemaObjectNamingRule.java | 10 +- .../schema/naming/TableNamingRule.java | 4 +- .../service/schema/naming/UdtNamingRule.java | 5 +- .../schema/tables/ApiRegularIndex.java | 2 +- .../service/schema/tables/ApiTextIndex.java | 2 +- .../service/schema/tables/ApiVectorIndex.java | 2 +- .../schema/tables/TableBasedSchemaObject.java | 50 ++ .../tables}/TableSchemaObject.java | 21 +- .../factories/IndexFactoryFromIndexDesc.java | 2 +- .../service/shredding/CqlNamedValue.java | 2 +- .../service/shredding/JsonNamedValue.java | 2 +- .../jsonapi/service/shredding/NamedValue.java | 2 +- .../tables/CqlNamedValueContainerFactory.java | 2 +- .../JsonNamedValueContainerFactory.java | 2 +- .../shredding/tables/WriteableTableRow.java | 2 +- .../sgv2/jsonapi/util/CqlIdentifierUtil.java | 2 +- .../sgv2/jsonapi/util/DynamicTTLCache.java | 5 + .../jsonapi/util/recordable/Recordable.java | 2 +- .../TableFilterClauseBuilderTest.java | 2 +- .../sgv2/jsonapi/fixtures/CqlFixture.java | 2 +- .../testdata/SchemaObjectTestData.java | 2 +- .../testdata/TableUpdateAnalyzerTestData.java | 2 +- .../testdata/TableWhereCQLClauseTestData.java | 2 +- .../testdata/UpdateClauseTestData.java | 2 +- .../testdata/WhereAnalyzerTestData.java | 2 +- .../testdata/WhereCQLClauseTestData.java | 2 +- .../collections/OperationTestBase.java | 3 +- .../operation/tasks/BaseTaskAssertions.java | 6 +- .../operation/tasks/BaseTaskTestData.java | 2 +- .../operation/tasks/BaseTaskTestTask.java | 2 +- .../DriverExceptionHandlerAssertions.java | 2 +- .../operation/tasks/ReadDBTaskAssertions.java | 2 +- .../operation/tasks/ReadDBTaskTestData.java | 2 +- .../operation/tasks/ReadDBTaskTestTask.java | 2 +- .../operation/tasks/TaskGroupTest.java | 2 +- .../processor/CommandContextTestData.java | 2 +- .../processor/SchemaObjectTestData.java | 4 +- .../CreateCollectionCommandResolverTest.java | 3 +- .../CreateKeyspaceCommandResolverTest.java | 2 +- .../DeleteCollectionCommandResolverTest.java | 3 +- .../DropKeyspaceCommandResolverTest.java | 2 +- .../FindCollectionCommandResolverTest.java | 3 +- .../resolver/matcher/FilterInversionTest.java | 2 +- .../update/TableUpdateOperatorTestData.java | 2 +- .../SchemaObjectCacheChangeListenerTests.java | 449 ++++++++++++++++ .../schema/SchemaObjectIdentifierTests.java | 394 ++++++++++++++ 228 files changed, 2603 insertions(+), 668 deletions(-) delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DatabaseSchemaObject.java delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/KeyspaceSchemaObject.java delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObject.java delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObjectName.java delete mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaObject.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheSupplier.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java create mode 100644 src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java rename src/main/java/io/stargate/sgv2/jsonapi/service/{cqldriver/executor => schema/tables}/TableSchemaObject.java (63%) create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java index 77db77b143..a41710d091 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java @@ -9,15 +9,23 @@ import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; import io.stargate.sgv2.jsonapi.config.feature.ApiFeatures; import io.stargate.sgv2.jsonapi.config.feature.FeaturesConfig; +import io.stargate.sgv2.jsonapi.logging.LoggingMDCContext; import io.stargate.sgv2.jsonapi.metrics.CommandFeatures; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; + +import java.util.ArrayList; +import java.util.List; import java.util.Objects; /** @@ -28,14 +36,17 @@ * BuilderSupplier}, configure this with application wide config, then when ready to build the * context for a specific request call {@link BuilderSupplier#getBuilder(SchemaObject)} to get a * {@link BuilderSupplier.Builder} to configure the context for the request. - * *

+ *NOTE: When {@link BuilderSupplier.Builder#build()} is called it will call + * {@link #addToMDC()} so that the context is added to the logging MDC for the duration of the request. The + * context must be closed via {@link #close()} to remove it from the MDC, this should be done at the last possible + * time in the resource handler so all log messages have the context. * * @param The schema object type that this context is for. There are times we need to lock * this down to the specific type, if so use the "as" methods such as {@link * CommandContext#asCollectionContext()} */ -public class CommandContext { +public class CommandContext implements LoggingMDCContext { // Common for all instances private final JsonProcessingMetricsReporter jsonProcessingMetricsReporter; @@ -47,11 +58,15 @@ public class CommandContext { // Request specific private final SchemaT schemaObject; + private final RequestTracing requestTracing; + private final RequestContext requestContext; private final EmbeddingProvider embeddingProvider; // to be removed later, this is a single provider private final String commandName; // TODO: remove the command name, but it is used in 14 places - private final RequestContext requestContext; - private RequestTracing requestTracing; + + // both per request list of objects that want to update the logging MDC context, + // add to this list in the ctor. See {@link #addToMDC()} and {@link #removeFromMDC()} + private final List loggingMDCContexts = new ArrayList<>(); // see accessors private FindAndRerankCommand.HybridLimits hybridLimits; @@ -77,19 +92,23 @@ private CommandContext( RerankingProviderFactory rerankingProviderFactory, MeterRegistry meterRegistry) { - this.schemaObject = schemaObject; - this.embeddingProvider = embeddingProvider; - this.commandName = commandName; - this.requestContext = requestContext; - - this.jsonProcessingMetricsReporter = jsonProcessingMetricsReporter; + // Common for all instances this.cqlSessionCache = cqlSessionCache; this.commandConfig = commandConfig; this.embeddingProviderFactory = embeddingProviderFactory; + this.jsonProcessingMetricsReporter = jsonProcessingMetricsReporter; + this.meterRegistry = meterRegistry; this.rerankingProviderFactory = rerankingProviderFactory; + // Request specific + this.embeddingProvider = embeddingProvider; // to be removed later, this is a single provider + this.requestContext = requestContext; + this.schemaObject = schemaObject; + this.commandName = commandName; // TODO: remove the command name, but it is used in 14 places this.apiFeatures = apiFeatures; - this.meterRegistry = meterRegistry; + + this.loggingMDCContexts.add(this.requestContext); + this.loggingMDCContexts.add(this.schemaObject.identifier()); var anyTracing = apiFeatures().isFeatureEnabled(ApiFeature.REQUEST_TRACING) @@ -191,34 +210,34 @@ public MeterRegistry meterRegistry() { } public boolean isCollectionContext() { - return schemaObject().type() == CollectionSchemaObject.TYPE; + return schemaObject().type() == SchemaObjectType.COLLECTION; } @SuppressWarnings("unchecked") public CommandContext asCollectionContext() { - checkSchemaObjectType(CollectionSchemaObject.TYPE); + checkSchemaObjectType(SchemaObjectType.COLLECTION); return (CommandContext) this; } @SuppressWarnings("unchecked") public CommandContext asTableContext() { - checkSchemaObjectType(TableSchemaObject.TYPE); + checkSchemaObjectType(SchemaObjectType.TABLE); return (CommandContext) this; } @SuppressWarnings("unchecked") public CommandContext asKeyspaceContext() { - checkSchemaObjectType(KeyspaceSchemaObject.TYPE); + checkSchemaObjectType(SchemaObjectType.KEYSPACE); return (CommandContext) this; } @SuppressWarnings("unchecked") public CommandContext asDatabaseContext() { - checkSchemaObjectType(DatabaseSchemaObject.TYPE); + checkSchemaObjectType(SchemaObjectType.DATABASE); return (CommandContext) this; } - private void checkSchemaObjectType(SchemaObject.SchemaObjectType expectedType) { + private void checkSchemaObjectType(SchemaObjectType expectedType) { Preconditions.checkArgument( schemaObject().type() == expectedType, "SchemaObject type actual was %s expected was %s ", @@ -226,6 +245,24 @@ private void checkSchemaObjectType(SchemaObject.SchemaObjectType expectedType) { expectedType); } + @Override + public void addToMDC() { + loggingMDCContexts.forEach(LoggingMDCContext::addToMDC); + } + + @Override + public void removeFromMDC() { + loggingMDCContexts.forEach(LoggingMDCContext::removeFromMDC); + } + + /** + * NOTE: Not using AutoCloseable because it created a lot of linting warnings, we only want to + * close this in the request resource handler. + */ + public void close() throws Exception { + removeFromMDC(); + } + /** * Configure the BuilderSupplier with resources and config that will be used for all the {@link * CommandContext} that will be created. Then called {@link @@ -341,7 +378,7 @@ public CommandContext build() { Objects.requireNonNull(commandName, "commandName must not be null"); Objects.requireNonNull(requestContext, "requestContext must not be null"); - return new CommandContext<>( + var context = new CommandContext<>( schemaObject, embeddingProvider, commandName, @@ -353,6 +390,8 @@ public CommandContext build() { embeddingProviderFactory, rerankingProviderFactory, meterRegistry); + context.addToMDC(); + return context; } } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java index b4f7ab96bf..110e75c3fa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java @@ -5,7 +5,7 @@ * *

Example: creteTable runs against the Keyspace , so target is the Keyspace aaron 13 - nove - * 2024 - not using the {@link - * io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject.SchemaObjectType} because this + * io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType} because this * also needs the SYSTEM value, and the schema object design prob needs improvement */ public enum CommandTarget { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java index 1b84589c68..8fd0f8c3b2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java @@ -8,8 +8,8 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentId; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonExtensionType; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java index a89bc8f74a..c55fc16c02 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java @@ -6,8 +6,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.SortDefinition; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortClause; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java index 7f0dab19e3..e54bc8b863 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.*; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.datatype.MapComponentDesc; import io.stargate.sgv2.jsonapi.exception.FilterException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java index a4b88b2fdc..45721f07e3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java @@ -13,7 +13,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortClause; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortExpression; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java index 4240db973b..da2c201d5a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java @@ -1,6 +1,7 @@ package io.stargate.sgv2.jsonapi.api.v1; import static io.stargate.sgv2.jsonapi.config.constants.DocumentConstants.Fields.VECTOR_EMBEDDING_TEXT_FIELD; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import io.micrometer.core.instrument.MeterRegistry; import io.smallrye.mutiny.Uni; @@ -35,12 +36,14 @@ import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.processor.MeteredCommandProcessor; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; +import io.stargate.sgv2.jsonapi.service.schema.UnscopedSchemaObjectIdentifier; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; @@ -63,6 +66,8 @@ import org.eclipse.microprofile.openapi.annotations.security.SecurityRequirement; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.jboss.resteasy.reactive.RestResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Path(CollectionResource.BASE_PATH) @Produces(MediaType.APPLICATION_JSON) @@ -70,6 +75,7 @@ @SecurityRequirement(name = OpenApiConstants.SecuritySchemes.TOKEN) @Tag(ref = "Documents") public class CollectionResource { + private static final Logger LOGGER = LoggerFactory.getLogger(CollectionResource.class); public static final String BASE_PATH = GeneralResource.BASE_PATH + "/{keyspace}/{collection}"; @@ -80,18 +86,22 @@ public class CollectionResource { @Inject private RequestContext requestContext; @Inject private SchemaCache schemaCache; + private final SchemaObjectCacheSupplier schemaObjectCacheSupplier; private final CommandContext.BuilderSupplier contextBuilderSupplier; private final EmbeddingProviderFactory embeddingProviderFactory; private final MeteredCommandProcessor meteredCommandProcessor; @Inject public CollectionResource( + SchemaObjectCacheSupplier schemaObjectCacheSupplier, MeteredCommandProcessor meteredCommandProcessor, MeterRegistry meterRegistry, JsonProcessingMetricsReporter jsonProcessingMetricsReporter, CqlSessionCacheSupplier sessionCacheSupplier, EmbeddingProviderFactory embeddingProviderFactory, RerankingProviderFactory rerankingProviderFactory) { + + this.schemaObjectCacheSupplier = schemaObjectCacheSupplier; this.embeddingProviderFactory = embeddingProviderFactory; this.meteredCommandProcessor = meteredCommandProcessor; @@ -201,12 +211,15 @@ public Uni> postCommand( @NotNull @Valid CollectionCommand command, @PathParam("keyspace") @NotEmpty String keyspace, @PathParam("collection") @NotEmpty String collection) { - return schemaCache - .getSchemaObject( - requestContext, - keyspace, - collection, - CommandType.DDL.equals(command.commandName().getCommandType())) + + var name = + new UnscopedSchemaObjectIdentifier.DefaultKeyspaceScopedName( + cqlIdentifierFromUserInput(keyspace), cqlIdentifierFromUserInput(collection)); + var forceRefresh = CommandType.DDL.equals(command.commandName().getCommandType()); + + return schemaObjectCacheSupplier + .get() + .getTableBased(requestContext, name, requestContext.userAgent(), forceRefresh) .onItemOrFailure() .transformToUni( (schemaObject, throwable) -> { @@ -223,7 +236,7 @@ public Uni> postCommand( return Uni.createFrom().item(new ThrowableCommandResultSupplier(error)); } else { // TODO No need for the else clause here, simplify - if (schemaObject.type() == SchemaObject.SchemaObjectType.TABLE) { + if (schemaObject.type() == SchemaObjectType.TABLE) { var apiFeatures = ApiFeatures.fromConfigAndRequest( apiFeatureConfig, requestContext.getHttpHeaders()); @@ -237,13 +250,13 @@ public Uni> postCommand( // for the $vector column in a collection VectorColumnDefinition vectorColDef = null; - if (schemaObject.type() == SchemaObject.SchemaObjectType.COLLECTION) { + if (schemaObject.type() == SchemaObjectType.COLLECTION) { vectorColDef = schemaObject .vectorConfig() .getColumnDefinition(VECTOR_EMBEDDING_TEXT_FIELD) .orElse(null); - } else if (schemaObject.type() == SchemaObject.SchemaObjectType.TABLE) { + } else if (schemaObject.type() == SchemaObjectType.TABLE) { vectorColDef = schemaObject .vectorConfig() @@ -256,8 +269,8 @@ public Uni> postCommand( if (vectorColDef != null && vectorColDef.vectorizeDefinition() != null) { embeddingProvider = embeddingProviderFactory.create( - requestContext.getTenantId(), - requestContext.getCassandraToken(), + requestContext.tenant(), + requestContext.authToken(), vectorColDef.vectorizeDefinition().provider(), vectorColDef.vectorizeDefinition().modelName(), vectorColDef.vectorSize(), @@ -278,7 +291,19 @@ public Uni> postCommand( .withRequestContext(requestContext) .build(); - return meteredCommandProcessor.processCommand(commandContext, command); + return meteredCommandProcessor.processCommand(commandContext, command) + .onTermination() + .invoke( + () -> { + try { + commandContext.close(); + } catch (Exception e) { + LOGGER.error( + "Error closing the command context for requestContext={}", + requestContext, + e); + } + }); } }) .map(commandResult -> commandResult.toRestResponse()); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/GeneralResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/GeneralResource.java index 033360a601..e9c5cd4335 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/GeneralResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/GeneralResource.java @@ -11,10 +11,11 @@ import io.stargate.sgv2.jsonapi.config.constants.OpenApiConstants; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.processor.MeteredCommandProcessor; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -33,6 +34,8 @@ import org.eclipse.microprofile.openapi.annotations.security.SecurityRequirement; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.jboss.resteasy.reactive.RestResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Path(GeneralResource.BASE_PATH) @Produces(MediaType.APPLICATION_JSON) @@ -40,21 +43,27 @@ @SecurityRequirement(name = OpenApiConstants.SecuritySchemes.TOKEN) @Tag(ref = "General") public class GeneralResource { + private static final Logger LOGGER = LoggerFactory.getLogger(GeneralResource.class); + public static final String BASE_PATH = "/v1"; @Inject private RequestContext requestContext; + private final SchemaObjectCacheSupplier schemaObjectCacheSupplier; private final CommandContext.BuilderSupplier contextBuilderSupplier; private final MeteredCommandProcessor meteredCommandProcessor; @Inject public GeneralResource( + SchemaObjectCacheSupplier schemaObjectCacheSupplier, MeteredCommandProcessor meteredCommandProcessor, MeterRegistry meterRegistry, JsonProcessingMetricsReporter jsonProcessingMetricsReporter, CqlSessionCacheSupplier sessionCacheSupplier, EmbeddingProviderFactory embeddingProviderFactory, RerankingProviderFactory rerankingProviderFactory) { + + this.schemaObjectCacheSupplier = schemaObjectCacheSupplier; this.meteredCommandProcessor = meteredCommandProcessor; contextBuilderSupplier = @@ -98,16 +107,36 @@ public GeneralResource( @POST public Uni> postCommand(@NotNull @Valid GeneralCommand command) { - var commandContext = - contextBuilderSupplier - .getBuilder(new DatabaseSchemaObject()) - .withCommandName(command.getClass().getSimpleName()) - .withRequestContext(requestContext) - .build(); + var dbIdentifier = SchemaObjectIdentifier.forDatabase(requestContext.tenant()); + + return schemaObjectCacheSupplier + .get() + .getDatabase(requestContext, dbIdentifier, requestContext.userAgent(), false) + .flatMap( + databaseSchemaObject -> { + var commandContext = + contextBuilderSupplier + .getBuilder(databaseSchemaObject) + .withCommandName(command.getClass().getSimpleName()) + .withRequestContext(requestContext) + .build(); - return meteredCommandProcessor - .processCommand(commandContext, command) - // map to 2xx unless overridden by error - .map(commandResult -> commandResult.toRestResponse()); + return meteredCommandProcessor + .processCommand(commandContext, command) + // map to 2xx unless overridden by error + .map(commandResult -> commandResult.toRestResponse()) + .onTermination() + .invoke( + () -> { + try { + commandContext.close(); + } catch (Exception e) { + LOGGER.error( + "Error closing the command context for requestContext={}", + requestContext, + e); + } + }); + }); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java index 91fd51d243..65a79dc26f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java @@ -1,5 +1,7 @@ package io.stargate.sgv2.jsonapi.api.v1; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; + import io.micrometer.core.instrument.MeterRegistry; import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.ConfigPreLoader; @@ -15,10 +17,11 @@ import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableCommandResultSupplier; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.processor.MeteredCommandProcessor; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import jakarta.inject.Inject; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; @@ -41,6 +44,8 @@ import org.eclipse.microprofile.openapi.annotations.security.SecurityRequirement; import org.eclipse.microprofile.openapi.annotations.tags.Tag; import org.jboss.resteasy.reactive.RestResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Path(KeyspaceResource.BASE_PATH) @Produces(MediaType.APPLICATION_JSON) @@ -48,22 +53,27 @@ @SecurityRequirement(name = OpenApiConstants.SecuritySchemes.TOKEN) @Tag(ref = "Keyspaces") public class KeyspaceResource { + private static final Logger LOGGER = LoggerFactory.getLogger(KeyspaceResource.class); public static final String BASE_PATH = GeneralResource.BASE_PATH + "/{keyspace}"; @Inject private RequestContext requestContext; + private final SchemaObjectCacheSupplier schemaObjectCacheSupplier; private final CommandContext.BuilderSupplier contextBuilderSupplier; private final MeteredCommandProcessor meteredCommandProcessor; @Inject public KeyspaceResource( + SchemaObjectCacheSupplier schemaObjectCacheSupplier, MeteredCommandProcessor meteredCommandProcessor, MeterRegistry meterRegistry, JsonProcessingMetricsReporter jsonProcessingMetricsReporter, CqlSessionCacheSupplier sessionCacheSupplier, EmbeddingProviderFactory embeddingProviderFactory, RerankingProviderFactory rerankingProviderFactory) { + + this.schemaObjectCacheSupplier = schemaObjectCacheSupplier; this.meteredCommandProcessor = meteredCommandProcessor; contextBuilderSupplier = @@ -143,28 +153,51 @@ public Uni> postCommand( // CommandContext commandContext = new CommandContext(keyspace, null); // HACK TODO: The above did not set a command name on the command context, how did that work ? - var commandContext = - contextBuilderSupplier - .getBuilder(new KeyspaceSchemaObject(keyspace)) - .withEmbeddingProvider(null) - .withCommandName(command.getClass().getSimpleName()) - .withRequestContext(requestContext) - .build(); + var keyspaceIdentifier = + SchemaObjectIdentifier.forKeyspace( + requestContext.tenant(), cqlIdentifierFromUserInput(keyspace)); + + // Force refresh on all keyspace commands because they are all DDL commands + return schemaObjectCacheSupplier + .get() + .getKeyspace(requestContext, keyspaceIdentifier, requestContext.userAgent(), true) + .flatMap( + keyspaceSchemaObject -> { + var commandContext = + contextBuilderSupplier + .getBuilder(keyspaceSchemaObject) + .withEmbeddingProvider(null) + .withCommandName(command.getClass().getSimpleName()) + .withRequestContext(requestContext) + .build(); - // Need context first to check if feature is enabled - if (command instanceof TableOnlyCommand - && !commandContext.apiFeatures().isFeatureEnabled(ApiFeature.TABLES)) { - return Uni.createFrom() - .item( - new ThrowableCommandResultSupplier( - ErrorCodeV1.TABLE_FEATURE_NOT_ENABLED.toApiException())) - .map(commandResult -> commandResult.toRestResponse()); - } + // Need context first to check if feature is enabled, because of request overrides + if (command instanceof TableOnlyCommand + && !commandContext.apiFeatures().isFeatureEnabled(ApiFeature.TABLES)) { + return Uni.createFrom() + .item( + new ThrowableCommandResultSupplier( + ErrorCodeV1.TABLE_FEATURE_NOT_ENABLED.toApiException())) + .map(commandResult -> commandResult.toRestResponse()); + } // call processor return meteredCommandProcessor .processCommand(commandContext, command) // map to 2xx unless overridden by error - .map(commandResult -> commandResult.toRestResponse()); + .map(commandResult -> commandResult.toRestResponse()) + .onTermination() + .invoke( + () -> { + try { + commandContext.close(); + } catch (Exception e) { + LOGGER.error( + "Error closing the command context for requestContext={}", + requestContext, + e); + } + }); + }); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java b/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java index 87d1afa9a1..02f9fc7238 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java @@ -5,7 +5,8 @@ import com.datastax.oss.driver.api.core.type.DataType; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.datatype.ColumnDesc; import io.stargate.sgv2.jsonapi.config.constants.ErrorObjectV2Constants.TemplateVars; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.UnscopedSchemaObjectIdentifier; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiDataType; @@ -16,6 +17,8 @@ import java.util.function.Consumer; import java.util.function.Function; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; + /** * Static helper functions to consistently format objects into strings when building error messages. * @@ -144,6 +147,26 @@ public static Map errVars(SchemaObject schemaObject, Throwable e return errVars(schemaObject, exception, null); } + public static Map errVars(UnscopedSchemaObjectIdentifier name) { + return errVars(name, null); + } + + public static Map errVars( + UnscopedSchemaObjectIdentifier name, Consumer> consumer) { + + Map map = new HashMap<>(); + + map.put(TemplateVars.KEYSPACE, cqlIdentifierToMessageString(name.keyspace())); + map.put( + TemplateVars.TABLE, + name.objectName() == null ? "" : cqlIdentifierToMessageString(name.objectName())); + + if (consumer != null) { + consumer.accept(map); + } + return map; + } + /** * Adds variables to a map for the schemaObject and Throwable then calls * the consumer to add more. @@ -178,8 +201,10 @@ public static Map errVars( Map map = new HashMap<>(); if (schemaObject != null) { map.put(TemplateVars.SCHEMA_TYPE, schemaObject.type().name()); - map.put(TemplateVars.KEYSPACE, schemaObject.name().keyspace()); - map.put(TemplateVars.TABLE, schemaObject.name().table()); + map.put( + TemplateVars.KEYSPACE, + cqlIdentifierToMessageString(schemaObject.identifier().keyspace())); + map.put(TemplateVars.TABLE, cqlIdentifierToMessageString(schemaObject.identifier().table())); } if (exception != null) { map.put(TemplateVars.ERROR_CLASS, exception.getClass().getSimpleName()); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java index ad8e1ac623..e8172fe197 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java @@ -41,7 +41,8 @@ public class CommandQueryExecutor { public enum QueryTarget { TABLE, - COLLECTION; + COLLECTION, + SCHEMA; final String profilePrefix; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DatabaseSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DatabaseSchemaObject.java deleted file mode 100644 index d96b7d0834..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DatabaseSchemaObject.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -public class DatabaseSchemaObject extends SchemaObject { - - public static final SchemaObjectType TYPE = SchemaObjectType.DATABASE; - - public DatabaseSchemaObject() { - super(TYPE, SchemaObjectName.MISSING); - } - - @Override - public VectorConfig vectorConfig() { - return VectorConfig.NOT_ENABLED_CONFIG; - } - - @Override - public IndexUsage newIndexUsage() { - return IndexUsage.NO_OP; - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandler.java index c7f1829a31..9a85eb0f82 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandler.java @@ -8,6 +8,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.*; import io.stargate.sgv2.jsonapi.exception.DatabaseException; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.CqlPrintUtil; import java.util.*; import java.util.function.BiFunction; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/KeyspaceSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/KeyspaceSchemaObject.java deleted file mode 100644 index 1f1fbc7436..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/KeyspaceSchemaObject.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; - -public class KeyspaceSchemaObject extends SchemaObject { - - public static final SchemaObjectType TYPE = SchemaObjectType.KEYSPACE; - - /** Represents missing schema, e.g. when we are running a create table. */ - public static final KeyspaceSchemaObject MISSING = - new KeyspaceSchemaObject(SchemaObjectName.MISSING); - - public KeyspaceSchemaObject(String keyspace) { - this(newObjectName(keyspace)); - } - - public KeyspaceSchemaObject(SchemaObjectName name) { - super(TYPE, name); - } - - /** - * Construct a {@link KeyspaceSchemaObject} that represents the keyspace the collection is in. - * - * @param collection - * @return - */ - public static KeyspaceSchemaObject fromSchemaObject(CollectionSchemaObject collection) { - return new KeyspaceSchemaObject(newObjectName(collection.name.keyspace())); - } - - /** - * Construct a {@link KeyspaceSchemaObject} that represents the keyspace the collection is in. - * - * @param table - * @return - */ - public static KeyspaceSchemaObject fromSchemaObject(TableSchemaObject table) { - return new KeyspaceSchemaObject(newObjectName(table.name.keyspace())); - } - - @Override - public VectorConfig vectorConfig() { - return VectorConfig.NOT_ENABLED_CONFIG; - } - - @Override - public IndexUsage newIndexUsage() { - return IndexUsage.NO_OP; - } - - /** - * Centralised creation of the name for a Keyspace so we always use the correct marker object for - * collection name - * - * @param keyspaceName - * @return - */ - private static SchemaObjectName newObjectName(String keyspaceName) { - return new SchemaObjectName(keyspaceName, SchemaObjectName.MISSING_NAME); - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java index 9a728afc88..3cc4e70c3c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java @@ -27,6 +27,8 @@ import org.slf4j.LoggerFactory; /** + * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY + * * Top level entry for caching the keyspaces and tables from the backend db * *

IMPORTANT: use {@link #getSchemaChangeListener()} and {@link #getDeactivatedTenantConsumer()} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObject.java deleted file mode 100644 index 165890489a..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObject.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import io.stargate.sgv2.jsonapi.util.recordable.Recordable; -import java.util.Objects; - -/** A Collection or Table the command works on */ -public abstract class SchemaObject implements Recordable { - - // Because a lot of code needs to make decisions based on the type of the SchemaObject use an - // enum and we also have generics for strong type checking - public enum SchemaObjectType { - COLLECTION(Constants.COLLECTION), - DATABASE(Constants.DATABASE), - INDEX(Constants.INDEX), - KEYSPACE(Constants.KEYSPACE), - TABLE(Constants.TABLE), - UDT(Constants.UDT); - - /** Constants so the public HTTP API objects can use the same values. */ - public interface Constants { - String COLLECTION = "Collection"; - String DATABASE = "Database"; - String INDEX = "Index"; - String KEYSPACE = "Keyspace"; - String TABLE = "Table"; - String UDT = "Udt"; - } - - private final String apiName; - - SchemaObjectType(String apiName) { - this.apiName = Objects.requireNonNull(apiName, "apiName must not be null"); - } - - /** Gets the name to use when identifying this schema object type in the public API. */ - public String apiName() { - return apiName; - } - } - - protected final SchemaObjectType type; - protected final SchemaObjectName name; - - protected SchemaObject(SchemaObjectType type, SchemaObjectName name) { - this.type = type; - this.name = name; - } - - public SchemaObjectType type() { - return type; - } - - public SchemaObjectName name() { - return name; - } - - /** - * Subclasses must always return VectorConfig, if there is no vector config they should return - * VectorConfig.notEnabledVectorConfig(). - * - * @return - */ - public abstract VectorConfig vectorConfig(); - - /** - * Call to get an instance of the appropriate {@link IndexUsage} for this schema object - * - * @return non null, IndexUsage instance - */ - public abstract IndexUsage newIndexUsage(); - - @Override - public Recordable.DataRecorder recordTo(Recordable.DataRecorder dataRecorder) { - return dataRecorder.append("type", type).append("name", name); - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObjectName.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObjectName.java deleted file mode 100644 index 00de4f348f..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaObjectName.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import io.stargate.sgv2.jsonapi.util.recordable.Recordable; -import org.slf4j.MDC; - -public record SchemaObjectName(String keyspace, String table) implements Recordable { - - // Marker object to use when the name is missing - public static final String MISSING_NAME = ""; - - public static final SchemaObjectName MISSING = new SchemaObjectName(MISSING_NAME, MISSING_NAME); - - @SuppressWarnings("StringEquality") - public SchemaObjectName(String keyspace, String table) { - // Check using reference equality for the missing value marker object, so we only allow empty - // string if that object is used. - Preconditions.checkArgument( - (MISSING_NAME == keyspace) || !Strings.isNullOrEmpty(keyspace), "keyspace cannot be null"); - Preconditions.checkArgument( - (MISSING_NAME == table) || !Strings.isNullOrEmpty(table), "table cannot be null"); - - this.keyspace = keyspace; - this.table = table; - } - - // TODO, check if MDC actually populates these logs as expected - public void addToMDC() { - // NOTE: MUST stay as namespace for logging analysis - MDC.put("namespace", keyspace); - - // NOTE: MUST stay as collection for logging analysis - MDC.put("collection", table); - } - - public void removeFromMDC() { - MDC.remove("namespace"); - MDC.remove("collection"); - } - - @Override - public DataRecorder recordTo(DataRecorder dataRecorder) { - return dataRecorder.append("keyspace", keyspace).append("table", table); - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java index 714c25ef73..f861291685 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java @@ -7,12 +7,16 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; import java.time.Duration; import java.util.Optional; -/** Caches the vector enabled status for the namespace */ +/** + * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY + * + * Caches the vector enabled status for the namespace */ // TODO: what is the vector status of a namespace ? vectors are per collection // TODO: clarify the name of this class, it is a cache of the collections/ tables not a cache of // namespaces ?? diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaObject.java deleted file mode 100644 index 083b64cc50..0000000000 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaObject.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; - -public abstract class TableBasedSchemaObject extends SchemaObject { - - private final TableMetadata tableMetadata; - - protected TableBasedSchemaObject(SchemaObjectType type, TableMetadata tableMetadata) { - // uses asCql(pretty) so the names do not always include double quotes - this( - type, - tableMetadata == null - ? SchemaObjectName.MISSING - : new SchemaObjectName( - tableMetadata.getKeyspace().asCql(true), tableMetadata.getName().asCql(true)), - tableMetadata); - } - - // aaron- adding this ctor so for now the CollectionSchemaObject can set the schemaObjectName and - // have the tablemetdata - // be null because it is not used by any collection processing (currently). - protected TableBasedSchemaObject( - SchemaObjectType type, SchemaObjectName name, TableMetadata tableMetadata) { - // uses asCql(pretty) so the names do not always include double quotes - super(type, name); - this.tableMetadata = tableMetadata; - } - - public CqlIdentifier keyspaceName() { - return tableMetadata.getKeyspace(); - } - - public CqlIdentifier tableName() { - return tableMetadata.getName(); - } - - public TableMetadata tableMetadata() { - return tableMetadata; - } -} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java index f26afda2fa..6a026aa0bd 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java @@ -3,7 +3,9 @@ import static io.stargate.sgv2.jsonapi.config.constants.DocumentConstants.Fields.VECTOR_EMBEDDING_FIELD; import static io.stargate.sgv2.jsonapi.config.constants.DocumentConstants.Fields.VECTOR_EMBEDDING_TEXT_FIELD; import static io.stargate.sgv2.jsonapi.exception.ErrorCodeV1.EMBEDDING_PROVIDER_UNEXPECTED_RESPONSE; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; +import com.datastax.oss.driver.api.core.CqlIdentifier; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -16,13 +18,15 @@ import io.stargate.sgv2.jsonapi.exception.DocumentException; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorType; +import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; + import java.util.*; /** @@ -100,7 +104,7 @@ public Uni vectorize(List documents) { if (!vectorizeTexts.isEmpty()) { if (embeddingProvider == null) { throw ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED.toApiException( - schemaObject.name().table()); + cqlIdentifierToMessageString(schemaObject.identifier().table())); } Uni> vectors = embeddingProvider @@ -167,7 +171,7 @@ public Uni vectorize(List documents) { public Uni vectorize(String vectorizeContent) { if (embeddingProvider == null) { throw ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED.toApiException( - schemaObject.name().table()); + cqlIdentifierToMessageString(schemaObject.identifier().table())); } Uni> vectors = embeddingProvider @@ -211,7 +215,7 @@ public Uni vectorize(SortClause sortClause) { if (sortClause.hasVectorizeSearchClause()) { if (embeddingProvider == null) { throw ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED.toApiException( - schemaObject.name().table()); + cqlIdentifierToMessageString(schemaObject.identifier().table())); } final List sortExpressions = sortClause.sortExpressions(); SortExpression expression = sortExpressions.getFirst(); @@ -299,7 +303,7 @@ private Uni> vectorizeTexts( // Copied from vectorize(List documents) above leaving as is for now if (embeddingProvider == null) { throw ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED.toApiException( - schemaObject.name().table()); + cqlIdentifierToMessageString(schemaObject.identifier().table())); } return embeddingProvider diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java index 46968de17e..06c537e79e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java @@ -17,13 +17,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.UpdateOneCommand; import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.exception.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.MeteredEmbeddingProvider; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorType; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java index 35a2ddb370..09322dbc54 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java @@ -7,8 +7,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import java.util.ArrayList; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java index 2d67418579..1c23f2b5e2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java index 72a5603880..4d521b3ad3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java @@ -7,6 +7,8 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; import java.util.Objects; import java.util.function.Supplier; + +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -96,7 +98,7 @@ protected Multi startMulti(CommandContext commandContext) { commandContext.cqlSessionCache(), new CommandQueryExecutor.DBRequestContext( commandContext.requestContext().tenant(), - commandContext.requestContext().getCassandraToken(), + commandContext.requestContext().authToken(), commandContext.requestContext().userAgent(), commandContext.requestTracing().enabled()), CommandQueryExecutor.QueryTarget.TABLE); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java index 78861b41be..3de2669e97 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.querybuilder.insert.OngoingValues; import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java index fb7cdffee6..e38d963c79 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java @@ -8,8 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java index 90b4072be5..b62e30167f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java @@ -7,8 +7,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.config.constants.ErrorObjectV2Constants; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java index be9aefe073..cf4c81e6e4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java @@ -9,8 +9,7 @@ import io.stargate.sgv2.jsonapi.exception.APIException; import io.stargate.sgv2.jsonapi.exception.APIExceptionCommandErrorBuilder; import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableToErrorMapper; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java index 24a6e37a51..a1128ad2ac 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexDefContainer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java index edbe9b948f..f0bb200440 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java index 8c6b7451b2..b33c664389 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java @@ -6,8 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlType; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java index 587900db10..a287b3e04b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java @@ -11,7 +11,7 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.EmptyAsyncResultSet; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.Task; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java index 03e45670bc..4efe59f5f6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/Operation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/Operation.java index 07d7e40f43..156a622917 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/Operation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/Operation.java @@ -6,7 +6,7 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttempt.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttempt.java index df0fa67863..108b341fa5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttempt.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttempt.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.CqlPrintUtil; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.time.Duration; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptAccumulator.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptAccumulator.java index 0805fa3720..8d4f71264b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptAccumulator.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptAccumulator.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation; import io.smallrye.mutiny.Multi; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** * TODO: aaron 19 march 2025 - remove OperationAttempt and related code once Tasks are solid diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptContainer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptContainer.java index c846ada50d..3f8dd19034 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptContainer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptContainer.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.*; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPage.java index 3698649618..ed8313667e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPage.java @@ -3,7 +3,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Collections; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPageBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPageBuilder.java index 39c7a3ff4d..0f16264e2d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPageBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/OperationAttemptPageBuilder.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java index 5dd99a65e8..61895eec0d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java @@ -24,6 +24,8 @@ import java.util.List; import java.util.Objects; import java.util.Optional; + +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java index 38c3e7ccf8..a46fa4bd88 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java @@ -3,8 +3,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.*; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortExpression; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.*; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java index a0de87f9ab..f4d93b5f05 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import java.time.Duration; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java index d6a3980718..3c93c2addc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskPage; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java index b8af1a7338..e35310f785 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java @@ -5,8 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import org.slf4j.Logger; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java index 9ffb2ac9b4..c23ef178f0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java index 8db887abd1..21a3510771 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java index 2a2c2d0ae2..b00caf983a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java @@ -3,7 +3,7 @@ import com.datastax.oss.driver.api.querybuilder.update.Update; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tables.WhereCQLClauseAnalyzer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java index d9c7829d45..380da242b3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java index 18424dfa1c..8738ff5d40 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java @@ -20,8 +20,7 @@ import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java index daf45c5f7d..1eb76f5b77 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java @@ -5,8 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import java.util.function.Supplier; import org.slf4j.Logger; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java index 48216c1906..ef92c865fa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** Operation that returns estimated count of documents. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java index df64111ad5..ee40debe19 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java @@ -14,8 +14,7 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java index d6bc9bfdd7..b32ee7d1fc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.tasks.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java index e222b26330..e4e5d8d47a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java @@ -3,8 +3,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java index bb2a34b90a..5e013871fa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java @@ -1,8 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java index 8260dfe4a9..c8dd1c3840 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java @@ -1,8 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java index 70b1a7e51b..080cc77c15 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.TableFilter; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java index a3c1e39274..ce337eb7d5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java @@ -15,7 +15,7 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.DefaultSubConditionRelation; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltConditionPredicate; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java index 919cf90366..df46a74d4c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltConditionPredicate; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/TableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/TableFilter.java index 69afdd6a97..92d4e256d1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/TableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/TableFilter.java @@ -6,7 +6,7 @@ import com.datastax.oss.driver.api.querybuilder.relation.Relation; import com.datastax.oss.driver.api.querybuilder.select.Select; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/WhereBehaviour.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/WhereBehaviour.java index bf9d723e5a..ce2a3267b3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/WhereBehaviour.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/query/WhereBehaviour.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.query; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * Interface that describes how a where clause behaves. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java index 3a6dbab923..7a436bd1cf 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java @@ -6,7 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindRerankingProvidersCommand; import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.provider.ApiModelSupport; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java index ef731fd812..c3270b4d42 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java @@ -6,13 +6,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortExpression; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCommand; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.embeddings.EmbeddingTaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.resolver.FindCommandResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Collections; import java.util.List; @@ -82,7 +82,7 @@ protected IntermediateReadResultSupplier buildResultSupplier( new TraceMessage( "Executing inner '%s' command for schema object '%s' " .formatted( - findCommand.commandName().getApiName(), schemaObject.name()), + findCommand.commandName().getApiName(), schemaObject.identifier()), Recordable.copyOf(Map.of("command", findCommand)))); return findOperation.execute(commandContext); }, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java index 76e9534ad6..137a146f34 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java @@ -4,14 +4,16 @@ import static io.stargate.sgv2.jsonapi.metrics.MetricsConstants.MetricTags.*; import static io.stargate.sgv2.jsonapi.metrics.MetricsConstants.UNKNOWN_VALUE; import static io.stargate.sgv2.jsonapi.util.ClassUtils.classSimpleName; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; +import com.datastax.oss.driver.api.core.CqlIdentifier; import io.micrometer.core.instrument.*; import io.micrometer.core.instrument.Timer; import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.metrics.MetricsConstants; import io.stargate.sgv2.jsonapi.metrics.MicrometerConfiguration; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProvider; import java.util.*; import java.util.concurrent.TimeUnit; @@ -87,9 +89,9 @@ public void recordPassageCount(int passageCount) { // Record the passage count for the specific tenant and table Tags tenantTags = new RerankingTagsBuilder() - .withTenant(requestContext.getTenantId().orElse(UNKNOWN_VALUE)) - .withKeyspace(schemaObject.name().keyspace()) - .withTable(schemaObject.name().table()) + .withTenant(requestContext.tenant()) + .withKeyspace(schemaObject.identifier().keyspace()) + .withTable(schemaObject.identifier().table()) .build(); meterRegistry.summary(RERANK_TENANT_PASSAGE_COUNT_METRIC, tenantTags).record(passageCount); @@ -139,9 +141,9 @@ public void recordCallLatency(Timer.Sample sample) { // Build tags for the tenant timer Tags tenantTags = new RerankingTagsBuilder() - .withTenant(requestContext.getTenantId().orElse(UNKNOWN_VALUE)) - .withKeyspace(schemaObject.name().keyspace()) - .withTable(schemaObject.name().table()) + .withTenant(requestContext.tenant()) + .withKeyspace(schemaObject.identifier().keyspace()) + .withTable(schemaObject.identifier().table()) .build(); // Get the tenant timer instance Timer tenantTimer = meterRegistry.timer(RERANK_TENANT_CALL_DURATION_METRIC, tenantTags); @@ -182,13 +184,13 @@ public RerankingTagsBuilder withTenant(Tenant tenant) { return this; } - public RerankingTagsBuilder withKeyspace(String keyspace) { - putOrThrow(KEYSPACE_TAG, keyspace); + public RerankingTagsBuilder withKeyspace(CqlIdentifier keyspace) { + putOrThrow(KEYSPACE_TAG, cqlIdentifierToMessageString(keyspace)); return this; } - public RerankingTagsBuilder withTable(String table) { - putOrThrow(TABLE_TAG, table); + public RerankingTagsBuilder withTable(CqlIdentifier table) { + putOrThrow(TABLE_TAG, cqlIdentifierToMessageString(table)); return this; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java index 75961131be..1c879a3270 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java @@ -9,8 +9,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; import io.stargate.sgv2.jsonapi.api.request.RerankingCredentials; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.projection.DocumentProjector; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProvider; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java index cf09dfd59e..b9475adfb1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java @@ -1,8 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.reranking; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; public class RerankingTaskBuilder extends TaskBuilder, SchemaT, RerankingTaskBuilder> { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java index ad3c89d47a..3986636eca 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.tasks.CompositeTask; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.CompositeTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskPage; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java index df8d1b9ea7..b78678dabe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java @@ -8,7 +8,7 @@ import com.datastax.oss.driver.api.querybuilder.schema.AlterTableStart; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java index 6fba093a87..e41b7f7ac4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import com.datastax.oss.driver.api.core.CqlIdentifier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableExceptionHandler.java index a708a3adb8..02c8bebe4a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableExceptionHandler.java @@ -4,7 +4,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java index fd868d4a8b..f443c30a4a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java @@ -7,8 +7,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.AlterTypeStart; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import java.util.Objects; @@ -61,7 +60,7 @@ public static AlterTypeDBTaskBuilder builder(KeyspaceSchemaObject schemaObject) @Override protected SimpleStatement buildStatement() { - var keyspaceIdentifier = cqlIdentifierFromUserInput(schemaObject.name().keyspace()); + var keyspaceIdentifier = schemaObject.identifier().keyspace(); AlterTypeStart alterTypeStart = alterType(keyspaceIdentifier, udtName); return switch (alterTypeDBTaskType) { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java index 64bd4cf434..3695bbad70 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java @@ -3,8 +3,7 @@ import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import com.datastax.oss.driver.api.core.CqlIdentifier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java index d70c3d128a..6c2ce1d9a1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java @@ -7,8 +7,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.List; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java index 08515a5c01..4166c397d5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java @@ -6,7 +6,7 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateIndexOnTable; import com.datastax.oss.driver.internal.querybuilder.schema.DefaultCreateIndex; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.ExtendedCreateIndex; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java index c1f5a60a9e..49b28109e3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexExceptionHandler.java index a0188a68fa..efb9c6988b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexExceptionHandler.java @@ -6,7 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java index a38bca5a8e..aafd7fceee 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java @@ -8,8 +8,7 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; import com.datastax.oss.driver.api.querybuilder.schema.CreateTableWithOptions; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java index e2b5b614b3..06334ef607 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java @@ -1,7 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java index de97a2b596..36c56b6004 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java @@ -7,8 +7,7 @@ import com.datastax.oss.driver.api.core.servererrors.AlreadyExistsException; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; import java.util.Objects; /** Exception handler for the {@link CreateTableDBTask} */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java index 0c8d9cef0b..dd55433707 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.*; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java index 1815e2bbd6..48a6cdb638 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java @@ -1,7 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java index ba89e914b8..0b38ac047d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; import java.util.Objects; public class CreateTypeExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java index 60f306b97e..12dcd53ea3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java @@ -5,8 +5,7 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java index a0bbf008ca..0e68f3df1e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java @@ -2,8 +2,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java index 440723dc8c..65565851d6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; import java.util.Objects; public class DropIndexExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java index 5ef57ee9cf..937ad95783 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java @@ -7,8 +7,7 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; /* diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java index ca15b785cd..5feba64439 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java @@ -2,8 +2,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java index 1bf7bf90e7..224bc6dcba 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; import java.util.Objects; public class DropTableExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java index a6bef90566..6b3097c3b2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java @@ -7,8 +7,7 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; /* diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java index 4ac6c068b2..3b50b0f453 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java @@ -2,8 +2,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java index 343308bdb5..cc9764db95 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java @@ -6,8 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; import java.util.Objects; public class DropTypeExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java index 4a04fdcb6c..67b2b06343 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java @@ -2,8 +2,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; - +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; /** * Subclass of {@link DefaultDriverExceptionHandler} for working with {@link KeyspaceSchemaObject}. * diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java index 3fb9818b9f..48bee9afe1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java @@ -2,7 +2,7 @@ import com.datastax.oss.driver.api.querybuilder.delete.Delete; import io.stargate.sgv2.jsonapi.exception.FilterException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.DeleteDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java index 38042fca9b..48a45d4a9c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java @@ -2,8 +2,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * Subclass of {@link DefaultDriverExceptionHandler} for working with {@link TableSchemaObject}. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java index 58c3ef9910..d50cf980ff 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.ColumnsDescContainer; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTask; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import io.stargate.sgv2.jsonapi.service.shredding.tables.RowId; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java index 7f7941006d..960fb9b1fd 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.databind.JsonNode; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTask; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java index a5ac557bb4..19ce94a0c5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java @@ -4,7 +4,7 @@ import com.datastax.oss.driver.api.querybuilder.insert.OngoingValues; import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; import io.stargate.sgv2.jsonapi.service.resolver.UnvalidatedClauseException; import io.stargate.sgv2.jsonapi.service.shredding.tables.WriteableTableRow; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableMutationOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableMutationOperation.java index 812905caf3..18f5ff12c5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableMutationOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableMutationOperation.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * For now, a marker class / interface for operations that modify data in a table. 26 sept 2024 - diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java index 0eaa64cd67..b4edc6fc21 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java index 1ec8046069..111294b7ed 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java @@ -18,7 +18,7 @@ import io.stargate.sgv2.jsonapi.exception.ProjectionException; import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToJSONCodecException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; import io.stargate.sgv2.jsonapi.service.operation.query.SelectCQLClause; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java index d124a7f1b1..74f4ca590d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.ReadDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableSimilarityFunction.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableSimilarityFunction.java index f963bf4407..9fd549ad81 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableSimilarityFunction.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableSimilarityFunction.java @@ -9,7 +9,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.Projectable; import io.stargate.sgv2.jsonapi.api.model.command.VectorSortable; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.CqlVectorUtil; import java.util.function.Function; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java index c218104b04..2f7579eb1d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java @@ -7,7 +7,7 @@ import com.datastax.oss.driver.api.querybuilder.update.Update; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.LogicalExpression; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.DefaultSubConditionRelation; import io.stargate.sgv2.jsonapi.service.operation.query.*; import java.util.ArrayList; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java index d74915eb2c..be8029d072 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java @@ -13,8 +13,7 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.InTableFilter; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListTableFilter; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java index 89eb6c2ec5..2102a203c2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.DocumentException; import io.stargate.sgv2.jsonapi.exception.ErrorCode; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import io.stargate.sgv2.jsonapi.service.shredding.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTask.java index 369984f594..6dd5582263 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTask.java @@ -4,7 +4,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WarningException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.*; @@ -517,7 +517,7 @@ public Recordable.DataRecorder recordTo(Recordable.DataRecorder dataRecorder) { .append("status", status) .append("taskId", taskId) .append("schemaObject.type", schemaObject.type()) - .append("schemaObject.name", schemaObject.name()) + .append("schemaObject.name", schemaObject.identifier()) .append("retryPolicy", retryPolicy) .append("warnings", warnings) .append("suppressedWarnings", suppressedWarnings) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTask.java index 15b5755565..b4ba0a1cd4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTask.java @@ -3,7 +3,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WarningException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskInnerPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskInnerPage.java index 08b19d9a84..4e109894b8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskInnerPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskInnerPage.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java index 8709f0c8bf..4903b4afa6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOuterPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOuterPage.java index 0237ee3ef0..389641c282 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOuterPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOuterPage.java @@ -3,7 +3,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java index 5473bb7ebb..b77b7fa800 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java @@ -13,7 +13,7 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTaskPage.java index 367e34ab7f..8be28d2afe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTaskPage.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Optional; public abstract class DBTaskPage, SchemaT extends SchemaObject> diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/Task.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/Task.java index dcb1f8bd79..11691b2b35 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/Task.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/Task.java @@ -3,7 +3,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAccumulator.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAccumulator.java index 46b429f3bd..8a44987576 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAccumulator.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAccumulator.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Objects; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAndDeferrables.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAndDeferrables.java index 490b69d26c..b35f339dbc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAndDeferrables.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskAndDeferrables.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.Deferrable; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskBuilder.java index 28fc0cfbdf..ca235e1fd2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskBuilder.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroup.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroup.java index fc15058144..e4b25b04a3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroup.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroup.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupAndDeferrables.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupAndDeferrables.java index 02b7371969..d76b8ec3aa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupAndDeferrables.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupAndDeferrables.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.Deferrable; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java index b350cb5c95..ba47aada11 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java @@ -5,7 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java index 90b6c5f078..842caca0bf 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import java.util.Collections; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java index 580dd1ad61..7794f7efa2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java @@ -13,10 +13,11 @@ import io.stargate.sgv2.jsonapi.exception.ExceptionFlags; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableCommandResultSupplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; + import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.resolver.CommandResolverService; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -66,7 +67,7 @@ public Uni Uni Uni { - // Cleanup MDC after processing completes (success or failure) to prevent data from - // leaking into the next request handled by the same thread. - commandContext.schemaObject().name().removeFromMDC(); - MDC.remove("tenantId"); }); } @@ -168,8 +156,8 @@ private String buildCommandLog( new CommandLog( command.getClass().getSimpleName(), commandContext.requestContext().tenant(), - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table(), + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table() == null ? "" : commandContext.schemaObject().identifier().table().asInternal(), commandContext.schemaObject().type().name(), getIncomingDocumentsCount(command), getOutgoingDocumentsCount(result), diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java index c241704079..ab631ba929 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java index 983931b991..ce25fbc3f8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java @@ -6,8 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.AlterTypeCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.AlterTypeDBTask; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ClauseResolver.java index e531500e9a..0cd415f71e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ClauseResolver.java @@ -5,7 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** * Base for a class that can resolve a clause in a command for use by an Operation. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java index 12d95810e4..6e73dbfbc0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java @@ -17,11 +17,15 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.RequestException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.query.DBFilterBase; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; + import java.util.Objects; /** @@ -166,7 +170,7 @@ default Operation resolveKeyspaceCommand( // throw error as a fallback to make sure method is implemented, commands are tested well throw ErrorCodeV1.SERVER_INTERNAL_ERROR.toApiException( "%s Command does not support operating on Keyspaces, target was %s", - command.getClass().getSimpleName(), ctx.schemaObject().name()); + command.getClass().getSimpleName(), ctx.schemaObject().identifier()); } /** @@ -181,7 +185,7 @@ default Operation resolveDatabaseCommand( // throw error as a fallback to make sure method is implemented, commands are tested well throw ErrorCodeV1.SERVER_INTERNAL_ERROR.toApiException( "%s Command does not support operating on Databases, target was %s", - command.getClass().getSimpleName(), ctx.schemaObject().name()); + command.getClass().getSimpleName(), ctx.schemaObject().identifier()); } /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java index 115d846291..1a5db86536 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java @@ -12,8 +12,7 @@ import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.CreateCollectionOperation; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java index 5f0759c2c8..6aa2853f00 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java @@ -9,7 +9,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java index f5132db2aa..65e20fa4e6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateKeyspaceCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java index 5d1952d378..5de5b7c0e9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTableCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTableCommandResolver.java index 1762592138..d05432566a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTableCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTableCommandResolver.java @@ -15,6 +15,7 @@ import io.stargate.sgv2.jsonapi.service.operation.tables.CreateTableExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiDataTypeDefs; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiSupportDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java index e3d38e0174..7503e5141e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java @@ -9,7 +9,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTypeCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTypeCommandResolver.java index 0f7430394e..8cbf33d3fd 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTypeCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTypeCommandResolver.java @@ -7,13 +7,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateTypeCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.*; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java index 82b98e8e0a..7a89cd7269 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java @@ -9,7 +9,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.CreateIndexDBTask; import io.stargate.sgv2.jsonapi.service.operation.tables.CreateIndexDBTaskBuilder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java index c0c486fd60..fa5a06f9d9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java @@ -2,8 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteCollectionCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionCollectionOperation; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java index 596a4e1b0e..c953048d8d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java @@ -7,7 +7,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteManyCommand; import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java index 353588b17c..d7f0102aa3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java @@ -11,7 +11,7 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java index 663007b63a..f91e43ba63 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java @@ -6,8 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropIndexCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.DropIndexDBTask; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java index b898dd2f23..f0452b74f9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropKeyspaceCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java index 503fad4409..7eee36775a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java index de14d21556..7190e79959 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java @@ -6,8 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropTableCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java index f4d744ca7c..4410e0d414 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java @@ -6,8 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropTypeCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.DropTypeDBTask; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java index dc54ef1b66..649e27e97d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java @@ -3,8 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCollectionsCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionsCollectionOperation; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java index 8496325d78..17ed9e5664 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java @@ -11,7 +11,7 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java index 791549bbac..77ab71f331 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindEmbeddingProvidersCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.embeddings.FindEmbeddingProvidersOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java index ef9b937b0a..0d7cc41ad6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindKeyspacesCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.FindKeyspacesOperation; import jakarta.enterprise.context.ApplicationScoped; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java index cedc7929c4..3834a904e9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java @@ -2,9 +2,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindNamespacesCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; + import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.FindKeyspacesOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java index 0ea66cc571..ea44fc5917 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java @@ -9,7 +9,7 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java index 7002bbf923..42f499055c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindRerankingProvidersCommand; import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.reranking.FindRerankingProvidersOperation; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java index de5ae46e52..91d70604e3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.InsertManyCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionInsertAttemptBuilder; import io.stargate.sgv2.jsonapi.service.operation.collections.InsertCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java index 2877ba320d..16b0269d7f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.InsertOneCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionInsertAttemptBuilder; import io.stargate.sgv2.jsonapi.service.operation.collections.InsertCollectionOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java index 5308b0fa1d..2afae79d13 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java @@ -3,7 +3,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListIndexesCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java index f1a70dd1cc..36c3cc5b34 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListTablesCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.*; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.KeyspaceDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java index a49bafc62a..db82a34511 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java @@ -4,8 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListTypesCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.ListTypesDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.ListTypesDBTask; import io.stargate.sgv2.jsonapi.service.operation.MetadataDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.tables.KeyspaceDriverExceptionHandler; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java index 7b1553ba18..160b69ab54 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java @@ -5,7 +5,7 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.embeddings.EmbeddingOperationFactory; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java index 3c9668e6c4..bfe772a747 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java @@ -11,7 +11,7 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java index affe37ecf4..12fb29f94e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.*; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java index 6840e3951c..0979947095 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java @@ -7,7 +7,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonType; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.ValueComparisonOperator; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.*; import io.stargate.sgv2.jsonapi.service.operation.filters.table.BinaryTableFilter; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java index 2561e34720..48d757f53e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java @@ -17,7 +17,7 @@ import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cql.builder.QueryBuilder; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java index faf417c056..8c07150783 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.exception.SortException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.InMemorySortComparator; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; import io.stargate.sgv2.jsonapi.service.operation.query.RowSorter; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java index bbebbf223e..fdbd0451ad 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java @@ -5,7 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.Command; import io.stargate.sgv2.jsonapi.api.model.command.Sortable; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java index 6d3ffd701e..851defac0d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java @@ -8,8 +8,7 @@ import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableBasedSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java index 73792bec58..260b11872c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java @@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java index d1ca2a1a4a..b1112afced 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnRemoveToAssignment; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java index 327b1d1f06..4e3c7e9c63 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java @@ -11,7 +11,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperatorModifier; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAppendToAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java index aa1b86ef79..1602679468 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.UpdateException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.DefaultUpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java index aeb2d4d2c7..b6453b8b6c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java index 8b76bb01b4..d768d9699b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java @@ -5,7 +5,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonType; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java index 5825b852dd..9af2f5be72 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java @@ -3,7 +3,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.Command; import io.stargate.sgv2.jsonapi.api.model.command.Updatable; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java new file mode 100644 index 0000000000..8b0b417c0e --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java @@ -0,0 +1,35 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; + +/** + * A Database in the API. + *

+ * While we don't do much with a database itself in the API, we do some commands like + * listing keyspaces that conceptually belong to the database. So we have a schema + * object for it. + *

+ * Currently only identified by the tenant. + */ +public class DatabaseSchemaObject extends SchemaObject { + + public DatabaseSchemaObject(Tenant tenant) { + super(SchemaObjectType.DATABASE, SchemaObjectIdentifier.forDatabase(tenant)); + } + + public DatabaseSchemaObject(SchemaObjectIdentifier identifier) { + super(SchemaObjectType.DATABASE, identifier); + } + + @Override + public VectorConfig vectorConfig() { + return VectorConfig.NOT_ENABLED_CONFIG; + } + + @Override + public IndexUsage newIndexUsage() { + return IndexUsage.NO_OP; + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java new file mode 100644 index 0000000000..74001b0499 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java @@ -0,0 +1,52 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.google.common.annotations.VisibleForTesting; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; + +import java.util.Objects; + +/** + * A Keyspace in the API. + *

+ * We currently do not hang things like Tables and Views of the KeyspaceSchemaObject, + * they can all be retrieved from {@link SchemaObjectCache} + *

+ * We hae commands like list collections, list tables, etc. that run against + * as Keyspace so we have an object to represent that Keyspace. + */ +public class KeyspaceSchemaObject extends SchemaObject { + + private KeyspaceMetadata keyspaceMetadata; + + @VisibleForTesting + public KeyspaceSchemaObject(SchemaObjectIdentifier identifier) { + super(SchemaObjectType.KEYSPACE, identifier); + + // here for existing testing, where creating the KeyspaceMetadata was not common + this.keyspaceMetadata = null; + } + + public KeyspaceSchemaObject(Tenant tenant, KeyspaceMetadata keyspaceMetadata) { + super( + SchemaObjectType.KEYSPACE, + SchemaObjectIdentifier.forKeyspace(tenant, keyspaceMetadata.getName())); + + // keyspaceMetadata will prob be checked for null above, but for sanity, we ensure it's not null + // here + this.keyspaceMetadata = + Objects.requireNonNull(keyspaceMetadata, "keyspaceMetadata must not be null"); + } + + @Override + public VectorConfig vectorConfig() { + return VectorConfig.NOT_ENABLED_CONFIG; + } + + @Override + public IndexUsage newIndexUsage() { + return IndexUsage.NO_OP; + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java new file mode 100644 index 0000000000..857c92b266 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java @@ -0,0 +1,59 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; +import io.stargate.sgv2.jsonapi.util.recordable.Recordable; +import java.util.Objects; + +/** + * Base for all Schema objects the API works with, such as Database, Keyspace, + * Table, Collection. + *

+ * Schema Object are identified by a {@link SchemaObjectIdentifier} which is globally unique + * for all tenants. + */ +public abstract class SchemaObject implements Recordable { + + protected final SchemaObjectIdentifier identifier; + + protected SchemaObject(SchemaObjectType expectedType, SchemaObjectIdentifier identifier) { + + this.identifier = Objects.requireNonNull(identifier, "identifier must not be null"); + + if (identifier.type() != expectedType) { + throw new IllegalArgumentException( + String.format( + "Invalid SchemaObjectIdentifier, expected schemaType %s but got identifier: %s", + expectedType, identifier)); + } + } + + public SchemaObjectType type() { + return identifier.type(); + } + + public SchemaObjectIdentifier identifier() { + return identifier; + } + + /** + * Subclasses must always return VectorConfig, if there is no vector config they should return + * VectorConfig.notEnabledVectorConfig(). + *

+ * aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. + */ + public abstract VectorConfig vectorConfig(); + + /** + * Call to get an instance of the appropriate {@link IndexUsage} for this schema object + * + *

+ * aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. + */ + public abstract IndexUsage newIndexUsage(); + + @Override + public Recordable.DataRecorder recordTo(Recordable.DataRecorder dataRecorder) { + return dataRecorder.append("identifier", identifier); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java new file mode 100644 index 0000000000..afb094e5d6 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java @@ -0,0 +1,483 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListenerBase; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.datastax.oss.driver.api.core.session.Session; +import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.annotations.VisibleForTesting; +import io.micrometer.core.instrument.MeterRegistry; +import io.smallrye.mutiny.Uni; +import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; +import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; +import java.lang.ref.WeakReference; +import java.time.Duration; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.CompletionStage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SchemaObjectCache + extends DynamicTTLCache { + + private static final Logger LOGGER = LoggerFactory.getLogger(SchemaObjectCache.class); + + private final DynamicTTLSupplier ttlSupplier; + + SchemaObjectCache( + long cacheMaxSize, + Duration cacheTTL, + UserAgent slaUserAgent, + Duration slaUserTTL, + SchemaObjectFactory schemaObjectFactory, + MeterRegistry meterRegistry) { + this( + cacheMaxSize, + cacheTTL, + slaUserAgent, + slaUserTTL, + schemaObjectFactory, + meterRegistry, + false, + null); + } + + @VisibleForTesting + SchemaObjectCache( + long cacheMaxSize, + Duration cacheTTL, + UserAgent slaUserAgent, + Duration slaUserTTL, + SchemaObjectFactory schemaObjectFactory, + MeterRegistry meterRegistry, + boolean asyncTaskOnCaller, + Ticker cacheTicker) { + super( + "schema_object_cache", + cacheMaxSize, + createOnLoad(schemaObjectFactory), + List.of(), + meterRegistry, + asyncTaskOnCaller, + cacheTicker); + + Objects.requireNonNull(schemaObjectFactory, "schemaObjectFactory must not be null"); + this.ttlSupplier = new DynamicTTLSupplier(cacheTTL, slaUserAgent, slaUserTTL); + + LOGGER.info( + "Initializing SchemaObjectCache with cacheMaxSize={}, ttlSupplier={}", + cacheMaxSize, + ttlSupplier); + } + + private static ValueFactory createOnLoad( + SchemaObjectFactory factory) { + + return (cacheKey) -> { + var requestContext = + cacheKey + .requestContext() + .orElseThrow( + () -> + new IllegalStateException( + "SchemaCacheKey.onLoad - requestContext is null, weak reference was cleared")); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace( + "SchemaCacheKey.onLoad - loading schema object with identifier: {}, forceRefresh: {}, userAgent: {}", + cacheKey.schemaIdentifier(), + cacheKey.forceRefresh(), + cacheKey.userAgent()); + } + + return factory.apply(requestContext, cacheKey.schemaIdentifier(), cacheKey.forceRefresh()); + }; + } + + /** + * Gets a listener to use with the {@link CqlSessionFactory} to remove the schema cache entries + * when the DB sends schema change events. + */ + public SchemaChangeListener getSchemaChangeListener() { + return new SchemaObjectCache.SchemaCacheSchemaChangeListener(this); + } + + public Uni getDatabase( + RequestContext requestContext, + SchemaObjectIdentifier identifier, + UserAgent userAgent, + boolean forceRefresh) { + return get(requestContext, identifier, userAgent, forceRefresh); + } + + // get keyspace + public Uni getKeyspace( + RequestContext requestContext, + SchemaObjectIdentifier identifier, + UserAgent userAgent, + boolean forceRefresh) { + + return get(requestContext, identifier, userAgent, forceRefresh); + } + + public Uni getTableBased( + RequestContext requestContext, + UnscopedSchemaObjectIdentifier name, + UserAgent userAgent, + boolean forceRefresh) { + + var collectionKey = + createCacheKey( + requestContext, + SchemaObjectIdentifier.forCollection( + requestContext.tenant(), name.keyspace(), name.objectName()), + userAgent, + forceRefresh); + + var tableKey = + createCacheKey( + requestContext, + SchemaObjectIdentifier.forTable( + requestContext.tenant(), name.keyspace(), name.objectName()), + userAgent, + false); + + // we do not know if this is a collection or a table until we load it, and we + // cannot change the key once it is loaded, so we need to check both + + // As an optimization, we getifPresent incase the object is a table - we would get a cache miss + // for + // the collection key, then try to load, then discover it is a table, fail the load, then get + // again + // and potentially cache hit for the table. + + if (!forceRefresh) { + + var existingCollection = getIfPresent(collectionKey); + if (existingCollection.isPresent()) { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace( + "getTableBased() - found existing collection schema object collectionKey: {}", + collectionKey); + return Uni.createFrom().item((TableBasedSchemaObject) existingCollection.get()); + } + } + + var existingTable = getIfPresent(tableKey); + if (existingTable.isPresent()) { + // we have a cache hit for the table, return it + if (LOGGER.isTraceEnabled()) { + LOGGER.trace( + "getTableBased() - found existing table schema object tableKey: {}", tableKey); + } + return Uni.createFrom().item((TableBasedSchemaObject) existingTable.get()); + } + } + + // we do not have a cache hit, or we wanted to force refresh, so we need to load it + // force refresh on the collection cache key will cause the cache to load and replace the entry + // and if we will refresh the driver metadata. So no need to also do that on the table key. + return get(collectionKey) + .onFailure( + io.stargate.sgv2.jsonapi.service.schema.SchemaObjectFactory + .SchemaObjectTypeMismatchException.class) + .recoverWithUni( + () -> { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace( + "getTableBased() - collection key load resulted in SchemaObjectTypeMismatchException, retrying collectionKey.identifier: {}, tableKey.identifier: {}", + collectionKey.schemaIdentifier, + tableKey.schemaIdentifier); + } + return get(tableKey); + }) + .invoke( + schemaObject -> { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace( + "getTableBased() - loaded schema object with identifier: {}, collectionKey.identifier: {}, tableKey.identifier: {}", + schemaObject.identifier(), + collectionKey.schemaIdentifier, + tableKey.schemaIdentifier); + } + }) + .map(obj -> (TableBasedSchemaObject) obj); + } + + private Uni get( + RequestContext requestContext, + SchemaObjectIdentifier identifier, + UserAgent userAgent, + boolean forceRefresh) { + + // todo, check and cast somehow + return (Uni) get(createCacheKey(requestContext, identifier, userAgent, forceRefresh)); + } + + @VisibleForTesting + Optional getIfPresent( + RequestContext requestContext, SchemaObjectIdentifier identifier, UserAgent userAgent) { + + return (Optional) getIfPresent(createCacheKey(requestContext, identifier, userAgent, false)); + } + + // + // private Optional getIfPresent(SchemaCacheKey key) { + // + // // todo, check and cast somehow + // return (Optional) getIfPresent(key); + // } + protected void evictTable(Tenant tenant, CqlIdentifier keyspace, CqlIdentifier table) { + // no need to normalize the keyspace name, it is already normalized + var evictKey = + createCacheKey(null, SchemaObjectIdentifier.forTable(tenant, keyspace, table), null, false); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("evictTable() - evictKey: {}", evictKey); + } + + evict(evictKey); + } + + protected void evictKeyspace(Tenant tenant, CqlIdentifier keyspace, boolean evictAll) { + // no need to normalize the keyspace name, it is already normalized + var evictKey = + createCacheKey(null, SchemaObjectIdentifier.forKeyspace(tenant, keyspace), null, false); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("evictKeyspace() - evictKey: {}", evictKey); + } + + evict(evictKey); + if (evictAll) { + // we need to remove all the tables, collections, etc that are in this keyspace + evictIf(key -> evictKey.schemaIdentifier.isSameKeyspace(key.schemaIdentifier)); + } + } + + private SchemaCacheKey createCacheKey( + RequestContext requestContext, + SchemaObjectIdentifier schemaIdentifier, + UserAgent userAgent, + boolean forceRefresh) { + + // sanity check + // requestContext may be null when we are doing evictions + if (requestContext!= null && (!requestContext.tenant().equals(schemaIdentifier.tenant()))){ + throw new IllegalArgumentException( + "RequestContext tenant does not match schemaIdentifier requestContext.tenant: " + + requestContext.tenant() + + ", schemaIdentifier.tenant: " + + schemaIdentifier.tenant()); + } + + return new SchemaCacheKey( + requestContext, + schemaIdentifier, + ttlSupplier.ttlForUsageAgent(userAgent), + forceRefresh, + userAgent); + } + + static class SchemaCacheKey implements DynamicTTLCache.CacheKey { + + private final SchemaObjectIdentifier schemaIdentifier; + // ttl is not part of the key identity + private final Duration ttl; + private final boolean forceRefresh; + // user agent only added for logging and debugging, not part of the key identity + private final UserAgent userAgent; + // held as weak because a cache key can be very long-lived, this is the context we loaded it in + private WeakReference requestContextWeakReference; + + SchemaCacheKey( + RequestContext requestContext, + SchemaObjectIdentifier schemaIdentifier, + Duration ttl, + boolean forceRefresh, + UserAgent userAgent) { + + this.schemaIdentifier = + Objects.requireNonNull(schemaIdentifier, "schemaIdentifier must not be null"); + this.ttl = Objects.requireNonNull(ttl, "ttl must not be null"); + this.forceRefresh = forceRefresh; + this.userAgent = userAgent; + // requestContext may be null, it is only used when we will need to load the schema object + this.requestContextWeakReference = new WeakReference<>(requestContext); + } + + SchemaObjectIdentifier schemaIdentifier() { + return schemaIdentifier; + } + + Optional requestContext() { + return Optional.ofNullable(requestContextWeakReference.get()); + } + + UserAgent userAgent() { + return userAgent; + } + + @Override + public Duration ttl() { + return ttl; + } + + @Override + public boolean forceRefresh() { + return forceRefresh; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof SchemaCacheKey that)) { + return false; + } + return schemaIdentifier.equals(that.schemaIdentifier); + } + + @Override + public int hashCode() { + return Objects.hash(schemaIdentifier); + } + + @Override + public String toString() { + return new StringBuilder() + .append("SchemaCacheKey{") + .append("schemaIdentifier=") + .append(schemaIdentifier) + .append(", ttl=") + .append(ttl) + .append(", userAgent='") + .append(userAgent) + .append("'}") + .toString(); + } + } + + /** + * SchemaChangeListener for the schema cache, this is used to evict the cache entries when we get + * messages from the DB that the schema has changed. + * + *

NOTE: This relies on the sessionName being set correctly which should be in {@link + * io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory} + * + *

A new schema change listener should be created for each CQL {@link Session} when it is + * created because the listener will first listen for {@link SchemaChangeListener#onSessionReady} + * and get the tenantID from the session name via {@link Session#getName}. + * + *

If the tenant is not set, null or blank, we log at ERROR rather than throw because the + * callback methods are called on driver async threads and exceptions there are unlikely to be + * passed back in the request response. + * + *

This could be non-static inner, but static to make testing easier so we can pass in the + * cache it is working with. + */ + static class SchemaCacheSchemaChangeListener extends SchemaChangeListenerBase { + + private static final Logger LOGGER = + LoggerFactory.getLogger(SchemaCacheSchemaChangeListener.class); + + private final SchemaObjectCache schemaObjectCache; + + // tenantID is nullable when there is a regular C* database + private boolean sessionReady = false; + private Tenant tenant = null; + + public SchemaCacheSchemaChangeListener(SchemaObjectCache schemaObjectCache) { + this.schemaObjectCache = + Objects.requireNonNull(schemaObjectCache, "schemaObjectCache must not be null"); + } + + private boolean isSessionReady(String context) { + if (!sessionReady) { + LOGGER.error( + "SchemaCacheSchemaChangeListener sessionReady is false when expected true - {}", + context); + return false; + } + return true; + } + + private void evictTable(String context, TableMetadata tableMetadata) { + if (isSessionReady(context)) { + schemaObjectCache.evictTable(tenant, tableMetadata.getKeyspace(), tableMetadata.getName()); + } + } + + private void evictKeyspace( + String context, KeyspaceMetadata keyspaceMetadata, boolean evictAll) { + if (isSessionReady(context)) { + schemaObjectCache.evictKeyspace(tenant, keyspaceMetadata.getName(), evictAll); + } + } + + @Override + public void onSessionReady(@NonNull Session session) { + // This is called when the session is ready, we can get the tenant from the session name + // and set it in the listener so we can use it in the other methods. + tenant = TenantFactory.instance().create(session.getName()); + sessionReady = true; + } + + /** + * When a table is dropped, evict from cache to reduce the size and avoid stale if it is + * re-created + */ + @Override + public void onTableDropped(@NonNull TableMetadata table) { + evictTable("onTableDropped", table); + } + + /** When a table is created, evict from cache to avoid stale if it was re-created */ + @Override + public void onTableCreated(@NonNull TableMetadata table) { + evictTable("onTableCreated", table); + } + + /** When a table is updated, evict from cache to avoid stale entries */ + @Override + public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadata previous) { + // table name can never change + evictTable("onTableUpdated", current); + } + + /** When keyspace dropped, we dont need any more of the tables in the cache */ + @Override + public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { + evictKeyspace("onKeyspaceDropped", keyspace, true); + } + + /** When keyspace created, evict KS and all other objects incase we missed the drop */ + @Override + public void onKeyspaceCreated(@NonNull KeyspaceMetadata keyspace) { + evictKeyspace("onKeyspaceCreated", keyspace, true); + } + + /** When keyspace updated, evict from cache incase stale keyspace or collections */ + @Override + public void onKeyspaceUpdated( + @NonNull KeyspaceMetadata current, @NonNull KeyspaceMetadata previous) { + evictKeyspace("onKeyspaceUpdated", current, false); + } + } + + /** Called to create a new session when one is needed. */ + interface SchemaObjectFactory { + CompletionStage apply( + RequestContext requestContext, SchemaObjectIdentifier identifier, boolean forceRefresh); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheSupplier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheSupplier.java new file mode 100644 index 0000000000..5bf59049b3 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheSupplier.java @@ -0,0 +1,41 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import io.micrometer.core.instrument.MeterRegistry; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; +import io.stargate.sgv2.jsonapi.config.OperationsConfig; +import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import java.time.Duration; +import java.util.function.Supplier; + +@ApplicationScoped +public class SchemaObjectCacheSupplier implements Supplier { + + private final SchemaObjectCache singleton; + + @Inject + public SchemaObjectCacheSupplier( + CqlSessionCacheSupplier cqlSessionCacheSupplier, + OperationsConfig operationsConfig, + MeterRegistry meterRegistry) { + + var dbConfig = operationsConfig.databaseConfig(); + + var factory = new SchemaObjectFactory(cqlSessionCacheSupplier.get()); + + this.singleton = + new SchemaObjectCache( + dbConfig.sessionCacheMaxSize(), + Duration.ofSeconds(dbConfig.sessionCacheTtlSeconds()), + operationsConfig.slaUserAgent().map(UserAgent::new).orElse(null), + Duration.ofSeconds(dbConfig.slaSessionCacheTtlSeconds()), + factory, + meterRegistry); + } + + @Override + public SchemaObjectCache get() { + return singleton; + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java new file mode 100644 index 0000000000..1ff2b6a8dc --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java @@ -0,0 +1,150 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import static io.stargate.sgv2.jsonapi.exception.ErrorFormatters.errFmtJoin; +import static io.stargate.sgv2.jsonapi.exception.ErrorFormatters.errVars; + +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.smallrye.mutiny.Uni; +import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.exception.SchemaException; +import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; +import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; +import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; +import java.util.Objects; +import java.util.concurrent.CompletionStage; + +/** + * Creates + */ +public class SchemaObjectFactory implements SchemaObjectCache.SchemaObjectFactory { + + private static final CollectionTableMatcher IS_COLLECTION_PREDICATE = + new CollectionTableMatcher(); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private final CQLSessionCache sessionCache; + + public SchemaObjectFactory(CQLSessionCache sessionCache) { + this.sessionCache = Objects.requireNonNull(sessionCache, "sessionCache must not be null"); + } + + @Override + public CompletionStage apply( + RequestContext requestContext, SchemaObjectIdentifier identifier, boolean forceRefresh) { + + Objects.requireNonNull(requestContext, "requestContext must not be null"); + Objects.requireNonNull(identifier, "identifier must not be null"); + + // sanity check + if (! requestContext.tenant().equals(identifier.tenant())){ + throw new IllegalArgumentException("requestContext and identifier tenant mismatch, requestContext: %s, identifier: %s" + .formatted(requestContext, identifier.tenant())); + } + + Uni uni = + switch (identifier.type()) { + case DATABASE -> createDatabaseSchemaObject(requestContext, identifier, forceRefresh); + case KEYSPACE -> createKeyspaceSchemaObject(requestContext, identifier, forceRefresh); + case TABLE -> + createTableBasedSchemaObject(requestContext, identifier, forceRefresh) + .invoke( + tbso -> { + if (tbso.type() != SchemaObjectType.TABLE) { + throw new SchemaObjectTypeMismatchException( + SchemaObjectType.TABLE, tbso.type()); + } + }); + case COLLECTION -> + createTableBasedSchemaObject(requestContext, identifier, forceRefresh) + .invoke( + tbso -> { + if (tbso.type() != SchemaObjectType.COLLECTION) { + throw new SchemaObjectTypeMismatchException( + SchemaObjectType.COLLECTION, tbso.type()); + } + }); + default -> + throw new IllegalArgumentException( + "Unsupported schema object type: " + identifier.type()); + }; + return uni.map(obj -> (SchemaObject) obj).subscribeAsCompletionStage(); + } + + private Uni createDatabaseSchemaObject( + RequestContext requestContext, SchemaObjectIdentifier identifier, boolean forceRefresh) { + + // currently nothing to read for a database schema object + return Uni.createFrom().item(() -> new DatabaseSchemaObject(identifier)); + } + + private Uni createKeyspaceSchemaObject( + RequestContext requestContext, SchemaObjectIdentifier identifier, boolean forceRefresh) { + + // currently nothing to read for a keyspace schema object + return getKeyspaceMetadata(requestContext, identifier, forceRefresh) + .map( + keyspaceMetadata -> + new KeyspaceSchemaObject(requestContext.tenant(), keyspaceMetadata)); + } + + private Uni createTableBasedSchemaObject( + RequestContext requestContext, UnscopedSchemaObjectIdentifier scopedName, boolean forceRefresh) { + + return getKeyspaceMetadata(requestContext, scopedName, forceRefresh) + .map( + keyspaceMetadata -> { + var tableMetadata = + keyspaceMetadata + .getTable(scopedName.objectName()) + .orElseThrow( + () -> { + var allTables = + keyspaceMetadata.getTables().keySet().stream() + .sorted(CqlIdentifierUtil.CQL_IDENTIFIER_COMPARATOR) + .map(CqlIdentifierUtil::cqlIdentifierToMessageString) + .toList(); + return SchemaException.Code.UNKNOWN_COLLECTION_OR_TABLE.get( + errVars( + scopedName, + vars -> vars.put("allTables", errFmtJoin(allTables)))); + }); + return IS_COLLECTION_PREDICATE.test(tableMetadata) + ? CollectionSchemaObject.getCollectionSettings( + requestContext.tenant(), tableMetadata, OBJECT_MAPPER) + : TableSchemaObject.from( + requestContext.tenant(), tableMetadata, OBJECT_MAPPER); + }); + } + + private Uni getKeyspaceMetadata( + RequestContext requestContext, UnscopedSchemaObjectIdentifier scopedName, boolean forceRefresh) { + + var queryExecutor = + new CommandQueryExecutor( + sessionCache, + new CommandQueryExecutor.DBRequestContext(requestContext), + CommandQueryExecutor.QueryTarget.SCHEMA); + + return queryExecutor + .getKeyspaceMetadata(scopedName.keyspace(), forceRefresh) + .map( + optKeyspace -> + optKeyspace.orElseThrow( + () -> SchemaException.Code.UNKNOWN_KEYSPACE.get(errVars(scopedName)))); + } + + static class SchemaObjectTypeMismatchException extends RuntimeException { + + SchemaObjectTypeMismatchException(SchemaObjectType expected, SchemaObjectType actual) { + super( + String.format( + "Expected schema object type %s but got %s", expected.apiName(), actual.apiName())); + } + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java new file mode 100644 index 0000000000..8217c4df0c --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java @@ -0,0 +1,237 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; +import static io.stargate.sgv2.jsonapi.util.StringUtil.normalizeOptionalString; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.google.common.base.Preconditions; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.logging.LoggingMDCContext; +import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; +import io.stargate.sgv2.jsonapi.util.recordable.Recordable; +import java.util.Objects; +import javax.annotation.Nullable; +import org.slf4j.MDC; + +/** + * Identifies a {@link SchemaObject} in the API, which can be a database, keyspace, collection, etc. + *

+ * Schema objects are identified by their type, name, and importantly, the tenant they belong to. So an identifier + * is unique and stable for all tenants in a single instance of the API. + *

+ *

+ * Create using the factory methods, such as {@link #forDatabase(Tenant)} which validate the data that is needed. + *

+ * use {@link #fullName()} or {@link #toString()} to get a human-readable representation of the identifier, such as + * keyspace_name.table_name + *

+ * Note: You should compare and manages the identifiers as objects using + * the {@link #equals(Object)} and {@link #hashCode()} methods, which include the tenant etc in the logic. + * Avoid comparing the individual fields, such as {@link #tenant()}, {@link #keyspace()} or {@link #table()}. + * + */ +public class SchemaObjectIdentifier implements UnscopedSchemaObjectIdentifier, Recordable, LoggingMDCContext { + + private final SchemaObjectType type; + private final Tenant tenant; + private final CqlIdentifier keyspace; + private final CqlIdentifier table; + + private final String fullName; + + private SchemaObjectIdentifier( + SchemaObjectType type, Tenant tenant, CqlIdentifier keyspace, CqlIdentifier table) { + + this.type = type; + this.tenant = tenant; + this.keyspace = keyspace; + this.table = table; + + this.fullName = + switch (type) { + case DATABASE -> "db:" + tenant; + case KEYSPACE -> cqlIdentifierToMessageString(keyspace); + case COLLECTION, TABLE, INDEX -> + cqlIdentifierToMessageString(keyspace) + "." + cqlIdentifierToMessageString(table); + }; + } + + /** + * Creates a {@link SchemaObjectIdentifier} for a database. + */ + public static SchemaObjectIdentifier forDatabase(Tenant tenant) { + + checkTenantId(tenant); + return new SchemaObjectIdentifier(SchemaObjectType.DATABASE, tenant, null, null); + } + + /** + * Creates a {@link SchemaObjectIdentifier} for a keyspace. + */ + public static SchemaObjectIdentifier forKeyspace(Tenant tenant, CqlIdentifier keyspace) { + + checkTenantId(tenant); + checkKeyspaceName(keyspace); + return new SchemaObjectIdentifier(SchemaObjectType.KEYSPACE, tenant, keyspace, null); + } + + /** + * Creates a {@link SchemaObjectIdentifier} for a collection. + */ + public static SchemaObjectIdentifier forCollection( + Tenant tenant, CqlIdentifier keyspace, CqlIdentifier collection) { + + checkTenantId(tenant); + checkKeyspaceName(keyspace); + checkTableName("collection", collection); + return new SchemaObjectIdentifier(SchemaObjectType.COLLECTION, tenant, keyspace, collection); + } + + /** + * Creates a {@link SchemaObjectIdentifier} for a table. + */ + public static SchemaObjectIdentifier forTable( + Tenant tenant, CqlIdentifier keyspace, CqlIdentifier table) { + + checkTenantId(tenant); + checkKeyspaceName(keyspace); + checkTableName("table", table); + return new SchemaObjectIdentifier(SchemaObjectType.TABLE, tenant, keyspace, table); + } + + /** + * Creates a {@link SchemaObjectIdentifier} using CQL TableMetadata to get the name parts. + */ + public static SchemaObjectIdentifier fromTableMetadata( + SchemaObjectType type, Tenant tenant, TableMetadata tableMetadata) { + + checkTenantId(tenant); + Objects.requireNonNull(tableMetadata, "tableMetadata must not be null"); + + return switch (type) { + case TABLE -> forTable(tenant, tableMetadata.getKeyspace(), tableMetadata.getName()); + case COLLECTION -> + forCollection(tenant, tableMetadata.getKeyspace(), tableMetadata.getName()); + default -> throw new IllegalArgumentException("fromTableMetadata() - Unsupported object type: " + type); + }; + } + + public SchemaObjectType type() { + return type; + } + + /** + * The full name of the schema object, this is also returned from {@link #toString()}.: + * + */ + public String fullName() { + return fullName; + } + + public Tenant tenant() { + return tenant; + } + + /** + * Gets the {@link SchemaObjectIdentifier} for the keyspace that contains this schema object. + */ + public SchemaObjectIdentifier keyspaceIdentifier() { + return forKeyspace(tenant, keyspace); + } + + @Override + public CqlIdentifier keyspace() { + return keyspace; + } + + @Nullable + public CqlIdentifier table() { + return table; + } + + /** + * Same as {@link #table()} , part of the {@link UnscopedSchemaObjectIdentifier} interface. + */ + @Override + public CqlIdentifier objectName() { + return table; + } + + /** + * Tests if this identifier is from the same tenant AND keyspace as another identifier. + */ + public boolean isSameKeyspace(SchemaObjectIdentifier other) { + return Objects.equals(tenant, other.tenant) && Objects.equals(keyspace, other.keyspace); + } + + private static void checkTenantId(Tenant tenant) { + Objects.requireNonNull(tenant, "tenant name must not be null"); + } + + private static void checkKeyspaceName(CqlIdentifier keyspace) { + Objects.requireNonNull(keyspace, "keyspace name must not be null"); + Preconditions.checkArgument( + !keyspace.asInternal().isBlank(), "keyspace name must not be blank"); + } + + private static void checkTableName(String context, CqlIdentifier table) { + Objects.requireNonNull(table, context + " name must not be null"); + Preconditions.checkArgument(!table.asInternal().isBlank(), context + " name must not be blank"); + } + + @Override + public void addToMDC() { + // NOTE: MUST stay as namespace for logging analysis + MDC.put("namespace", keyspace.asInternal()); + + // NOTE: MUST stay as collection for logging analysis + MDC.put("collection", normalizeOptionalString(table == null ? null : table.asInternal())); + } + + @Override + public void removeFromMDC() { + MDC.remove("namespace"); + MDC.remove("collection"); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof SchemaObjectIdentifier that)) { + return false; + } + return Objects.equals(type, that.type) + && Objects.equals(tenant, that.tenant) + && Objects.equals(keyspace, that.keyspace) + && Objects.equals(table, that.table); + } + + @Override + public int hashCode() { + return Objects.hash(type, tenant, keyspace, table); + } + + /** + * Gets the {@link #fullName()} + */ + @Override + public String toString() { + return fullName(); + } + + @Override + public DataRecorder recordTo(DataRecorder dataRecorder) { + return dataRecorder + .append("tenant", tenant) + .append("type", type) + .append("keyspace", keyspace) + .append("table", table); + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java new file mode 100644 index 0000000000..08a0fbd22a --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java @@ -0,0 +1,37 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import java.util.Objects; + +/** + * The types of schema object that are used in the API + */ +public enum SchemaObjectType { + + COLLECTION(Constants.COLLECTION), + DATABASE(Constants.DATABASE), + INDEX(Constants.INDEX), + KEYSPACE(Constants.KEYSPACE), + TABLE(Constants.TABLE), + UDT(Constants.UDT); + + /** Constants so the public HTTP API objects can use the same values. */ + public interface Constants { + String COLLECTION = "Collection"; + String DATABASE = "Database"; + String INDEX = "Index"; + String KEYSPACE = "Keyspace"; + String TABLE = "Table"; + String UDT = "Udt"; + } + + private final String apiName; + + SchemaObjectType(String apiName) { + this.apiName = Objects.requireNonNull(apiName, "apiName must not be null"); + } + + /** Gets the name to use when identifying this schema object type in the public API. */ + public String apiName() { + return apiName; + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java new file mode 100644 index 0000000000..1bb08bf7a3 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java @@ -0,0 +1,37 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; + +import java.util.Objects; + +/** + * An identifier for a schema object that is not scoped to a + * {@link io.stargate.sgv2.jsonapi.api.request.tenant.Tenant}. + *

+ * We only have the Keyspace and object name, such as the table name, we do now know who it belongs to. + * This is used by the SchemaObjectCache due to issues with not knowing if a CQL table is a + * API Collection or API Table. See {@link SchemaObjectCache#getTableBased(RequestContext, UnscopedSchemaObjectIdentifier, UserAgent, boolean)} + */ +public interface UnscopedSchemaObjectIdentifier { + + /** + * The keyspace that this object belongs to. + */ + CqlIdentifier keyspace(); + + /** + * The name of the object, such as a table or index. + */ + CqlIdentifier objectName(); + + record DefaultKeyspaceScopedName(CqlIdentifier keyspace, CqlIdentifier objectName) + implements UnscopedSchemaObjectIdentifier { + + public DefaultKeyspaceScopedName { + Objects.requireNonNull(keyspace, "keyspace must not be null"); + Objects.requireNonNull(objectName, "objectName must not be null"); + } + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java index 30268e073d..60bc89c603 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java @@ -1,6 +1,7 @@ package io.stargate.sgv2.jsonapi.service.schema.collections; import static io.stargate.sgv2.jsonapi.config.constants.DocumentConstants.Fields.VECTOR_EMBEDDING_TEXT_FIELD; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; @@ -10,17 +11,19 @@ import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateCollectionCommand; import io.stargate.sgv2.jsonapi.api.model.command.impl.VectorizeConfig; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.config.constants.TableCommentConstants; import io.stargate.sgv2.jsonapi.config.constants.VectorConstants; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; import io.stargate.sgv2.jsonapi.service.projection.IndexingProjector; -import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; -import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; +import io.stargate.sgv2.jsonapi.service.schema.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; import java.util.Map; @@ -34,19 +37,17 @@ */ public final class CollectionSchemaObject extends TableBasedSchemaObject { - public static final SchemaObjectType TYPE = SchemaObjectType.COLLECTION; - // Collection Schema to use if all information missing: Vector not configured, // no Lexical enabled - public static final CollectionSchemaObject MISSING = - new CollectionSchemaObject( - SchemaObjectName.MISSING, - null, - IdConfig.defaultIdConfig(), - VectorConfig.NOT_ENABLED_CONFIG, - null, - CollectionLexicalConfig.configForDisabled(), - CollectionRerankDef.configForDisabled()); + // public static final CollectionSchemaObject MISSING = + // new CollectionSchemaObject( + // SchemaObjectIdentifier.MISSING, + // null, + // IdConfig.defaultIdConfig(), + // VectorConfig.NOT_ENABLED_CONFIG, + // null, + // CollectionLexicalConfig.configForDisabled(), + // CollectionRerankDef.configForDisabled()); private final IdConfig idConfig; private final VectorConfig vectorConfig; @@ -60,54 +61,77 @@ public final class CollectionSchemaObject extends TableBasedSchemaObject { * @param indexingConfig */ public CollectionSchemaObject( - String keypaceName, - String name, + Tenant tenant, TableMetadata tableMetadata, IdConfig idConfig, VectorConfig vectorConfig, CollectionIndexingConfig indexingConfig, CollectionLexicalConfig lexicalConfig, CollectionRerankDef rerankDef) { - this( - new SchemaObjectName(keypaceName, name), - tableMetadata, - idConfig, - vectorConfig, - indexingConfig, - lexicalConfig, - rerankDef); + + super(SchemaObjectType.COLLECTION, tenant, tableMetadata); + + this.idConfig = idConfig; + this.vectorConfig = vectorConfig; + this.indexingConfig = indexingConfig; + this.tableMetadata = tableMetadata; + this.lexicalConfig = Objects.requireNonNull(lexicalConfig); + this.rerankDef = Objects.requireNonNull(rerankDef); } + /** + * we have a lot of old tests that created a collection without having table meta data. Use the + * ctor with TableMetadata in prod code + */ + @VisibleForTesting public CollectionSchemaObject( - SchemaObjectName name, - TableMetadata tableMetadata, + SchemaObjectIdentifier identifier, IdConfig idConfig, VectorConfig vectorConfig, CollectionIndexingConfig indexingConfig, CollectionLexicalConfig lexicalConfig, CollectionRerankDef rerankDef) { - super(TYPE, name, tableMetadata); + + super(SchemaObjectType.COLLECTION, identifier); this.idConfig = idConfig; this.vectorConfig = vectorConfig; this.indexingConfig = indexingConfig; - this.tableMetadata = tableMetadata; + this.tableMetadata = null; this.lexicalConfig = Objects.requireNonNull(lexicalConfig); this.rerankDef = Objects.requireNonNull(rerankDef); } + // public CollectionSchemaObject( + // SchemaObjectIdentifier name, + // TableMetadata tableMetadata, + // IdConfig idConfig, + // VectorConfig vectorConfig, + // CollectionIndexingConfig indexingConfig, + // CollectionLexicalConfig lexicalConfig, + // CollectionRerankDef rerankDef) { + // super(TYPE, name, tableMetadata); + // + // this.idConfig = idConfig; + // this.vectorConfig = vectorConfig; + // this.indexingConfig = indexingConfig; + // this.tableMetadata = tableMetadata; + // this.lexicalConfig = Objects.requireNonNull(lexicalConfig); + // this.rerankDef = Objects.requireNonNull(rerankDef); + // } + // TODO: remove this, it is just here for testing and can be handled by creating test data // effectively - public CollectionSchemaObject withIdType(CollectionIdType idType) { - return new CollectionSchemaObject( - name(), - tableMetadata, - new IdConfig(idType), - vectorConfig, - indexingConfig, - lexicalConfig, - rerankDef); - } + // public CollectionSchemaObject withIdType(CollectionIdType idType) { + // return new CollectionSchemaObject( + // name(), + // tableMetadata, + // new IdConfig(idType), + // vectorConfig, + // indexingConfig, + // lexicalConfig, + // rerankDef); + // } /** * Method for constructing a new CollectionSchemaObject with overrides for Lexical and Rerank @@ -116,7 +140,7 @@ public CollectionSchemaObject withIdType(CollectionIdType idType) { public CollectionSchemaObject withLexicalAndRerankOverrides( CollectionLexicalConfig lexicalOverride, CollectionRerankDef rerankOverride) { return new CollectionSchemaObject( - name(), + identifier().tenant(), tableMetadata, idConfig, vectorConfig, @@ -187,7 +211,7 @@ public IndexingProjector indexingProjector() { // } public static CollectionSchemaObject getCollectionSettings( - TableMetadata table, ObjectMapper objectMapper) { + Tenant tenant, TableMetadata table, ObjectMapper objectMapper) { // [jsonapi#639]: get internal name to avoid quoting of case-sensitive names String keyspaceName = table.getKeyspace().asInternal(); String collectionName = table.getName().asInternal(); @@ -230,6 +254,7 @@ public static CollectionSchemaObject getCollectionSettings( } } return createCollectionSettings( + tenant, keyspaceName, collectionName, table, @@ -241,6 +266,7 @@ public static CollectionSchemaObject getCollectionSettings( objectMapper); } else { // if not vector collection return createCollectionSettings( + tenant, keyspaceName, collectionName, table, @@ -254,6 +280,7 @@ public static CollectionSchemaObject getCollectionSettings( } public static CollectionSchemaObject getCollectionSettings( + Tenant tenant, String keyspaceName, String collectionName, TableMetadata tableMetadata, @@ -264,6 +291,7 @@ public static CollectionSchemaObject getCollectionSettings( String comment, ObjectMapper objectMapper) { return createCollectionSettings( + tenant, keyspaceName, collectionName, tableMetadata, @@ -276,6 +304,7 @@ public static CollectionSchemaObject getCollectionSettings( } private static CollectionSchemaObject createCollectionSettings( + Tenant tenant, String keyspaceName, String collectionName, TableMetadata tableMetadata, @@ -293,8 +322,7 @@ private static CollectionSchemaObject createCollectionSettings( CollectionRerankDef rerankingConfig = CollectionRerankDef.configForPreRerankingCollection(); if (vectorEnabled) { return new CollectionSchemaObject( - keyspaceName, - collectionName, + tenant, tableMetadata, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( @@ -310,8 +338,7 @@ private static CollectionSchemaObject createCollectionSettings( rerankingConfig); } else { return new CollectionSchemaObject( - keyspaceName, - collectionName, + tenant, tableMetadata, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, @@ -340,7 +367,12 @@ private static CollectionSchemaObject createCollectionSettings( case 1: return new CollectionSettingsV1Reader() .readCollectionSettings( - collectionNode, keyspaceName, collectionName, tableMetadata, objectMapper); + tenant, + collectionNode, + keyspaceName, + collectionName, + tableMetadata, + objectMapper); default: throw ErrorCodeV1.INVALID_SCHEMA_VERSION.toApiException(); } @@ -349,6 +381,7 @@ private static CollectionSchemaObject createCollectionSettings( // sample comment : {"indexing":{"deny":["address"]}}} return new CollectionSettingsV0Reader() .readCollectionSettings( + tenant, commentConfigNode, keyspaceName, collectionName, @@ -430,7 +463,8 @@ public static CreateCollectionCommand collectionSettingToCreateCollectionCommand // CreateCollectionCommand object is created for convenience to generate json // response. The code is not creating a collection here. - return new CreateCollectionCommand(collectionSetting.name.table(), options); + return new CreateCollectionCommand( + cqlIdentifierToMessageString(collectionSetting.identifier().table()), options); } public IdConfig idConfig() { @@ -465,7 +499,7 @@ public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || obj.getClass() != this.getClass()) return false; var that = (CollectionSchemaObject) obj; - return Objects.equals(this.name, that.name) + return Objects.equals(this.identifier(), that.identifier()) && Objects.equals(this.idConfig, that.idConfig) && Objects.equals(this.vectorConfig, that.vectorConfig) && Objects.equals(this.indexingConfig, that.indexingConfig) @@ -475,14 +509,14 @@ public boolean equals(Object obj) { @Override public int hashCode() { - return Objects.hash(name, idConfig, vectorConfig, indexingConfig); + return Objects.hash(identifier(), idConfig, vectorConfig, indexingConfig); } @Override public String toString() { return "CollectionSchemaObject[" - + "name=" - + name + + "identifier=" + + identifier() + ", " + "idConfig=" + idConfig diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java index d71620cd5d..bd89809175 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java @@ -1,10 +1,10 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Collection name. */ public class CollectionNamingRule extends SchemaObjectNamingRule { public CollectionNamingRule() { - super(SchemaObject.SchemaObjectType.COLLECTION); + super(SchemaObjectType.COLLECTION); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java index c029d23abc..596e5e3e01 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java @@ -1,13 +1,13 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Index name. */ public class IndexNamingRule extends SchemaObjectNamingRule { private static final int MAX_INDEX_NAME_LENGTH = 100; public IndexNamingRule() { - super(SchemaObject.SchemaObjectType.INDEX); + super(SchemaObjectType.INDEX); } @Override diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java index fe48883897..626d758990 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java @@ -1,10 +1,10 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Keyspace name. */ public class KeyspaceNamingRule extends SchemaObjectNamingRule { public KeyspaceNamingRule() { - super(SchemaObject.SchemaObjectType.KEYSPACE); + super(SchemaObjectType.KEYSPACE); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java index 0fe4bea2b1..3f849a667a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java @@ -2,7 +2,9 @@ import io.stargate.sgv2.jsonapi.exception.ErrorTemplate; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; + import java.util.Map; import java.util.regex.Pattern; @@ -23,9 +25,9 @@ public abstract class SchemaObjectNamingRule extends NamingRule { private static final int MAX_NAME_LENGTH = 48; private static final Pattern PATTERN_WORD_CHARS = Pattern.compile("\\w+"); - private final SchemaObject.SchemaObjectType schemaType; + private final SchemaObjectType schemaType; - public SchemaObjectNamingRule(SchemaObject.SchemaObjectType schemaType) { + public SchemaObjectNamingRule(SchemaObjectType schemaType) { super(schemaType.name()); this.schemaType = schemaType; } @@ -33,7 +35,7 @@ public SchemaObjectNamingRule(SchemaObject.SchemaObjectType schemaType) { /** * @return the type of schema object that this rule is applied to */ - public SchemaObject.SchemaObjectType schemaType() { + public SchemaObjectType schemaType() { return schemaType; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java index 9c343e6ac8..de3b317490 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java @@ -1,10 +1,10 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Table name. */ public class TableNamingRule extends SchemaObjectNamingRule { public TableNamingRule() { - super(SchemaObject.SchemaObjectType.TABLE); + super(SchemaObjectType.TABLE); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java index 0d4926749d..d93a98682d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java @@ -1,10 +1,11 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; public class UdtNamingRule extends SchemaObjectNamingRule { public UdtNamingRule() { - super(SchemaObject.SchemaObjectType.UDT); + super(SchemaObjectType.UDT); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java index 1d83ac738d..a6b4622270 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromIndexDesc; import io.stargate.sgv2.jsonapi.util.ApiOptionUtils; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java index b63bfcfd6a..1d07bb0309 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java @@ -18,7 +18,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromIndexDesc; import io.stargate.sgv2.jsonapi.util.JsonUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java index 11e1ee7ef1..589a7a4341 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java @@ -13,7 +13,7 @@ import io.stargate.sgv2.jsonapi.config.constants.VectorConstants; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java new file mode 100644 index 0000000000..a28e580398 --- /dev/null +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java @@ -0,0 +1,50 @@ +package io.stargate.sgv2.jsonapi.service.schema.tables; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.google.common.annotations.VisibleForTesting; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; + +import java.util.Objects; + +/** + * Common base for a Collection and Table, which are both a CQL Table. + */ +public abstract class TableBasedSchemaObject extends SchemaObject { + + private final TableMetadata tableMetadata; + + protected TableBasedSchemaObject( + SchemaObjectType type, Tenant tenant, TableMetadata tableMetadata) { + super(type, SchemaObjectIdentifier.fromTableMetadata(type, tenant, tableMetadata)); + + this.tableMetadata = Objects.requireNonNull(tableMetadata, "tableMetadata must not be null"); + } + + /** + * For old tests that do not have the table metadata + */ + @VisibleForTesting + protected TableBasedSchemaObject( + SchemaObjectType expectedType, + SchemaObjectIdentifier schemaObjectIdentifier) { + super(expectedType, schemaObjectIdentifier); + + this.tableMetadata = null; + } + + public CqlIdentifier keyspaceName() { + return tableMetadata.getKeyspace(); + } + + public CqlIdentifier tableName() { + return tableMetadata.getName(); + } + + public TableMetadata tableMetadata() { + return tableMetadata; + } +} diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java similarity index 63% rename from src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableSchemaObject.java rename to src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java index 6fbf96d1d5..9a1692a5f6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java @@ -1,8 +1,11 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; +package io.stargate.sgv2.jsonapi.service.schema.tables; import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import com.fasterxml.jackson.databind.ObjectMapper; -import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,14 +13,15 @@ public class TableSchemaObject extends TableBasedSchemaObject { private static final Logger LOGGER = LoggerFactory.getLogger(TableSchemaObject.class); - public static final SchemaObjectType TYPE = SchemaObjectType.TABLE; - private final VectorConfig vectorConfig; private final ApiTableDef apiTableDef; private TableSchemaObject( - TableMetadata tableMetadata, VectorConfig vectorConfig, ApiTableDef apiTableDef) { - super(TYPE, tableMetadata); + Tenant tenant, + TableMetadata tableMetadata, + VectorConfig vectorConfig, + ApiTableDef apiTableDef) { + super(SchemaObjectType.TABLE, tenant, tableMetadata); this.vectorConfig = vectorConfig; this.apiTableDef = apiTableDef; } @@ -37,11 +41,12 @@ public ApiTableDef apiTableDef() { } /** Get table schema object from table metadata */ - public static TableSchemaObject from(TableMetadata tableMetadata, ObjectMapper objectMapper) { + public static TableSchemaObject from( + Tenant tenant, TableMetadata tableMetadata, ObjectMapper objectMapper) { var vectorConfig = VectorConfig.from(tableMetadata, objectMapper); var apiTableDef = ApiTableDef.FROM_CQL_FACTORY.create(tableMetadata, vectorConfig); - return new TableSchemaObject(tableMetadata, vectorConfig, apiTableDef); + return new TableSchemaObject(tenant, tableMetadata, vectorConfig, apiTableDef); } @Override diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java index 41796c5e01..7de962059d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java @@ -6,7 +6,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.definition.indexes.IndexDefinitionDesc; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedUserIndexException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java index 3b6e50faf4..2c70cbf7b1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java @@ -12,7 +12,7 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.embeddings.EmbeddingDeferredAction; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodec; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java index d7d2f0b9ea..618c5ef439 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonLiteral; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonPath; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java index 563d3dab1a..775d1a730d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java @@ -2,7 +2,7 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.RequestException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java index dd914651a9..04181a8002 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java @@ -3,7 +3,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.internal.core.util.Strings; import io.stargate.sgv2.jsonapi.exception.RequestException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValueContainer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/JsonNamedValueContainerFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/JsonNamedValueContainerFactory.java index 28f5823069..190d8b6763 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/JsonNamedValueContainerFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/JsonNamedValueContainerFactory.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.service.shredding.tables; import com.fasterxml.jackson.databind.JsonNode; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.JsonNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.JsonNamedValueContainer; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/WriteableTableRow.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/WriteableTableRow.java index c320739322..7bf258e9a1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/WriteableTableRow.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/WriteableTableRow.java @@ -1,6 +1,6 @@ package io.stargate.sgv2.jsonapi.service.shredding.tables; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.*; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/CqlIdentifierUtil.java b/src/main/java/io/stargate/sgv2/jsonapi/util/CqlIdentifierUtil.java index 7a58f34d80..88843f59bf 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/util/CqlIdentifierUtil.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/CqlIdentifierUtil.java @@ -25,7 +25,7 @@ public static CqlIdentifier cqlIdentifierFromIndexTarget(String name) { } public static String cqlIdentifierToMessageString(CqlIdentifier identifier) { - return identifier.asCql(true); + return identifier == null ? "null" : identifier.asCql(true); } /** Returns the API representation of a CQL identifier. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java index a33219e823..f34b910db9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java @@ -21,6 +21,7 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.Executor; import java.util.function.Function; +import java.util.function.Predicate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -181,6 +182,10 @@ protected boolean evict(KeyT key) { return entryFound; } + protected void evictIf(Predicate predicate) { + cache.synchronous().asMap().keySet().removeIf(predicate); + } + /** * Process a key being removed from the cache for any reason. * diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/recordable/Recordable.java b/src/main/java/io/stargate/sgv2/jsonapi/util/recordable/Recordable.java index c51ec429a8..858478f3ff 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/util/recordable/Recordable.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/recordable/Recordable.java @@ -22,7 +22,7 @@ public interface Recordable { /** - * Called for the implementer to record its data to the {@link DataRecorder}, values should be + * Called for the implementer to record it's data to the {@link DataRecorder}, values should be * appended using {@link DataRecorder#append(String, Object)}. Values that implement {@link * Recordable} will be added as a sub object. * diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java b/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java index 232a7fc087..c4f0547114 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java index 6a267769ec..694a6799ba 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java @@ -7,7 +7,7 @@ import io.stargate.sgv2.jsonapi.fixtures.identifiers.BaseFixtureIdentifiers; import io.stargate.sgv2.jsonapi.fixtures.identifiers.FixtureIdentifiers; import io.stargate.sgv2.jsonapi.fixtures.tables.TableFixture; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java index 53052200f7..f6fe3337a3 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.fixtures.testdata; import com.fasterxml.jackson.databind.ObjectMapper; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; public class SchemaObjectTestData extends TestDataSuplier { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java index bbb64b4c4d..e72fd45355 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.resolver.update.TableUpdateAnalyzer; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java index 5cd28e6ccd..ae14d10a63 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java @@ -10,7 +10,7 @@ import com.datastax.oss.driver.internal.querybuilder.select.DefaultSelect; import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.tables.TableWhereCQLClause; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java index 7de29e3961..664ef25b26 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java index 8f9189b4ae..b46bf77afc 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.tables.TableWhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tables.WhereCQLClauseAnalyzer; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java index b3e65f1fe3..816901941a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java @@ -1,7 +1,7 @@ package io.stargate.sgv2.jsonapi.fixtures.testdata; import com.datastax.oss.driver.api.querybuilder.select.Select; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import java.util.List; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java index 076cd04922..19ecfc572b 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java @@ -20,8 +20,7 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.serializer.CQLBindValues; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionLexicalConfig; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java index 43a1636f87..8186e2b61a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java @@ -10,9 +10,9 @@ import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WarningException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.time.Duration; import java.util.Objects; @@ -43,7 +43,7 @@ public static TableSchemaObject mockTable(String keyspaceName, String tableName) when(mockTable.keyspaceName()).thenReturn(CqlIdentifier.fromInternal(keyspaceName)); when(mockTable.tableName()).thenReturn(CqlIdentifier.fromInternal(tableName)); - when(mockTable.type()).thenReturn(SchemaObject.SchemaObjectType.TABLE); + when(mockTable.type()).thenReturn(SchemaObjectType.TABLE); when(mockTable.name()).thenReturn(new SchemaObjectName(keyspaceName, tableName)); return mockTable; } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestData.java index 01f813efea..3982dabf0e 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestData.java @@ -3,7 +3,7 @@ import static org.mockito.Mockito.*; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.time.Duration; public class BaseTaskTestData { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestTask.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestTask.java index 412c0c1d37..d92c539e1a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestTask.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskTestTask.java @@ -2,7 +2,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * Test task for testing the core functionality of the {@link BaseTask} - not testing any of the diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DriverExceptionHandlerAssertions.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DriverExceptionHandlerAssertions.java index 6a1fd51434..4297cc5919 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DriverExceptionHandlerAssertions.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DriverExceptionHandlerAssertions.java @@ -6,7 +6,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskAssertions.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskAssertions.java index 5dd1d154cb..e7e6cb9ae0 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskAssertions.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskAssertions.java @@ -11,7 +11,7 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Objects; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java index a66dbd5779..bb60e0714c 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java index 1bc8e695f0..d811a3265a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java @@ -4,7 +4,7 @@ import com.datastax.oss.driver.api.querybuilder.select.Select; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.ReadDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.*; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupTest.java index 37d5b0064c..25bf2ca91e 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskGroupTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Test; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java index ce3e6bc894..4ea2036848 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java @@ -13,7 +13,7 @@ import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java index 0797ed4991..dd53399b42 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java @@ -4,8 +4,8 @@ import static org.mockito.Mockito.when; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject.SchemaObjectType; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; /** Tests data and mocks for working with {@link SchemaObject} */ diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java index c8cb864013..a6c3c3cab1 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java @@ -13,8 +13,7 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.CreateCollectionOperation; import jakarta.inject.Inject; import org.apache.commons.lang3.RandomStringUtils; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java index e4972ff9fd..5def26a05a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java @@ -10,7 +10,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateNamespaceCommand; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java index 7ce1a00ad7..df05e18998 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java @@ -8,8 +8,7 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteCollectionCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionCollectionOperation; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java index d8845f55a8..96babe10d0 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java @@ -8,7 +8,7 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DatabaseSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java index 160b98afa5..93e4844deb 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java @@ -8,8 +8,7 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCollectionsCommand; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; -import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionsCollectionOperation; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java index 1c7919871f..2c8a3ee416 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java @@ -14,7 +14,7 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.definition.datatype.MapComponentDesc; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java index 8e82f4380d..209d4a76ce 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java @@ -12,7 +12,7 @@ import io.stargate.sgv2.jsonapi.exception.UpdateException; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestDataSuplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java new file mode 100644 index 0000000000..6c23c9960d --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java @@ -0,0 +1,449 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.github.benmanes.caffeine.cache.Ticker; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import io.stargate.sgv2.jsonapi.api.request.RequestContext; +import io.stargate.sgv2.jsonapi.api.request.UserAgent; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; +import io.stargate.sgv2.jsonapi.config.DatabaseType; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; +import io.stargate.sgv2.jsonapi.util.CacheTestsBase; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; + + +/** + * Tests for the {@link SchemaObjectCache.SchemaCacheSchemaChangeListener} to evict and clear items + * see XXX for tests on the cache directly. + */ +public class SchemaObjectCacheChangeListenerTests extends CacheTestsBase { + private static final Logger LOGGER = LoggerFactory.getLogger(SchemaObjectCacheChangeListenerTests.class); + + + private final UserAgent SLA_USER_AGENT = + new UserAgent("user-agent/" + TEST_CONSTANTS.CORRELATION_ID); + + private final Tenant OTHER_TENANT = + Tenant.create(DatabaseType.ASTRA, "other-tenantFixture-" + TEST_CONSTANTS.CORRELATION_ID); + + private final SchemaObjectIdentifier TABLE_1_IDENTIFIER = TEST_CONSTANTS.TABLE_IDENTIFIER; + + private final SchemaObjectIdentifier TABLE_2_IDENTIFIER = + SchemaObjectIdentifier.forTable( + TEST_CONSTANTS.TENANT, + TABLE_1_IDENTIFIER.keyspace(), + CqlIdentifier.fromInternal("table2")); + + // NOTE: actual table name is the same as TABLE_1_IDENTIFIER, but in a different tenant! + private final SchemaObjectIdentifier TABLE_OTHER_IDENTIFIER = + SchemaObjectIdentifier.forTable( + OTHER_TENANT, TABLE_1_IDENTIFIER.keyspace(), TABLE_1_IDENTIFIER.table()); + + private final SchemaObjectIdentifier KEYSPACE_1_IDENTIFIER = + TABLE_1_IDENTIFIER.keyspaceIdentifier(); + + private final SchemaObjectIdentifier KEYSPACE_OTHER_IDENTIFIER = + TABLE_OTHER_IDENTIFIER.keyspaceIdentifier(); + + @BeforeEach + public void setUp() { + // the listener needs to create tenants, and it uses this factory + TenantFactory.initialize(TEST_CONSTANTS.DATABASE_TYPE); + } + + @AfterEach + public void reset() { + TenantFactory.reset(); + } + + + @Test + public void silentFailWhenOnSessionReadyNotCalled() { + + var fixture = newFixture(); + var expectedTable = + fixture.mockTable(fixture.tenantFixture, TEST_CONSTANTS.TABLE_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var tableMetadata = fixture.tableMetadataForIdentifier(TEST_CONSTANTS.TABLE_IDENTIFIER); + var keyspaceMetadata = fixture.keyspaceMetadataForIdentifier(TEST_CONSTANTS.TABLE_IDENTIFIER); + + // if the listener is called before onSessionReady is called it should not error + fixture.listener.onTableDropped(tableMetadata); + fixture.listener.onTableCreated(tableMetadata); + fixture.listener.onTableUpdated(tableMetadata, tableMetadata); + + fixture.listener.onKeyspaceDropped(keyspaceMetadata); + fixture.listener.onKeyspaceCreated(keyspaceMetadata); + fixture.listener.onKeyspaceUpdated(keyspaceMetadata, keyspaceMetadata); + + // and the table should still be there + var actualTableAfter = + fixture + .cache() + .getIfPresent( + fixture.tenantFixture.requestContext, TEST_CONSTANTS.TABLE_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + assertThat(actualTableAfter) + .as("Table is still in schema cache after listener called before onSessionReady") + .isPresent() + .get() + .isSameAs(expectedTable); + } + + @Test + public void tableChangesEvictTable() { + + var tableMetadata = newFixture().tableMetadataForIdentifier(TABLE_1_IDENTIFIER); + + List> calls = + List.of( + (cb) -> { + cb.onTableCreated(tableMetadata); + return "onTableCreated"; + }, + (cb) -> { + cb.onTableUpdated(tableMetadata, tableMetadata); + return "onTableUpdated"; + }, + (cb) -> { + cb.onTableDropped(tableMetadata); + return "onTableDropped"; + }); + + for (var cb : calls) { + var fixture = newFixture(); + + // put two tables in from two keyspaces for the tenantFixture we are removing + // and one from a different tenantFixture + // table 1 is the one we remove + var expectedTable1 = fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + fixture.listener.onSessionReady(fixture.tenantFixture().cqlSession); + var operation = cb.apply(fixture.listener); + + // only table1 should be removed, the others should still be there + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectPresent(operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); + assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + } + } + + @Test + public void keyspaceDroppedEvictsAllForKS() { + + var fixture = newFixture(); + + // put two tables in from two keyspaces for the tenantFixture we are removing + // and one from a different tenantFixture + // table 1 and 2 is the ones we remove + var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedKSOther = + fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); + + // the cql session name is set for to use the TEST_CONSTANTS.TENANT + fixture.listener.onSessionReady(fixture.tenantFixture.cqlSession); + // drop keyspace 1, from the TENANT + fixture.listener.onKeyspaceDropped(ksMetadata1); + + // table1 and 2 should be removed because from same keyspace + tenantFixture, table other still there + // keyspace 1 should be removed, but not the other keyspace + var operation = "onKeyspaceDropped"; + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); + assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + } + + @Test + public void keyspaceUpdatedEvictsOnlyKs() { + + var fixture = newFixture(); + + // put two tables in from two keyspaces for the tenantFixture we are removing + // and one from a different tenantFixture + var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedKSOther = + fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); + + // the cql session name is set for to use the TEST_CONSTANTS.TENANT + fixture.listener.onSessionReady(fixture.tenantFixture.cqlSession); + // drop keyspace 1, from the TENANT + fixture.listener.onKeyspaceUpdated(ksMetadata1, ksMetadata1); + + // only ks for the tenant should be removed, other tables and ks should still be there + var operation = "onKeyspaceUpdated"; + assertSchemaObjectPresent(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER, expectedTable1); + assertSchemaObjectPresent(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); + assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + } + + @Test + public void keyspaceCreatedEvictsAllForKS() { + + var fixture = newFixture(); + + + var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedKSOther = + fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); + + // the cql session name is set for to use the TEST_CONSTANTS.TENANT + fixture.listener.onSessionReady(fixture.tenantFixture.cqlSession); + // drop keyspace 1, from the TENANT + fixture.listener.onKeyspaceCreated(ksMetadata1); + + // only ks for the tenant should be removed, other tables and ks should still be there + var operation = "onKeyspaceCreated"; + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); + assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + } + + // ========================================================================================================= + // Helper methods to create mock objects for testing + // ========================================================================================================= + + private void assertSchemaObjectRemoved( + String operation, FixtureTenant thisFixtureTenant, Fixture fixture, SchemaObjectIdentifier identifier) { + + assertThat( + fixture.cache.getIfPresent( + thisFixtureTenant.requestContext, identifier, TEST_CONSTANTS.USER_AGENT)) + .as("%s removed on after operation=%s", identifier, operation) + .isEmpty(); + } + + private void assertSchemaObjectPresent( + String operation, + FixtureTenant thisFixtureTenant, + Fixture fixture, + SchemaObjectIdentifier identifier, + SchemaObject expectedSchemaObject) { + assertThat( + fixture.cache.getIfPresent( + thisFixtureTenant.requestContext, identifier, TEST_CONSTANTS.USER_AGENT)) + .as("%s present on after operation=%s", identifier, operation) + .isPresent() + .get() + .isSameAs(expectedSchemaObject); + } + + private TableMetadata tableMetadata(String keyspaceName, String tableName) { + + var tableMetadata = mock(TableMetadata.class); + + var keyspaceIdentifier = mock(CqlIdentifier.class); + when(keyspaceIdentifier.asInternal()).thenReturn(keyspaceName); + when(tableMetadata.getKeyspace()).thenReturn(keyspaceIdentifier); + + var tableIdentifier = mock(CqlIdentifier.class); + when(tableIdentifier.asInternal()).thenReturn(tableName); + when(tableMetadata.getName()).thenReturn(tableIdentifier); + + return tableMetadata; + } + + private KeyspaceMetadata keyspaceMetadata(String keyspaceName) { + + var keyspaceMetadata = mock(KeyspaceMetadata.class); + + var keyspaceIdentifier = mock(CqlIdentifier.class); + when(keyspaceIdentifier.asInternal()).thenReturn(keyspaceName); + when(keyspaceMetadata.getName()).thenReturn(keyspaceIdentifier); + + return keyspaceMetadata; + } + + private Fixture newFixture() { + + var schemaObjectFactory = mock(SchemaObjectCache.SchemaObjectFactory.class); + var ticker = new CacheTestsBase.FakeTicker(); + + var cache = + new SchemaObjectCache( + CACHE_MAX_SIZE, + LONG_TTL, + SLA_USER_AGENT, + SHORT_TTL, + schemaObjectFactory, + new SimpleMeterRegistry(), + true, + ticker); + + return new Fixture( + schemaObjectFactory, + cache.getSchemaChangeListener(), + cache, + ticker, + newFixtureTenant(TEST_CONSTANTS.TENANT), + newFixtureTenant(OTHER_TENANT)); + } + + private FixtureTenant newFixtureTenant(Tenant tenant) { + + var requestContext = mock(RequestContext.class); + when(requestContext.tenant()).thenReturn(tenant); + + var cqlSession = mock(CqlSession.class); + when(cqlSession.getName()).thenReturn(tenant.toString()); + + return new FixtureTenant(tenant, requestContext, cqlSession); + } + record Fixture( + SchemaObjectCache.SchemaObjectFactory factory, + SchemaChangeListener listener, + SchemaObjectCache cache, + Ticker ticker, + FixtureTenant tenantFixture, + FixtureTenant otherTenantFixture) { + + public TableSchemaObject mockTable(FixtureTenant thisFixtureTenant, SchemaObjectIdentifier identifier, UserAgent userAgent) { + + var tableSchemaObject = mock(TableSchemaObject.class); + when(tableSchemaObject.identifier()).thenReturn(identifier); + + addToCache(thisFixtureTenant, identifier, userAgent, tableSchemaObject); + return tableSchemaObject; + } + + public KeyspaceSchemaObject mockKeyspace( + FixtureTenant thisFixtureTenant, SchemaObjectIdentifier identifier, UserAgent userAgent) { + + var keyspaceSchemaObject = mock(KeyspaceSchemaObject.class); + + when(keyspaceSchemaObject.identifier()).thenReturn(identifier); + + addToCache(thisFixtureTenant, identifier, userAgent, keyspaceSchemaObject); + return keyspaceSchemaObject; + } + + public void addToCache( + FixtureTenant thisFixtureTenant, + SchemaObjectIdentifier identifier, + UserAgent userAgent, + TableSchemaObject tableSchemaObject) { + + LOGGER.info("Setting up factories for identifier: {}, thisFixtureTenant: {}", identifier, thisFixtureTenant); + + // the getTableBased function may need to make two calls to get the schema object, the first + // is to try if it is a collection, the second is to get it as a table + // so we need ot make sure to throw an exception when called + + // this is the success call + when(factory.apply(any(), eq(identifier), anyBoolean())) + .thenReturn(CompletableFuture.completedFuture(tableSchemaObject)); + + // now the failure call + var otherIdentifier = + identifier.type() == SchemaObjectType.COLLECTION + ? SchemaObjectIdentifier.forTable( + identifier.tenant(), identifier.keyspace(), identifier.table()) + : SchemaObjectIdentifier.forCollection( + identifier.tenant(), identifier.keyspace(), identifier.table()); + when(factory.apply(any(), eq(otherIdentifier), anyBoolean())) + .thenReturn( + CompletableFuture.failedFuture( + new SchemaObjectFactory.SchemaObjectTypeMismatchException( + identifier.type(), otherIdentifier.type()))); + + LOGGER.info("Calling cache to get table for identifier: {}", identifier); + + var actualTable = + cache() + .getTableBased(thisFixtureTenant.requestContext, identifier, userAgent, false) + .await() + .indefinitely(); + + assertThat(actualTable) + .as( + "Table is one returned by the factory, expected:%s actual:%s", + identifier, actualTable.identifier()) + .isEqualTo(tableSchemaObject); + } + + public void addToCache( + FixtureTenant thisFixtureTenant, + SchemaObjectIdentifier identifier, + UserAgent userAgent, + KeyspaceSchemaObject keyspaceSchemaObject) { + + when(factory.apply(any(), eq(identifier), anyBoolean())) + .thenReturn(CompletableFuture.completedFuture(keyspaceSchemaObject)); + + var actual = + cache().getKeyspace(thisFixtureTenant.requestContext, identifier, userAgent, false) + .await() + .indefinitely(); + + assertThat(actual) + .as("Keyspace is one returned by the factory") + .isEqualTo(keyspaceSchemaObject); + } + + public TableMetadata tableMetadataForIdentifier(SchemaObjectIdentifier identifier) { + + var tableMetaData = mock(TableMetadata.class); + when(tableMetaData.getKeyspace()).thenReturn(identifier.keyspace()); + when(tableMetaData.getName()).thenReturn(identifier.table()); + return tableMetaData; + } + + public KeyspaceMetadata keyspaceMetadataForIdentifier(SchemaObjectIdentifier identifier) { + + var keyspaceMetaData = mock(KeyspaceMetadata.class); + when(keyspaceMetaData.getName()).thenReturn(identifier.keyspace()); + return keyspaceMetaData; + } + } + + record FixtureTenant( + Tenant tenant, + RequestContext requestContext, + CqlSession cqlSession + ){} +} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java new file mode 100644 index 0000000000..2c0737f51b --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java @@ -0,0 +1,394 @@ +package io.stargate.sgv2.jsonapi.service.schema; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import io.stargate.sgv2.jsonapi.TestConstants; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.config.DatabaseType; +import io.stargate.sgv2.jsonapi.util.recordable.Jsonable; +import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; +import org.junit.jupiter.api.Test; +import org.slf4j.MDC; + +public class SchemaObjectIdentifierTests { + + protected final TestConstants TEST_CONSTANTS = new TestConstants(); + private final Tenant OTHER_TENANT = Tenant.create(TEST_CONSTANTS.DATABASE_TYPE, "other-tenant-" + TEST_CONSTANTS.CORRELATION_ID); + + @Test + public void forDatabaseFactory() { + + assertThatThrownBy(() -> SchemaObjectIdentifier.forDatabase(null)) + .as("throws if tenant is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("tenant"); + + var tenant = TEST_CONSTANTS.TENANT; + var identifier = SchemaObjectIdentifier.forDatabase(tenant); + assertThat(identifier.fullName()) + .as("fullName should be db:") + .isEqualTo("db:" + tenant); + + assertThat(identifier.type()) + .as("type should be DATABASE") + .isEqualTo(SchemaObjectType.DATABASE); + + assertThat(identifier.tenant()) + .as("tenant should match the one used to create the identifier") + .isEqualTo(tenant); + } + + @Test + public void forKeyspaceFactory() { + var tenant = TEST_CONSTANTS.TENANT; + + assertThatThrownBy(() -> SchemaObjectIdentifier.forKeyspace(null, CqlIdentifier.fromCql("ks"))) + .as("throws if tenant is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("tenant"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forKeyspace(tenant, null)) + .as("throws if keyspace is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("keyspace"); + + // need fromInternal to create a blank CqlIdentifier + assertThatThrownBy(() -> SchemaObjectIdentifier.forKeyspace(tenant, CqlIdentifier.fromInternal(""))) + .as("throws if keyspace is blank") + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("keyspace name must not be blank"); + + var keyspace = CqlIdentifier.fromCql("ks"); + var identifier = SchemaObjectIdentifier.forKeyspace(tenant, keyspace); + assertThat(identifier.fullName()) + .as("fullName should equal keyspace name") + .isEqualTo("ks"); + + assertThat(identifier.type()) + .as("type should be KEYSPACE") + .isEqualTo(SchemaObjectType.KEYSPACE); + + assertThat(identifier.tenant()) + .as("tenant should match the one used to create the identifier") + .isEqualTo(tenant); + } + + @Test + public void forCollectionFactory() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(null, keyspace, CqlIdentifier.fromCql("col"))) + .as("throws if tenant is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("tenant"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(tenant, null, CqlIdentifier.fromCql("col"))) + .as("throws if keyspace is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("keyspace"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(tenant, keyspace, null)) + .as("throws if collection is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("collection"); + + // need fromInternal to create a blank CqlIdentifier + assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(tenant, keyspace, CqlIdentifier.fromInternal(""))) + .as("throws if collection is blank") + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("collection name must not be blank"); + + var collection = CqlIdentifier.fromCql("col"); + var identifier = SchemaObjectIdentifier.forCollection(tenant, keyspace, collection); + assertThat(identifier.fullName()) + .as("fullName should be keyspace.collection") + .isEqualTo("ks.col"); + + assertThat(identifier.type()) + .as("type should be COLLECTION") + .isEqualTo(SchemaObjectType.COLLECTION); + + assertThat(identifier.tenant()) + .as("tenant should match the one used to create the identifier") + .isEqualTo(tenant); + } + + @Test + public void forTableFactory() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(null, keyspace, CqlIdentifier.fromCql("tbl"))) + .as("throws if tenant is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("tenant"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(tenant, null, CqlIdentifier.fromCql("tbl"))) + .as("throws if keyspace is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("keyspace"); + + assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(tenant, keyspace, null)) + .as("throws if table is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("table"); + + // need fromInternal to create a blank CqlIdentifier + assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(tenant, keyspace, CqlIdentifier.fromInternal(""))) + .as("throws if table is blank") + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("table name must not be blank"); + + var table = CqlIdentifier.fromCql("tbl"); + var identifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + assertThat(identifier.fullName()) + .as("fullName should be keyspace.table") + .isEqualTo("ks.tbl"); + + assertThat(identifier.type()) + .as("type should be TABLE") + .isEqualTo(SchemaObjectType.TABLE); + + assertThat(identifier.tenant()) + .as("tenant should match the one used to create the identifier") + .isEqualTo(tenant); + } + + + @Test + public void fromTableMetadata() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var metadata = mock(TableMetadata.class); + when(metadata.getKeyspace()).thenReturn(keyspace); + when(metadata.getName()).thenReturn(table); + + var fromTable = SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, metadata); + assertThat(fromTable.type()) + .as("should return SchemaObjectType.TABLE") + .isEqualTo(SchemaObjectType.TABLE); + assertThat(fromTable.fullName()) + .as("should extract fullName from metadata for TABLE") + .isEqualTo("ks.tbl"); + + var fromCollection = SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.COLLECTION, tenant, metadata); + assertThat(fromCollection.type()) + .as("should return SchemaObjectType.COLLECTION") + .isEqualTo(SchemaObjectType.COLLECTION); + assertThat(fromCollection.fullName()) + .as("should extract fullName from metadata for COLLECTION") + .isEqualTo("ks.tbl"); + + assertThatThrownBy(() -> + SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.KEYSPACE, tenant, metadata)) + .as("should throw for unsupported SchemaObjectType") + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("Unsupported object type"); + + assertThatThrownBy(() -> + SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, null)) + .as("should throw if TableMetadata is null") + .isInstanceOf(NullPointerException.class) + .hasMessageContaining("tableMetadata must not be null"); + } + + @Test + public void keyspaceIdentifierIsExpected() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var tableIdentifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + var keyspaceIdentifier = tableIdentifier.keyspaceIdentifier(); + + assertThat(keyspaceIdentifier.type()) + .as("should return type KEYSPACE") + .isEqualTo(SchemaObjectType.KEYSPACE); + + assertThat(keyspaceIdentifier.keyspace()) + .as("keyspaceIdentifier has same keyspace as the table identifier") + .isEqualTo(tableIdentifier.keyspace()); + assertThat(keyspaceIdentifier.tenant()) + .as("keyspaceIdentifier has same tenant as the table identifier") + .isEqualTo(tableIdentifier.tenant()); + } + + @Test + public void unscopedIdentifierInterface() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var tableIdentifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + var unscoped = (UnscopedSchemaObjectIdentifier)tableIdentifier; + + assertThat(unscoped.keyspace()) + .as("unscoped keyspace should match the table identifier's keyspace") + .isEqualTo(tableIdentifier.keyspace()); + + assertThat(unscoped.objectName()) + .as("unscoped object name should match the table identifier's table name") + .isEqualTo(tableIdentifier.table()); + } + + @Test + public void toStringIsFullName() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var tableIdentifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + + assertThat(tableIdentifier.toString()) + .as("toString should return fullName") + .isEqualTo(tableIdentifier.fullName()); + } + + @Test + public void isSameKeyspace() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + + var table1 = CqlIdentifier.fromCql("t1"); + var table2 = CqlIdentifier.fromCql("t2"); + + var id1 = SchemaObjectIdentifier.forTable(tenant, keyspace, table1); + var id2 = SchemaObjectIdentifier.forTable(tenant, keyspace, table2); + + assertThat(id1.isSameKeyspace(id2)) + .as("should return true when tenant and keyspace match") + .isTrue(); + + var id3 = SchemaObjectIdentifier.forTable(OTHER_TENANT, keyspace, table1); + + assertThat(id1.isSameKeyspace(id3)) + .as("should return false when tenant differs") + .isFalse(); + + var otherKeyspace = CqlIdentifier.fromCql("otherks"); + var id4 = SchemaObjectIdentifier.forTable(tenant, otherKeyspace, table1); + + assertThat(id1.isSameKeyspace(id4)) + .as("should return false when keyspace differs") + .isFalse(); + } + + @Test + public void testAddAndRemoveFromMDC() { + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var identifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + + identifier.addToMDC(); + + assertThat(MDC.get("namespace")) + .as("MDC should contain keyspace as 'namespace'") + .isEqualTo("ks"); + + assertThat(MDC.get("collection")) + .as("MDC should contain table as 'collection'") + .isEqualTo("tbl"); + + identifier.removeFromMDC(); + + assertThat(MDC.get("namespace")) + .as("MDC 'namespace' should be removed") + .isNull(); + + assertThat(MDC.get("collection")) + .as("MDC 'collection' should be removed") + .isNull(); + } + + @Test + public void recordTo(){ + var tenant = TEST_CONSTANTS.TENANT; + var keyspace = CqlIdentifier.fromCql("ks"); + var table = CqlIdentifier.fromCql("tbl"); + + var identifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); + + var pretty = PrettyPrintable.pprint(identifier); + assertThat(pretty) + .as("recordTo output for SchemaObjectIdentifier") + .contains("tenant", tenant.toString()) + .contains("databaseType", TEST_CONSTANTS.DATABASE_TYPE.name()) + .contains("type", "TABLE") + .contains("keyspace", "ks") + .contains("table", "tbl"); + + var identifierJson = Jsonable.toJson(identifier); + var expected = JsonNodeFactory.instance.objectNode(); + // there is a top level "SchemaObjectIdentifier" field + var contents = expected.withObjectProperty("SchemaObjectIdentifier"); + contents.put("tenant",Jsonable.toJson(tenant)); + contents.put("type", "TABLE"); + contents.put("keyspace", keyspace.asInternal()); + contents.put("table", table.asInternal()); + + assertThat(identifierJson) + .as("JSON output for Tenant") + .isEqualTo(expected); + } + + @Test + public void equalityAndHashCodeReflexive() { + var db = TEST_CONSTANTS.DATABASE_IDENTIFIER; + var ks = TEST_CONSTANTS.KEYSPACE_IDENTIFIER; + var coll = TEST_CONSTANTS.COLLECTION_IDENTIFIER; + var table = TEST_CONSTANTS.TABLE_IDENTIFIER; + + assertThat(db).isEqualTo(db).hasSameHashCodeAs(db); + assertThat(ks).isEqualTo(ks).hasSameHashCodeAs(ks); + assertThat(coll).isEqualTo(coll).hasSameHashCodeAs(coll); + assertThat(table).isEqualTo(table).hasSameHashCodeAs(table); + } + + @Test + public void equalityAndHashCodeTransitive() { + var id1 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id2 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id3 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + assertThat(id1).isEqualTo(id2); + assertThat(id2).isEqualTo(id3); + assertThat(id1).isEqualTo(id3); + + assertThat(id1.hashCode()).isEqualTo(id2.hashCode()); + assertThat(id2.hashCode()).isEqualTo(id3.hashCode()); + } + + @Test + public void differentTenant() { + var id1 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id2 = SchemaObjectIdentifier.forCollection(OTHER_TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + assertThat(id1).isNotEqualTo(id2); + + assertThat(id1.hashCode()).isNotEqualTo(id2.hashCode()); + } +} \ No newline at end of file From 25d3521153ef52893079fb3e04ceaf2cab394355 Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Mon, 15 Dec 2025 12:03:34 -0800 Subject: [PATCH 3/8] Merge from Main(Mostly latest Tenant refactoring work) --- .../api/model/command/CommandContext.java | 36 ++-- .../api/model/command/CommandTarget.java | 5 +- .../command/builders/FilterClauseBuilder.java | 2 +- .../command/builders/SortClauseBuilder.java | 2 +- .../builders/TableFilterClauseBuilder.java | 2 +- .../builders/TableSortClauseBuilder.java | 2 +- .../tracing/DefaultRequestTracing.java | 2 - .../jsonapi/api/v1/CollectionResource.java | 4 +- .../sgv2/jsonapi/api/v1/KeyspaceResource.java | 34 ++-- .../jsonapi/exception/ErrorFormatters.java | 4 +- .../cqldriver/executor/SchemaCache.java | 2 +- .../executor/TableBasedSchemaCache.java | 3 +- .../service/embedding/DataVectorizer.java | 5 +- .../embedding/DataVectorizerService.java | 2 +- .../service/operation/DeleteDBTask.java | 3 +- .../service/operation/DeleteDBTaskPage.java | 3 +- .../service/operation/GenericOperation.java | 3 +- .../service/operation/InsertAttempt.java | 3 +- .../service/operation/InsertDBTask.java | 3 +- .../service/operation/InsertDBTaskPage.java | 3 +- .../operation/InsertOperationPage.java | 3 +- .../service/operation/ListIndexesDBTask.java | 2 +- .../service/operation/ListTablesDBTask.java | 3 +- .../service/operation/ListTypesDBTask.java | 3 +- .../service/operation/MetadataDBTask.java | 2 +- .../service/operation/MetadataDBTaskPage.java | 2 +- .../jsonapi/service/operation/ReadDBTask.java | 3 +- .../service/operation/ReadDBTaskPage.java | 3 +- .../service/operation/SchemaDBTask.java | 2 +- .../service/operation/SchemaDBTaskPage.java | 2 +- .../service/operation/TruncateDBTask.java | 3 +- .../service/operation/TruncateDBTaskPage.java | 3 +- .../service/operation/UpdateDBTask.java | 2 +- .../operation/UpdateDBTaskBuilder.java | 2 +- .../service/operation/UpdateDBTaskPage.java | 2 +- .../CreateCollectionOperation.java | 3 +- .../DeleteCollectionCollectionOperation.java | 3 +- .../FindCollectionsCollectionOperation.java | 3 +- .../embeddings/EmbeddingOperationFactory.java | 2 +- .../operation/embeddings/EmbeddingTask.java | 3 +- .../embeddings/EmbeddingTaskBuilder.java | 3 +- .../embeddings/EmbeddingTaskGroupBuilder.java | 3 +- .../filters/table/InTableFilter.java | 2 +- .../filters/table/MapSetListTableFilter.java | 2 +- .../filters/table/NativeTypeTableFilter.java | 2 +- .../FindRerankingProvidersOperation.java | 2 +- .../IntermediateCollectionReadTask.java | 3 +- .../operation/reranking/RerankingMetrics.java | 3 +- .../operation/reranking/RerankingTask.java | 3 +- .../reranking/RerankingTaskBuilder.java | 3 +- .../reranking/RerankingTaskPage.java | 3 +- .../operation/tables/AlterTableDBTask.java | 2 +- .../tables/AlterTableDBTaskBuilder.java | 2 +- .../operation/tables/AlterTypeDBTask.java | 4 +- .../tables/AlterTypeDBTaskBuilder.java | 3 +- .../tables/AlterTypeExceptionHandler.java | 3 +- .../operation/tables/CreateIndexDBTask.java | 2 +- .../tables/CreateIndexDBTaskBuilder.java | 2 +- .../operation/tables/CreateTableDBTask.java | 3 +- .../tables/CreateTableDBTaskBuilder.java | 3 +- .../tables/CreateTableExceptionHandler.java | 3 +- .../operation/tables/CreateTypeDBTask.java | 3 +- .../tables/CreateTypeDBTaskBuilder.java | 3 +- .../tables/CreateTypeExceptionHandler.java | 3 +- .../operation/tables/DropIndexDBTask.java | 3 +- .../tables/DropIndexDBTaskBuilder.java | 3 +- .../tables/DropIndexExceptionHandler.java | 3 +- .../operation/tables/DropTableDBTask.java | 3 +- .../tables/DropTableDBTaskBuilder.java | 3 +- .../tables/DropTableExceptionHandler.java | 3 +- .../operation/tables/DropTypeDBTask.java | 3 +- .../tables/DropTypeDBTaskBuilder.java | 3 +- .../tables/DropTypeExceptionHandler.java | 3 +- .../KeyspaceDriverExceptionHandler.java | 1 + .../tables/TableDeleteDBTaskBuilder.java | 2 +- .../tables/TableDriverExceptionHandler.java | 3 +- .../operation/tables/TableInsertDBTask.java | 2 +- .../tables/TableInsertDBTaskBuilder.java | 2 +- .../tables/TableInsertValuesCQLClause.java | 2 +- .../operation/tables/TableOperation.java | 2 +- .../operation/tables/TableProjection.java | 2 +- .../tables/TableReadDBTaskBuilder.java | 2 +- .../operation/tables/TableWhereCQLClause.java | 2 +- .../tables/WhereCQLClauseAnalyzer.java | 3 +- .../tables/WriteableTableRowBuilder.java | 2 +- .../tasks/CompositeTaskOperationBuilder.java | 2 +- .../operation/tasks/TaskOperation.java | 2 +- .../service/operation/tasks/TaskPage.java | 2 +- .../jsonapi/service/processor/CommandLog.java | 2 - .../service/processor/CommandProcessor.java | 1 - .../processor/MeteredCommandProcessor.java | 4 +- .../resolver/AlterTableCommandResolver.java | 2 +- .../resolver/AlterTypeCommandResolver.java | 3 +- .../service/resolver/CommandResolver.java | 1 - .../CreateCollectionCommandResolver.java | 2 +- .../resolver/CreateIndexCommandResolver.java | 2 +- .../CreateKeyspaceCommandResolver.java | 2 +- .../CreateNamespaceCommandResolver.java | 2 +- .../CreateTextIndexCommandResolver.java | 2 +- .../CreateVectorIndexCommandResolver.java | 2 +- .../DeleteCollectionCommandResolver.java | 3 +- .../resolver/DeleteManyCommandResolver.java | 2 +- .../resolver/DeleteOneCommandResolver.java | 2 +- .../resolver/DropIndexCommandResolver.java | 3 +- .../resolver/DropKeyspaceCommandResolver.java | 2 +- .../DropNamespaceCommandResolver.java | 2 +- .../resolver/DropTableCommandResolver.java | 3 +- .../resolver/DropTypeCommandResolver.java | 3 +- .../FindCollectionsCommandResolver.java | 3 +- .../service/resolver/FindCommandResolver.java | 2 +- ...FindEmbeddingProvidersCommandResolver.java | 2 +- .../FindKeyspacesCommandResolver.java | 2 +- .../FindNamespacesCommandResolver.java | 1 - .../resolver/FindOneCommandResolver.java | 2 +- ...FindRerankingProvidersCommandResolver.java | 2 +- .../resolver/InsertManyCommandResolver.java | 2 +- .../resolver/InsertOneCommandResolver.java | 2 +- .../resolver/ListIndexesCommandResolver.java | 2 +- .../resolver/ListTablesCommandResolver.java | 3 +- .../resolver/ListTypesCommandResolver.java | 3 +- .../resolver/TableReadDBOperationBuilder.java | 2 +- .../resolver/UpdateOneCommandResolver.java | 2 +- .../resolver/matcher/FilterResolver.java | 2 +- .../resolver/matcher/TableFilterResolver.java | 2 +- .../sort/TableCqlSortClauseResolver.java | 2 +- .../sort/TableMemorySortClauseResolver.java | 2 +- .../sort/TableSortClauseResolver.java | 2 +- .../resolver/update/TableUpdateAnalyzer.java | 3 +- .../update/TableUpdateOperatorResolver.java | 2 +- .../update/TableUpdatePullAllResolver.java | 2 +- .../update/TableUpdatePushResolver.java | 2 +- .../resolver/update/TableUpdateResolver.java | 2 +- .../update/TableUpdateSetResolver.java | 2 +- .../update/TableUpdateUnsetResolver.java | 2 +- .../resolver/update/UpdateResolver.java | 2 +- .../service/schema/DatabaseSchemaObject.java | 11 +- .../service/schema/KeyspaceSchemaObject.java | 13 +- .../jsonapi/service/schema/SchemaObject.java | 16 +- .../service/schema/SchemaObjectCache.java | 2 +- .../service/schema/SchemaObjectFactory.java | 22 ++- .../schema/SchemaObjectIdentifier.java | 75 +++----- .../service/schema/SchemaObjectType.java | 5 +- .../UnscopedSchemaObjectIdentifier.java | 22 +-- .../schema/naming/CollectionNamingRule.java | 1 - .../schema/naming/IndexNamingRule.java | 1 - .../schema/naming/KeyspaceNamingRule.java | 1 - .../schema/naming/SchemaObjectNamingRule.java | 2 - .../schema/naming/TableNamingRule.java | 1 - .../service/schema/naming/UdtNamingRule.java | 1 - .../schema/tables/ApiRegularIndex.java | 1 - .../service/schema/tables/ApiTextIndex.java | 1 - .../service/schema/tables/ApiVectorIndex.java | 1 - .../schema/tables/TableBasedSchemaObject.java | 12 +- .../factories/IndexFactoryFromIndexDesc.java | 2 +- .../service/shredding/CqlNamedValue.java | 2 +- .../service/shredding/JsonNamedValue.java | 2 +- .../jsonapi/service/shredding/NamedValue.java | 2 +- .../tables/CqlNamedValueContainerFactory.java | 2 +- .../sgv2/jsonapi/util/DynamicTTLCache.java | 4 - .../TableFilterClauseBuilderTest.java | 2 +- .../testdata/TableUpdateAnalyzerTestData.java | 2 +- .../testdata/TableWhereCQLClauseTestData.java | 2 +- .../testdata/UpdateClauseTestData.java | 2 +- .../testdata/WhereAnalyzerTestData.java | 2 +- .../testdata/WhereCQLClauseTestData.java | 2 +- .../collections/OperationTestBase.java | 3 +- .../operation/tasks/BaseTaskAssertions.java | 2 +- .../operation/tasks/ReadDBTaskTestData.java | 2 +- .../operation/tasks/ReadDBTaskTestTask.java | 2 +- .../processor/CommandContextTestData.java | 2 +- .../processor/SchemaObjectTestData.java | 2 +- .../CreateCollectionCommandResolverTest.java | 3 +- .../CreateKeyspaceCommandResolverTest.java | 2 +- .../DeleteCollectionCommandResolverTest.java | 3 +- .../DropKeyspaceCommandResolverTest.java | 2 +- .../FindCollectionCommandResolverTest.java | 3 +- .../resolver/matcher/FilterInversionTest.java | 2 +- .../update/TableUpdateOperatorTestData.java | 2 +- .../SchemaObjectCacheChangeListenerTests.java | 175 +++++++++++------- .../schema/SchemaObjectIdentifierTests.java | 131 ++++++------- 180 files changed, 498 insertions(+), 451 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java index a41710d091..9cc978b6b4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandContext.java @@ -23,7 +23,6 @@ import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; - import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -36,11 +35,11 @@ * BuilderSupplier}, configure this with application wide config, then when ready to build the * context for a specific request call {@link BuilderSupplier#getBuilder(SchemaObject)} to get a * {@link BuilderSupplier.Builder} to configure the context for the request. - *

- *NOTE: When {@link BuilderSupplier.Builder#build()} is called it will call - * {@link #addToMDC()} so that the context is added to the logging MDC for the duration of the request. The - * context must be closed via {@link #close()} to remove it from the MDC, this should be done at the last possible - * time in the resource handler so all log messages have the context. + * + *

NOTE: When {@link BuilderSupplier.Builder#build()} is called it will call {@link + * #addToMDC()} so that the context is added to the logging MDC for the duration of the request. The + * context must be closed via {@link #close()} to remove it from the MDC, this should be done at the + * last possible time in the resource handler so all log messages have the context. * * @param The schema object type that this context is for. There are times we need to lock * this down to the specific type, if so use the "as" methods such as {@link @@ -378,18 +377,19 @@ public CommandContext build() { Objects.requireNonNull(commandName, "commandName must not be null"); Objects.requireNonNull(requestContext, "requestContext must not be null"); - var context = new CommandContext<>( - schemaObject, - embeddingProvider, - commandName, - requestContext, - jsonProcessingMetricsReporter, - cqlSessionCache, - commandConfig, - apiFeatures, - embeddingProviderFactory, - rerankingProviderFactory, - meterRegistry); + var context = + new CommandContext<>( + schemaObject, + embeddingProvider, + commandName, + requestContext, + jsonProcessingMetricsReporter, + cqlSessionCache, + commandConfig, + apiFeatures, + embeddingProviderFactory, + rerankingProviderFactory, + meterRegistry); context.addToMDC(); return context; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java index 110e75c3fa..f3abac12ac 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/CommandTarget.java @@ -4,9 +4,8 @@ * The schema object a command can be called against. * *

Example: creteTable runs against the Keyspace , so target is the Keyspace aaron 13 - nove - - * 2024 - not using the {@link - * io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType} because this - * also needs the SYSTEM value, and the schema object design prob needs improvement + * 2024 - not using the {@link io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType} + * because this also needs the SYSTEM value, and the schema object design prob needs improvement */ public enum CommandTarget { COLLECTION, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java index 96965e995d..25433a0353 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java @@ -8,8 +8,8 @@ import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentId; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonExtensionType; import io.stargate.sgv2.jsonapi.util.JsonUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java index c55fc16c02..f9ad7d0aa8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java @@ -7,8 +7,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortClause; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java index d8de0af1ae..311ad18eb3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilder.java @@ -8,9 +8,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.*; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.datatype.MapComponentDesc; import io.stargate.sgv2.jsonapi.exception.FilterException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java index 45721f07e3..07781c03c9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableSortClauseBuilder.java @@ -13,9 +13,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortClause; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortExpression; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; import io.stargate.sgv2.jsonapi.util.JsonUtil; import java.util.ArrayList; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java index 4ad1b3e3d3..7d5eb3c5e8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/tracing/DefaultRequestTracing.java @@ -3,8 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import java.util.*; - -import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java index 3a1680795b..77d1b2d293 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java @@ -33,7 +33,6 @@ import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; @@ -273,7 +272,8 @@ public Uni> postCommand( .withRequestContext(requestContext) .build(); - return meteredCommandProcessor.processCommand(commandContext, command) + return meteredCommandProcessor + .processCommand(commandContext, command) .onTermination() .invoke( () -> { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java index 65a79dc26f..be11538e79 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java @@ -181,23 +181,23 @@ public Uni> postCommand( .map(commandResult -> commandResult.toRestResponse()); } - // call processor - return meteredCommandProcessor - .processCommand(commandContext, command) - // map to 2xx unless overridden by error - .map(commandResult -> commandResult.toRestResponse()) - .onTermination() - .invoke( - () -> { - try { - commandContext.close(); - } catch (Exception e) { - LOGGER.error( - "Error closing the command context for requestContext={}", - requestContext, - e); - } - }); + // call processor + return meteredCommandProcessor + .processCommand(commandContext, command) + // map to 2xx unless overridden by error + .map(commandResult -> commandResult.toRestResponse()) + .onTermination() + .invoke( + () -> { + try { + commandContext.close(); + } catch (Exception e) { + LOGGER.error( + "Error closing the command context for requestContext={}", + requestContext, + e); + } + }); }); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java b/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java index 65331bfed9..b4ec28b50b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/exception/ErrorFormatters.java @@ -1,5 +1,7 @@ package io.stargate.sgv2.jsonapi.exception; +import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; + import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; @@ -18,8 +20,6 @@ import java.util.function.Consumer; import java.util.function.Function; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; - /** * Static helper functions to consistently format objects into strings when building error messages. * diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java index bda0febe78..5641963b8e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java @@ -29,7 +29,7 @@ /** * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY * - * Top level entry for caching the keyspaces and tables from the backend db + *

Top level entry for caching the keyspaces and tables from the backend db * *

IMPORTANT: use {@link #getSchemaChangeListener()} and {@link #getDeactivatedTenantConsumer()} * to get callbacks to evict the cache when the schema changes or a tenant is deactivated. This diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java index c3f6ddc0ad..0416e8df6a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java @@ -17,7 +17,8 @@ /** * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY * - * Caches the vector enabled status for the namespace */ + *

Caches the vector enabled status for the namespace + */ // TODO: what is the vector status of a namespace ? vectors are per collection // TODO: clarify the name of this class, it is a cache of the collections/ tables not a cache of // namespaces ?? diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java index 6a026aa0bd..9058e07a67 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizer.java @@ -5,7 +5,6 @@ import static io.stargate.sgv2.jsonapi.exception.ErrorCodeV1.EMBEDDING_PROVIDER_UNEXPECTED_RESPONSE; import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; -import com.datastax.oss.driver.api.core.CqlIdentifier; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -18,15 +17,13 @@ import io.stargate.sgv2.jsonapi.exception.DocumentException; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorType; -import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; - import java.util.*; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java index b9dc5f4fb6..107d3b6378 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/embedding/DataVectorizerService.java @@ -17,9 +17,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.UpdateOneCommand; import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.exception.*; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.MeteredEmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorType; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java index 09322dbc54..d4f60af0fa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTask.java @@ -7,9 +7,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; +import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java index 1c23f2b5e2..e73b594223 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/DeleteDBTaskPage.java @@ -4,9 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; +import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; /** * A page of results from a delete command, use {@link #builder()} to get a builder to pass to diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java index 4d521b3ad3..7acfa3e92f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java @@ -5,10 +5,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Objects; import java.util.function.Supplier; - -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java index 3de2669e97..5934f5fc0c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertAttempt.java @@ -6,7 +6,8 @@ import com.datastax.oss.driver.api.querybuilder.insert.OngoingValues; import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java index e38d963c79..fecd2ff0b2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTask.java @@ -8,9 +8,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java index b62e30167f..7a5168a3b2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertDBTaskPage.java @@ -7,9 +7,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.config.constants.ErrorObjectV2Constants; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; +import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import io.stargate.sgv2.jsonapi.service.shredding.tables.RowId; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java index cf4c81e6e4..1d6413b3be 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/InsertOperationPage.java @@ -9,7 +9,8 @@ import io.stargate.sgv2.jsonapi.exception.APIException; import io.stargate.sgv2.jsonapi.exception.APIExceptionCommandErrorBuilder; import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableToErrorMapper; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java index a1128ad2ac..17cbf311ff 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexDefContainer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java index f0bb200440..7bd8a85901 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java @@ -4,9 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java index b33c664389..4e23e09adf 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTypesDBTask.java @@ -6,8 +6,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlType; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; import io.stargate.sgv2.jsonapi.service.schema.tables.TypeBindingPoint; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java index a287b3e04b..7873d0ed98 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java @@ -11,11 +11,11 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.EmptyAsyncResultSet; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.Task; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java index 4efe59f5f6..734d68ae7b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTaskPage.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java index 61895eec0d..8193d3f752 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTask.java @@ -19,13 +19,12 @@ import io.stargate.sgv2.jsonapi.service.operation.query.*; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import java.time.Duration; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; - -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java index a46fa4bd88..054b32889d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ReadDBTaskPage.java @@ -3,8 +3,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.*; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortExpression; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.*; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java index f4d93b5f05..0c1c1d6573 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTask.java @@ -8,9 +8,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.time.Duration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java index 3c93c2addc..c77df641d3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/SchemaDBTaskPage.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskPage; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java index e35310f785..457dcc83d6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTask.java @@ -5,9 +5,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; +import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java index c23ef178f0..c7b88dbc4d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/TruncateDBTaskPage.java @@ -4,10 +4,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.function.Supplier; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java index 21a3510771..f9949b580c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTask.java @@ -8,11 +8,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java index b00caf983a..0f09a8b5c7 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskBuilder.java @@ -3,11 +3,11 @@ import com.datastax.oss.driver.api.querybuilder.update.Update; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tables.WhereCQLClauseAnalyzer; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java index 380da242b3..023e23af86 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/UpdateDBTaskPage.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.DBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * A page of results from a update command, use {@link #builder()} to get a builder to pass to diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java index 8738ff5d40..1c4bffdc8e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java @@ -20,9 +20,10 @@ import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionLexicalConfig; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionRerankDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java index 1eb76f5b77..443a839184 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java @@ -5,8 +5,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import java.util.function.Supplier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java index ee40debe19..ce626cdffa 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java @@ -14,8 +14,9 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java index b32ee7d1fc..4ebe03877a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingOperationFactory.java @@ -1,10 +1,10 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.tasks.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.Deferrable; import io.stargate.sgv2.jsonapi.service.shredding.DeferredAction; import org.slf4j.Logger; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java index 2722a98d1a..b21c7cce9d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTask.java @@ -3,9 +3,10 @@ import io.smallrye.mutiny.Uni; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java index 5e013871fa..0a39def305 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskBuilder.java @@ -1,10 +1,11 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java index c8dd1c3840..33b7cb1022 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/embeddings/EmbeddingTaskGroupBuilder.java @@ -1,9 +1,10 @@ package io.stargate.sgv2.jsonapi.service.operation.embeddings; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; +import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java index 080cc77c15..cc21bfcc9f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/InTableFilter.java @@ -14,10 +14,10 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.TableFilter; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java index ce337eb7d5..9e6946c725 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/MapSetListTableFilter.java @@ -15,13 +15,13 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.DefaultSubConditionRelation; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltConditionPredicate; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.TableFilter; import io.stargate.sgv2.jsonapi.service.schema.tables.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; /** Table filter against the map/set/list column. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java index df46a74d4c..da6eea0e97 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/filters/table/NativeTypeTableFilter.java @@ -10,12 +10,12 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltCondition; import io.stargate.sgv2.jsonapi.service.operation.builder.BuiltConditionPredicate; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; import io.stargate.sgv2.jsonapi.service.operation.query.FilterBehaviour; import io.stargate.sgv2.jsonapi.service.operation.query.TableFilter; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java index 7a436bd1cf..3ba2ed9728 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/FindRerankingProvidersOperation.java @@ -6,12 +6,12 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindRerankingProvidersCommand; import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.provider.ApiModelSupport; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfigImpl; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import java.util.*; import java.util.function.Predicate; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java index c3270b4d42..4d0791b48c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/IntermediateCollectionReadTask.java @@ -82,7 +82,8 @@ protected IntermediateReadResultSupplier buildResultSupplier( new TraceMessage( "Executing inner '%s' command for schema object '%s' " .formatted( - findCommand.commandName().getApiName(), schemaObject.identifier()), + findCommand.commandName().getApiName(), + schemaObject.identifier()), Recordable.copyOf(Map.of("command", findCommand)))); return findOperation.execute(commandContext); }, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java index 137a146f34..2993cf9467 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingMetrics.java @@ -2,7 +2,6 @@ import static io.stargate.sgv2.jsonapi.metrics.MetricsConstants.MetricNames.*; import static io.stargate.sgv2.jsonapi.metrics.MetricsConstants.MetricTags.*; -import static io.stargate.sgv2.jsonapi.metrics.MetricsConstants.UNKNOWN_VALUE; import static io.stargate.sgv2.jsonapi.util.ClassUtils.classSimpleName; import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierToMessageString; @@ -13,8 +12,8 @@ import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.metrics.MetricsConstants; import io.stargate.sgv2.jsonapi.metrics.MicrometerConfiguration; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProvider; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.*; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java index 1c879a3270..abaa374d87 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTask.java @@ -9,10 +9,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; import io.stargate.sgv2.jsonapi.api.request.RerankingCredentials; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; +import io.stargate.sgv2.jsonapi.service.operation.tasks.BaseTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.projection.DocumentProjector; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProvider; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.PathMatchLocator; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.*; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java index b9475adfb1..a6abe11a90 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskBuilder.java @@ -1,7 +1,8 @@ package io.stargate.sgv2.jsonapi.service.operation.reranking; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; public class RerankingTaskBuilder extends TaskBuilder, SchemaT, RerankingTaskBuilder> { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java index 3986636eca..279dc8fd33 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/reranking/RerankingTaskPage.java @@ -4,10 +4,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.tasks.CompositeTask; +import io.stargate.sgv2.jsonapi.service.operation.tasks.CompositeTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskAccumulator; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskPage; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java index b78678dabe..f005454165 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTask.java @@ -8,10 +8,10 @@ import com.datastax.oss.driver.api.querybuilder.schema.AlterTableStart; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java index e41b7f7ac4..4b29786f85 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTableDBTaskBuilder.java @@ -1,10 +1,10 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import com.datastax.oss.driver.api.core.CqlIdentifier; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDefContainer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java index f443c30a4a..7e4096a700 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTask.java @@ -1,14 +1,14 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.*; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.AlterTypeStart; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java index 3695bbad70..961e9f6a12 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeDBTaskBuilder.java @@ -3,8 +3,9 @@ import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import com.datastax.oss.driver.api.core.CqlIdentifier; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java index 6c2ce1d9a1..7bfca4ed7d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/AlterTypeExceptionHandler.java @@ -7,7 +7,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.List; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java index 4166c397d5..7178a81573 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTask.java @@ -6,12 +6,12 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateIndexOnTable; import com.datastax.oss.driver.internal.querybuilder.schema.DefaultCreateIndex; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.ExtendedCreateIndex; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexDef; import io.stargate.sgv2.jsonapi.service.schema.tables.CQLSAIIndex; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; /* diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java index 49b28109e3..1c6183954b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateIndexDBTaskBuilder.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; @@ -8,6 +7,7 @@ import io.stargate.sgv2.jsonapi.service.schema.tables.ApiRegularIndex; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTextIndex; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorIndex; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; /** Builder for a {@link CreateIndexDBTask}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java index aafd7fceee..d76354f105 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java @@ -8,8 +8,9 @@ import com.datastax.oss.driver.api.querybuilder.schema.CreateTableStart; import com.datastax.oss.driver.api.querybuilder.schema.CreateTableWithOptions; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java index 06334ef607..71cc0fb2e3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTaskBuilder.java @@ -1,7 +1,8 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java index 36c56b6004..9236c23e42 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableExceptionHandler.java @@ -7,7 +7,8 @@ import com.datastax.oss.driver.api.core.servererrors.AlreadyExistsException; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.Map; import java.util.Objects; /** Exception handler for the {@link CreateTableDBTask} */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java index dd55433707..3016ae1f71 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java @@ -6,8 +6,9 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.*; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskRetryPolicy; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; public class CreateTypeDBTask extends SchemaDBTask { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java index 48a6cdb638..79afb0448f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTaskBuilder.java @@ -1,7 +1,8 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java index 0b38ac047d..18fed5f3c4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeExceptionHandler.java @@ -6,7 +6,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.Map; import java.util.Objects; public class CreateTypeExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java index 12dcd53ea3..11c8026720 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java @@ -5,8 +5,9 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import java.util.Objects; /* diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java index 0e68f3df1e..290332d6da 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTaskBuilder.java @@ -2,10 +2,11 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import java.util.Objects; /** Builds a {@link DropIndexDBTask}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java index 65565851d6..efce4b85cb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexExceptionHandler.java @@ -6,7 +6,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.Map; import java.util.Objects; public class DropIndexExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java index 937ad95783..8f3902e9f5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java @@ -7,8 +7,9 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; /* An attempt to drop table in a keyspace. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java index 5feba64439..3687c56ac2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTaskBuilder.java @@ -2,10 +2,11 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import java.util.Objects; /** Builds a {@link DropTableDBTask}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java index 224bc6dcba..ed1fb76e3e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableExceptionHandler.java @@ -6,7 +6,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.Map; import java.util.Objects; public class DropTableExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java index 6b3097c3b2..eb79ef9f5f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java @@ -7,8 +7,9 @@ import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; import com.datastax.oss.driver.api.querybuilder.schema.Drop; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; /* An attempt to drop type in a keyspace. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java index 3b50b0f453..fe3011c419 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTaskBuilder.java @@ -2,10 +2,11 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.querybuilder.schema.Drop; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; +import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import java.util.Objects; /** Builds a {@link DropTypeDBTask}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java index cc9764db95..3ab4c5825e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeExceptionHandler.java @@ -6,7 +6,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.core.servererrors.InvalidQueryException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import java.util.Map; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; +import java.util.Map; import java.util.Objects; public class DropTypeExceptionHandler extends KeyspaceDriverExceptionHandler { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java index 67b2b06343..8f7514392e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/KeyspaceDriverExceptionHandler.java @@ -3,6 +3,7 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; + /** * Subclass of {@link DefaultDriverExceptionHandler} for working with {@link KeyspaceSchemaObject}. * diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java index 48bee9afe1..0837b7a95f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDeleteDBTaskBuilder.java @@ -2,10 +2,10 @@ import com.datastax.oss.driver.api.querybuilder.delete.Delete; import io.stargate.sgv2.jsonapi.exception.FilterException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.DeleteDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java index 48a45d4a9c..50dae88032 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableDriverExceptionHandler.java @@ -2,7 +2,8 @@ import com.datastax.oss.driver.api.core.cql.SimpleStatement; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * Subclass of {@link DefaultDriverExceptionHandler} for working with {@link TableSchemaObject}. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java index d50cf980ff..d846841922 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTask.java @@ -4,8 +4,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.SchemaDescSource; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.ColumnsDescContainer; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTask; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.DocRowIdentifer; import io.stargate.sgv2.jsonapi.service.shredding.tables.RowId; import io.stargate.sgv2.jsonapi.service.shredding.tables.WriteableTableRow; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java index 960fb9b1fd..6e4abf4043 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertDBTaskBuilder.java @@ -2,11 +2,11 @@ import com.fasterxml.jackson.databind.JsonNode; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTask; import io.stargate.sgv2.jsonapi.service.operation.InsertDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.tasks.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.tables.JsonNamedValueContainerFactory; import io.stargate.sgv2.jsonapi.service.shredding.tables.WriteableTableRow; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java index 19ce94a0c5..08f78496ab 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableInsertValuesCQLClause.java @@ -4,9 +4,9 @@ import com.datastax.oss.driver.api.querybuilder.insert.OngoingValues; import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.InsertValuesCQLClause; import io.stargate.sgv2.jsonapi.service.resolver.UnvalidatedClauseException; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.tables.WriteableTableRow; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java index b4edc6fc21..80c9eed83e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableOperation.java @@ -1,8 +1,8 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java index ac0d7ece45..deca240e40 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableProjection.java @@ -18,11 +18,11 @@ import io.stargate.sgv2.jsonapi.exception.ProjectionException; import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToJSONCodecException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; import io.stargate.sgv2.jsonapi.service.operation.query.SelectCQLClause; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiSupportDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.*; import java.util.function.Predicate; import org.slf4j.Logger; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java index 74f4ca590d..1fe5169efe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableReadDBTaskBuilder.java @@ -4,11 +4,11 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.ReadDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.*; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskBuilder; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java index 2f7579eb1d..ca8c5ae920 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/TableWhereCQLClause.java @@ -7,9 +7,9 @@ import com.datastax.oss.driver.api.querybuilder.update.Update; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.LogicalExpression; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.override.DefaultSubConditionRelation; import io.stargate.sgv2.jsonapi.service.operation.query.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java index be8029d072..e1c6bd6619 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WhereCQLClauseAnalyzer.java @@ -13,7 +13,6 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.InTableFilter; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListTableFilter; @@ -24,6 +23,8 @@ import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexFunction; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexType; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java index 2102a203c2..f8bbae246f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/WriteableTableRowBuilder.java @@ -8,9 +8,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.DocumentException; import io.stargate.sgv2.jsonapi.exception.ErrorCode; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.*; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.*; import io.stargate.sgv2.jsonapi.service.shredding.tables.CqlNamedValueContainerFactory; import io.stargate.sgv2.jsonapi.service.shredding.tables.WriteableTableRow; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java index 4903b4afa6..f95d90b305 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/CompositeTaskOperationBuilder.java @@ -1,8 +1,8 @@ package io.stargate.sgv2.jsonapi.service.operation.tasks; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** * Helps build an {@link Operation} to run composite tasks of inner task groups. diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java index ba47aada11..764064a692 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskOperation.java @@ -5,8 +5,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.tracing.TraceMessage; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.util.Objects; import java.util.function.Function; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java index 842caca0bf..a75abfd768 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/TaskPage.java @@ -2,8 +2,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.CommandResultBuilder; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Collections; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java index fd29897bfb..afda02bbc8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandLog.java @@ -1,8 +1,6 @@ package io.stargate.sgv2.jsonapi.service.processor; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; -import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; - import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java index 7794f7efa2..535d16e0f0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/CommandProcessor.java @@ -13,7 +13,6 @@ import io.stargate.sgv2.jsonapi.exception.ExceptionFlags; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableCommandResultSupplier; - import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.resolver.CommandResolverService; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java index 6be089b6e9..e03c9ef7b8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java @@ -169,7 +169,9 @@ private String buildCommandLog( command.getClass().getSimpleName(), commandContext.requestContext().tenant(), commandContext.schemaObject().identifier().keyspace().asInternal(), - commandContext.schemaObject().identifier().table() == null ? "" : commandContext.schemaObject().identifier().table().asInternal(), + commandContext.schemaObject().identifier().table() == null + ? "" + : commandContext.schemaObject().identifier().table().asInternal(), commandContext.schemaObject().type().name(), getIncomingDocumentsCount(command), getOutgoingDocumentsCount(result), diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java index ab631ba929..273040368f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTableCommandResolver.java @@ -14,7 +14,6 @@ import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableExtensions; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorizeDefinition; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; @@ -23,6 +22,7 @@ import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; import io.stargate.sgv2.jsonapi.service.schema.tables.*; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java index ce25fbc3f8..b95aaeb0ad 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/AlterTypeCommandResolver.java @@ -6,13 +6,14 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.AlterTypeCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.AlterTypeDBTask; import io.stargate.sgv2.jsonapi.service.operation.tables.AlterTypeExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiUdtType; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java index 3cae9cac95..45432d831e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolver.java @@ -24,7 +24,6 @@ import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; - import java.util.Objects; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java index f1c83d8f88..7af9560a42 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java @@ -15,10 +15,10 @@ import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.CreateCollectionOperation; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionLexicalConfig; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionRerankDef; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java index 6aa2853f00..65083ec8d9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateIndexCommandResolver.java @@ -9,7 +9,6 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; @@ -20,6 +19,7 @@ import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexType; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiRegularIndex; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java index 65e20fa4e6..ca013050e9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolver.java @@ -2,9 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateKeyspaceCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import jakarta.enterprise.context.ApplicationScoped; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java index 5de5b7c0e9..cda5c7c16d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateNamespaceCommandResolver.java @@ -2,9 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import jakarta.enterprise.context.ApplicationScoped; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java index 7503e5141e..32cb158d25 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateTextIndexCommandResolver.java @@ -9,7 +9,6 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; @@ -21,6 +20,7 @@ import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexType; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTextIndex; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java index 7a89cd7269..87f24724b8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateVectorIndexCommandResolver.java @@ -9,7 +9,6 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.CreateIndexDBTask; import io.stargate.sgv2.jsonapi.service.operation.tables.CreateIndexDBTaskBuilder; @@ -19,6 +18,7 @@ import io.stargate.sgv2.jsonapi.service.schema.naming.NamingRules; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexType; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorIndex; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; import java.util.Map; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java index fa5a06f9d9..0a4188f14d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolver.java @@ -2,8 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteCollectionCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionCollectionOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** Resolver for the {@link DeleteCollectionCommand}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java index c953048d8d..c6e373a798 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteManyCommandResolver.java @@ -7,7 +7,6 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteManyCommand; import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionOperation; @@ -23,6 +22,7 @@ import io.stargate.sgv2.jsonapi.service.resolver.matcher.FilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.matcher.TableFilterResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java index d7f0102aa3..0d76ad3d1b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteOneCommandResolver.java @@ -11,7 +11,6 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionOperation; @@ -24,6 +23,7 @@ import io.stargate.sgv2.jsonapi.service.resolver.matcher.FilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.matcher.TableFilterResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.SortClauseUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java index f91e43ba63..cf6ff8e511 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropIndexCommandResolver.java @@ -6,13 +6,14 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropIndexCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.DropIndexDBTask; import io.stargate.sgv2.jsonapi.service.operation.tables.DropIndexExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.util.ApiOptionUtils; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java index f0452b74f9..b6943f5819 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolver.java @@ -2,9 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropKeyspaceCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** Command resolver for {@link DropKeyspaceCommand}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java index 7eee36775a..ce0c886d2f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropNamespaceCommandResolver.java @@ -2,9 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java index 7190e79959..e6cb842e63 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTableCommandResolver.java @@ -6,12 +6,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropTableCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.*; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.util.ApiOptionUtils; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java index 4410e0d414..7404e17a8c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/DropTypeCommandResolver.java @@ -6,13 +6,14 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.DropTypeCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTask; import io.stargate.sgv2.jsonapi.service.operation.SchemaDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.tables.DropTypeDBTask; import io.stargate.sgv2.jsonapi.service.operation.tables.DropTypeExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.util.ApiOptionUtils; import jakarta.enterprise.context.ApplicationScoped; import java.time.Duration; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java index 649e27e97d..23adf54fb8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionsCommandResolver.java @@ -3,8 +3,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCollectionsCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionsCollectionOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java index 17ed9e5664..5d82b8aa27 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindCommandResolver.java @@ -11,13 +11,13 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionOperation; import io.stargate.sgv2.jsonapi.service.resolver.matcher.CollectionFilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.matcher.FilterResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.SortClauseUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java index 77ab71f331..b4b6a76046 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindEmbeddingProvidersCommandResolver.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindEmbeddingProvidersCommand; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.configuration.EmbeddingProvidersConfig; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.embeddings.FindEmbeddingProvidersOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java index 0d7cc41ad6..9f86622b91 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindKeyspacesCommandResolver.java @@ -2,9 +2,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindKeyspacesCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.FindKeyspacesOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** Command resolver for {@link FindKeyspacesCommand}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java index 3834a904e9..814721ac4c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindNamespacesCommandResolver.java @@ -2,7 +2,6 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindNamespacesCommand; - import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.FindKeyspacesOperation; import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java index ea44fc5917..40bda02c50 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindOneCommandResolver.java @@ -9,7 +9,6 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionOperation; @@ -17,6 +16,7 @@ import io.stargate.sgv2.jsonapi.service.resolver.matcher.CollectionFilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.matcher.FilterResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.SortClauseUtil; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java index 42f499055c..b4d03d92d4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/FindRerankingProvidersCommandResolver.java @@ -4,10 +4,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindRerankingProvidersCommand; import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.reranking.FindRerankingProvidersOperation; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java index 91d70604e3..0ab26873b4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertManyCommandResolver.java @@ -2,7 +2,6 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.InsertManyCommand; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionInsertAttemptBuilder; import io.stargate.sgv2.jsonapi.service.operation.collections.InsertCollectionOperation; @@ -10,6 +9,7 @@ import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tables.TableInsertDBTask; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentShredder; import io.stargate.sgv2.jsonapi.service.shredding.tables.JsonNamedValueContainerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java index 16b0269d7f..1e24e92d30 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/InsertOneCommandResolver.java @@ -2,7 +2,6 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.InsertOneCommand; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionInsertAttemptBuilder; import io.stargate.sgv2.jsonapi.service.operation.collections.InsertCollectionOperation; @@ -10,6 +9,7 @@ import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tables.TableInsertDBTask; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentShredder; import io.stargate.sgv2.jsonapi.service.shredding.tables.JsonNamedValueContainerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java index 2afae79d13..e27d72f69a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListIndexesCommandResolver.java @@ -3,11 +3,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListIndexesCommand; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import jakarta.enterprise.context.ApplicationScoped; /** Command resolver for the {@link ListIndexesCommand}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java index 36c3cc5b34..4ccb64db66 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTablesCommandResolver.java @@ -4,10 +4,11 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListTablesCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.*; +import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.tables.KeyspaceDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java index db82a34511..e29d16e640 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/ListTypesCommandResolver.java @@ -4,12 +4,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandStatus; import io.stargate.sgv2.jsonapi.api.model.command.impl.ListTypesCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.ListTypesDBTask; +import io.stargate.sgv2.jsonapi.service.operation.ListTypesDBTask; import io.stargate.sgv2.jsonapi.service.operation.MetadataDBTaskPage; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.tables.KeyspaceDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskGroup; import io.stargate.sgv2.jsonapi.service.operation.tasks.TaskOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java index 160b69ab54..a036d9bc33 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/TableReadDBOperationBuilder.java @@ -5,7 +5,6 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.embeddings.EmbeddingOperationFactory; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOption; @@ -16,6 +15,7 @@ import io.stargate.sgv2.jsonapi.service.resolver.matcher.TableFilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.sort.TableCqlSortClauseResolver; import io.stargate.sgv2.jsonapi.service.resolver.sort.TableMemorySortClauseResolver; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java index bfe772a747..9c7f2134ac 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/UpdateOneCommandResolver.java @@ -11,7 +11,6 @@ import io.stargate.sgv2.jsonapi.api.v1.metrics.JsonApiMetricsConfig; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; import io.stargate.sgv2.jsonapi.service.operation.*; import io.stargate.sgv2.jsonapi.service.operation.collections.CollectionReadType; @@ -28,6 +27,7 @@ import io.stargate.sgv2.jsonapi.service.resolver.matcher.TableFilterResolver; import io.stargate.sgv2.jsonapi.service.resolver.update.TableUpdateResolver; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentShredder; import io.stargate.sgv2.jsonapi.service.updater.DocumentUpdater; import io.stargate.sgv2.jsonapi.util.SortClauseUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java index 12fb29f94e..5b1cd4e94c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterResolver.java @@ -4,9 +4,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.*; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import java.util.Objects; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java index 0979947095..217c730fbe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/TableFilterResolver.java @@ -7,10 +7,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonType; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.ValueComparisonOperator; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.*; import io.stargate.sgv2.jsonapi.service.operation.filters.table.BinaryTableFilter; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentId; import java.math.BigDecimal; import java.util.EnumSet; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java index 48d757f53e..c4dca7c4c2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableCqlSortClauseResolver.java @@ -17,7 +17,6 @@ import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cql.builder.QueryBuilder; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; @@ -30,6 +29,7 @@ import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTableDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiTypeName; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.*; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonPath; import io.stargate.sgv2.jsonapi.service.shredding.tables.CqlNamedValueContainerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java index 8c07150783..6d21a76410 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableMemorySortClauseResolver.java @@ -10,11 +10,11 @@ import io.stargate.sgv2.jsonapi.exception.SortException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.InMemorySortComparator; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; import io.stargate.sgv2.jsonapi.service.operation.query.RowSorter; import io.stargate.sgv2.jsonapi.service.operation.tables.TableRowSorter; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.ArrayList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java index fdbd0451ad..7f22cc9323 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/sort/TableSortClauseResolver.java @@ -5,8 +5,8 @@ import io.stargate.sgv2.jsonapi.api.model.command.Command; import io.stargate.sgv2.jsonapi.api.model.command.Sortable; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** * Common base for common code when resolving the sort clause for either CQL or in memory sorting diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java index 851defac0d..634a25c0f2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateAnalyzer.java @@ -8,7 +8,8 @@ import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; +import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import java.util.List; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java index 260b11872c..c8fef40c3f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorResolver.java @@ -6,10 +6,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; import io.stargate.sgv2.jsonapi.service.shredding.tables.CqlNamedValueContainerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java index b1112afced..d23a13f370 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePullAllResolver.java @@ -3,10 +3,10 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnRemoveToAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java index a340fa488b..cef8d07547 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdatePushResolver.java @@ -11,10 +11,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperatorModifier; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAppendToAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java index 1602679468..e255d2be73 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateResolver.java @@ -14,10 +14,10 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.UpdateException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.DefaultUpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValueContainer; import io.stargate.sgv2.jsonapi.service.shredding.tables.CqlNamedValueContainerFactory; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java index b6453b8b6c..8caba3bff3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateSetResolver.java @@ -3,9 +3,9 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java index d768d9699b..ba6b7444ca 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateUnsetResolver.java @@ -5,10 +5,10 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonType; import io.stargate.sgv2.jsonapi.api.model.command.clause.update.UpdateOperator; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import java.util.List; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java index 9af2f5be72..fb209d87c4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/update/UpdateResolver.java @@ -3,9 +3,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.Command; import io.stargate.sgv2.jsonapi.api.model.command.Updatable; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.UpdateValuesCQLClause; import io.stargate.sgv2.jsonapi.service.resolver.ClauseResolver; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** * A {@link ClauseResolver} for the update clause in a command and creates a {@link diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java index 8b0b417c0e..c5476f7a2b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/DatabaseSchemaObject.java @@ -6,12 +6,11 @@ /** * A Database in the API. - *

- * While we don't do much with a database itself in the API, we do some commands like - * listing keyspaces that conceptually belong to the database. So we have a schema - * object for it. - *

- * Currently only identified by the tenant. + * + *

While we don't do much with a database itself in the API, we do some commands like listing + * keyspaces that conceptually belong to the database. So we have a schema object for it. + * + *

Currently only identified by the tenant. */ public class DatabaseSchemaObject extends SchemaObject { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java index 74001b0499..11bdef3f59 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/KeyspaceSchemaObject.java @@ -5,17 +5,16 @@ import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; - import java.util.Objects; /** * A Keyspace in the API. - *

- * We currently do not hang things like Tables and Views of the KeyspaceSchemaObject, - * they can all be retrieved from {@link SchemaObjectCache} - *

- * We hae commands like list collections, list tables, etc. that run against - * as Keyspace so we have an object to represent that Keyspace. + * + *

We currently do not hang things like Tables and Views of the KeyspaceSchemaObject, they can + * all be retrieved from {@link SchemaObjectCache} + * + *

We hae commands like list collections, list tables, etc. that run against as Keyspace so we + * have an object to represent that Keyspace. */ public class KeyspaceSchemaObject extends SchemaObject { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java index 857c92b266..1d1820b9f8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObject.java @@ -6,11 +6,10 @@ import java.util.Objects; /** - * Base for all Schema objects the API works with, such as Database, Keyspace, - * Table, Collection. - *

- * Schema Object are identified by a {@link SchemaObjectIdentifier} which is globally unique - * for all tenants. + * Base for all Schema objects the API works with, such as Database, Keyspace, Table, Collection. + * + *

Schema Object are identified by a {@link SchemaObjectIdentifier} which is globally unique for + * all tenants. */ public abstract class SchemaObject implements Recordable { @@ -39,16 +38,15 @@ public SchemaObjectIdentifier identifier() { /** * Subclasses must always return VectorConfig, if there is no vector config they should return * VectorConfig.notEnabledVectorConfig(). - *

- * aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. + * + *

aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. */ public abstract VectorConfig vectorConfig(); /** * Call to get an instance of the appropriate {@link IndexUsage} for this schema object * - *

- * aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. + *

aaron - 30 may 2025 - this is legacy from old code and should be moved in the future. */ public abstract IndexUsage newIndexUsage(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java index afb094e5d6..84e055f11c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java @@ -272,7 +272,7 @@ private SchemaCacheKey createCacheKey( // sanity check // requestContext may be null when we are doing evictions - if (requestContext!= null && (!requestContext.tenant().equals(schemaIdentifier.tenant()))){ + if (requestContext != null && (!requestContext.tenant().equals(schemaIdentifier.tenant()))) { throw new IllegalArgumentException( "RequestContext tenant does not match schemaIdentifier requestContext.tenant: " + requestContext.tenant() diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java index 1ff2b6a8dc..e1fa54ffe3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java @@ -18,9 +18,7 @@ import java.util.Objects; import java.util.concurrent.CompletionStage; -/** - * Creates - */ +/** Creates */ public class SchemaObjectFactory implements SchemaObjectCache.SchemaObjectFactory { private static final CollectionTableMatcher IS_COLLECTION_PREDICATE = @@ -42,9 +40,10 @@ public CompletionStage apply( Objects.requireNonNull(identifier, "identifier must not be null"); // sanity check - if (! requestContext.tenant().equals(identifier.tenant())){ - throw new IllegalArgumentException("requestContext and identifier tenant mismatch, requestContext: %s, identifier: %s" - .formatted(requestContext, identifier.tenant())); + if (!requestContext.tenant().equals(identifier.tenant())) { + throw new IllegalArgumentException( + "requestContext and identifier tenant mismatch, requestContext: %s, identifier: %s" + .formatted(requestContext, identifier.tenant())); } Uni uni = @@ -94,7 +93,9 @@ private Uni createKeyspaceSchemaObject( } private Uni createTableBasedSchemaObject( - RequestContext requestContext, UnscopedSchemaObjectIdentifier scopedName, boolean forceRefresh) { + RequestContext requestContext, + UnscopedSchemaObjectIdentifier scopedName, + boolean forceRefresh) { return getKeyspaceMetadata(requestContext, scopedName, forceRefresh) .map( @@ -117,13 +118,14 @@ private Uni createTableBasedSchemaObject( return IS_COLLECTION_PREDICATE.test(tableMetadata) ? CollectionSchemaObject.getCollectionSettings( requestContext.tenant(), tableMetadata, OBJECT_MAPPER) - : TableSchemaObject.from( - requestContext.tenant(), tableMetadata, OBJECT_MAPPER); + : TableSchemaObject.from(requestContext.tenant(), tableMetadata, OBJECT_MAPPER); }); } private Uni getKeyspaceMetadata( - RequestContext requestContext, UnscopedSchemaObjectIdentifier scopedName, boolean forceRefresh) { + RequestContext requestContext, + UnscopedSchemaObjectIdentifier scopedName, + boolean forceRefresh) { var queryExecutor = new CommandQueryExecutor( diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java index 8217c4df0c..bce0f1e471 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java @@ -8,7 +8,6 @@ import com.google.common.base.Preconditions; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.logging.LoggingMDCContext; -import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Objects; import javax.annotation.Nullable; @@ -16,22 +15,21 @@ /** * Identifies a {@link SchemaObject} in the API, which can be a database, keyspace, collection, etc. - *

- * Schema objects are identified by their type, name, and importantly, the tenant they belong to. So an identifier - * is unique and stable for all tenants in a single instance of the API. - *

- *

- * Create using the factory methods, such as {@link #forDatabase(Tenant)} which validate the data that is needed. - *

- * use {@link #fullName()} or {@link #toString()} to get a human-readable representation of the identifier, such as - * keyspace_name.table_name - *

- * Note: You should compare and manages the identifiers as objects using - * the {@link #equals(Object)} and {@link #hashCode()} methods, which include the tenant etc in the logic. - * Avoid comparing the individual fields, such as {@link #tenant()}, {@link #keyspace()} or {@link #table()}. * + *

Schema objects are identified by their type, name, and importantly, the tenant they belong to. + * So an identifier is unique and stable for all tenants in a single instance of the API. + * + *

Create using the factory methods, such as {@link #forDatabase(Tenant)} which validate the data + * that is needed. + * + *

use {@link #fullName()} or {@link #toString()} to get a human-readable representation of the + * identifier, such as keyspace_name.table_name Note: You should compare and + * manages the identifiers as objects using the {@link #equals(Object)} and {@link #hashCode()} + * methods, which include the tenant etc in the logic. Avoid comparing the individual fields, such + * as {@link #tenant()}, {@link #keyspace()} or {@link #table()}. */ -public class SchemaObjectIdentifier implements UnscopedSchemaObjectIdentifier, Recordable, LoggingMDCContext { +public class SchemaObjectIdentifier + implements UnscopedSchemaObjectIdentifier, Recordable, LoggingMDCContext { private final SchemaObjectType type; private final Tenant tenant; @@ -57,18 +55,14 @@ private SchemaObjectIdentifier( }; } - /** - * Creates a {@link SchemaObjectIdentifier} for a database. - */ + /** Creates a {@link SchemaObjectIdentifier} for a database. */ public static SchemaObjectIdentifier forDatabase(Tenant tenant) { checkTenantId(tenant); return new SchemaObjectIdentifier(SchemaObjectType.DATABASE, tenant, null, null); } - /** - * Creates a {@link SchemaObjectIdentifier} for a keyspace. - */ + /** Creates a {@link SchemaObjectIdentifier} for a keyspace. */ public static SchemaObjectIdentifier forKeyspace(Tenant tenant, CqlIdentifier keyspace) { checkTenantId(tenant); @@ -76,9 +70,7 @@ public static SchemaObjectIdentifier forKeyspace(Tenant tenant, CqlIdentifier ke return new SchemaObjectIdentifier(SchemaObjectType.KEYSPACE, tenant, keyspace, null); } - /** - * Creates a {@link SchemaObjectIdentifier} for a collection. - */ + /** Creates a {@link SchemaObjectIdentifier} for a collection. */ public static SchemaObjectIdentifier forCollection( Tenant tenant, CqlIdentifier keyspace, CqlIdentifier collection) { @@ -88,9 +80,7 @@ public static SchemaObjectIdentifier forCollection( return new SchemaObjectIdentifier(SchemaObjectType.COLLECTION, tenant, keyspace, collection); } - /** - * Creates a {@link SchemaObjectIdentifier} for a table. - */ + /** Creates a {@link SchemaObjectIdentifier} for a table. */ public static SchemaObjectIdentifier forTable( Tenant tenant, CqlIdentifier keyspace, CqlIdentifier table) { @@ -100,9 +90,7 @@ public static SchemaObjectIdentifier forTable( return new SchemaObjectIdentifier(SchemaObjectType.TABLE, tenant, keyspace, table); } - /** - * Creates a {@link SchemaObjectIdentifier} using CQL TableMetadata to get the name parts. - */ + /** Creates a {@link SchemaObjectIdentifier} using CQL TableMetadata to get the name parts. */ public static SchemaObjectIdentifier fromTableMetadata( SchemaObjectType type, Tenant tenant, TableMetadata tableMetadata) { @@ -113,7 +101,9 @@ public static SchemaObjectIdentifier fromTableMetadata( case TABLE -> forTable(tenant, tableMetadata.getKeyspace(), tableMetadata.getName()); case COLLECTION -> forCollection(tenant, tableMetadata.getKeyspace(), tableMetadata.getName()); - default -> throw new IllegalArgumentException("fromTableMetadata() - Unsupported object type: " + type); + default -> + throw new IllegalArgumentException( + "fromTableMetadata() - Unsupported object type: " + type); }; } @@ -123,10 +113,11 @@ public SchemaObjectType type() { /** * The full name of the schema object, this is also returned from {@link #toString()}.: + * *

*/ public String fullName() { @@ -137,9 +128,7 @@ public Tenant tenant() { return tenant; } - /** - * Gets the {@link SchemaObjectIdentifier} for the keyspace that contains this schema object. - */ + /** Gets the {@link SchemaObjectIdentifier} for the keyspace that contains this schema object. */ public SchemaObjectIdentifier keyspaceIdentifier() { return forKeyspace(tenant, keyspace); } @@ -154,17 +143,13 @@ public CqlIdentifier table() { return table; } - /** - * Same as {@link #table()} , part of the {@link UnscopedSchemaObjectIdentifier} interface. - */ + /** Same as {@link #table()} , part of the {@link UnscopedSchemaObjectIdentifier} interface. */ @Override public CqlIdentifier objectName() { return table; } - /** - * Tests if this identifier is from the same tenant AND keyspace as another identifier. - */ + /** Tests if this identifier is from the same tenant AND keyspace as another identifier. */ public boolean isSameKeyspace(SchemaObjectIdentifier other) { return Objects.equals(tenant, other.tenant) && Objects.equals(keyspace, other.keyspace); } @@ -218,9 +203,7 @@ public int hashCode() { return Objects.hash(type, tenant, keyspace, table); } - /** - * Gets the {@link #fullName()} - */ + /** Gets the {@link #fullName()} */ @Override public String toString() { return fullName(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java index 08a0fbd22a..72b7a82e8c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectType.java @@ -2,11 +2,8 @@ import java.util.Objects; -/** - * The types of schema object that are used in the API - */ +/** The types of schema object that are used in the API */ public enum SchemaObjectType { - COLLECTION(Constants.COLLECTION), DATABASE(Constants.DATABASE), INDEX(Constants.INDEX), diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java index 1bb08bf7a3..26619e8dae 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/UnscopedSchemaObjectIdentifier.java @@ -3,27 +3,23 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.api.request.UserAgent; - import java.util.Objects; /** - * An identifier for a schema object that is not scoped to a - * {@link io.stargate.sgv2.jsonapi.api.request.tenant.Tenant}. - *

- * We only have the Keyspace and object name, such as the table name, we do now know who it belongs to. - * This is used by the SchemaObjectCache due to issues with not knowing if a CQL table is a - * API Collection or API Table. See {@link SchemaObjectCache#getTableBased(RequestContext, UnscopedSchemaObjectIdentifier, UserAgent, boolean)} + * An identifier for a schema object that is not scoped to a {@link + * io.stargate.sgv2.jsonapi.api.request.tenant.Tenant}. + * + *

We only have the Keyspace and object name, such as the table name, we do now know who it + * belongs to. This is used by the SchemaObjectCache due to issues with not knowing if a CQL table + * is a API Collection or API Table. See {@link SchemaObjectCache#getTableBased(RequestContext, + * UnscopedSchemaObjectIdentifier, UserAgent, boolean)} */ public interface UnscopedSchemaObjectIdentifier { - /** - * The keyspace that this object belongs to. - */ + /** The keyspace that this object belongs to. */ CqlIdentifier keyspace(); - /** - * The name of the object, such as a table or index. - */ + /** The name of the object, such as a table or index. */ CqlIdentifier objectName(); record DefaultKeyspaceScopedName(CqlIdentifier keyspace, CqlIdentifier objectName) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java index bd89809175..6e31f124af 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Collection name. */ public class CollectionNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java index 596e5e3e01..9d32e88681 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Index name. */ public class IndexNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java index 626d758990..e6d0c95942 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Keyspace name. */ public class KeyspaceNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java index 3f849a667a..0a4d9cea3d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/SchemaObjectNamingRule.java @@ -2,9 +2,7 @@ import io.stargate.sgv2.jsonapi.exception.ErrorTemplate; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; - import java.util.Map; import java.util.regex.Pattern; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java index de3b317490..010bf2978f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; /** The naming rule of the new Table name. */ public class TableNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java index d93a98682d..e8d7927e2a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/UdtNamingRule.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; public class UdtNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java index a6b4622270..14dc69a8ef 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiRegularIndex.java @@ -14,7 +14,6 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromIndexDesc; import io.stargate.sgv2.jsonapi.util.ApiOptionUtils; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java index 1d07bb0309..531a3b9695 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiTextIndex.java @@ -18,7 +18,6 @@ import io.stargate.sgv2.jsonapi.config.constants.TableDescDefaults; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromIndexDesc; import io.stargate.sgv2.jsonapi.util.JsonUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java index 589a7a4341..0bcf7a85d8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/ApiVectorIndex.java @@ -13,7 +13,6 @@ import io.stargate.sgv2.jsonapi.config.constants.VectorConstants; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedCqlIndexException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; import io.stargate.sgv2.jsonapi.service.schema.tables.factories.IndexFactoryFromCql; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java index a28e580398..0d09df2323 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableBasedSchemaObject.java @@ -7,12 +7,9 @@ import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; - import java.util.Objects; -/** - * Common base for a Collection and Table, which are both a CQL Table. - */ +/** Common base for a Collection and Table, which are both a CQL Table. */ public abstract class TableBasedSchemaObject extends SchemaObject { private final TableMetadata tableMetadata; @@ -24,13 +21,10 @@ protected TableBasedSchemaObject( this.tableMetadata = Objects.requireNonNull(tableMetadata, "tableMetadata must not be null"); } - /** - * For old tests that do not have the table metadata - */ + /** For old tests that do not have the table metadata */ @VisibleForTesting protected TableBasedSchemaObject( - SchemaObjectType expectedType, - SchemaObjectIdentifier schemaObjectIdentifier) { + SchemaObjectType expectedType, SchemaObjectIdentifier schemaObjectIdentifier) { super(expectedType, schemaObjectIdentifier); this.tableMetadata = null; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java index 7de962059d..3b4d8fa36c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/factories/IndexFactoryFromIndexDesc.java @@ -6,9 +6,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.table.definition.indexes.IndexDefinitionDesc; import io.stargate.sgv2.jsonapi.exception.SchemaException; import io.stargate.sgv2.jsonapi.exception.checked.UnsupportedUserIndexException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiIndexDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * Base for Factories that can create a {@link ApiIndexDef} subclass from the user description in a diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java index 2c70cbf7b1..3c21a24266 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/CqlNamedValue.java @@ -12,12 +12,12 @@ import io.stargate.sgv2.jsonapi.exception.checked.MissingJSONCodecException; import io.stargate.sgv2.jsonapi.exception.checked.ToCQLCodecException; import io.stargate.sgv2.jsonapi.exception.checked.UnknownColumnException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.embeddings.EmbeddingDeferredAction; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodec; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiVectorType; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.*; /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java index 618c5ef439..737655acf0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/JsonNamedValue.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.databind.JsonNode; import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.JsonLiteral; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonPath; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java index 775d1a730d..d75dd45728 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/NamedValue.java @@ -2,8 +2,8 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.RequestException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.ApiColumnDef; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java index 04181a8002..edab15bdef 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/shredding/tables/CqlNamedValueContainerFactory.java @@ -3,8 +3,8 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.internal.core.util.Strings; import io.stargate.sgv2.jsonapi.exception.RequestException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistry; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValueContainer; import io.stargate.sgv2.jsonapi.service.shredding.JsonNamedValueContainer; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java index be5e21ebb8..961299f435 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/util/DynamicTTLCache.java @@ -7,10 +7,6 @@ import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.cache.CaffeineStatsCounter; import io.smallrye.mutiny.Uni; -import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.api.request.UserAgent; -import io.stargate.sgv2.jsonapi.service.cqldriver.CqlCredentials; -import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; import io.stargate.sgv2.jsonapi.api.request.UserAgent; import java.time.Duration; import java.util.ArrayList; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java b/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java index c4f0547114..e9e89682e5 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/model/command/builders/TableFilterClauseBuilderTest.java @@ -10,8 +10,8 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import java.io.IOException; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java index e72fd45355..324fc16d57 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java @@ -8,8 +8,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.resolver.update.TableUpdateAnalyzer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import org.slf4j.Logger; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java index ae14d10a63..e4d4d5ddb5 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java @@ -10,9 +10,9 @@ import com.datastax.oss.driver.internal.querybuilder.select.DefaultSelect; import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.tables.TableWhereCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.ArrayList; import java.util.List; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java index 664ef25b26..84ee683c5d 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/UpdateClauseTestData.java @@ -11,11 +11,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.stargate.sgv2.jsonapi.exception.ErrorCode; import io.stargate.sgv2.jsonapi.exception.UpdateException; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.codecs.JSONCodecRegistries; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnSetToAssignment; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValue; import io.stargate.sgv2.jsonapi.service.shredding.CqlNamedValueContainer; import io.stargate.sgv2.jsonapi.service.shredding.JsonNodeDecoder; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java index b46bf77afc..815933e7e4 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java @@ -14,10 +14,10 @@ import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.tables.TableWhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tables.WhereCQLClauseAnalyzer; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.Arrays; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java index 816901941a..de2f52443e 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereCQLClauseTestData.java @@ -1,9 +1,9 @@ package io.stargate.sgv2.jsonapi.fixtures.testdata; import com.datastax.oss.driver.api.querybuilder.select.Select; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; public class WhereCQLClauseTestData extends TestDataSuplier { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java index cce4a3a50a..866d5d058b 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java @@ -20,9 +20,10 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.serializer.CQLBindValues; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionLexicalConfig; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionRerankDef; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java index 8186e2b61a..5d435930eb 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java @@ -10,8 +10,8 @@ import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WarningException; -import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.time.Duration; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java index bb60e0714c..ddbe776076 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestData.java @@ -10,13 +10,13 @@ import io.stargate.sgv2.jsonapi.api.model.command.tracing.RequestTracing; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.CQLOptions; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.query.OrderByCqlClause; import io.stargate.sgv2.jsonapi.service.operation.query.WhereCQLClause; import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; import io.stargate.sgv2.jsonapi.service.operation.tables.TableProjection; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import java.util.List; public class ReadDBTaskTestData { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java index d811a3265a..63b9845b50 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/ReadDBTaskTestTask.java @@ -4,11 +4,11 @@ import com.datastax.oss.driver.api.querybuilder.select.Select; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CqlPagingState; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.DefaultDriverExceptionHandler; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.OperationProjection; import io.stargate.sgv2.jsonapi.service.operation.ReadDBTask; import io.stargate.sgv2.jsonapi.service.operation.query.*; import io.stargate.sgv2.jsonapi.service.operation.tables.TableDriverExceptionHandler; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** * A test the mocks reading from the database, using the {@link ReadDBTask} to read from the diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java index a1b2330ac4..413c64192c 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/CommandContextTestData.java @@ -12,9 +12,9 @@ import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** tests data and mocks for working with {@link CommandContext} */ public class CommandContextTestData extends TestDataSuplier { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java index dd53399b42..8ecf518ee0 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java @@ -5,8 +5,8 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; /** Tests data and mocks for working with {@link SchemaObject} */ public class SchemaObjectTestData { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java index 69cfbb4c55..f772a074dd 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolverTest.java @@ -13,8 +13,9 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.CreateCollectionOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import jakarta.inject.Inject; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java index 2a86fe313a..2c9b860b82 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CreateKeyspaceCommandResolverTest.java @@ -10,9 +10,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.CreateNamespaceCommand; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.CreateKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import org.apache.commons.lang3.RandomStringUtils; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java index e28a5c39d1..244dd1b9bb 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DeleteCollectionCommandResolverTest.java @@ -8,8 +8,9 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DeleteCollectionCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.DeleteCollectionCollectionOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java index 7a4bfbea26..a1b6ab8dbd 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/DropKeyspaceCommandResolverTest.java @@ -8,9 +8,9 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.DropNamespaceCommand; -import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.keyspaces.DropKeyspaceOperation; +import io.stargate.sgv2.jsonapi.service.schema.DatabaseSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java index de3e476259..7d0d61e049 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/FindCollectionCommandResolverTest.java @@ -8,8 +8,9 @@ import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCollectionsCommand; -import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject;import io.stargate.sgv2.jsonapi.service.operation.Operation; +import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.FindCollectionsCollectionOperation; +import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java index 6abecfe3c6..b48a21f96d 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/matcher/FilterInversionTest.java @@ -13,9 +13,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.impl.FindCommand; import io.stargate.sgv2.jsonapi.api.model.command.table.definition.datatype.MapComponentDesc; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.filters.table.MapSetListFilterComponent; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; import java.math.BigDecimal; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java index 209d4a76ce..fa62f84aeb 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/update/TableUpdateOperatorTestData.java @@ -12,8 +12,8 @@ import io.stargate.sgv2.jsonapi.exception.UpdateException; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestData; import io.stargate.sgv2.jsonapi.fixtures.testdata.TestDataSuplier; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.query.ColumnAssignment; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import java.util.List; diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java index 6c23c9960d..e1619375f8 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java @@ -17,25 +17,22 @@ import io.stargate.sgv2.jsonapi.config.DatabaseType; import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.CacheTestsBase; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Function; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; -import java.util.List; -import java.util.concurrent.CompletableFuture; -import java.util.function.Function; - - /** * Tests for the {@link SchemaObjectCache.SchemaCacheSchemaChangeListener} to evict and clear items * see XXX for tests on the cache directly. */ public class SchemaObjectCacheChangeListenerTests extends CacheTestsBase { - private static final Logger LOGGER = LoggerFactory.getLogger(SchemaObjectCacheChangeListenerTests.class); - + private static final Logger LOGGER = + LoggerFactory.getLogger(SchemaObjectCacheChangeListenerTests.class); private final UserAgent SLA_USER_AGENT = new UserAgent("user-agent/" + TEST_CONSTANTS.CORRELATION_ID); @@ -73,13 +70,13 @@ public void reset() { TenantFactory.reset(); } - @Test public void silentFailWhenOnSessionReadyNotCalled() { var fixture = newFixture(); var expectedTable = - fixture.mockTable(fixture.tenantFixture, TEST_CONSTANTS.TABLE_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + fixture.mockTable( + fixture.tenantFixture, TEST_CONSTANTS.TABLE_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var tableMetadata = fixture.tableMetadataForIdentifier(TEST_CONSTANTS.TABLE_IDENTIFIER); var keyspaceMetadata = fixture.keyspaceMetadataForIdentifier(TEST_CONSTANTS.TABLE_IDENTIFIER); @@ -98,7 +95,9 @@ public void silentFailWhenOnSessionReadyNotCalled() { fixture .cache() .getIfPresent( - fixture.tenantFixture.requestContext, TEST_CONSTANTS.TABLE_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + fixture.tenantFixture.requestContext, + TEST_CONSTANTS.TABLE_IDENTIFIER, + TEST_CONSTANTS.USER_AGENT); assertThat(actualTableAfter) .as("Table is still in schema cache after listener called before onSessionReady") @@ -133,17 +132,27 @@ public void tableChangesEvictTable() { // put two tables in from two keyspaces for the tenantFixture we are removing // and one from a different tenantFixture // table 1 is the one we remove - var expectedTable1 = fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTable2 = fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable1 = + fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = + fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = + fixture.mockTable( + fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); fixture.listener.onSessionReady(fixture.tenantFixture().cqlSession); var operation = cb.apply(fixture.listener); // only table1 should be removed, the others should still be there - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); - assertSchemaObjectPresent(operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); - assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); + assertSchemaObjectPresent( + operation, + fixture.otherTenantFixture, + fixture, + TABLE_OTHER_IDENTIFIER, + expectedTableOther); } } @@ -155,13 +164,20 @@ public void keyspaceDroppedEvictsAllForKS() { // put two tables in from two keyspaces for the tenantFixture we are removing // and one from a different tenantFixture // table 1 and 2 is the ones we remove - var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - - var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable1 = + fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = + fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = + fixture.mockTable( + fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = + fixture.mockKeyspace( + fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var expectedKSOther = - fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + fixture.mockKeyspace( + fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); @@ -170,15 +186,18 @@ public void keyspaceDroppedEvictsAllForKS() { // drop keyspace 1, from the TENANT fixture.listener.onKeyspaceDropped(ksMetadata1); - // table1 and 2 should be removed because from same keyspace + tenantFixture, table other still there + // table1 and 2 should be removed because from same keyspace + tenantFixture, table other still + // there // keyspace 1 should be removed, but not the other keyspace var operation = "onKeyspaceDropped"; - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); - assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); - - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); - assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); } @Test @@ -188,13 +207,20 @@ public void keyspaceUpdatedEvictsOnlyKs() { // put two tables in from two keyspaces for the tenantFixture we are removing // and one from a different tenantFixture - var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - - var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable1 = + fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = + fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = + fixture.mockTable( + fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = + fixture.mockKeyspace( + fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var expectedKSOther = - fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + fixture.mockKeyspace( + fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); @@ -205,12 +231,16 @@ public void keyspaceUpdatedEvictsOnlyKs() { // only ks for the tenant should be removed, other tables and ks should still be there var operation = "onKeyspaceUpdated"; - assertSchemaObjectPresent(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER, expectedTable1); - assertSchemaObjectPresent(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); - assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); - - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); - assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + assertSchemaObjectPresent( + operation, fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER, expectedTable1); + assertSchemaObjectPresent( + operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER, expectedTable2); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); } @Test @@ -218,14 +248,20 @@ public void keyspaceCreatedEvictsAllForKS() { var fixture = newFixture(); - - var expectedTable1 = fixture.mockTable(fixture.tenantFixture,TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTable2 = fixture.mockTable(fixture.tenantFixture,TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - var expectedTableOther = fixture.mockTable(fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); - - var expectedKS = fixture.mockKeyspace(fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable1 = + fixture.mockTable(fixture.tenantFixture, TABLE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTable2 = + fixture.mockTable(fixture.tenantFixture, TABLE_2_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + var expectedTableOther = + fixture.mockTable( + fixture.otherTenantFixture, TABLE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + + var expectedKS = + fixture.mockKeyspace( + fixture.tenantFixture, KEYSPACE_1_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var expectedKSOther = - fixture.mockKeyspace(fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); + fixture.mockKeyspace( + fixture.otherTenantFixture, KEYSPACE_OTHER_IDENTIFIER, TEST_CONSTANTS.USER_AGENT); var ksMetadata1 = fixture.keyspaceMetadataForIdentifier(KEYSPACE_1_IDENTIFIER); @@ -236,12 +272,14 @@ public void keyspaceCreatedEvictsAllForKS() { // only ks for the tenant should be removed, other tables and ks should still be there var operation = "onKeyspaceCreated"; - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); - assertSchemaObjectPresent(operation,fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); - - assertSchemaObjectRemoved(operation,fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); - assertSchemaObjectPresent(operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, TABLE_1_IDENTIFIER); + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, TABLE_2_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, TABLE_OTHER_IDENTIFIER, expectedTableOther); + + assertSchemaObjectRemoved(operation, fixture.tenantFixture, fixture, KEYSPACE_1_IDENTIFIER); + assertSchemaObjectPresent( + operation, fixture.otherTenantFixture, fixture, KEYSPACE_OTHER_IDENTIFIER, expectedKSOther); } // ========================================================================================================= @@ -249,7 +287,10 @@ public void keyspaceCreatedEvictsAllForKS() { // ========================================================================================================= private void assertSchemaObjectRemoved( - String operation, FixtureTenant thisFixtureTenant, Fixture fixture, SchemaObjectIdentifier identifier) { + String operation, + FixtureTenant thisFixtureTenant, + Fixture fixture, + SchemaObjectIdentifier identifier) { assertThat( fixture.cache.getIfPresent( @@ -334,6 +375,7 @@ private FixtureTenant newFixtureTenant(Tenant tenant) { return new FixtureTenant(tenant, requestContext, cqlSession); } + record Fixture( SchemaObjectCache.SchemaObjectFactory factory, SchemaChangeListener listener, @@ -342,7 +384,8 @@ record Fixture( FixtureTenant tenantFixture, FixtureTenant otherTenantFixture) { - public TableSchemaObject mockTable(FixtureTenant thisFixtureTenant, SchemaObjectIdentifier identifier, UserAgent userAgent) { + public TableSchemaObject mockTable( + FixtureTenant thisFixtureTenant, SchemaObjectIdentifier identifier, UserAgent userAgent) { var tableSchemaObject = mock(TableSchemaObject.class); when(tableSchemaObject.identifier()).thenReturn(identifier); @@ -368,7 +411,10 @@ public void addToCache( UserAgent userAgent, TableSchemaObject tableSchemaObject) { - LOGGER.info("Setting up factories for identifier: {}, thisFixtureTenant: {}", identifier, thisFixtureTenant); + LOGGER.info( + "Setting up factories for identifier: {}, thisFixtureTenant: {}", + identifier, + thisFixtureTenant); // the getTableBased function may need to make two calls to get the schema object, the first // is to try if it is a collection, the second is to get it as a table @@ -382,9 +428,9 @@ public void addToCache( var otherIdentifier = identifier.type() == SchemaObjectType.COLLECTION ? SchemaObjectIdentifier.forTable( - identifier.tenant(), identifier.keyspace(), identifier.table()) + identifier.tenant(), identifier.keyspace(), identifier.table()) : SchemaObjectIdentifier.forCollection( - identifier.tenant(), identifier.keyspace(), identifier.table()); + identifier.tenant(), identifier.keyspace(), identifier.table()); when(factory.apply(any(), eq(otherIdentifier), anyBoolean())) .thenReturn( CompletableFuture.failedFuture( @@ -416,7 +462,8 @@ public void addToCache( .thenReturn(CompletableFuture.completedFuture(keyspaceSchemaObject)); var actual = - cache().getKeyspace(thisFixtureTenant.requestContext, identifier, userAgent, false) + cache() + .getKeyspace(thisFixtureTenant.requestContext, identifier, userAgent, false) .await() .indefinitely(); @@ -441,9 +488,5 @@ public KeyspaceMetadata keyspaceMetadataForIdentifier(SchemaObjectIdentifier ide } } - record FixtureTenant( - Tenant tenant, - RequestContext requestContext, - CqlSession cqlSession - ){} + record FixtureTenant(Tenant tenant, RequestContext requestContext, CqlSession cqlSession) {} } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java index 2c0737f51b..454f494d0a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; -import io.stargate.sgv2.jsonapi.config.DatabaseType; import io.stargate.sgv2.jsonapi.util.recordable.Jsonable; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import org.junit.jupiter.api.Test; @@ -19,7 +18,8 @@ public class SchemaObjectIdentifierTests { protected final TestConstants TEST_CONSTANTS = new TestConstants(); - private final Tenant OTHER_TENANT = Tenant.create(TEST_CONSTANTS.DATABASE_TYPE, "other-tenant-" + TEST_CONSTANTS.CORRELATION_ID); + private final Tenant OTHER_TENANT = + Tenant.create(TEST_CONSTANTS.DATABASE_TYPE, "other-tenant-" + TEST_CONSTANTS.CORRELATION_ID); @Test public void forDatabaseFactory() { @@ -59,16 +59,15 @@ public void forKeyspaceFactory() { .hasMessageContaining("keyspace"); // need fromInternal to create a blank CqlIdentifier - assertThatThrownBy(() -> SchemaObjectIdentifier.forKeyspace(tenant, CqlIdentifier.fromInternal(""))) + assertThatThrownBy( + () -> SchemaObjectIdentifier.forKeyspace(tenant, CqlIdentifier.fromInternal(""))) .as("throws if keyspace is blank") .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("keyspace name must not be blank"); var keyspace = CqlIdentifier.fromCql("ks"); var identifier = SchemaObjectIdentifier.forKeyspace(tenant, keyspace); - assertThat(identifier.fullName()) - .as("fullName should equal keyspace name") - .isEqualTo("ks"); + assertThat(identifier.fullName()).as("fullName should equal keyspace name").isEqualTo("ks"); assertThat(identifier.type()) .as("type should be KEYSPACE") @@ -84,12 +83,15 @@ public void forCollectionFactory() { var tenant = TEST_CONSTANTS.TENANT; var keyspace = CqlIdentifier.fromCql("ks"); - assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(null, keyspace, CqlIdentifier.fromCql("col"))) + assertThatThrownBy( + () -> + SchemaObjectIdentifier.forCollection(null, keyspace, CqlIdentifier.fromCql("col"))) .as("throws if tenant is null") .isInstanceOf(NullPointerException.class) .hasMessageContaining("tenant"); - assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(tenant, null, CqlIdentifier.fromCql("col"))) + assertThatThrownBy( + () -> SchemaObjectIdentifier.forCollection(tenant, null, CqlIdentifier.fromCql("col"))) .as("throws if keyspace is null") .isInstanceOf(NullPointerException.class) .hasMessageContaining("keyspace"); @@ -100,7 +102,10 @@ public void forCollectionFactory() { .hasMessageContaining("collection"); // need fromInternal to create a blank CqlIdentifier - assertThatThrownBy(() -> SchemaObjectIdentifier.forCollection(tenant, keyspace, CqlIdentifier.fromInternal(""))) + assertThatThrownBy( + () -> + SchemaObjectIdentifier.forCollection( + tenant, keyspace, CqlIdentifier.fromInternal(""))) .as("throws if collection is blank") .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("collection name must not be blank"); @@ -125,12 +130,14 @@ public void forTableFactory() { var tenant = TEST_CONSTANTS.TENANT; var keyspace = CqlIdentifier.fromCql("ks"); - assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(null, keyspace, CqlIdentifier.fromCql("tbl"))) + assertThatThrownBy( + () -> SchemaObjectIdentifier.forTable(null, keyspace, CqlIdentifier.fromCql("tbl"))) .as("throws if tenant is null") .isInstanceOf(NullPointerException.class) .hasMessageContaining("tenant"); - assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(tenant, null, CqlIdentifier.fromCql("tbl"))) + assertThatThrownBy( + () -> SchemaObjectIdentifier.forTable(tenant, null, CqlIdentifier.fromCql("tbl"))) .as("throws if keyspace is null") .isInstanceOf(NullPointerException.class) .hasMessageContaining("keyspace"); @@ -141,27 +148,23 @@ public void forTableFactory() { .hasMessageContaining("table"); // need fromInternal to create a blank CqlIdentifier - assertThatThrownBy(() -> SchemaObjectIdentifier.forTable(tenant, keyspace, CqlIdentifier.fromInternal(""))) + assertThatThrownBy( + () -> SchemaObjectIdentifier.forTable(tenant, keyspace, CqlIdentifier.fromInternal(""))) .as("throws if table is blank") .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("table name must not be blank"); var table = CqlIdentifier.fromCql("tbl"); var identifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); - assertThat(identifier.fullName()) - .as("fullName should be keyspace.table") - .isEqualTo("ks.tbl"); + assertThat(identifier.fullName()).as("fullName should be keyspace.table").isEqualTo("ks.tbl"); - assertThat(identifier.type()) - .as("type should be TABLE") - .isEqualTo(SchemaObjectType.TABLE); + assertThat(identifier.type()).as("type should be TABLE").isEqualTo(SchemaObjectType.TABLE); assertThat(identifier.tenant()) .as("tenant should match the one used to create the identifier") .isEqualTo(tenant); } - @Test public void fromTableMetadata() { var tenant = TEST_CONSTANTS.TENANT; @@ -172,7 +175,8 @@ public void fromTableMetadata() { when(metadata.getKeyspace()).thenReturn(keyspace); when(metadata.getName()).thenReturn(table); - var fromTable = SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, metadata); + var fromTable = + SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, metadata); assertThat(fromTable.type()) .as("should return SchemaObjectType.TABLE") .isEqualTo(SchemaObjectType.TABLE); @@ -180,7 +184,8 @@ public void fromTableMetadata() { .as("should extract fullName from metadata for TABLE") .isEqualTo("ks.tbl"); - var fromCollection = SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.COLLECTION, tenant, metadata); + var fromCollection = + SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.COLLECTION, tenant, metadata); assertThat(fromCollection.type()) .as("should return SchemaObjectType.COLLECTION") .isEqualTo(SchemaObjectType.COLLECTION); @@ -188,14 +193,16 @@ public void fromTableMetadata() { .as("should extract fullName from metadata for COLLECTION") .isEqualTo("ks.tbl"); - assertThatThrownBy(() -> - SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.KEYSPACE, tenant, metadata)) + assertThatThrownBy( + () -> + SchemaObjectIdentifier.fromTableMetadata( + SchemaObjectType.KEYSPACE, tenant, metadata)) .as("should throw for unsupported SchemaObjectType") .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Unsupported object type"); - assertThatThrownBy(() -> - SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, null)) + assertThatThrownBy( + () -> SchemaObjectIdentifier.fromTableMetadata(SchemaObjectType.TABLE, tenant, null)) .as("should throw if TableMetadata is null") .isInstanceOf(NullPointerException.class) .hasMessageContaining("tableMetadata must not be null"); @@ -229,7 +236,7 @@ public void unscopedIdentifierInterface() { var table = CqlIdentifier.fromCql("tbl"); var tableIdentifier = SchemaObjectIdentifier.forTable(tenant, keyspace, table); - var unscoped = (UnscopedSchemaObjectIdentifier)tableIdentifier; + var unscoped = (UnscopedSchemaObjectIdentifier) tableIdentifier; assertThat(unscoped.keyspace()) .as("unscoped keyspace should match the table identifier's keyspace") @@ -270,16 +277,12 @@ public void isSameKeyspace() { var id3 = SchemaObjectIdentifier.forTable(OTHER_TENANT, keyspace, table1); - assertThat(id1.isSameKeyspace(id3)) - .as("should return false when tenant differs") - .isFalse(); + assertThat(id1.isSameKeyspace(id3)).as("should return false when tenant differs").isFalse(); var otherKeyspace = CqlIdentifier.fromCql("otherks"); var id4 = SchemaObjectIdentifier.forTable(tenant, otherKeyspace, table1); - assertThat(id1.isSameKeyspace(id4)) - .as("should return false when keyspace differs") - .isFalse(); + assertThat(id1.isSameKeyspace(id4)).as("should return false when keyspace differs").isFalse(); } @Test @@ -302,17 +305,13 @@ public void testAddAndRemoveFromMDC() { identifier.removeFromMDC(); - assertThat(MDC.get("namespace")) - .as("MDC 'namespace' should be removed") - .isNull(); + assertThat(MDC.get("namespace")).as("MDC 'namespace' should be removed").isNull(); - assertThat(MDC.get("collection")) - .as("MDC 'collection' should be removed") - .isNull(); + assertThat(MDC.get("collection")).as("MDC 'collection' should be removed").isNull(); } @Test - public void recordTo(){ + public void recordTo() { var tenant = TEST_CONSTANTS.TENANT; var keyspace = CqlIdentifier.fromCql("ks"); var table = CqlIdentifier.fromCql("tbl"); @@ -332,14 +331,12 @@ public void recordTo(){ var expected = JsonNodeFactory.instance.objectNode(); // there is a top level "SchemaObjectIdentifier" field var contents = expected.withObjectProperty("SchemaObjectIdentifier"); - contents.put("tenant",Jsonable.toJson(tenant)); + contents.put("tenant", Jsonable.toJson(tenant)); contents.put("type", "TABLE"); contents.put("keyspace", keyspace.asInternal()); contents.put("table", table.asInternal()); - assertThat(identifierJson) - .as("JSON output for Tenant") - .isEqualTo(expected); + assertThat(identifierJson).as("JSON output for Tenant").isEqualTo(expected); } @Test @@ -357,17 +354,23 @@ public void equalityAndHashCodeReflexive() { @Test public void equalityAndHashCodeTransitive() { - var id1 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); - - var id2 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); - - var id3 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + var id1 = + SchemaObjectIdentifier.forCollection( + TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id2 = + SchemaObjectIdentifier.forCollection( + TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id3 = + SchemaObjectIdentifier.forCollection( + TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); assertThat(id1).isEqualTo(id2); assertThat(id2).isEqualTo(id3); @@ -379,16 +382,20 @@ public void equalityAndHashCodeTransitive() { @Test public void differentTenant() { - var id1 = SchemaObjectIdentifier.forCollection(TEST_CONSTANTS.TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); - - var id2 = SchemaObjectIdentifier.forCollection(OTHER_TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + var id1 = + SchemaObjectIdentifier.forCollection( + TEST_CONSTANTS.TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + + var id2 = + SchemaObjectIdentifier.forCollection( + OTHER_TENANT, + TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), + TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); assertThat(id1).isNotEqualTo(id2); assertThat(id1.hashCode()).isNotEqualTo(id2.hashCode()); } -} \ No newline at end of file +} From 4cfcce9b2832ff8ad2eaf5645f22a9a08a17b172 Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Wed, 7 Jan 2026 12:04:27 -0800 Subject: [PATCH 4/8] clean up for collectionSchemaObject, schema type coverage UDT, INDEX UNKNOWN_COLLECTION_OR_TABLE, convert all SchemaObjectName to identifier usage --- .../command/builders/FilterClauseBuilder.java | 4 +- .../command/builders/SortClauseBuilder.java | 4 +- .../jsonapi/api/v1/CollectionResource.java | 3 +- .../sgv2/jsonapi/api/v1/KeyspaceResource.java | 14 - .../jsonapi/exception/SchemaException.java | 1 + .../cqldriver/CqlSessionCacheSupplier.java | 13 +- .../cqldriver/executor/SchemaCache.java | 623 +++++++++--------- .../executor/TableBasedSchemaCache.java | 263 ++++---- .../service/operation/ListIndexesDBTask.java | 5 +- .../service/operation/ListTablesDBTask.java | 5 +- .../service/operation/MetadataDBTask.java | 6 +- .../collections/CountCollectionOperation.java | 8 +- .../CreateCollectionOperation.java | 21 +- .../DeleteCollectionCollectionOperation.java | 2 +- .../DeleteCollectionOperation.java | 4 +- ...matedDocumentCountCollectionOperation.java | 4 +- .../collections/FindCollectionOperation.java | 18 +- .../FindCollectionsCollectionOperation.java | 10 +- .../InsertCollectionOperation.java | 8 +- .../ReadAndUpdateCollectionOperation.java | 9 +- .../TruncateCollectionOperation.java | 6 +- .../operation/tables/CreateTableDBTask.java | 3 +- .../operation/tables/CreateTypeDBTask.java | 3 +- .../operation/tables/DropIndexDBTask.java | 4 +- .../operation/tables/DropTableDBTask.java | 4 +- .../operation/tables/DropTypeDBTask.java | 4 +- .../processor/MeteredCommandProcessor.java | 4 +- .../CreateCollectionCommandResolver.java | 1 - .../service/schema/SchemaObjectCache.java | 70 +- .../service/schema/SchemaObjectFactory.java | 29 +- .../schema/SchemaObjectIdentifier.java | 4 +- .../collections/CollectionSchemaObject.java | 128 +--- .../CollectionSettingsV0Reader.java | 7 +- .../CollectionSettingsV1Reader.java | 13 +- .../schema/naming/CollectionNamingRule.java | 1 + .../schema/naming/IndexNamingRule.java | 1 + .../schema/naming/KeyspaceNamingRule.java | 1 + .../schema/naming/TableNamingRule.java | 1 + src/main/resources/errors.yaml | 10 + 39 files changed, 636 insertions(+), 683 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java index e66bc334c9..fc0ad670fe 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/FilterClauseBuilder.java @@ -7,9 +7,9 @@ import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.exception.FilterException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.service.shredding.collections.DocumentId; import io.stargate.sgv2.jsonapi.service.shredding.collections.JsonExtensionType; import io.stargate.sgv2.jsonapi.util.JsonUtil; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java index 995d76668c..a25765591d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/model/command/builders/SortClauseBuilder.java @@ -6,9 +6,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.clause.filter.SortDefinition; import io.stargate.sgv2.jsonapi.api.model.command.clause.sort.SortClause; import io.stargate.sgv2.jsonapi.exception.SortException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObject; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.TableSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.JsonUtil; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java index 77d1b2d293..8b5a5f5527 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/CollectionResource.java @@ -32,13 +32,13 @@ import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableCommandResultSupplier; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.processor.MeteredCommandProcessor; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.service.schema.UnscopedSchemaObjectIdentifier; import jakarta.inject.Inject; import jakarta.validation.Valid; @@ -80,7 +80,6 @@ public class CollectionResource { // TODO remove apiFeatureConfig as a property after cleanup for how we get schema from cache @Inject private FeaturesConfig apiFeatureConfig; @Inject private RequestContext requestContext; - @Inject private SchemaCache schemaCache; private final SchemaObjectCacheSupplier schemaObjectCacheSupplier; private final CommandContext.BuilderSupplier contextBuilderSupplier; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java index be11538e79..fc9b1c7660 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/api/v1/KeyspaceResource.java @@ -8,13 +8,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.model.command.CommandResult; import io.stargate.sgv2.jsonapi.api.model.command.KeyspaceCommand; -import io.stargate.sgv2.jsonapi.api.model.command.TableOnlyCommand; import io.stargate.sgv2.jsonapi.api.model.command.impl.*; import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.config.constants.OpenApiConstants; -import io.stargate.sgv2.jsonapi.config.feature.ApiFeature; -import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.exception.mappers.ThrowableCommandResultSupplier; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; @@ -171,16 +167,6 @@ public Uni> postCommand( .withRequestContext(requestContext) .build(); - // Need context first to check if feature is enabled, because of request overrides - if (command instanceof TableOnlyCommand - && !commandContext.apiFeatures().isFeatureEnabled(ApiFeature.TABLES)) { - return Uni.createFrom() - .item( - new ThrowableCommandResultSupplier( - ErrorCodeV1.TABLE_FEATURE_NOT_ENABLED.toApiException())) - .map(commandResult -> commandResult.toRestResponse()); - } - // call processor return meteredCommandProcessor .processCommand(commandContext, command) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/exception/SchemaException.java b/src/main/java/io/stargate/sgv2/jsonapi/exception/SchemaException.java index e1fc126925..2ff041965c 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/exception/SchemaException.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/exception/SchemaException.java @@ -47,6 +47,7 @@ public enum Code implements ErrorCode { MISSING_DIMENSION_IN_VECTOR_COLUMN, MISSING_FIELDS_FOR_TYPE_CREATION, MISSING_PARTITION_COLUMNS, + UNKNOWN_COLLECTION_OR_TABLE, UNKNOWN_DATA_TYPE, UNKNOWN_INDEX_COLUMN, UNKNOWN_INDEX_TYPE, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java index a8fcffb5a5..86f948b0c5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java @@ -4,7 +4,7 @@ import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.config.OperationsConfig; import io.stargate.sgv2.jsonapi.metrics.MetricsTenantDeactivationConsumer; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import java.time.Duration; @@ -29,13 +29,12 @@ public CqlSessionCacheSupplier( @ConfigProperty(name = "quarkus.application.name") String applicationName, OperationsConfig operationsConfig, MeterRegistry meterRegistry, - SchemaCache schemaCache // aaron - later changes remove this dependency - ) { + SchemaObjectCacheSupplier schemaObjectCacheSupplier) { Objects.requireNonNull(applicationName, "applicationName must not be null"); Objects.requireNonNull(operationsConfig, "operationsConfig must not be null"); Objects.requireNonNull(meterRegistry, "meterRegistry must not be null"); - Objects.requireNonNull(schemaCache, "schemaCache must not be null"); + Objects.requireNonNull(schemaObjectCacheSupplier, "schemaObjectCacheSupplier must not be null"); var dbConfig = operationsConfig.databaseConfig(); @@ -46,13 +45,15 @@ public CqlSessionCacheSupplier( dbConfig.userName(), dbConfig.password()); + var schemaObjectCache = schemaObjectCacheSupplier.get(); + var sessionFactory = new CqlSessionFactory( applicationName, dbConfig.localDatacenter(), dbConfig.cassandraEndPoints(), dbConfig.cassandraPort(), - schemaCache::getSchemaChangeListener); + schemaObjectCache::getSchemaChangeListener); singleton = new CQLSessionCache( @@ -64,7 +65,7 @@ public CqlSessionCacheSupplier( sessionFactory, meterRegistry, List.of( - schemaCache.getDeactivatedTenantConsumer(), + schemaObjectCache.getDeactivatedTenantConsumer(), new MetricsTenantDeactivationConsumer(meterRegistry))); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java index 5641963b8e..af8f2438ac 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCache.java @@ -1,307 +1,316 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; -import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListenerBase; -import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; -import com.datastax.oss.driver.api.core.session.Session; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; -import com.google.common.annotations.VisibleForTesting; -import io.smallrye.mutiny.Uni; -import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; -import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; -import io.stargate.sgv2.jsonapi.config.DatabaseType; -import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; -import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import java.util.Objects; -import java.util.Optional; -import org.jspecify.annotations.NonNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY - * - *

Top level entry for caching the keyspaces and tables from the backend db - * - *

IMPORTANT: use {@link #getSchemaChangeListener()} and {@link #getDeactivatedTenantConsumer()} - * to get callbacks to evict the cache when the schema changes or a tenant is deactivated. This - * should be handled in {@link CqlSessionCacheSupplier} - * - *

TODO: There should be a single level cache of keyspace,table not two levels, it will be easier - * to size and manage https://github.com/stargate/data-api/issues/2070 - */ -@ApplicationScoped -public class SchemaCache { - private static final Logger LOGGER = LoggerFactory.getLogger(SchemaCache.class); - - private final CqlSessionCacheSupplier sessionCacheSupplier; - private final DatabaseType databaseType; - private final ObjectMapper objectMapper; - private final TableCacheFactory tableCacheFactory; - private final OperationsConfig operationsConfig; - - /** caching the keyspaces we know about which then have all the tables / collections under them */ - private final LoadingCache keyspaceCache; - - @Inject - public SchemaCache( - CqlSessionCacheSupplier sessionCacheSupplier, - ObjectMapper objectMapper, - OperationsConfig operationsConfig) { - this(sessionCacheSupplier, objectMapper, operationsConfig, TableBasedSchemaCache::new); - } - - /** - * NOTE: must not use the sessionCacheSupplier in the ctor or because it will create a circular - * calls, because the sessionCacheSupplier calls schema cache to get listeners - */ - @VisibleForTesting - protected SchemaCache( - CqlSessionCacheSupplier sessionCacheSupplier, - ObjectMapper objectMapper, - OperationsConfig operationsConfig, - TableCacheFactory tableCacheFactory) { - - this.sessionCacheSupplier = - Objects.requireNonNull(sessionCacheSupplier, "sessionCacheSupplier must not be null"); - this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); - this.operationsConfig = operationsConfig; - this.databaseType = - Objects.requireNonNull(operationsConfig, "operationsConfig must not be null") - .databaseConfig() - .type(); - this.tableCacheFactory = - Objects.requireNonNull(tableCacheFactory, "tableCacheFactory must not be null"); - - // TODO: The size of the cache should be in configuration. - int cacheSize = 1000; - keyspaceCache = Caffeine.newBuilder().maximumSize(cacheSize).build(this::onLoad); - - LOGGER.info("SchemaCache created with max size {}", cacheSize); - } - - /** - * Gets a listener to use with the {@link CqlSessionFactory} to remove the schema cache entries - * when the DB sends schema change events. - */ - public SchemaChangeListener getSchemaChangeListener() { - return new SchemaCacheSchemaChangeListener(this); - } - - /** - * Gets a consumer to use with the {@link CQLSessionCache} to remove the schema cache entries when - * a tenant is deactivated. - */ - public CQLSessionCache.DeactivatedTenantListener getDeactivatedTenantConsumer() { - return new SchemaCacheDeactivatedTenantConsumer(this); - } - - /** Gets or loads the schema object for the given namespace and collection or table name. */ - public Uni getSchemaObject( - RequestContext requestContext, - String namespace, - String collectionName, - boolean forceRefresh) { - - Objects.requireNonNull(namespace, "namespace must not be null"); - - var tableBasedSchemaCache = - keyspaceCache.get(new KeyspaceCacheKey(requestContext.tenant(), namespace)); - Objects.requireNonNull( - tableBasedSchemaCache, "keyspaceCache must not return null tableBasedSchemaCache"); - return tableBasedSchemaCache.getSchemaObject(requestContext, collectionName, forceRefresh); - } - - private TableBasedSchemaCache onLoad(SchemaCache.KeyspaceCacheKey key) { - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("onLoad() - tenant: {}, keyspace: {}", key.tenant(), key.keyspace()); - } - - // Cannot get a session from the sessionCacheSupplier in the constructor because - // it will create a circular call. So need to wait until now to create the QueryExecutor - // this is OK, only happens when the table is not in the cache - var queryExecutor = new QueryExecutor(sessionCacheSupplier.get(), operationsConfig); - return tableCacheFactory.create(key.keyspace(), queryExecutor, objectMapper); - } - - /** For testing only - peek to see if the schema object is in the cache without loading it. */ - @VisibleForTesting - Optional peekSchemaObject(Tenant tenant, String keyspaceName, String tableName) { - - var tableBasedSchemaCache = - keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, keyspaceName)); - if (tableBasedSchemaCache != null) { - return tableBasedSchemaCache.peekSchemaObject(tableName); - } - return Optional.empty(); - } - ; - - /** Removes the table from the cache if present. */ - void evictTable(Tenant tenant, String keyspace, String tableName) { - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace( - "evictTable() - tenant: {}, keyspace: {}, tableName: {}", tenant, keyspace, tableName); - } - - var tableBasedSchemaCache = keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, keyspace)); - if (tableBasedSchemaCache != null) { - tableBasedSchemaCache.evictCollectionSettingCacheEntry(tableName); - } - } - - /** Removes all keyspaces and table entries for the given tenant from the cache. */ - void evictAllKeyspaces(Tenant tenant) { - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("evictAllKeyspaces() - tenant: {}", tenant); - } - - keyspaceCache.asMap().keySet().removeIf(key -> key.tenant().equals(tenant)); - } - - /** Removes the keyspace from the cache if present. */ - void evictKeyspace(Tenant tenant, String keyspace) { - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("evictKeyspace() - tenant: {}, keyspace: {}", tenant, keyspace); - } - - keyspaceCache.invalidate(new KeyspaceCacheKey(tenant, keyspace)); - } - - /** Key for the Keyspace cache, we rely on the record hash and equals */ - record KeyspaceCacheKey(Tenant tenant, String keyspace) { - - KeyspaceCacheKey { - Objects.requireNonNull(tenant, "tenant must not be null"); - Objects.requireNonNull(keyspace, "namespace must not be null"); - } - } - - /** - * SchemaChangeListener for the schema cache, this is used to evict the cache entries when we get - * messages from the DB that the schema has changed. - * - *

NOTE: This relies on the sessionName being set correctly which should be in {@link - * io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory} - * - *

A new schema change listener should be created for each CQL {@link Session} when it is - * created because the listener will first listen for {@link SchemaChangeListener#onSessionReady} - * and get the tenantID from the session name via {@link Session#getName}. - * - *

If the tenant is not set, null or blank, we log at ERROR rather than throw because the - * callback methods are called on driver async threads and exceptions there are unlikely to be - * passed back in the request response. - * - *

This could be non-static inner, but static to make testing easier so we can pass in the - * cache it is working with. - */ - static class SchemaCacheSchemaChangeListener extends SchemaChangeListenerBase { - - private static final Logger LOGGER = - LoggerFactory.getLogger(SchemaCacheSchemaChangeListener.class); - - private final SchemaCache schemaCache; - - private Tenant tenant = null; - - public SchemaCacheSchemaChangeListener(SchemaCache schemaCache) { - this.schemaCache = Objects.requireNonNull(schemaCache, "schemaCache must not be null"); - } - - private boolean hasTenantId(String context) { - - if (tenant == null || tenant.toString().isBlank()) { - LOGGER.error( - "SchemaCacheSchemaChangeListener tenant is null or blank when expected to be set - {}", - context); - return false; - } - return true; - } - - private void evictTable(String context, TableMetadata tableMetadata) { - - if (hasTenantId(context)) { - schemaCache.evictTable( - tenant, tableMetadata.getKeyspace().asInternal(), tableMetadata.getName().asInternal()); - } - } - - @Override - public void onSessionReady(@NonNull Session session) { - // This is called when the session is ready, we can get the tenant from the session name - // and set it in the listener so we can use it in the other methods. - tenant = TenantFactory.instance().create(session.getName()); - hasTenantId("onSessionReady called but sessionName() is null or blank"); - } - - /** - * When a table is dropped, evict from cache to reduce the size and avoid stale if it is - * re-created - */ - @Override - public void onTableDropped(@NonNull TableMetadata table) { - evictTable("onTableDropped", table); - } - - /** When a table is created, evict from cache to avoid stale if it was re-created */ - @Override - public void onTableCreated(@NonNull TableMetadata table) { - evictTable("onTableCreated", table); - } - - /** When a table is updated, evict from cache to avoid stale entries */ - @Override - public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadata previous) { - // table name can never change - evictTable("onTableUpdated", current); - } - - /** When keyspace dropped, we dont need any more of the tables in the cache */ - @Override - public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { - if (hasTenantId("onKeyspaceDropped")) { - schemaCache.evictKeyspace(tenant, keyspace.getName().asInternal()); - } - } - } - - /** - * Listener for use with the {@link CQLSessionCache} to remove the schema cache entries when a - * tenant is deactivated. - */ - private static class SchemaCacheDeactivatedTenantConsumer - implements CQLSessionCache.DeactivatedTenantListener { - - private final SchemaCache schemaCache; - - public SchemaCacheDeactivatedTenantConsumer(SchemaCache schemaCache) { - this.schemaCache = Objects.requireNonNull(schemaCache, "schemaCache must not be null"); - } - - @Override - public void accept(Tenant tenant) { - // the sessions are keyed on the tenantID and the credentials, and one session can work with - // multiple keyspaces. So we need to evict all the keyspaces for the tenant - schemaCache.evictAllKeyspaces(tenant); - } - } - - /** Function to create a new TableBasedSchemaCache, so we can mock when testing */ - @FunctionalInterface - public interface TableCacheFactory { - TableBasedSchemaCache create( - String namespace, QueryExecutor queryExecutor, ObjectMapper objectMapper); - } -} +// package io.stargate.sgv2.jsonapi.service.cqldriver.executor; +// +// import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +// import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; +// import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListenerBase; +// import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; +// import com.datastax.oss.driver.api.core.session.Session; +// import com.fasterxml.jackson.databind.ObjectMapper; +// import com.github.benmanes.caffeine.cache.Caffeine; +// import com.github.benmanes.caffeine.cache.LoadingCache; +// import com.google.common.annotations.VisibleForTesting; +// import io.smallrye.mutiny.Uni; +// import io.stargate.sgv2.jsonapi.api.request.RequestContext; +// import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +// import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; +// import io.stargate.sgv2.jsonapi.config.DatabaseType; +// import io.stargate.sgv2.jsonapi.config.OperationsConfig; +// import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; +// import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; +// import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; +// import jakarta.enterprise.context.ApplicationScoped; +// import jakarta.inject.Inject; +// import java.util.Objects; +// import java.util.Optional; +// import org.jspecify.annotations.NonNull; +// import org.slf4j.Logger; +// import org.slf4j.LoggerFactory; +// +/// ** +// * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY +// * +// *

Top level entry for caching the keyspaces and tables from the backend db +// * +// *

IMPORTANT: use {@link #getSchemaChangeListener()} and {@link +// #getDeactivatedTenantConsumer()} +// * to get callbacks to evict the cache when the schema changes or a tenant is deactivated. This +// * should be handled in {@link CqlSessionCacheSupplier} +// * +// *

TODO: There should be a single level cache of keyspace,table not two levels, it will be +// easier +// * to size and manage https://github.com/stargate/data-api/issues/2070 +// */ +// @ApplicationScoped +// public class SchemaCache { +// private static final Logger LOGGER = LoggerFactory.getLogger(SchemaCache.class); +// +// private final CqlSessionCacheSupplier sessionCacheSupplier; +// private final DatabaseType databaseType; +// private final ObjectMapper objectMapper; +// private final TableCacheFactory tableCacheFactory; +// private final OperationsConfig operationsConfig; +// +// /** caching the keyspaces we know about which then have all the tables / collections under them +// */ +// private final LoadingCache keyspaceCache; +// +// @Inject +// public SchemaCache( +// CqlSessionCacheSupplier sessionCacheSupplier, +// ObjectMapper objectMapper, +// OperationsConfig operationsConfig) { +// this(sessionCacheSupplier, objectMapper, operationsConfig, TableBasedSchemaCache::new); +// } +// +// /** +// * NOTE: must not use the sessionCacheSupplier in the ctor or because it will create a circular +// * calls, because the sessionCacheSupplier calls schema cache to get listeners +// */ +// @VisibleForTesting +// protected SchemaCache( +// CqlSessionCacheSupplier sessionCacheSupplier, +// ObjectMapper objectMapper, +// OperationsConfig operationsConfig, +// TableCacheFactory tableCacheFactory) { +// +// this.sessionCacheSupplier = +// Objects.requireNonNull(sessionCacheSupplier, "sessionCacheSupplier must not be null"); +// this.objectMapper = Objects.requireNonNull(objectMapper, "objectMapper must not be null"); +// this.operationsConfig = operationsConfig; +// this.databaseType = +// Objects.requireNonNull(operationsConfig, "operationsConfig must not be null") +// .databaseConfig() +// .type(); +// this.tableCacheFactory = +// Objects.requireNonNull(tableCacheFactory, "tableCacheFactory must not be null"); +// +// // TODO: The size of the cache should be in configuration. +// int cacheSize = 1000; +// keyspaceCache = Caffeine.newBuilder().maximumSize(cacheSize).build(this::onLoad); +// +// LOGGER.info("SchemaCache created with max size {}", cacheSize); +// } +// +// /** +// * Gets a listener to use with the {@link CqlSessionFactory} to remove the schema cache entries +// * when the DB sends schema change events. +// */ +// public SchemaChangeListener getSchemaChangeListener() { +// return new SchemaCacheSchemaChangeListener(this); +// } +// +// /** +// * Gets a consumer to use with the {@link CQLSessionCache} to remove the schema cache entries +// when +// * a tenant is deactivated. +// */ +// public CQLSessionCache.DeactivatedTenantListener getDeactivatedTenantConsumer() { +// return new SchemaCacheDeactivatedTenantConsumer(this); +// } +// +// /** Gets or loads the schema object for the given namespace and collection or table name. */ +// public Uni getSchemaObject( +// RequestContext requestContext, +// String namespace, +// String collectionName, +// boolean forceRefresh) { +// +// Objects.requireNonNull(namespace, "namespace must not be null"); +// +// var tableBasedSchemaCache = +// keyspaceCache.get(new KeyspaceCacheKey(requestContext.tenant(), namespace)); +// Objects.requireNonNull( +// tableBasedSchemaCache, "keyspaceCache must not return null tableBasedSchemaCache"); +// return tableBasedSchemaCache.getSchemaObject(requestContext, collectionName, forceRefresh); +// } +// +// private TableBasedSchemaCache onLoad(SchemaCache.KeyspaceCacheKey key) { +// if (LOGGER.isTraceEnabled()) { +// LOGGER.trace("onLoad() - tenant: {}, keyspace: {}", key.tenant(), key.keyspace()); +// } +// +// // Cannot get a session from the sessionCacheSupplier in the constructor because +// // it will create a circular call. So need to wait until now to create the QueryExecutor +// // this is OK, only happens when the table is not in the cache +// var queryExecutor = new QueryExecutor(sessionCacheSupplier.get(), operationsConfig); +// return tableCacheFactory.create(key.keyspace(), queryExecutor, objectMapper); +// } +// +// /** For testing only - peek to see if the schema object is in the cache without loading it. */ +// @VisibleForTesting +// Optional peekSchemaObject(Tenant tenant, String keyspaceName, String tableName) { +// +// var tableBasedSchemaCache = +// keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, keyspaceName)); +// if (tableBasedSchemaCache != null) { +// return tableBasedSchemaCache.peekSchemaObject(tableName); +// } +// return Optional.empty(); +// } +// ; +// +// /** Removes the table from the cache if present. */ +// void evictTable(Tenant tenant, String keyspace, String tableName) { +// +// if (LOGGER.isTraceEnabled()) { +// LOGGER.trace( +// "evictTable() - tenant: {}, keyspace: {}, tableName: {}", tenant, keyspace, tableName); +// } +// +// var tableBasedSchemaCache = keyspaceCache.getIfPresent(new KeyspaceCacheKey(tenant, +// keyspace)); +// if (tableBasedSchemaCache != null) { +// tableBasedSchemaCache.evictCollectionSettingCacheEntry(tableName); +// } +// } +// +// /** Removes all keyspaces and table entries for the given tenant from the cache. */ +// void evictAllKeyspaces(Tenant tenant) { +// +// if (LOGGER.isTraceEnabled()) { +// LOGGER.trace("evictAllKeyspaces() - tenant: {}", tenant); +// } +// +// keyspaceCache.asMap().keySet().removeIf(key -> key.tenant().equals(tenant)); +// } +// +// /** Removes the keyspace from the cache if present. */ +// void evictKeyspace(Tenant tenant, String keyspace) { +// +// if (LOGGER.isTraceEnabled()) { +// LOGGER.trace("evictKeyspace() - tenant: {}, keyspace: {}", tenant, keyspace); +// } +// +// keyspaceCache.invalidate(new KeyspaceCacheKey(tenant, keyspace)); +// } +// +// /** Key for the Keyspace cache, we rely on the record hash and equals */ +// record KeyspaceCacheKey(Tenant tenant, String keyspace) { +// +// KeyspaceCacheKey { +// Objects.requireNonNull(tenant, "tenant must not be null"); +// Objects.requireNonNull(keyspace, "namespace must not be null"); +// } +// } +// +// /** +// * SchemaChangeListener for the schema cache, this is used to evict the cache entries when we +// get +// * messages from the DB that the schema has changed. +// * +// *

NOTE: This relies on the sessionName being set correctly which should be in {@link +// * io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory} +// * +// *

A new schema change listener should be created for each CQL {@link Session} when it is +// * created because the listener will first listen for {@link +// SchemaChangeListener#onSessionReady} +// * and get the tenantID from the session name via {@link Session#getName}. +// * +// *

If the tenant is not set, null or blank, we log at ERROR rather than throw because the +// * callback methods are called on driver async threads and exceptions there are unlikely to be +// * passed back in the request response. +// * +// *

This could be non-static inner, but static to make testing easier so we can pass in the +// * cache it is working with. +// */ +// static class SchemaCacheSchemaChangeListener extends SchemaChangeListenerBase { +// +// private static final Logger LOGGER = +// LoggerFactory.getLogger(SchemaCacheSchemaChangeListener.class); +// +// private final SchemaCache schemaCache; +// +// private Tenant tenant = null; +// +// public SchemaCacheSchemaChangeListener(SchemaCache schemaCache) { +// this.schemaCache = Objects.requireNonNull(schemaCache, "schemaCache must not be null"); +// } +// +// private boolean hasTenantId(String context) { +// +// if (tenant == null || tenant.toString().isBlank()) { +// LOGGER.error( +// "SchemaCacheSchemaChangeListener tenant is null or blank when expected to be set - +// {}", +// context); +// return false; +// } +// return true; +// } +// +// private void evictTable(String context, TableMetadata tableMetadata) { +// +// if (hasTenantId(context)) { +// schemaCache.evictTable( +// tenant, tableMetadata.getKeyspace().asInternal(), +// tableMetadata.getName().asInternal()); +// } +// } +// +// @Override +// public void onSessionReady(@NonNull Session session) { +// // This is called when the session is ready, we can get the tenant from the session name +// // and set it in the listener so we can use it in the other methods. +// tenant = TenantFactory.instance().create(session.getName()); +// hasTenantId("onSessionReady called but sessionName() is null or blank"); +// } +// +// /** +// * When a table is dropped, evict from cache to reduce the size and avoid stale if it is +// * re-created +// */ +// @Override +// public void onTableDropped(@NonNull TableMetadata table) { +// evictTable("onTableDropped", table); +// } +// +// /** When a table is created, evict from cache to avoid stale if it was re-created */ +// @Override +// public void onTableCreated(@NonNull TableMetadata table) { +// evictTable("onTableCreated", table); +// } +// +// /** When a table is updated, evict from cache to avoid stale entries */ +// @Override +// public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadata previous) { +// // table name can never change +// evictTable("onTableUpdated", current); +// } +// +// /** When keyspace dropped, we dont need any more of the tables in the cache */ +// @Override +// public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { +// if (hasTenantId("onKeyspaceDropped")) { +// schemaCache.evictKeyspace(tenant, keyspace.getName().asInternal()); +// } +// } +// } +// +// /** +// * Listener for use with the {@link CQLSessionCache} to remove the schema cache entries when a +// * tenant is deactivated. +// */ +// private static class SchemaCacheDeactivatedTenantConsumer +// implements CQLSessionCache.DeactivatedTenantListener { +// +// private final SchemaCache schemaCache; +// +// public SchemaCacheDeactivatedTenantConsumer(SchemaCache schemaCache) { +// this.schemaCache = Objects.requireNonNull(schemaCache, "schemaCache must not be null"); +// } +// +// @Override +// public void accept(Tenant tenant) { +// // the sessions are keyed on the tenantID and the credentials, and one session can work with +// // multiple keyspaces. So we need to evict all the keyspaces for the tenant +// schemaCache.evictAllKeyspaces(tenant); +// } +// } +// +// /** Function to create a new TableBasedSchemaCache, so we can mock when testing */ +// @FunctionalInterface +// public interface TableCacheFactory { +// TableBasedSchemaCache create( +// String namespace, QueryExecutor queryExecutor, ObjectMapper objectMapper); +// } +// } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java index e2a24def3d..44345dc1a4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/TableBasedSchemaCache.java @@ -1,130 +1,133 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import io.smallrye.mutiny.Uni; -import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; -import io.stargate.sgv2.jsonapi.exception.JsonApiException; -import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; -import java.time.Duration; -import java.util.Map; -import java.util.Optional; - -/** - * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY - * - *

Caches the vector enabled status for the namespace - */ -// TODO: what is the vector status of a namespace ? vectors are per collection -// TODO: clarify the name of this class, it is a cache of the collections/ tables not a cache of -// namespaces ?? -public class TableBasedSchemaCache { - - public final String namespace; - - public final QueryExecutor queryExecutor; - - private final ObjectMapper objectMapper; - - // TODO: move the settings to config - // TODO: set the cache loader when creating the cache - private static final long CACHE_TTL_SECONDS = 300; - private static final long CACHE_MAX_SIZE = 1000; - private final Cache schemaObjectCache = - Caffeine.newBuilder() - .expireAfterWrite(Duration.ofSeconds(CACHE_TTL_SECONDS)) - .maximumSize(CACHE_MAX_SIZE) - .build(); - - public TableBasedSchemaCache( - String namespace, QueryExecutor queryExecutor, ObjectMapper objectMapper) { - this.namespace = namespace; - this.queryExecutor = queryExecutor; - this.objectMapper = objectMapper; - } - - protected Uni getSchemaObject( - RequestContext requestContext, String collectionName, boolean forceRefresh) { - - // TODO: why is this not using the loader pattern ? - SchemaObject schemaObject = null; - if (!forceRefresh) { - schemaObject = schemaObjectCache.getIfPresent(collectionName); - } - if (null != schemaObject) { - return Uni.createFrom().item(schemaObject); - } else { - return loadSchemaObject(requestContext, collectionName) - .onItemOrFailure() - .transformToUni( - (result, error) -> { - if (null != error) { - // not a valid collection schema - // TODO: Explain why this changes the error code - if (error instanceof JsonApiException - && ((JsonApiException) error).getErrorCode() - == ErrorCodeV1.VECTORIZECONFIG_CHECK_FAIL) { - return Uni.createFrom() - .failure( - ErrorCodeV1.INVALID_JSONAPI_COLLECTION_SCHEMA.toApiException( - "%s", collectionName)); - } - // collection does not exist - // TODO: DO NOT do a string starts with, use proper error structures - // again, why is this here, looks like it returns the same error code ? - // Guess: this a driver exception, not Data API's internal one - // ... seems unlikely as driver does not have concept of "Collection" (vs Tables)? - // (that is: "Collection" would refer to column datatype not "funny table"?) - if (error instanceof RuntimeException rte - && rte.getMessage().startsWith("Collection does not exist")) { - return Uni.createFrom() - .failure( - SchemaException.Code.COLLECTION_NOT_EXIST.get( - Map.of("collection", collectionName))); - } - return Uni.createFrom().failure(error); - } - schemaObjectCache.put(collectionName, result); - return Uni.createFrom().item(result); - }); - } - } - - Optional peekSchemaObject(String tableName) { - return Optional.ofNullable(schemaObjectCache.getIfPresent(tableName)); - } - - private Uni loadSchemaObject(RequestContext requestContext, String collectionName) { - - return queryExecutor - .getTableMetadata(requestContext, namespace, collectionName) - .onItem() - .transform( - optionalTable -> { - // TODO: AARON - I changed the logic here, needs to be checked - // TODO: error code here needs to be for collections and tables - var table = - optionalTable.orElseThrow( - () -> - SchemaException.Code.COLLECTION_NOT_EXIST.get( - Map.of("collection", collectionName))); - - // check if its a valid json API Table - // TODO: re-use the table matcher this is on the request hot path - if (new CollectionTableMatcher().test(table)) { - return CollectionSchemaObject.getCollectionSettings( - optionalTable.get(), objectMapper); - } - - return TableSchemaObject.from(table, objectMapper); - }); - } - - public void evictCollectionSettingCacheEntry(String collectionName) { - schemaObjectCache.invalidate(collectionName); - } -} +// package io.stargate.sgv2.jsonapi.service.cqldriver.executor; +// +// import com.fasterxml.jackson.databind.ObjectMapper; +// import com.github.benmanes.caffeine.cache.Cache; +// import com.github.benmanes.caffeine.cache.Caffeine; +// import io.smallrye.mutiny.Uni; +// import io.stargate.sgv2.jsonapi.api.request.RequestContext; +// import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; +// import io.stargate.sgv2.jsonapi.exception.JsonApiException; +// import io.stargate.sgv2.jsonapi.exception.SchemaException; +// import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +// import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +// import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionTableMatcher; +// import java.time.Duration; +// import java.util.Map; +// import java.util.Optional; +// +/// ** +// * TODO: @YUQI - DELETE WHEN SCHMEA OBJECT CACHE IS READY +// * +// *

Caches the vector enabled status for the namespace +// */ +//// TODO: what is the vector status of a namespace ? vectors are per collection +//// TODO: clarify the name of this class, it is a cache of the collections/ tables not a cache of +//// namespaces ?? +// public class TableBasedSchemaCache { +// +// public final String namespace; +// +// public final QueryExecutor queryExecutor; +// +// private final ObjectMapper objectMapper; +// +// // TODO: move the settings to config +// // TODO: set the cache loader when creating the cache +// private static final long CACHE_TTL_SECONDS = 300; +// private static final long CACHE_MAX_SIZE = 1000; +// private final Cache schemaObjectCache = +// Caffeine.newBuilder() +// .expireAfterWrite(Duration.ofSeconds(CACHE_TTL_SECONDS)) +// .maximumSize(CACHE_MAX_SIZE) +// .build(); +// +// public TableBasedSchemaCache( +// String namespace, QueryExecutor queryExecutor, ObjectMapper objectMapper) { +// this.namespace = namespace; +// this.queryExecutor = queryExecutor; +// this.objectMapper = objectMapper; +// } +// +// protected Uni getSchemaObject( +// RequestContext requestContext, String collectionName, boolean forceRefresh) { +// +// // TODO: why is this not using the loader pattern ? +// SchemaObject schemaObject = null; +// if (!forceRefresh) { +// schemaObject = schemaObjectCache.getIfPresent(collectionName); +// } +// if (null != schemaObject) { +// return Uni.createFrom().item(schemaObject); +// } else { +// return loadSchemaObject(requestContext, collectionName) +// .onItemOrFailure() +// .transformToUni( +// (result, error) -> { +// if (null != error) { +// // not a valid collection schema +// // TODO: Explain why this changes the error code +// if (error instanceof JsonApiException +// && ((JsonApiException) error).getErrorCode() +// == ErrorCodeV1.VECTORIZECONFIG_CHECK_FAIL) { +// return Uni.createFrom() +// .failure( +// ErrorCodeV1.INVALID_JSONAPI_COLLECTION_SCHEMA.toApiException( +// "%s", collectionName)); +// } +// // collection does not exist +// // TODO: DO NOT do a string starts with, use proper error structures +// // again, why is this here, looks like it returns the same error code ? +// // Guess: this a driver exception, not Data API's internal one +// // ... seems unlikely as driver does not have concept of "Collection" (vs +// Tables)? +// // (that is: "Collection" would refer to column datatype not "funny table"?) +// if (error instanceof RuntimeException rte +// && rte.getMessage().startsWith("Collection does not exist")) { +// return Uni.createFrom() +// .failure( +// SchemaException.Code.COLLECTION_NOT_EXIST.get( +// Map.of("collection", collectionName))); +// } +// return Uni.createFrom().failure(error); +// } +// schemaObjectCache.put(collectionName, result); +// return Uni.createFrom().item(result); +// }); +// } +// } +// +// Optional peekSchemaObject(String tableName) { +// return Optional.ofNullable(schemaObjectCache.getIfPresent(tableName)); +// } +// +// private Uni loadSchemaObject(RequestContext requestContext, String collectionName) +// { +// +// return queryExecutor +// .getTableMetadata(requestContext, namespace, collectionName) +// .onItem() +// .transform( +// optionalTable -> { +// // TODO: AARON - I changed the logic here, needs to be checked +// // TODO: error code here needs to be for collections and tables +// var table = +// optionalTable.orElseThrow( +// () -> +// SchemaException.Code.COLLECTION_NOT_EXIST.get( +// Map.of("collection", collectionName))); +// +// // check if its a valid json API Table +// // TODO: re-use the table matcher this is on the request hot path +// if (new CollectionTableMatcher().test(table)) { +// return CollectionSchemaObject.getCollectionSettings( +// optionalTable.get(), objectMapper); +// } +// +// return TableSchemaObject.from(table, objectMapper); +// }); +// } +// +// public void evictCollectionSettingCacheEntry(String collectionName) { +// schemaObjectCache.invalidate(collectionName); +// } +// } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java index 17cbf311ff..fa73f493c2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListIndexesDBTask.java @@ -43,10 +43,7 @@ private Optional indexesForTable() { if (!TABLE_MATCHER.test(tableMetadata)) { return Optional.empty(); } - var indexesContainer = - TableSchemaObject.from(tableMetadata, OBJECT_MAPPER) - .apiTableDef() - .indexesIncludingUnsupported(); + var indexesContainer = schemaObject.apiTableDef().indexesIncludingUnsupported(); if (LOGGER.isDebugEnabled()) { LOGGER.debug( "indexesForTable() - table: {} indexesContainer: {}", diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java index 7bd8a85901..64f5299c49 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/ListTablesDBTask.java @@ -67,7 +67,10 @@ protected Object getSchema() { .values() .stream() .filter(TABLE_MATCHER) - .map(tableMetadata -> TableSchemaObject.from(tableMetadata, OBJECT_MAPPER)) + .map( + tableMetadata -> + TableSchemaObject.from( + schemaObject.identifier().tenant(), tableMetadata, OBJECT_MAPPER)) .map( tableSchemaObject -> tableSchemaObject diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java index 7873d0ed98..2955b8ca93 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/MetadataDBTask.java @@ -56,7 +56,11 @@ protected AsyncResultSetSupplier buildDBResultSupplier( CommandContext commandContext, CommandQueryExecutor queryExecutor) { return new MetadataAsyncResultSetSupplier( - commandContext, this, null, queryExecutor, schemaObject.name().keyspace()); + commandContext, + this, + null, + queryExecutor, + schemaObject.identifier().keyspace().asInternal()); } @Override diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CountCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CountCollectionOperation.java index d70471596c..ee70758ed4 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CountCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CountCollectionOperation.java @@ -56,8 +56,8 @@ private SimpleStatement buildSelectQuery() { .count() .as("count") .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table().asInternal()) .where(expressions.get(0)) .build(); } else { @@ -66,8 +66,8 @@ private SimpleStatement buildSelectQuery() { .select() .column("key") .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table().asInternal()) .where(expressions.get(0)) .limit(limit + 1) .build(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java index 9ca7c69116..50338d070a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/CreateCollectionOperation.java @@ -127,7 +127,7 @@ public Uni> execute( logger.info( "Executing CreateCollectionOperation for {}.{} with definition: {}", - commandContext.schemaObject().name().keyspace(), + commandContext.schemaObject().identifier().keyspace(), name, comment); @@ -141,8 +141,7 @@ public Uni> execute( // refactor to make // this operation fully Async, without refactoring all the logic. KeyspaceMetadata currKeyspace = - allKeyspaces.get( - CqlIdentifier.fromInternal(commandContext.schemaObject().name().keyspace())); + allKeyspaces.get(commandContext.schemaObject().identifier().keyspace()); if (currKeyspace == null) { return Uni.createFrom() @@ -162,7 +161,8 @@ public Uni> execute( // if table exists, compare existingCollectionSettings and newCollectionSettings CollectionSchemaObject existingCollectionSettings = - CollectionSchemaObject.getCollectionSettings(tableMetadata, objectMapper); + CollectionSchemaObject.getCollectionSettings( + requestContext.tenant(), tableMetadata, objectMapper); // Use the fromNameOrDefault() so if not specified it will default var embeddingSourceModel = @@ -176,9 +176,8 @@ public Uni> execute( () -> SimilarityFunction.getUnknownFunctionException(vectorFunction)); CollectionSchemaObject newCollectionSettings = - CollectionSchemaObject.getCollectionSettings( - currKeyspace.getName().asInternal(), - name, + CollectionSchemaObject.createCollectionSettings( + commandContext.schemaObject().identifier(), tableMetadata, vectorSearch, vectorSize, @@ -221,7 +220,7 @@ public Uni> execute( logger.info( "CreateCollectionOperation for {}.{} with existing legacy lexical/reranking settings, new settings differ. Tried to unify, result: {}" + " Old settings: {}, New settings: {}", - commandContext.schemaObject().name().keyspace(), + commandContext.schemaObject().identifier().keyspace(), name, settingsAreEqual, existingCollectionSettings, @@ -230,7 +229,7 @@ public Uni> execute( logger.info( "CreateCollectionOperation for {}.{} with different settings (but not old legacy lexical/reranking settings), cannot unify." + " Old settings: {}, New settings: {}", - commandContext.schemaObject().name().keyspace(), + commandContext.schemaObject().identifier().keyspace(), name, existingCollectionSettings, newCollectionSettings); @@ -266,7 +265,7 @@ private Uni> executeCollectionCreation( queryExecutor.executeCreateSchemaChange( dataApiRequestInfo, getCreateTable( - commandContext.schemaObject().name().keyspace(), + commandContext.schemaObject().identifier().keyspace().asInternal(), name, vectorSearch, vectorSize, @@ -283,7 +282,7 @@ private Uni> executeCollectionCreation( if (res.wasApplied()) { final List indexStatements = getIndexStatements( - commandContext.schemaObject().name().keyspace(), + commandContext.schemaObject().identifier().keyspace().asInternal(), name, lexicalConfig, collectionExisted); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java index 443a839184..e0e6e72cf9 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionCollectionOperation.java @@ -29,7 +29,7 @@ public record DeleteCollectionCollectionOperation( public Uni> execute( RequestContext dataApiRequestInfo, QueryExecutor queryExecutor) { logger.info("Executing DeleteCollectionCollectionOperation for {}", name); - String cql = DROP_TABLE_CQL.formatted(context.schemaObject().name().keyspace(), name); + String cql = DROP_TABLE_CQL.formatted(context.schemaObject().identifier().keyspace(), name); SimpleStatement query = SimpleStatement.newInstance(cql); // execute return queryExecutor diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionOperation.java index 9fae39ac55..761ff2f3a6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/DeleteCollectionOperation.java @@ -178,8 +178,8 @@ private String buildDeleteQuery() { String delete = "DELETE FROM \"%s\".\"%s\" WHERE key = ? IF tx_id = ?"; return String.format( delete, - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()); + commandContext.schemaObject().identifier().keyspace(), + commandContext.schemaObject().identifier().table()); } /** diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java index ef92c865fa..c7fa40b65f 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/EstimatedDocumentCountCollectionOperation.java @@ -34,9 +34,9 @@ private SimpleStatement buildSelectQuery() { return selectFrom("system", "size_estimates") .all() .whereColumn("keyspace_name") - .isEqualTo(literal(commandContext.schemaObject().name().keyspace())) + .isEqualTo(literal(commandContext.schemaObject().identifier().keyspace())) .whereColumn("table_name") - .isEqualTo(literal(commandContext.schemaObject().name().table())) + .isEqualTo(literal(commandContext.schemaObject().identifier().table())) .build(); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperation.java index a47615ee42..3956876152 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperation.java @@ -369,7 +369,7 @@ public Uni> execute( return Uni.createFrom() .failure( ErrorCodeV1.VECTOR_SEARCH_NOT_SUPPORTED.toApiException( - "%s", commandContext().schemaObject().name().table())); + "%s", commandContext().schemaObject().identifier().table().asInternal())); } // get FindResponse @@ -517,8 +517,8 @@ private List buildSelectQueries(IDCollectionFilter additionalId ? documentColumns : documentKeyColumns) .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().toString(), + commandContext.schemaObject().identifier().table().toString()) .where(expression) .limit(limit); var bm25Expr = bm25SearchExpression(); @@ -551,8 +551,8 @@ private Query getVectorSearchQueryByExpression(Expression expres DocumentConstants.Columns.VECTOR_SEARCH_INDEX_COLUMN_NAME, commandContext().schemaObject().similarityFunction()) .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table().asInternal()) .where(expression) .limit(limit) .vsearch(DocumentConstants.Columns.VECTOR_SEARCH_INDEX_COLUMN_NAME, vector()) @@ -562,8 +562,8 @@ private Query getVectorSearchQueryByExpression(Expression expres .select() .column(CollectionReadType.DOCUMENT == readType ? documentColumns : documentKeyColumns) .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table().asInternal()) .where(expression) .limit(limit) .vsearch(DocumentConstants.Columns.VECTOR_SEARCH_INDEX_COLUMN_NAME, vector()) @@ -600,8 +600,8 @@ private List buildSortedSelectQueries(IDCollectionFilter additi .select() .column(columnsToAdd) .from( - commandContext.schemaObject().name().keyspace(), - commandContext.schemaObject().name().table()) + commandContext.schemaObject().identifier().keyspace().asInternal(), + commandContext.schemaObject().identifier().table().asInternal()) .where(expression) .limit(maxSortReadLimit()) .build(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java index ce626cdffa..12f8b8e7dd 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionsCollectionOperation.java @@ -64,7 +64,8 @@ public Uni> execute( .map( keyspaces -> keyspaces.get( - CqlIdentifier.fromInternal(commandContext.schemaObject().name().keyspace()))) + CqlIdentifier.fromInternal( + commandContext.schemaObject().identifier().keyspace().asInternal()))) .map( keyspaceMetadata -> { if (keyspaceMetadata == null) { @@ -76,7 +77,8 @@ public Uni> execute( .filter(tableMatcher) .map( table -> - CollectionSchemaObject.getCollectionSettings(table, objectMapper)) + CollectionSchemaObject.getCollectionSettings( + requestContext.tenant(), table, objectMapper)) .toList(); return new Result(explain, collections); }); @@ -98,7 +100,9 @@ public CommandResult get() { builder.addStatus(CommandStatus.EXISTING_COLLECTIONS, createCollectionCommands); } else { List tables = - collections.stream().map(schemaObject -> schemaObject.name().table()).toList(); + collections.stream() + .map(schemaObject -> schemaObject.identifier().table().asInternal()) + .toList(); builder.addStatus(CommandStatus.EXISTING_COLLECTIONS, tables); } return builder.build(); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperation.java index 8bdc8b8164..305717dcf5 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperation.java @@ -9,7 +9,6 @@ import io.stargate.sgv2.jsonapi.exception.DocumentException; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.serializer.CQLBindValues; import io.stargate.sgv2.jsonapi.service.operation.InsertOperationPage; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; @@ -83,7 +82,7 @@ public Uni> execute( final boolean vectorEnabled = commandContext().schemaObject().vectorConfig().vectorEnabled(); if (!vectorEnabled && insertions.stream().anyMatch(insertion -> insertion.hasVectorValues())) { throw ErrorCodeV1.VECTOR_SEARCH_NOT_SUPPORTED.toApiException( - commandContext().schemaObject().name().table()); + commandContext().schemaObject().identifier().table().asInternal()); } // create json doc write metrics if (commandContext.jsonProcessingMetricsReporter() != null) { @@ -240,13 +239,12 @@ private Uni insertDocument( public String buildInsertQuery(boolean vectorEnabled) { final boolean lexicalEnabled = commandContext().schemaObject().lexicalConfig().enabled(); StringBuilder insertQuery = new StringBuilder(200); - final SchemaObjectName tableName = commandContext.schemaObject().name(); insertQuery .append("INSERT INTO \"") - .append(tableName.keyspace()) + .append(commandContext.schemaObject().identifier().keyspace().asInternal()) .append("\".\"") - .append(tableName.table()) + .append(commandContext.schemaObject().identifier().table().asInternal()) .append("\"") .append( " (key, tx_id, doc_json, exist_keys, array_size, array_contains, query_bool_values,") diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperation.java index 4a3db0b409..21e29ba1fb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperation.java @@ -12,7 +12,6 @@ import io.stargate.sgv2.jsonapi.exception.DatabaseException; import io.stargate.sgv2.jsonapi.exception.unchecked.LWTFailureException; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.QueryExecutor; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.serializer.CQLBindValues; import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; import io.stargate.sgv2.jsonapi.service.operation.filters.collection.IDCollectionFilter; @@ -280,8 +279,12 @@ private Uni updatedDocument( } private String buildUpdateQuery(boolean vectorEnabled, boolean lexicalEnabled) { - final SchemaObjectName tableName = commandContext.schemaObject().name(); - return buildUpdateQuery(tableName.keyspace(), tableName.table(), vectorEnabled, lexicalEnabled); + var identifier = commandContext.schemaObject().identifier(); + return buildUpdateQuery( + identifier.keyspace().asInternal(), + identifier.table().asInternal(), + vectorEnabled, + lexicalEnabled); } // NOTE: This method is used in the test code (to avoid having to copy query Strings verbatim), diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/TruncateCollectionOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/TruncateCollectionOperation.java index f9e452740d..d449227fef 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/TruncateCollectionOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/collections/TruncateCollectionOperation.java @@ -25,10 +25,12 @@ public record TruncateCollectionOperation(CommandContext @Override public Uni> execute( RequestContext dataApiRequestInfo, QueryExecutor queryExecutor) { - logger.info("Executing TruncateCollectionOperation for {}", context.schemaObject().name()); + logger.info( + "Executing TruncateCollectionOperation for {}", context.schemaObject().identifier()); String cql = TRUNCATE_TABLE_CQL.formatted( - context.schemaObject().name().keyspace(), context.schemaObject().name().table()); + context.schemaObject().identifier().keyspace().asInternal(), + context.schemaObject().identifier().table().asInternal()); SimpleStatement query = SimpleStatement.newInstance(cql); // execute return queryExecutor diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java index d76354f105..af9ead08e0 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTableDBTask.java @@ -1,7 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createTable; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.CreateTable; @@ -45,7 +44,7 @@ public static CreateTableDBTaskBuilder builder(KeyspaceSchemaObject schemaObject protected SimpleStatement buildStatement() { - var keyspaceIdentifier = cqlIdentifierFromUserInput(schemaObject.name().keyspace()); + var keyspaceIdentifier = schemaObject.identifier().keyspace(); CreateTableStart create = createTable(keyspaceIdentifier, tableDef.name()); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java index 3016ae1f71..52d6e1c14e 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/CreateTypeDBTask.java @@ -1,7 +1,6 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; import static com.datastax.oss.driver.api.querybuilder.SchemaBuilder.createType; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.schema.*; @@ -43,7 +42,7 @@ public static CreateTypeDBTaskBuilder builder(KeyspaceSchemaObject schemaObject) @Override protected SimpleStatement buildStatement() { - var keyspaceIdentifier = cqlIdentifierFromUserInput(schemaObject.name().keyspace()); + var keyspaceIdentifier = schemaObject.identifier().keyspace(); CreateTypeStart createTypeStart = createType(keyspaceIdentifier, apiUdtType.udtName()); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java index 11c8026720..ddf7620b6a 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropIndexDBTask.java @@ -41,9 +41,7 @@ protected SimpleStatement buildStatement() { // The keyspace name always comes from the metadata, we need to add support to hold the // KeyspaceMetadata - Drop drop = - SchemaBuilder.dropIndex( - CqlIdentifier.fromInternal(schemaObject.name().keyspace()), indexName); + Drop drop = SchemaBuilder.dropIndex(schemaObject.identifier().keyspace(), indexName); // Apply any additional options drop = cqlOptions.applyBuilderOptions(drop); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java index 8f3902e9f5..b6da96b4b8 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTableDBTask.java @@ -1,7 +1,5 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; - import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; @@ -38,7 +36,7 @@ public static DropTableDBTaskBuilder builder(KeyspaceSchemaObject schemaObject) @Override protected SimpleStatement buildStatement() { - CqlIdentifier keyspaceIdentifier = cqlIdentifierFromUserInput(schemaObject.name().keyspace()); + CqlIdentifier keyspaceIdentifier = schemaObject.identifier().keyspace(); // Set as StorageAttachedIndex as default Drop drop = SchemaBuilder.dropTable(keyspaceIdentifier, name); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java index eb79ef9f5f..8a3e603502 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tables/DropTypeDBTask.java @@ -1,7 +1,5 @@ package io.stargate.sgv2.jsonapi.service.operation.tables; -import static io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil.cqlIdentifierFromUserInput; - import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.cql.SimpleStatement; import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; @@ -38,7 +36,7 @@ public static DropTypeDBTaskBuilder builder(KeyspaceSchemaObject schemaObject) { @Override protected SimpleStatement buildStatement() { - CqlIdentifier keyspaceIdentifier = cqlIdentifierFromUserInput(schemaObject.name().keyspace()); + CqlIdentifier keyspaceIdentifier = schemaObject.identifier().keyspace(); Drop drop = SchemaBuilder.dropType(keyspaceIdentifier, name); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java index e03c9ef7b8..e99922a3b6 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/processor/MeteredCommandProcessor.java @@ -95,7 +95,7 @@ public Uni Uni { // Cleanup MDC after processing completes (success or failure) to prevent data from // leaking into the next request handled by the same thread. - commandContext.schemaObject().name().removeFromMDC(); + commandContext.schemaObject().identifier().removeFromMDC(); MDC.remove("tenantId"); }); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java index 7af9560a42..608f364adb 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/resolver/CreateCollectionCommandResolver.java @@ -13,7 +13,6 @@ import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; import io.stargate.sgv2.jsonapi.exception.SchemaException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.KeyspaceSchemaObject; import io.stargate.sgv2.jsonapi.service.operation.Operation; import io.stargate.sgv2.jsonapi.service.operation.collections.CreateCollectionOperation; import io.stargate.sgv2.jsonapi.service.reranking.configuration.RerankingProvidersConfig; diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java index 84e055f11c..ed137bd92d 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java @@ -14,9 +14,11 @@ import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; +import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; +import jakarta.validation.constraints.NotNull; import java.lang.ref.WeakReference; import java.time.Duration; import java.util.List; @@ -119,7 +121,6 @@ public Uni getDatabase( return get(requestContext, identifier, userAgent, forceRefresh); } - // get keyspace public Uni getKeyspace( RequestContext requestContext, SchemaObjectIdentifier identifier, @@ -230,14 +231,11 @@ Optional getIfPresent( return (Optional) getIfPresent(createCacheKey(requestContext, identifier, userAgent, false)); } - // - // private Optional getIfPresent(SchemaCacheKey key) { - // - // // todo, check and cast somehow - // return (Optional) getIfPresent(key); - // } protected void evictTable(Tenant tenant, CqlIdentifier keyspace, CqlIdentifier table) { // no need to normalize the keyspace name, it is already normalized + // requestContext is only needed when creating/loading values + // Eviction with null requestContext works because SchemaCacheKey.equals() only compares + // schemaIdentifier var evictKey = createCacheKey(null, SchemaObjectIdentifier.forTable(tenant, keyspace, table), null, false); @@ -250,6 +248,9 @@ protected void evictTable(Tenant tenant, CqlIdentifier keyspace, CqlIdentifier t protected void evictKeyspace(Tenant tenant, CqlIdentifier keyspace, boolean evictAll) { // no need to normalize the keyspace name, it is already normalized + // requestContext is only needed when creating/loading values + // Eviction with null requestContext works because SchemaCacheKey.equals() only compares + // schemaIdentifier var evictKey = createCacheKey(null, SchemaObjectIdentifier.forKeyspace(tenant, keyspace), null, false); @@ -259,11 +260,22 @@ protected void evictKeyspace(Tenant tenant, CqlIdentifier keyspace, boolean evic evict(evictKey); if (evictAll) { - // we need to remove all the tables, collections, etc that are in this keyspace + // we need to remove all the tables, collections, etc. All of those are in this keyspace. evictIf(key -> evictKey.schemaIdentifier.isSameKeyspace(key.schemaIdentifier)); } } + /** + * TODO, how to do this for single level cache Removes all keyspaces and table entries for the + * given tenant from the cache. + */ + void evictAllKeyspaces(Tenant tenant) { + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("evictAllKeyspaces() - tenant: {}", tenant); + } + } + private SchemaCacheKey createCacheKey( RequestContext requestContext, SchemaObjectIdentifier schemaIdentifier, @@ -426,7 +438,7 @@ private void evictKeyspace( } @Override - public void onSessionReady(@NonNull Session session) { + public void onSessionReady(@NotNull Session session) { // This is called when the session is ready, we can get the tenant from the session name // and set it in the listener so we can use it in the other methods. tenant = TenantFactory.instance().create(session.getName()); @@ -438,44 +450,66 @@ public void onSessionReady(@NonNull Session session) { * re-created */ @Override - public void onTableDropped(@NonNull TableMetadata table) { + public void onTableDropped(@NotNull TableMetadata table) { evictTable("onTableDropped", table); } /** When a table is created, evict from cache to avoid stale if it was re-created */ @Override - public void onTableCreated(@NonNull TableMetadata table) { + public void onTableCreated(@NotNull TableMetadata table) { evictTable("onTableCreated", table); } /** When a table is updated, evict from cache to avoid stale entries */ @Override - public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadata previous) { + public void onTableUpdated(@NotNull TableMetadata current, @NotNull TableMetadata previous) { // table name can never change evictTable("onTableUpdated", current); } /** When keyspace dropped, we dont need any more of the tables in the cache */ @Override - public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { + public void onKeyspaceDropped(@NotNull KeyspaceMetadata keyspace) { evictKeyspace("onKeyspaceDropped", keyspace, true); } - /** When keyspace created, evict KS and all other objects incase we missed the drop */ + /** When keyspace created, evict KS and all other objects in case we missed the drop */ @Override - public void onKeyspaceCreated(@NonNull KeyspaceMetadata keyspace) { + public void onKeyspaceCreated(@NotNull KeyspaceMetadata keyspace) { evictKeyspace("onKeyspaceCreated", keyspace, true); } - /** When keyspace updated, evict from cache incase stale keyspace or collections */ + /** When keyspace updated, evict from cache in case stale keyspace or collections */ @Override public void onKeyspaceUpdated( - @NonNull KeyspaceMetadata current, @NonNull KeyspaceMetadata previous) { + @NotNull KeyspaceMetadata current, @NotNull KeyspaceMetadata previous) { evictKeyspace("onKeyspaceUpdated", current, false); } } - /** Called to create a new session when one is needed. */ + /** + * Listener for use with the {@link CQLSessionCache} to remove the schema object cache entries + * when a tenant is deactivated. + */ + private static class SchemaObjectCacheDeactivatedTenantConsumer + implements CQLSessionCache.DeactivatedTenantListener { + + private final SchemaObjectCache schemaObjectCache; + + public SchemaObjectCacheDeactivatedTenantConsumer(SchemaObjectCache schemaObjectCache) { + this.schemaObjectCache = + Objects.requireNonNull(schemaObjectCache, "schemaObjectCache must not be null"); + } + + @Override + public void accept(Tenant tenant) { + // the sessions are keyed on the tenantID and the credentials, and one session can work with + // multiple keyspaces. So we need to evict all the keyspaces for the tenant + schemaObjectCache.evictAllKeyspaces(tenant); + } + } + + /** Called to create a new schema object when one is needed. */ interface SchemaObjectFactory { CompletionStage apply( RequestContext requestContext, SchemaObjectIdentifier identifier, boolean forceRefresh); diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java index e1fa54ffe3..b1d4dd6ef1 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java @@ -18,7 +18,6 @@ import java.util.Objects; import java.util.concurrent.CompletionStage; -/** Creates */ public class SchemaObjectFactory implements SchemaObjectCache.SchemaObjectFactory { private static final CollectionTableMatcher IS_COLLECTION_PREDICATE = @@ -52,21 +51,29 @@ public CompletionStage apply( case KEYSPACE -> createKeyspaceSchemaObject(requestContext, identifier, forceRefresh); case TABLE -> createTableBasedSchemaObject(requestContext, identifier, forceRefresh) - .invoke( - tbso -> { - if (tbso.type() != SchemaObjectType.TABLE) { - throw new SchemaObjectTypeMismatchException( - SchemaObjectType.TABLE, tbso.type()); + .onItem() + .transformToUni( + tableBasedSchemaObject -> { + if (tableBasedSchemaObject.type() != SchemaObjectType.TABLE) { + return Uni.createFrom() + .failure( + new SchemaObjectTypeMismatchException( + SchemaObjectType.TABLE, tableBasedSchemaObject.type())); } + return Uni.createFrom().item(tableBasedSchemaObject); }); case COLLECTION -> createTableBasedSchemaObject(requestContext, identifier, forceRefresh) - .invoke( - tbso -> { - if (tbso.type() != SchemaObjectType.COLLECTION) { - throw new SchemaObjectTypeMismatchException( - SchemaObjectType.COLLECTION, tbso.type()); + .onItem() + .transformToUni( + tableBasedSchemaObject -> { + if (tableBasedSchemaObject.type() != SchemaObjectType.COLLECTION) { + return Uni.createFrom() + .failure( + new SchemaObjectTypeMismatchException( + SchemaObjectType.COLLECTION, tableBasedSchemaObject.type())); } + return Uni.createFrom().item(tableBasedSchemaObject); }); default -> throw new IllegalArgumentException( diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java index bce0f1e471..7f479f1c49 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifier.java @@ -50,7 +50,9 @@ private SchemaObjectIdentifier( switch (type) { case DATABASE -> "db:" + tenant; case KEYSPACE -> cqlIdentifierToMessageString(keyspace); - case COLLECTION, TABLE, INDEX -> + // Note, INDEX and UDT schemaType are not used currently + // Added for syntax completeness + case COLLECTION, TABLE, INDEX, UDT -> cqlIdentifierToMessageString(keyspace) + "." + cqlIdentifierToMessageString(table); }; } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java index abd2a1dc4a..f138f77592 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSchemaObject.java @@ -38,18 +38,6 @@ */ public final class CollectionSchemaObject extends TableBasedSchemaObject { - // Collection Schema to use if all information missing: Vector not configured, - // no Lexical enabled - // public static final CollectionSchemaObject MISSING = - // new CollectionSchemaObject( - // SchemaObjectIdentifier.MISSING, - // null, - // IdConfig.defaultIdConfig(), - // VectorConfig.NOT_ENABLED_CONFIG, - // null, - // CollectionLexicalConfig.configForDisabled(), - // CollectionRerankDef.configForDisabled()); - private final IdConfig idConfig; private final VectorConfig vectorConfig; private final CollectionIndexingConfig indexingConfig; @@ -57,10 +45,6 @@ public final class CollectionSchemaObject extends TableBasedSchemaObject { private final CollectionLexicalConfig lexicalConfig; private final CollectionRerankDef rerankDef; - /** - * @param vectorConfig - * @param indexingConfig - */ public CollectionSchemaObject( Tenant tenant, TableMetadata tableMetadata, @@ -81,7 +65,7 @@ public CollectionSchemaObject( } /** - * we have a lot of old tests that created a collection without having table meta data. Use the + * we have a lot of old tests that created a collection without having table metadata. Use the * ctor with TableMetadata in prod code */ @VisibleForTesting @@ -103,37 +87,6 @@ public CollectionSchemaObject( this.rerankDef = Objects.requireNonNull(rerankDef); } - // public CollectionSchemaObject( - // SchemaObjectIdentifier name, - // TableMetadata tableMetadata, - // IdConfig idConfig, - // VectorConfig vectorConfig, - // CollectionIndexingConfig indexingConfig, - // CollectionLexicalConfig lexicalConfig, - // CollectionRerankDef rerankDef) { - // super(TYPE, name, tableMetadata); - // - // this.idConfig = idConfig; - // this.vectorConfig = vectorConfig; - // this.indexingConfig = indexingConfig; - // this.tableMetadata = tableMetadata; - // this.lexicalConfig = Objects.requireNonNull(lexicalConfig); - // this.rerankDef = Objects.requireNonNull(rerankDef); - // } - - // TODO: remove this, it is just here for testing and can be handled by creating test data - // effectively - // public CollectionSchemaObject withIdType(CollectionIdType idType) { - // return new CollectionSchemaObject( - // name(), - // tableMetadata, - // new IdConfig(idType), - // vectorConfig, - // indexingConfig, - // lexicalConfig, - // rerankDef); - // } - /** * Method for constructing a new CollectionSchemaObject with overrides for Lexical and Rerank * settings. @@ -191,31 +144,9 @@ public IndexingProjector indexingProjector() { return indexingConfig.indexingProjector(); } - // TODO: AARON COMMENTED OUT TO SEE IF IT IS USED - // public enum AuthenticationType { - // NONE, - // HEADER, - // SHARED_SECRET, - // UNDEFINED; - // - // public static AuthenticationType fromString(String authenticationType) { - // if (authenticationType == null) return UNDEFINED; - // return switch (authenticationType.toLowerCase()) { - // case "none" -> NONE; - // case "header" -> HEADER; - // case "shared_secret" -> SHARED_SECRET; - // default -> - // throw ErrorCodeV1.VECTORIZE_INVALID_AUTHENTICATION_TYPE.toApiException( - // "'%s'", authenticationType); - // }; - // } - // } - public static CollectionSchemaObject getCollectionSettings( Tenant tenant, TableMetadata table, ObjectMapper objectMapper) { - // [jsonapi#639]: get internal name to avoid quoting of case-sensitive names - String keyspaceName = table.getKeyspace().asInternal(); - String collectionName = table.getName().asInternal(); + // get vector column final Optional vectorColumn = table.getColumn(DocumentConstants.Columns.VECTOR_SEARCH_INDEX_COLUMN_NAME); @@ -254,10 +185,9 @@ public static CollectionSchemaObject getCollectionSettings( () -> EmbeddingSourceModel.getUnknownSourceModelException(sourceModelName)); } } + return createCollectionSettings( - tenant, - keyspaceName, - collectionName, + SchemaObjectIdentifier.forCollection(tenant, table.getKeyspace(), table.getName()), table, true, vectorSize, @@ -267,9 +197,7 @@ public static CollectionSchemaObject getCollectionSettings( objectMapper); } else { // if not vector collection return createCollectionSettings( - tenant, - keyspaceName, - collectionName, + SchemaObjectIdentifier.forCollection(tenant, table.getKeyspace(), table.getName()), table, false, 0, @@ -280,34 +208,8 @@ public static CollectionSchemaObject getCollectionSettings( } } - public static CollectionSchemaObject getCollectionSettings( - Tenant tenant, - String keyspaceName, - String collectionName, - TableMetadata tableMetadata, - boolean vectorEnabled, - int vectorSize, - SimilarityFunction similarityFunction, - EmbeddingSourceModel sourceModel, - String comment, - ObjectMapper objectMapper) { - return createCollectionSettings( - tenant, - keyspaceName, - collectionName, - tableMetadata, - vectorEnabled, - vectorSize, - similarityFunction, - sourceModel, - comment, - objectMapper); - } - - private static CollectionSchemaObject createCollectionSettings( - Tenant tenant, - String keyspaceName, - String collectionName, + public static CollectionSchemaObject createCollectionSettings( + SchemaObjectIdentifier identifier, TableMetadata tableMetadata, boolean vectorEnabled, int vectorSize, @@ -323,7 +225,7 @@ private static CollectionSchemaObject createCollectionSettings( CollectionRerankDef rerankingConfig = CollectionRerankDef.configForPreRerankingCollection(); if (vectorEnabled) { return new CollectionSchemaObject( - tenant, + identifier.tenant(), tableMetadata, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( @@ -339,7 +241,7 @@ private static CollectionSchemaObject createCollectionSettings( rerankingConfig); } else { return new CollectionSchemaObject( - tenant, + identifier.tenant(), tableMetadata, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, @@ -367,13 +269,7 @@ private static CollectionSchemaObject createCollectionSettings( switch (collectionNode.get(TableCommentConstants.SCHEMA_VERSION_KEY).asInt()) { case 1: return new CollectionSettingsV1Reader() - .readCollectionSettings( - tenant, - collectionNode, - keyspaceName, - collectionName, - tableMetadata, - objectMapper); + .readCollectionSettings(identifier, collectionNode, tableMetadata, objectMapper); default: throw ErrorCodeV1.INVALID_SCHEMA_VERSION.toApiException(); } @@ -382,10 +278,8 @@ private static CollectionSchemaObject createCollectionSettings( // sample comment : {"indexing":{"deny":["address"]}}} return new CollectionSettingsV0Reader() .readCollectionSettings( - tenant, + identifier, commentConfigNode, - keyspaceName, - collectionName, tableMetadata, vectorEnabled, vectorSize, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV0Reader.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV0Reader.java index 5dbb613938..6319eeb0c3 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV0Reader.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV0Reader.java @@ -7,6 +7,7 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; import java.util.List; @@ -22,9 +23,8 @@ */ public class CollectionSettingsV0Reader { public CollectionSchemaObject readCollectionSettings( + SchemaObjectIdentifier identifier, JsonNode commentConfigNode, - String keyspaceName, - String collectionName, TableMetadata tableMetadata, boolean vectorEnabled, int vectorSize, @@ -48,8 +48,7 @@ public CollectionSchemaObject readCollectionSettings( indexingConfig = CollectionIndexingConfig.fromJson(indexing); } return new CollectionSchemaObject( - keyspaceName, - collectionName, + identifier.tenant(), tableMetadata, IdConfig.defaultIdConfig(), vectorConfig, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV1Reader.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV1Reader.java index bb135102ea..1c620b51b2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV1Reader.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/collections/CollectionSettingsV1Reader.java @@ -6,6 +6,7 @@ import io.stargate.sgv2.jsonapi.config.constants.TableCommentConstants; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import java.util.List; /** @@ -17,9 +18,8 @@ */ public class CollectionSettingsV1Reader { public CollectionSchemaObject readCollectionSettings( + SchemaObjectIdentifier identifier, JsonNode collectionNode, - String keyspaceName, - String collectionName, TableMetadata tableMetadata, ObjectMapper objectMapper) { @@ -67,12 +67,15 @@ public CollectionSchemaObject readCollectionSettings( } else { rerankingConfig = CollectionRerankDef.fromCommentJson( - keyspaceName, collectionName, rerankingNode, objectMapper); + // [jsonapi#639]: get internal name to avoid quoting of case-sensitive names + identifier.keyspace().asInternal(), + identifier.table().asInternal(), + rerankingNode, + objectMapper); } return new CollectionSchemaObject( - keyspaceName, - collectionName, + identifier.tenant(), tableMetadata, idConfig, vectorConfig, diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java index 6e31f124af..458ccf91f2 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/CollectionNamingRule.java @@ -1,5 +1,6 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; /** The naming rule of the new Collection name. */ public class CollectionNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java index 9d32e88681..5287667652 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/IndexNamingRule.java @@ -1,5 +1,6 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; /** The naming rule of the new Index name. */ public class IndexNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java index e6d0c95942..c51691cb74 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/KeyspaceNamingRule.java @@ -1,5 +1,6 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; /** The naming rule of the new Keyspace name. */ public class KeyspaceNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java index 010bf2978f..6e8cb867ed 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/naming/TableNamingRule.java @@ -1,5 +1,6 @@ package io.stargate.sgv2.jsonapi.service.schema.naming; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; /** The naming rule of the new Table name. */ public class TableNamingRule extends SchemaObjectNamingRule { diff --git a/src/main/resources/errors.yaml b/src/main/resources/errors.yaml index 53690ba856..e1378a9d6c 100644 --- a/src/main/resources/errors.yaml +++ b/src/main/resources/errors.yaml @@ -1023,6 +1023,16 @@ request-errors: Resend the command using a Keyspace that exists. + - scope: SCHEMA + code: UNKNOWN_COLLECTION_OR_TABLE + title: Collection or Table does not exist in the Keyspace + body: |- + The command tried to get a Collection or Table ${table} that does not exist in the Keyspace ${keyspace}. + + The keyspace has the existing collections or tables: ${allTables}. + + Resend the command using a Collection or Table that exists. + - scope: SCHEMA code: UNKNOWN_PARTITION_SORT_COLUMNS title: Partition sort columns are not defined in the table schema From bada24052ca3d939077708be52e8232c4d5f29b3 Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Thu, 8 Jan 2026 10:25:32 -0800 Subject: [PATCH 5/8] remove DBRequestContext, use RequestContext --- .../service/cqldriver/CQLSessionCache.java | 16 --------- .../cqldriver/CqlSessionCacheSupplier.java | 4 +-- .../executor/CommandQueryExecutor.java | 34 ++++--------------- .../service/operation/GenericOperation.java | 6 +--- .../service/operation/tasks/DBTask.java | 2 +- .../service/schema/SchemaObjectCache.java | 34 ------------------- .../service/schema/SchemaObjectFactory.java | 4 +-- 7 files changed, 10 insertions(+), 90 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java index e77f88da94..3acd54ad65 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CQLSessionCache.java @@ -10,7 +10,6 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.CommandQueryExecutor; import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; import java.time.Duration; import java.util.ArrayList; @@ -185,21 +184,6 @@ public Uni getSession(RequestContext requestContext) { requestContext.tenant(), requestContext.authToken(), requestContext.userAgent()); } - /** - * Gets or creates a {@link CqlSession} for the provided DB Request Context - * - * @param requestContext {@link CommandQueryExecutor.DBRequestContext} to get the session for. - * @return A Uni with the {@link CqlSession} for this tenant and credentials, the session maybe - * newly created or reused from the cache. - */ - public Uni getSession(CommandQueryExecutor.DBRequestContext requestContext) { - Objects.requireNonNull(requestContext, "requestContext must not be null"); - - // Validation happens when creating the credentials and session key - return getSession( - requestContext.tenant(), requestContext.authToken(), requestContext.userAgent()); - } - /** * Retrieves or creates a {@link CqlSession} for the specified tenant and authentication token. * diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java index 86f948b0c5..fdbe3acac7 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplier.java @@ -64,9 +64,7 @@ public CqlSessionCacheSupplier( credentialsFactory, sessionFactory, meterRegistry, - List.of( - schemaObjectCache.getDeactivatedTenantConsumer(), - new MetricsTenantDeactivationConsumer(meterRegistry))); + List.of(new MetricsTenantDeactivationConsumer(meterRegistry))); } /** Gets the singleton instance of the {@link CQLSessionCache}. */ diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java index e16c6ccebe..411a30f86b 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/CommandQueryExecutor.java @@ -10,9 +10,7 @@ import com.google.common.annotations.VisibleForTesting; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; -import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; -import io.stargate.sgv2.jsonapi.api.request.UserAgent; -import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; +import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.service.cqldriver.AccumulatingAsyncResultSet; import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import java.util.Objects; @@ -64,15 +62,14 @@ private enum QueryType { } private final CQLSessionCache cqlSessionCache; - private final DBRequestContext dbRequestContext; + private final RequestContext requestContext; private final QueryTarget queryTarget; public CommandQueryExecutor( - CQLSessionCache cqlSessionCache, DBRequestContext dbRequestContext, QueryTarget queryTarget) { + CQLSessionCache cqlSessionCache, RequestContext requestContext, QueryTarget queryTarget) { this.cqlSessionCache = Objects.requireNonNull(cqlSessionCache, "cqlSessionCache must not be null"); - this.dbRequestContext = - Objects.requireNonNull(dbRequestContext, "dbRequestContext must not be null"); + this.requestContext = requestContext; this.queryTarget = queryTarget; } @@ -188,7 +185,7 @@ public Uni executeCreateSchema(SimpleStatement statement) { * @return Uni of the {@link CqlSession} */ private Uni session() { - return cqlSessionCache.getSession(dbRequestContext); + return cqlSessionCache.getSession(requestContext); } private String getExecutionProfile(QueryType queryType) { @@ -202,27 +199,8 @@ private SimpleStatement withExecutionProfile(SimpleStatement statement, QueryTyp @VisibleForTesting public Uni executeAndWrap(SimpleStatement statement) { - // changing tracing creates a new object, avoid if not needed - var execStatement = - dbRequestContext.tracingEnabled() != statement.isTracing() - ? statement.setTracing(dbRequestContext.tracingEnabled()) - : statement; - return session() .flatMap( - session -> Uni.createFrom().completionStage(() -> session.executeAsync(execStatement))); - } - - // Aaron - Feb 3 - temp rename while factoring full RequestContext - public record DBRequestContext( - Tenant tenant, String authToken, UserAgent userAgent, boolean tracingEnabled) { - - public DBRequestContext(CommandContext commandContext) { - this( - commandContext.requestContext().tenant(), - commandContext.requestContext().authToken(), - commandContext.requestContext().userAgent(), - commandContext.requestTracing().enabled()); - } + session -> Uni.createFrom().completionStage(() -> session.executeAsync(statement))); } } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java index 7acfa3e92f..e5dafaeb32 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/GenericOperation.java @@ -95,11 +95,7 @@ protected Multi startMulti(CommandContext commandContext) { var commandQueryExecutor = new CommandQueryExecutor( commandContext.cqlSessionCache(), - new CommandQueryExecutor.DBRequestContext( - commandContext.requestContext().tenant(), - commandContext.requestContext().authToken(), - commandContext.requestContext().userAgent(), - commandContext.requestTracing().enabled()), + commandContext.requestContext(), CommandQueryExecutor.QueryTarget.TABLE); // Common start pattern for all operations diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java index b77b7fa800..f52f69f616 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/operation/tasks/DBTask.java @@ -186,7 +186,7 @@ protected CommandQueryExecutor getCommandQueryExecutor(CommandContext c // , improve later return new CommandQueryExecutor( commandContext.cqlSessionCache(), - new CommandQueryExecutor.DBRequestContext(commandContext), + commandContext.requestContext(), CommandQueryExecutor.QueryTarget.TABLE); } diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java index ed137bd92d..6d624befac 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java @@ -14,7 +14,6 @@ import io.stargate.sgv2.jsonapi.api.request.UserAgent; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.api.request.tenant.TenantFactory; -import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; @@ -265,17 +264,6 @@ protected void evictKeyspace(Tenant tenant, CqlIdentifier keyspace, boolean evic } } - /** - * TODO, how to do this for single level cache Removes all keyspaces and table entries for the - * given tenant from the cache. - */ - void evictAllKeyspaces(Tenant tenant) { - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("evictAllKeyspaces() - tenant: {}", tenant); - } - } - private SchemaCacheKey createCacheKey( RequestContext requestContext, SchemaObjectIdentifier schemaIdentifier, @@ -487,28 +475,6 @@ public void onKeyspaceUpdated( } } - /** - * Listener for use with the {@link CQLSessionCache} to remove the schema object cache entries - * when a tenant is deactivated. - */ - private static class SchemaObjectCacheDeactivatedTenantConsumer - implements CQLSessionCache.DeactivatedTenantListener { - - private final SchemaObjectCache schemaObjectCache; - - public SchemaObjectCacheDeactivatedTenantConsumer(SchemaObjectCache schemaObjectCache) { - this.schemaObjectCache = - Objects.requireNonNull(schemaObjectCache, "schemaObjectCache must not be null"); - } - - @Override - public void accept(Tenant tenant) { - // the sessions are keyed on the tenantID and the credentials, and one session can work with - // multiple keyspaces. So we need to evict all the keyspaces for the tenant - schemaObjectCache.evictAllKeyspaces(tenant); - } - } - /** Called to create a new schema object when one is needed. */ interface SchemaObjectFactory { CompletionStage apply( diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java index b1d4dd6ef1..da93f40747 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectFactory.java @@ -136,9 +136,7 @@ private Uni getKeyspaceMetadata( var queryExecutor = new CommandQueryExecutor( - sessionCache, - new CommandQueryExecutor.DBRequestContext(requestContext), - CommandQueryExecutor.QueryTarget.SCHEMA); + sessionCache, requestContext, CommandQueryExecutor.QueryTarget.SCHEMA); return queryExecutor .getKeyspaceMetadata(scopedName.keyspace(), forceRefresh) From bfb03282d0286a73580d7501ffcf800ba79b0c57 Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Fri, 9 Jan 2026 10:50:26 -0800 Subject: [PATCH 6/8] unit test compling fixes --- .../schema/tables/TableSchemaObject.java | 13 + .../stargate/sgv2/jsonapi/TestConstants.java | 69 +++- .../CollectionSchemaObjectTest.java | 12 +- .../sgv2/jsonapi/fixtures/CqlFixture.java | 5 +- .../testdata/SchemaObjectTestData.java | 8 +- .../testdata/TableUpdateAnalyzerTestData.java | 8 +- .../testdata/TableWhereCQLClauseTestData.java | 4 +- .../fixtures/testdata/TenantTestData.java | 17 + .../jsonapi/fixtures/testdata/TestData.java | 4 + .../testdata/WhereAnalyzerTestData.java | 8 +- .../CqlSessionCacheSupplierTests.java | 10 +- .../DefaultDriverExceptionHandlerTest.java | 11 +- ...DefaultDriverExceptionHandlerTestData.java | 36 +- .../executor/NamespaceCacheTest.java | 366 ------------------ .../cqldriver/executor/SchemaCacheTests.java | 256 ------------ .../operation/DataVectorizerTest.java | 3 +- .../operation/TestEmbeddingProvider.java | 2 +- .../FindCollectionOperationTest.java | 2 +- .../InsertCollectionOperationTest.java | 2 +- .../collections/OperationTestBase.java | 7 +- .../ReadAndUpdateCollectionOperationTest.java | 4 +- .../operation/tasks/BaseTaskAssertions.java | 3 +- .../processor/SchemaObjectTestData.java | 67 ---- .../CommandResolverWithVectorizerTest.java | 9 +- .../SchemaObjectCacheChangeListenerTests.java | 2 +- .../schema/SchemaObjectIdentifierTests.java | 8 +- .../DocumentShredderDocLimitsTest.java | 4 +- .../shredding/DocumentShredderTest.java | 14 +- ...DocumentShredderWithExtendedTypesTest.java | 30 +- 29 files changed, 183 insertions(+), 801 deletions(-) create mode 100644 src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TenantTestData.java delete mode 100644 src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/NamespaceCacheTest.java delete mode 100644 src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCacheTests.java delete mode 100644 src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java index 9a1692a5f6..3d04424048 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/tables/TableSchemaObject.java @@ -2,9 +2,11 @@ import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.annotations.VisibleForTesting; import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.IndexUsage; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectIdentifier; import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.util.recordable.Recordable; import org.slf4j.Logger; @@ -49,6 +51,17 @@ public static TableSchemaObject from( return new TableSchemaObject(tenant, tableMetadata, vectorConfig, apiTableDef); } + /** + * we have tests that created a table without having table metadata. Use the ctor with + * TableMetadata in prod code + */ + @VisibleForTesting + public TableSchemaObject(SchemaObjectIdentifier identifier) { + super(SchemaObjectType.TABLE, identifier); + vectorConfig = null; + apiTableDef = null; + } + @Override public Recordable.DataRecorder recordTo(Recordable.DataRecorder dataRecorder) { return super.recordTo(dataRecorder).append("apiTableDef", apiTableDef); diff --git a/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java b/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java index 7abfe895ef..61b1a2db71 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java @@ -19,12 +19,13 @@ import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProvider; import io.stargate.sgv2.jsonapi.service.embedding.operation.EmbeddingProviderFactory; import io.stargate.sgv2.jsonapi.service.reranking.operation.RerankingProviderFactory; -import io.stargate.sgv2.jsonapi.service.schema.EmbeddingSourceModel; -import io.stargate.sgv2.jsonapi.service.schema.SimilarityFunction; +import io.stargate.sgv2.jsonapi.service.schema.*; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionLexicalConfig; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionRerankDef; import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; import io.stargate.sgv2.jsonapi.service.schema.collections.IdConfig; +import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; +import io.stargate.sgv2.jsonapi.util.CqlIdentifierUtil; import java.util.List; import java.util.Optional; import org.apache.commons.lang3.RandomStringUtils; @@ -38,6 +39,7 @@ public class TestConstants { public final String APP_NAME; + public final DatabaseType DATABASE_TYPE; public final TenantFactory SINGLETON_TENANT_FACTORY; // ============================================================ @@ -55,8 +57,6 @@ public class TestConstants { public final String COLLECTION_NAME; public final String TABLE_NAME; - public final SchemaObjectName SCHEMA_OBJECT_NAME; - /** Raw SLA user agent, Use {@link #SLA_USER_AGENT} */ public final String SLA_USER_AGENT_NAME = "Datastax-SLA-Checker"; @@ -67,6 +67,18 @@ public class TestConstants { /** An astra database type TENANT used for test */ public final Tenant TENANT; + /** A database identifier for the test */ + public final SchemaObjectIdentifier DATABASE_IDENTIFIER; + + /** A keyspace identifier for the test */ + public final SchemaObjectIdentifier KEYSPACE_IDENTIFIER; + + /** A collection identifier for the test */ + public final SchemaObjectIdentifier COLLECTION_IDENTIFIER; + + /** A table identifier for the test */ + public final SchemaObjectIdentifier TABLE_IDENTIFIER; + /** A cassandra database type TENANT used for test */ public final Tenant CASSANDRA_TENANT; @@ -81,6 +93,11 @@ public class TestConstants { /** Embedding credentials */ public final EmbeddingCredentials EMBEDDING_CREDENTIALS; + /** + * Collection Schema to use if all information missing: Vector not configured, no Lexical enabled + */ + public final CollectionSchemaObject MISSING; + // ============================================================ // Schema Objects // ============================================================ @@ -88,6 +105,7 @@ public class TestConstants { public final CollectionSchemaObject COLLECTION_SCHEMA_OBJECT; public final CollectionSchemaObject COLLECTION_SCHEMA_OBJECT_LEGACY; public final CollectionSchemaObject VECTOR_COLLECTION_SCHEMA_OBJECT; + public final TableSchemaObject TABLE_SCHEMA_OBJECT; public final KeyspaceSchemaObject KEYSPACE_SCHEMA_OBJECT; public final DatabaseSchemaObject DATABASE_SCHEMA_OBJECT; @@ -99,20 +117,21 @@ public TestConstants() { COMMAND_NAME = "command-" + CORRELATION_ID; KEYSPACE_NAME = "keyspace-" + CORRELATION_ID; + var keyspaceCqlIdentifier = CqlIdentifierUtil.cqlIdentifierFromUserInput(KEYSPACE_NAME); COLLECTION_NAME = "collection-" + CORRELATION_ID; + var collectionCqlIdentifier = CqlIdentifierUtil.cqlIdentifierFromUserInput(COLLECTION_NAME); TABLE_NAME = "table-" + CORRELATION_ID; APP_NAME = "Stargate DATA API -" + CORRELATION_ID; - SCHEMA_OBJECT_NAME = new SchemaObjectName(KEYSPACE_NAME, COLLECTION_NAME); - // ============================================================ // Request Context // ============================================================ + DATABASE_TYPE = DatabaseType.ASTRA; var tenantId = "tenant-" + CORRELATION_ID; TenantFactory.reset(); - TenantFactory.initialize(DatabaseType.ASTRA); + TenantFactory.initialize(DATABASE_TYPE); TENANT = TenantFactory.instance().create(tenantId); SINGLETON_TENANT_FACTORY = TenantFactory.instance(); @@ -136,10 +155,20 @@ public TestConstants() { // Schema Objects // ============================================================ + DATABASE_IDENTIFIER = SchemaObjectIdentifier.forDatabase(TENANT); + KEYSPACE_IDENTIFIER = SchemaObjectIdentifier.forKeyspace(TENANT, keyspaceCqlIdentifier); + COLLECTION_IDENTIFIER = + SchemaObjectIdentifier.forCollection( + TENANT, keyspaceCqlIdentifier, collectionCqlIdentifier); + TABLE_IDENTIFIER = + SchemaObjectIdentifier.forTable( + TENANT, + keyspaceCqlIdentifier, + CqlIdentifierUtil.cqlIdentifierFromUserInput(TABLE_NAME)); + COLLECTION_SCHEMA_OBJECT = new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, - null, + COLLECTION_IDENTIFIER, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, null, @@ -153,8 +182,7 @@ public TestConstants() { // Schema object for testing with legacy (pre-lexical-config) defaults COLLECTION_SCHEMA_OBJECT_LEGACY = new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, - null, + COLLECTION_IDENTIFIER, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, null, @@ -163,8 +191,7 @@ public TestConstants() { VECTOR_COLLECTION_SCHEMA_OBJECT = new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, - null, + COLLECTION_IDENTIFIER, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( List.of( @@ -178,8 +205,20 @@ public TestConstants() { CollectionLexicalConfig.configForDisabled(), CollectionRerankDef.configForPreRerankingCollection()); - KEYSPACE_SCHEMA_OBJECT = KeyspaceSchemaObject.fromSchemaObject(COLLECTION_SCHEMA_OBJECT); - DATABASE_SCHEMA_OBJECT = new DatabaseSchemaObject(); + TABLE_SCHEMA_OBJECT = new TableSchemaObject(TABLE_IDENTIFIER); + + KEYSPACE_SCHEMA_OBJECT = new KeyspaceSchemaObject(KEYSPACE_IDENTIFIER); + DATABASE_SCHEMA_OBJECT = new DatabaseSchemaObject(TENANT); + + MISSING = + new CollectionSchemaObject( + TENANT, + null, + IdConfig.defaultIdConfig(), + VectorConfig.NOT_ENABLED_CONFIG, + null, + CollectionLexicalConfig.configForDisabled(), + CollectionRerankDef.configForDisabled()); } // CommandContext for working on the schema objects above diff --git a/src/test/java/io/stargate/sgv2/jsonapi/api/configuration/CollectionSchemaObjectTest.java b/src/test/java/io/stargate/sgv2/jsonapi/api/configuration/CollectionSchemaObjectTest.java index 3c729e6cce..5b7a30b54b 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/api/configuration/CollectionSchemaObjectTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/api/configuration/CollectionSchemaObjectTest.java @@ -4,6 +4,7 @@ import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.projection.IndexingProjector; import io.stargate.sgv2.jsonapi.service.schema.collections.*; @@ -15,21 +16,26 @@ @QuarkusTest @TestProfile(NoGlobalResourcesTestProfile.Impl.class) public class CollectionSchemaObjectTest { + + private final TestConstants TEST_CONSTANTS = new TestConstants(); + @Test public void ensureSingleProjectorCreation() { + CollectionIndexingConfig indexingConfig = new CollectionIndexingConfig(new HashSet<>(Arrays.asList("abc")), null); + CollectionSchemaObject settings = new CollectionSchemaObject( - "namespace", - "collectionName", - null, + TEST_CONSTANTS.COLLECTION_SCHEMA_OBJECT.identifier(), IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, indexingConfig, CollectionLexicalConfig.configForDisabled(), CollectionRerankDef.configForPreRerankingCollection()); + IndexingProjector indexingProj = settings.indexingProjector(); + assertThat(indexingProj) .isNotNull() // Should get the same instance second time due to memoization diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java index 694a6799ba..f66a082cfc 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/CqlFixture.java @@ -2,6 +2,7 @@ import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import com.fasterxml.jackson.databind.ObjectMapper; +import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.fixtures.data.DefaultData; import io.stargate.sgv2.jsonapi.fixtures.data.FixtureData; import io.stargate.sgv2.jsonapi.fixtures.identifiers.BaseFixtureIdentifiers; @@ -63,7 +64,9 @@ public CqlFixture( this.cqlData = cqlData; this.tableFixture = tableFixture; this.tableMetadata = tableFixture.tableMetadata(identifiers); - this.tableSchemaObject = TableSchemaObject.from(tableMetadata, new ObjectMapper()); + var TEST_CONSTANT = new TestConstants(); + this.tableSchemaObject = + TableSchemaObject.from(TEST_CONSTANT.TENANT, tableMetadata, new ObjectMapper()); } public FixtureIdentifiers identifiers() { diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java index f6fe3337a3..217b89fbb0 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/SchemaObjectTestData.java @@ -9,12 +9,10 @@ public SchemaObjectTestData(TestData testData) { super(testData); } - public TableSchemaObject emptyTableSchemaObject() { - return TableSchemaObject.from(testData.tableMetadata().empty(), new ObjectMapper()); - } - public TableSchemaObject tableWithMapSetList() { return TableSchemaObject.from( - testData.tableMetadata().tableAllDatatypesIndexed(), new ObjectMapper()); + testData.tenant().defaultTenant(), + testData.tableMetadata().tableAllDatatypesIndexed(), + new ObjectMapper()); } } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java index 324fc16d57..b037b7c81e 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableUpdateAnalyzerTestData.java @@ -6,6 +6,7 @@ import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import com.fasterxml.jackson.databind.ObjectMapper; +import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.UpdateException; import io.stargate.sgv2.jsonapi.service.resolver.update.TableUpdateAnalyzer; @@ -40,9 +41,12 @@ public static class TableUpdateAnalyzerFixture implements Recordable { public TableUpdateAnalyzerFixture(String message, TableMetadata tableMetadata) { this.message = message; this.tableMetadata = tableMetadata; + var TEST_CONSTANT = new TestConstants(); this.analyzer = - new TableUpdateAnalyzer(TableSchemaObject.from(tableMetadata, new ObjectMapper())); - this.tableSchemaObject = TableSchemaObject.from(tableMetadata, new ObjectMapper()); + new TableUpdateAnalyzer( + TableSchemaObject.from(TEST_CONSTANT.TENANT, tableMetadata, new ObjectMapper())); + this.tableSchemaObject = + TableSchemaObject.from(TEST_CONSTANT.TENANT, tableMetadata, new ObjectMapper()); this.columnAssignments = new UpdateClauseTestData.ColumnAssignmentsBuilder<>(this, tableMetadata); } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java index e4d4d5ddb5..ff5f2576ba 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TableWhereCQLClauseTestData.java @@ -9,6 +9,7 @@ import com.datastax.oss.driver.api.querybuilder.select.Select; import com.datastax.oss.driver.internal.querybuilder.select.DefaultSelect; import com.fasterxml.jackson.databind.ObjectMapper; +import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.exception.WithWarnings; import io.stargate.sgv2.jsonapi.service.operation.query.DBLogicalExpression; import io.stargate.sgv2.jsonapi.service.operation.tables.TableWhereCQLClause; @@ -56,7 +57,8 @@ public TableWhereCQLClauseFixture( String message, TableMetadata tableMetadata, DBLogicalExpression expressionBuilder) { this.message = message; this.tableMetadata = tableMetadata; - this.tableSchemaObject = TableSchemaObject.from(tableMetadata, new ObjectMapper()); + this.tableSchemaObject = + TableSchemaObject.from(new TestConstants().TENANT, tableMetadata, new ObjectMapper()); this.expressionBuilder = new LogicalExpressionTestData.ExpressionBuilder<>(this, expressionBuilder, tableMetadata); } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TenantTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TenantTestData.java new file mode 100644 index 0000000000..e81dafe0e5 --- /dev/null +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TenantTestData.java @@ -0,0 +1,17 @@ +package io.stargate.sgv2.jsonapi.fixtures.testdata; + +import io.stargate.sgv2.jsonapi.TestConstants; +import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; + +public class TenantTestData extends TestDataSuplier { + + private final TestConstants TEST_CONSTANTS = new TestConstants(); + + public TenantTestData(TestData testData) { + super(testData); + } + + public Tenant defaultTenant() { + return TEST_CONSTANTS.TENANT; + } +} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TestData.java index 538da34f21..fa6def490d 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/TestData.java @@ -41,6 +41,10 @@ private T getOrCache(Class clazz) { }); } + public TenantTestData tenant() { + return getOrCache(TenantTestData.class); + } + public SchemaObjectTestData schemaObject() { return getOrCache(SchemaObjectTestData.class); } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java index ab39638c03..88c761eca6 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/fixtures/testdata/WhereAnalyzerTestData.java @@ -11,6 +11,7 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; import com.fasterxml.jackson.databind.ObjectMapper; +import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.exception.FilterException; import io.stargate.sgv2.jsonapi.exception.WarningException; import io.stargate.sgv2.jsonapi.exception.WithWarnings; @@ -91,10 +92,13 @@ public WhereAnalyzerFixture( this.message = message; this.tableMetadata = tableMetadata; + var TEST_CONSTANT = new TestConstants(); this.analyzer = new WhereCQLClauseAnalyzer( - TableSchemaObject.from(tableMetadata, new ObjectMapper()), statementType); - this.tableSchemaObject = TableSchemaObject.from(tableMetadata, new ObjectMapper()); + TableSchemaObject.from(TEST_CONSTANT.TENANT, tableMetadata, new ObjectMapper()), + statementType); + this.tableSchemaObject = + TableSchemaObject.from(TEST_CONSTANT.TENANT, tableMetadata, new ObjectMapper()); this.expression = new LogicalExpressionTestData.ExpressionBuilder<>(this, expression, tableMetadata); } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplierTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplierTests.java index 33bffb19f7..d86cef2c25 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplierTests.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/CqlSessionCacheSupplierTests.java @@ -4,12 +4,11 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import io.stargate.sgv2.jsonapi.TestConstants; import io.stargate.sgv2.jsonapi.config.DatabaseType; import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaCache; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectCacheSupplier; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; @@ -37,12 +36,7 @@ public void testSingleton() { when(operationsConfig.slaUserAgent()) .thenReturn(Optional.of(TEST_CONSTANTS.SLA_USER_AGENT_NAME)); - // aaron - changes to the schema cache come later - var mockSchemaCache = mock(SchemaCache.class); - when(mockSchemaCache.getSchemaChangeListener()).thenReturn(mock(SchemaChangeListener.class)); - - when(mockSchemaCache.getDeactivatedTenantConsumer()) - .thenReturn(mock(CQLSessionCache.DeactivatedTenantListener.class)); + var mockSchemaCache = mock(SchemaObjectCacheSupplier.class); var factory = new CqlSessionCacheSupplier( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTest.java index d23d050fce..e96659a4d7 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTest.java @@ -1,6 +1,5 @@ package io.stargate.sgv2.jsonapi.service.cqldriver.executor; -import static io.stargate.sgv2.jsonapi.exception.ErrorFormatters.errFmt; import static io.stargate.sgv2.jsonapi.exception.ErrorFormatters.errFmtJoin; import static io.stargate.sgv2.jsonapi.exception.ExceptionFlags.UNRELIABLE_DB_SESSION; import static org.assertj.core.api.Assertions.assertThat; @@ -155,8 +154,8 @@ public void runAssertions( if (assertSchemaNames) { assertThat(handledException) .as("Handled error message has the schema names") - .hasMessageContaining(errFmt(TEST_DATA.KEYSPACE_NAME)) - .hasMessageContaining(errFmt(TEST_DATA.TABLE_NAME)); + .hasMessageContaining(TEST_DATA.testConstants.KEYSPACE_NAME) + .hasMessageContaining(TEST_DATA.testConstants.TABLE_NAME); } if (assertOrigError) { @@ -237,7 +236,7 @@ private static Stream tableDriverErrorHandledData() { false, false, false, - TEST_DATA.KEYSPACE_NAME.asCql(true), + TEST_DATA.testConstants.KEYSPACE_NAME, null)), new TestArguments( new NodeUnavailableException(mockNode("node: monkeys")), @@ -282,8 +281,8 @@ private static Stream tableDriverErrorHandledData() { new TestArguments( new AlreadyExistsException( mockNode("node: monkeys"), - TEST_DATA.KEYSPACE_NAME.asCql(true), - TEST_DATA.TABLE_NAME.asCql(true)), + TEST_DATA.testConstants.KEYSPACE_NAME, + TEST_DATA.testConstants.TABLE_NAME), Assertions.isUnexpectedDriverException()), // InvalidConfigurationInQueryException will happen if we send wrong DDL command // not expected diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTestData.java index ac5239c6df..10a7b0a352 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTestData.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/DefaultDriverExceptionHandlerTestData.java @@ -1,45 +1,21 @@ package io.stargate.sgv2.jsonapi.service.cqldriver.executor; -import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.cql.SimpleStatement; -import com.datastax.oss.driver.internal.core.metadata.schema.DefaultTableMetadata; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import io.stargate.sgv2.jsonapi.TestConstants; public class DefaultDriverExceptionHandlerTestData { public final DriverExceptionHandler DRIVER_HANDLER; - public final TableSchemaObject TABLE_SCHEMA_OBJECT; - - public final CqlIdentifier KEYSPACE_NAME = - CqlIdentifier.fromInternal("keyspace-" + System.currentTimeMillis()); - - public final CqlIdentifier TABLE_NAME = - CqlIdentifier.fromInternal("table-" + System.currentTimeMillis()); + public TestConstants testConstants = new TestConstants(); public final SimpleStatement STATEMENT = - SimpleStatement.newInstance("SELECT * FROM " + TABLE_NAME.asCql(true) + " WHERE x=?;", 1); + SimpleStatement.newInstance( + "SELECT * FROM " + testConstants.TABLE_IDENTIFIER.table().asCql(true) + " WHERE x=?;", 1); public DefaultDriverExceptionHandlerTestData() { - // Its just as easy to create the table metadata from the driver. - var tableMetadata = - new DefaultTableMetadata( - KEYSPACE_NAME, - TABLE_NAME, - UUID.randomUUID(), - false, - false, - List.of(), - Map.of(), - Map.of(), - Map.of(), - Map.of()); - TABLE_SCHEMA_OBJECT = TableSchemaObject.from(tableMetadata, new ObjectMapper()); - - DRIVER_HANDLER = new DefaultDriverExceptionHandler<>(TABLE_SCHEMA_OBJECT, STATEMENT); + DRIVER_HANDLER = + new DefaultDriverExceptionHandler<>(testConstants.TABLE_SCHEMA_OBJECT, STATEMENT); } } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/NamespaceCacheTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/NamespaceCacheTest.java deleted file mode 100644 index f8b064ddfe..0000000000 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/NamespaceCacheTest.java +++ /dev/null @@ -1,366 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; -import com.datastax.oss.driver.api.core.type.DataTypes; -import com.datastax.oss.driver.internal.core.metadata.schema.DefaultColumnMetadata; -import com.datastax.oss.driver.internal.core.metadata.schema.DefaultTableMetadata; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; -import io.quarkus.test.InjectMock; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import io.smallrye.mutiny.Uni; -import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; -import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; -import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; -import jakarta.inject.Inject; -import java.util.*; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -@QuarkusTest -@TestProfile(NoGlobalResourcesTestProfile.Impl.class) -public class NamespaceCacheTest { - - @Inject ObjectMapper objectMapper; - - @InjectMock protected RequestContext dataApiRequestInfo; - - @Nested - class Execute { - - @Test - public void checkValidJsonApiTable() { - QueryExecutor queryExecutor = mock(QueryExecutor.class); - when(queryExecutor.getTableMetadata(any(), any(), any())) - .then( - i -> { - List partitionColumn = - Lists.newArrayList( - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("key"), - DataTypes.tupleOf(DataTypes.TINYINT, DataTypes.TEXT), - false)); - Map columns = new HashMap<>(); - columns.put( - CqlIdentifier.fromInternal("tx_id"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("tx_id"), - DataTypes.TIMEUUID, - false)); - columns.put( - CqlIdentifier.fromInternal("doc_json"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("doc_json"), - DataTypes.TEXT, - false)); - columns.put( - CqlIdentifier.fromInternal("exist_keys"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("exist_keys"), - DataTypes.setOf(DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("array_size"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("array_size"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.INT), - false)); - columns.put( - CqlIdentifier.fromInternal("array_contains"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("array_contains"), - DataTypes.setOf(DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_bool_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_bool_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TINYINT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_dbl_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_dbl_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.DECIMAL), - false)); - columns.put( - CqlIdentifier.fromInternal("query_text_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_text_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_timestamp_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_timestamp_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TIMESTAMP), - false)); - columns.put( - CqlIdentifier.fromInternal("query_null_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_null_values"), - DataTypes.setOf(DataTypes.TEXT), - false)); - - return Uni.createFrom() - .item( - Optional.of( - new DefaultTableMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - UUID.randomUUID(), - false, - false, - partitionColumn, - new HashMap<>(), - columns, - new HashMap<>(), - new HashMap<>()))); - }); - TableBasedSchemaCache namespaceCache = createNamespaceCache(queryExecutor); - var schemaObject = - namespaceCache - .getSchemaObject(dataApiRequestInfo, "table", false) - .subscribe() - .withSubscriber(UniAssertSubscriber.create()) - .awaitItem() - .getItem(); - - assertThat(schemaObject instanceof CollectionSchemaObject); - assertThat(schemaObject) - .satisfies( - s -> { - assertThat(s.vectorConfig().vectorEnabled()).isFalse(); - assertThat(s.name.table()).isEqualTo("table"); - }); - } - - @Test - public void checkValidJsonApiTableWithIndexing() { - QueryExecutor queryExecutor = mock(QueryExecutor.class); - when(queryExecutor.getTableMetadata(any(), any(), any())) - .then( - i -> { - List partitionColumn = - Lists.newArrayList( - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("key"), - DataTypes.tupleOf(DataTypes.TINYINT, DataTypes.TEXT), - false)); - Map columns = new HashMap<>(); - columns.put( - CqlIdentifier.fromInternal("tx_id"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("tx_id"), - DataTypes.TIMEUUID, - false)); - columns.put( - CqlIdentifier.fromInternal("doc_json"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("doc_json"), - DataTypes.TEXT, - false)); - columns.put( - CqlIdentifier.fromInternal("exist_keys"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("exist_keys"), - DataTypes.setOf(DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("array_size"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("array_size"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.INT), - false)); - columns.put( - CqlIdentifier.fromInternal("array_contains"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("array_contains"), - DataTypes.setOf(DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_bool_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_bool_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TINYINT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_dbl_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_dbl_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.DECIMAL), - false)); - columns.put( - CqlIdentifier.fromInternal("query_text_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_text_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TEXT), - false)); - columns.put( - CqlIdentifier.fromInternal("query_timestamp_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_timestamp_values"), - DataTypes.mapOf(DataTypes.TEXT, DataTypes.TIMESTAMP), - false)); - columns.put( - CqlIdentifier.fromInternal("query_null_values"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("query_null_values"), - DataTypes.setOf(DataTypes.TEXT), - false)); - - return Uni.createFrom() - .item( - Optional.of( - new DefaultTableMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - UUID.randomUUID(), - false, - false, - partitionColumn, - new HashMap<>(), - columns, - Map.of( - CqlIdentifier.fromInternal("comment"), - "{\"indexing\":{\"deny\":[\"comment\"]}}"), - new HashMap<>()))); - }); - TableBasedSchemaCache namespaceCache = createNamespaceCache(queryExecutor); - var schemaObject = - namespaceCache - .getSchemaObject(dataApiRequestInfo, "table", false) - .subscribe() - .withSubscriber(UniAssertSubscriber.create()) - .awaitItem() - .getItem(); - - assertThat(schemaObject).isInstanceOf(CollectionSchemaObject.class); - var collectionSchemaObject = (CollectionSchemaObject) schemaObject; - assertThat(collectionSchemaObject) - .satisfies( - s -> { - assertThat(s.vectorConfig().vectorEnabled()).isFalse(); - assertThat(s.name.table()).isEqualTo("table"); - assertThat(s.indexingConfig().denied()).containsExactly("comment"); - }); - } - - @Test - public void checkNonCollectionJsonApiTable() { - QueryExecutor queryExecutor = mock(QueryExecutor.class); - when(queryExecutor.getTableMetadata(any(), any(), any())) - .then( - i -> { - List partitionColumn = - Lists.newArrayList( - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("key"), - DataTypes.tupleOf(DataTypes.TINYINT, DataTypes.TEXT), - false)); - // aaron - 25 oct 2024, use linked to preserve order and must have all columns in - // the col map - Map columns = new LinkedHashMap<>(); - columns.put(partitionColumn.getFirst().getName(), partitionColumn.getFirst()); - columns.put( - CqlIdentifier.fromInternal("tx_id"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("tx_id"), - DataTypes.TIMEUUID, - false)); - columns.put( - CqlIdentifier.fromInternal("doc"), - new DefaultColumnMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - CqlIdentifier.fromInternal("doc"), - DataTypes.TEXT, - false)); - return Uni.createFrom() - .item( - Optional.of( - new DefaultTableMetadata( - CqlIdentifier.fromInternal("ks"), - CqlIdentifier.fromInternal("table"), - UUID.randomUUID(), - false, - false, - partitionColumn, - new HashMap<>(), - columns, - new HashMap<>(), - new HashMap<>()))); - }); - TableBasedSchemaCache namespaceCache = createNamespaceCache(queryExecutor); - var schemaObject = - namespaceCache - .getSchemaObject(dataApiRequestInfo, "table", false) - .subscribe() - .withSubscriber(UniAssertSubscriber.create()) - .awaitItem() - .getItem(); - - assertThat(schemaObject).isInstanceOf(TableSchemaObject.class); - } - } - - private TableBasedSchemaCache createNamespaceCache(QueryExecutor qe) { - return new TableBasedSchemaCache("ks", qe, objectMapper); - } -} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCacheTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCacheTests.java deleted file mode 100644 index 129c3021a6..0000000000 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/cqldriver/executor/SchemaCacheTests.java +++ /dev/null @@ -1,256 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.cqldriver.executor; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import com.datastax.oss.driver.api.core.metadata.schema.SchemaChangeListener; -import com.datastax.oss.driver.api.core.metadata.schema.TableMetadata; -import com.datastax.oss.driver.api.core.session.Session; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.smallrye.mutiny.Uni; -import io.stargate.sgv2.jsonapi.TestConstants; -import io.stargate.sgv2.jsonapi.api.request.RequestContext; -import io.stargate.sgv2.jsonapi.api.request.tenant.Tenant; -import io.stargate.sgv2.jsonapi.config.DatabaseType; -import io.stargate.sgv2.jsonapi.config.OperationsConfig; -import io.stargate.sgv2.jsonapi.service.cqldriver.CQLSessionCache; -import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionCacheSupplier; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; -import java.util.List; -import java.util.Optional; -import java.util.function.Function; -import org.junit.Test; - -public class SchemaCacheTests { - - private final TestConstants testConstants = new TestConstants(); - - @Test - public void deactivatedTenantRemovesAllKeyspaces() { - var fixture = newFixture(); - - // put two tables in from two keyspaces - var table1 = addTable(fixture, testConstants.TENANT, "keyspace1", "table1"); - var table2 = addTable(fixture, testConstants.TENANT, "keyspace2", "table2"); - var table3 = addTable(fixture, testConstants.TENANT, "keyspace3", "table3"); - - var deactivatedListener = fixture.schemaCache.getDeactivatedTenantConsumer(); - - deactivatedListener.accept(testConstants.TENANT); - - // all of TENANT_ID should be removed, and the non TENANT_ID can stay - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace1", "table1")) - .as("TENANT_ID keyspace1 removed") - .isEmpty(); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace2", "table2")) - .as("TENANT_ID keyspace2 removed") - .isEmpty(); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace3", "table3")) - .as("notTenantId keyspace3 not removed") - .contains(table3); - } - - @Test - public void schemasChangeListenerNotInitialized() { - - var fixture = newFixture(); - var table1 = addTable(fixture, testConstants.TENANT, "keyspace1", "table1"); - - var listener = fixture.schemaCache.getSchemaChangeListener(); - - // if the listener is called before onSessionReady is called it should not error - var tableMetadata = mock(TableMetadata.class); - listener.onTableDropped(tableMetadata); - listener.onTableCreated(tableMetadata); - listener.onTableUpdated(tableMetadata, tableMetadata); - - var keyspaceMetadata = mock(KeyspaceMetadata.class); - listener.onKeyspaceDropped(keyspaceMetadata); - - // table1 should still be in the cache even because listener does not know what tenant - // the session was for - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace1", "table1")) - .as("TENANT_ID keyspace1 not removed") - .contains(table1); - } - - @Test - public void tableChangesEvictTabe() { - - var removedTableMetadata = tableMetadata("keyspace1", "table1"); - - List> calls = - List.of( - (cb) -> { - cb.onTableCreated(removedTableMetadata); - return "onTableCreated"; - }, - (cb) -> { - cb.onTableUpdated(removedTableMetadata, removedTableMetadata); - return "onTableUpdated"; - }, - (cb) -> { - cb.onTableDropped(removedTableMetadata); - return "onTableDropped"; - }); - var notTenantId = "not-tenant-id"; - - for (var cb : calls) { - var fixture = newFixture(); - - // put two tables in from two keyspaces for the tenant we are removing - var table1 = addTable(fixture, testConstants.TENANT, "keyspace1", "table1"); - var table2 = addTable(fixture, testConstants.TENANT, "keyspace2", "table2"); - var table3 = addTable(fixture, testConstants.TENANT, "keyspace3", "table3"); - - var listener = fixture.schemaCache.getSchemaChangeListener(); - listener.onSessionReady(fixture.session); - var operation = cb.apply(listener); - - // all of TENANT_ID should be removed, and the non TENANT_ID can stay - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace1", "table1")) - .as("TENANT_ID keyspace1 removed on table event operation=%s", operation) - .isEmpty(); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace2", "table2")) - .as("TENANT_ID keyspace2 not removed on table event operation=%s", operation) - .contains(table2); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace3", "table3")) - .as("notTenantId keyspace3 not removed on table event operation=%s", operation) - .contains(table3); - } - } - - @Test - public void keyspaceDroppedEvictsAllTables() { - - var notTenantId = "not-tenant-id"; - var fixture = newFixture(); - - var table1 = addTable(fixture, testConstants.TENANT, "keyspace1", "table1"); - var table2 = addTable(fixture, testConstants.TENANT, "keyspace2", "table2"); - var table3 = addTable(fixture, testConstants.TENANT, "keyspace3", "table3"); - - var listener = fixture.schemaCache.getSchemaChangeListener(); - listener.onSessionReady(fixture.session); - listener.onKeyspaceDropped(keyspaceMetadata("keyspace1")); - - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace1", "table1")) - .as("TENANT_ID keyspace1 removed") - .isEmpty(); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace2", "table2")) - .as("TENANT_ID keyspace2 not removed") - .contains(table2); - assertThat(fixture.schemaCache.peekSchemaObject(testConstants.TENANT, "keyspace3", "table3")) - .as("notTenantId keyspace3 not removed") - .contains(table3); - } - - /** Add a keyspace and cache item to the schema cache. */ - private SchemaObject addTable( - Fixture fixture, Tenant tenant, String keyspaceName, String tableName) { - - // setup to return a mocked table schema object - var tableSchemaCache = mock(TableBasedSchemaCache.class); - var expectedSchemaObject = mock(CollectionSchemaObject.class); - - when(tableSchemaCache.getSchemaObject(any(RequestContext.class), eq(tableName), anyBoolean())) - .thenReturn(Uni.createFrom().item(() -> expectedSchemaObject)); - when(tableSchemaCache.peekSchemaObject(eq(tableName))) - .thenReturn(Optional.of(expectedSchemaObject)); - - // override so that we return an empty schema object after it was evicted - doAnswer( - invocation -> { - when(tableSchemaCache.peekSchemaObject(eq(tableName))).thenReturn(Optional.empty()); - return null; - }) - .when(tableSchemaCache) - .evictCollectionSettingCacheEntry(tableName); - - when(fixture.tableCacheFactory.create(eq(keyspaceName), any(), any())) - .thenReturn(tableSchemaCache); - - // request context only needs the few things the SchemaCache uses - var requestContext = mock(RequestContext.class); - when(requestContext.tenant()).thenReturn(testConstants.TENANT); - - // setup so we return the TableBasedSchemaCache for the keyspace - reset(fixture.tableCacheFactory); - when(fixture.tableCacheFactory.create(eq(keyspaceName), any(), any())) - .thenReturn(tableSchemaCache); - - var actualUni = - fixture.schemaCache.getSchemaObject(requestContext, keyspaceName, tableName, false); - - assertThat(actualUni).as("getSchemaObject returns non null").isNotNull(); - var actualSchemaObject = actualUni.await().indefinitely(); - assertThat(actualSchemaObject) - .as("getSchemaObject returns the schema object from table cache") - .isSameAs(expectedSchemaObject); - - assertThat(fixture.schemaCache.peekSchemaObject(tenant, keyspaceName, tableName)) - .as("peekSchemaObject returns the schema object from table cache") - .contains(expectedSchemaObject); - - return actualSchemaObject; - } - - private TableMetadata tableMetadata(String keyspaceName, String tableName) { - - var tableMetadata = mock(TableMetadata.class); - - var keyspaceIdentifier = mock(CqlIdentifier.class); - when(keyspaceIdentifier.asInternal()).thenReturn(keyspaceName); - when(tableMetadata.getKeyspace()).thenReturn(keyspaceIdentifier); - - var tableIdentifier = mock(CqlIdentifier.class); - when(tableIdentifier.asInternal()).thenReturn(tableName); - when(tableMetadata.getName()).thenReturn(tableIdentifier); - - return tableMetadata; - } - - private KeyspaceMetadata keyspaceMetadata(String keyspaceName) { - - var keyspaceMetadata = mock(KeyspaceMetadata.class); - - var keyspaceIdentifier = mock(CqlIdentifier.class); - when(keyspaceIdentifier.asInternal()).thenReturn(keyspaceName); - when(keyspaceMetadata.getName()).thenReturn(keyspaceIdentifier); - - return keyspaceMetadata; - } - - record Fixture( - Session session, SchemaCache.TableCacheFactory tableCacheFactory, SchemaCache schemaCache) {} - - private Fixture newFixture() { - return newFixture(DatabaseType.ASTRA); - } - - private Fixture newFixture(DatabaseType databaseType) { - - var session = mock(Session.class); - when(session.getName()).thenReturn(testConstants.TENANT.toString()); - - var tableCacheFactory = mock(SchemaCache.TableCacheFactory.class); - - var sessionCacheSupplier = mock(CqlSessionCacheSupplier.class); - when(sessionCacheSupplier.get()).thenReturn(mock(CQLSessionCache.class)); - - var objectMapper = mock(ObjectMapper.class); - - var databaseConfig = mock(OperationsConfig.DatabaseConfig.class); - var operationsConfig = mock(OperationsConfig.class); - when(operationsConfig.databaseConfig()).thenReturn(databaseConfig); - when(databaseConfig.type()).thenReturn(databaseType); - - SchemaCache schemaCache = - new SchemaCache(sessionCacheSupplier, objectMapper, operationsConfig, tableCacheFactory); - return new Fixture(session, tableCacheFactory, schemaCache); - } -} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/DataVectorizerTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/DataVectorizerTest.java index dc2d4f5c71..fe68998620 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/DataVectorizerTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/DataVectorizerTest.java @@ -257,8 +257,7 @@ public void testWithUnmatchedVectorSize() { // new collection settings with different expected vector size CollectionSchemaObject collectionSettings = new CollectionSchemaObject( - "namespace", - "collections", + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/TestEmbeddingProvider.java b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/TestEmbeddingProvider.java index 38b3b9081c..d13c317903 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/TestEmbeddingProvider.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/embedding/operation/TestEmbeddingProvider.java @@ -83,7 +83,7 @@ public CommandContext commandContextWithVectorize() { return TEST_CONSTANTS.collectionContext( "testCommand", new CollectionSchemaObject( - TEST_CONSTANTS.SCHEMA_OBJECT_NAME, + TEST_CONSTANTS.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperationTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperationTest.java index b8d59bbf00..c29073cd77 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperationTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/FindCollectionOperationTest.java @@ -87,7 +87,7 @@ public void beforeEach() { testConstants.collectionContext( "testCommand", new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperationTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperationTest.java index ffc38b783a..affce14356 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperationTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/InsertCollectionOperationTest.java @@ -108,7 +108,7 @@ public void beforeEach() { testConstants.collectionContext( "testCommand", new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java index 866d5d058b..c33fd2e87d 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/OperationTestBase.java @@ -20,7 +20,6 @@ import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.metrics.JsonProcessingMetricsReporter; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.cqldriver.serializer.CQLBindValues; import io.stargate.sgv2.jsonapi.service.schema.KeyspaceSchemaObject; @@ -48,8 +47,6 @@ public class OperationTestBase { protected final String KEYSPACE_NAME = RandomStringUtils.insecure().nextAlphanumeric(16); protected final String COLLECTION_NAME = RandomStringUtils.insecure().nextAlphanumeric(16); - protected final SchemaObjectName SCHEMA_OBJECT_NAME = - new SchemaObjectName(KEYSPACE_NAME, COLLECTION_NAME); protected CollectionSchemaObject COLLECTION_SCHEMA_OBJECT; protected KeyspaceSchemaObject KEYSPACE_SCHEMA_OBJECT; @@ -65,7 +62,7 @@ public void beforeEach() { // must do this here to avoid touching quarkus config before it is initialized COLLECTION_SCHEMA_OBJECT = new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, @@ -73,7 +70,7 @@ public void beforeEach() { CollectionLexicalConfig.configForDisabled(), CollectionRerankDef.configForPreRerankingCollection()); - KEYSPACE_SCHEMA_OBJECT = KeyspaceSchemaObject.fromSchemaObject(COLLECTION_SCHEMA_OBJECT); + KEYSPACE_SCHEMA_OBJECT = new KeyspaceSchemaObject(COLLECTION_SCHEMA_OBJECT.identifier()); COLLECTION_CONTEXT = testConstants.collectionContext( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperationTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperationTest.java index 4cdc9e2518..1e783ab8e7 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperationTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/collections/ReadAndUpdateCollectionOperationTest.java @@ -72,7 +72,7 @@ public class ReadAndUpdateCollectionOperationTest extends OperationTestBase { @Inject DocumentShredder documentShredder; @Inject ObjectMapper objectMapper; @Inject DataVectorizerService dataVectorizerService; - private TestConstants testConstants = new TestConstants(); + private final TestConstants testConstants = new TestConstants(); private final ColumnDefinitions KEY_TXID_JSON_COLUMNS = buildColumnDefs( @@ -87,7 +87,7 @@ public void beforeEach() { testConstants.collectionContext( "testCommand", new CollectionSchemaObject( - SCHEMA_OBJECT_NAME, + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java index 5d435930eb..658d5f2b82 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/operation/tasks/BaseTaskAssertions.java @@ -10,8 +10,8 @@ import io.smallrye.mutiny.helpers.test.UniAssertSubscriber; import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.exception.WarningException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.schema.SchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.SchemaObjectType; import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; import io.stargate.sgv2.jsonapi.util.recordable.PrettyPrintable; import java.time.Duration; @@ -44,7 +44,6 @@ public static TableSchemaObject mockTable(String keyspaceName, String tableName) when(mockTable.keyspaceName()).thenReturn(CqlIdentifier.fromInternal(keyspaceName)); when(mockTable.tableName()).thenReturn(CqlIdentifier.fromInternal(tableName)); when(mockTable.type()).thenReturn(SchemaObjectType.TABLE); - when(mockTable.name()).thenReturn(new SchemaObjectName(keyspaceName, tableName)); return mockTable; } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java b/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java deleted file mode 100644 index 8ecf518ee0..0000000000 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/processor/SchemaObjectTestData.java +++ /dev/null @@ -1,67 +0,0 @@ -package io.stargate.sgv2.jsonapi.service.processor; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.*; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectType; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; -import io.stargate.sgv2.jsonapi.service.schema.tables.TableSchemaObject; - -/** Tests data and mocks for working with {@link SchemaObject} */ -public class SchemaObjectTestData { - - public final String DATABASE_NAME = "database-" + System.currentTimeMillis(); - public final String KEYSPACE_NAME = "keyspace-" + System.currentTimeMillis(); - public final String COLLECTION_NAME = "collection-" + System.currentTimeMillis(); - public final String TABLE_NAME = "table-" + System.currentTimeMillis(); - - public final DatabaseSchemaObject MOCK_DATABASE = - mockSchemaObject( - DatabaseSchemaObject.class, SchemaObjectType.DATABASE, SchemaObjectName.MISSING); - public final KeyspaceSchemaObject MOCK_KEYSPACE = - mockSchemaObject( - KeyspaceSchemaObject.class, - SchemaObjectType.KEYSPACE, - new SchemaObjectName(KEYSPACE_NAME, SchemaObjectName.MISSING_NAME)); - public final CollectionSchemaObject MOCK_COLLECTION = - mockSchemaObject( - CollectionSchemaObject.class, - SchemaObjectType.COLLECTION, - new SchemaObjectName(KEYSPACE_NAME, COLLECTION_NAME)); - public final TableSchemaObject MOCK_TABLE = - mockSchemaObject( - TableSchemaObject.class, - SchemaObjectType.TABLE, - new SchemaObjectName(KEYSPACE_NAME, TABLE_NAME)); - - /** helper to get the prebuilt mock instance on this class by the class of the schema object */ - @SuppressWarnings("unchecked") - public T prebuiltMock(Class schemaType) { - // cannot use new switch :( - if (schemaType == DatabaseSchemaObject.class) { - return (T) MOCK_DATABASE; - } else if (schemaType == KeyspaceSchemaObject.class) { - return (T) MOCK_KEYSPACE; - } else if (schemaType == CollectionSchemaObject.class) { - return (T) MOCK_COLLECTION; - } else if (schemaType == TableSchemaObject.class) { - return (T) MOCK_TABLE; - } else { - throw new IllegalArgumentException("Unknown schema object type: " + schemaType); - } - } - - /** - * Create get mock and setup the type and name, used for internal. Call {@link - * #prebuiltMock(Class)} to get the prebuilt mock on this instnace by the schema object class. - */ - public T mockSchemaObject( - Class schemaType, SchemaObjectType type, SchemaObjectName name) { - - T schema = mock(schemaType); - when(schema.type()).thenReturn(type); - when(schema.name()).thenReturn(name); - return schema; - } -} diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolverWithVectorizerTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolverWithVectorizerTest.java index 3c758a8657..93870c5d26 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolverWithVectorizerTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/resolver/CommandResolverWithVectorizerTest.java @@ -23,7 +23,6 @@ import io.stargate.sgv2.jsonapi.config.constants.DocumentConstants; import io.stargate.sgv2.jsonapi.exception.ErrorCodeV1; import io.stargate.sgv2.jsonapi.exception.JsonApiException; -import io.stargate.sgv2.jsonapi.service.cqldriver.executor.SchemaObjectName; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorColumnDefinition; import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.embedding.DataVectorizerService; @@ -84,7 +83,7 @@ public void beforeEach() { testConstants.collectionContext( "testCommand", new CollectionSchemaObject( - new SchemaObjectName(KEYSPACE_NAME, COLLECTION_NAME), + testConstants.TENANT, null, IdConfig.defaultIdConfig(), VectorConfig.fromColumnDefinitions( @@ -173,7 +172,7 @@ public void findNonVectorize() throws Exception { assertThat(exception.getMessage()) .isEqualTo( "Unable to vectorize data, embedding service not configured for the collection : " - + VECTOR_COMMAND_CONTEXT.schemaObject().name().table()); + + VECTOR_COMMAND_CONTEXT.schemaObject().identifier().table()); assertThat(exception.getErrorCode()) .isEqualTo(ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED); }); @@ -332,7 +331,7 @@ public void updateNonVectorize() throws Exception { assertThat(exception.getMessage()) .isEqualTo( "Unable to vectorize data, embedding service not configured for the collection : " - + VECTOR_COMMAND_CONTEXT.schemaObject().name().table()); + + VECTOR_COMMAND_CONTEXT.schemaObject().identifier().table()); assertThat(exception.getErrorCode()) .isEqualTo(ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED); }); @@ -527,7 +526,7 @@ public void insertManyNonVectorize() throws Exception { assertThat(exception.getMessage()) .isEqualTo( "Unable to vectorize data, embedding service not configured for the collection : " - + VECTOR_COMMAND_CONTEXT.schemaObject().name().table()); + + VECTOR_COMMAND_CONTEXT.schemaObject().identifier().table()); assertThat(exception.getErrorCode()) .isEqualTo(ErrorCodeV1.EMBEDDING_SERVICE_NOT_CONFIGURED); }); diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java index e1619375f8..99a5cb7467 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCacheChangeListenerTests.java @@ -62,7 +62,7 @@ public class SchemaObjectCacheChangeListenerTests extends CacheTestsBase { @BeforeEach public void setUp() { // the listener needs to create tenants, and it uses this factory - TenantFactory.initialize(TEST_CONSTANTS.DATABASE_TYPE); + TenantFactory.initialize(DatabaseType.ASTRA); } @AfterEach diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java index 454f494d0a..7f0865487c 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectIdentifierTests.java @@ -385,14 +385,14 @@ public void differentTenant() { var id1 = SchemaObjectIdentifier.forCollection( TEST_CONSTANTS.TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + TEST_CONSTANTS.KEYSPACE_SCHEMA_OBJECT.identifier.keyspace(), + TEST_CONSTANTS.COLLECTION_SCHEMA_OBJECT.identifier.table()); var id2 = SchemaObjectIdentifier.forCollection( OTHER_TENANT, - TEST_CONSTANTS.KEYSPACE_IDENTIFIER.keyspace(), - TEST_CONSTANTS.COLLECTION_IDENTIFIER.table()); + TEST_CONSTANTS.KEYSPACE_SCHEMA_OBJECT.identifier.keyspace(), + TEST_CONSTANTS.COLLECTION_SCHEMA_OBJECT.identifier.table()); assertThat(id1).isNotEqualTo(id2); diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderDocLimitsTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderDocLimitsTest.java index 3927785f10..6b5283f1de 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderDocLimitsTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderDocLimitsTest.java @@ -142,7 +142,7 @@ public void allowDocWithHugeObjectNoIndex() { IndexingProjector.createForIndexing(null, Collections.singleton("no_index")); assertThat( documentShredder.shred( - doc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null)) + doc, null, indexProjector, "testCommand", testConstants.MISSING, null)) .isNotNull(); } @@ -223,7 +223,7 @@ public void allowDocWithHugeArrayNoIndex() { IndexingProjector.createForIndexing(null, Collections.singleton("no_index")); assertThat( documentShredder.shred( - doc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null)) + doc, null, indexProjector, "testCommand", testConstants.MISSING, null)) .isNotNull(); } diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderTest.java index 5b95ff0092..9b8a135d91 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderTest.java @@ -607,7 +607,7 @@ public void shredWithIndexAllowSome() throws Exception { new HashSet<>(Arrays.asList("name", "metadata")), null); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(123))); List expPaths = Arrays.asList( @@ -676,7 +676,7 @@ public void shredVectorize9K() throws Exception { new HashSet<>(Arrays.asList("name", "metadata")), null); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(123))); List expPaths = Arrays.asList( @@ -739,7 +739,7 @@ public void shredWithIndexAllowAll() throws Exception { new HashSet<>(Arrays.asList("name", "metadata")), null); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(123))); List expPaths = Arrays.asList( @@ -797,7 +797,7 @@ public void shredWithIndexDenySome() throws Exception { IndexingProjector.createForIndexing(null, new HashSet<>(Arrays.asList("name", "values"))); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(123))); List expPaths = Arrays.asList( @@ -860,7 +860,7 @@ public void shredWithIndexDenyAll() throws Exception { IndexingProjector.createForIndexing(null, new HashSet<>(Arrays.asList("*"))); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(123))); List expPaths = @@ -904,7 +904,7 @@ public void shredWithHugeNonIndexedString() throws Exception { IndexingProjector.createForIndexing(null, new HashSet<>(Arrays.asList("blob"))); WritableShreddedDocument doc = documentShredder.shred( - inputDoc, null, indexProjector, "testCommand", CollectionSchemaObject.MISSING, null); + inputDoc, null, indexProjector, "testCommand", testConstants.MISSING, null); assertThat(doc.id()).isEqualTo(DocumentId.fromNumber(BigDecimal.valueOf(1))); List expPaths = Arrays.asList(JsonPath.from("_id"), JsonPath.from("name")); assertThat(doc.existKeys()).isEqualTo(new HashSet<>(expPaths)); @@ -944,7 +944,7 @@ public void validateJsonBytesWriteMetrics() throws Exception { null, IndexingProjector.identityProjector(), "jsonBytesWriteCommand", - CollectionSchemaObject.MISSING, + testConstants.MISSING, null); // verify metrics diff --git a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderWithExtendedTypesTest.java b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderWithExtendedTypesTest.java index b541fef763..82adc64b5a 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderWithExtendedTypesTest.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/service/shredding/DocumentShredderWithExtendedTypesTest.java @@ -14,9 +14,9 @@ import io.stargate.sgv2.jsonapi.api.model.command.CommandContext; import io.stargate.sgv2.jsonapi.api.request.RequestContext; import io.stargate.sgv2.jsonapi.exception.DocumentException; +import io.stargate.sgv2.jsonapi.service.cqldriver.executor.VectorConfig; import io.stargate.sgv2.jsonapi.service.projection.IndexingProjector; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionIdType; -import io.stargate.sgv2.jsonapi.service.schema.collections.CollectionSchemaObject; +import io.stargate.sgv2.jsonapi.service.schema.collections.*; import io.stargate.sgv2.jsonapi.service.shredding.collections.*; import io.stargate.sgv2.jsonapi.testresource.NoGlobalResourcesTestProfile; import jakarta.inject.Inject; @@ -198,15 +198,23 @@ class OkCasesGeneratedId { public void shredSimpleWithoutIdGenLegacyUUID() throws Exception { final String inputJson = "{\"value\": 42}"; final JsonNode inputDoc = objectMapper.readTree(inputJson); + var collectionSchemaObject = + new CollectionSchemaObject( + testConstants.TENANT, + null, + new IdConfig(CollectionIdType.UNDEFINED), + VectorConfig.NOT_ENABLED_CONFIG, + null, + CollectionLexicalConfig.configForDisabled(), + CollectionRerankDef.configForDisabled()); WritableShreddedDocument doc = documentShredder.shred( inputDoc, null, IndexingProjector.identityProjector(), "test", - CollectionSchemaObject.MISSING.withIdType(CollectionIdType.UNDEFINED), + collectionSchemaObject, null); - DocumentId docId = doc.id(); // Legacy UUID generated as "plain" String id assertThat(docId).isInstanceOf(DocumentId.StringId.class); @@ -244,7 +252,7 @@ public void shredSimpleWithoutIdGenObjectId() throws Exception { null, IndexingProjector.identityProjector(), "test", - CollectionSchemaObject.MISSING.withIdType(CollectionIdType.OBJECT_ID), + testConstants.MISSING, null); DocumentId docId = doc.id(); @@ -294,13 +302,23 @@ private void _testShredUUIDAutoGeneration(CollectionIdType idType, int uuidVersi throws Exception { final String inputJson = "{\"value\": 42}"; final JsonNode inputDoc = objectMapper.readTree(inputJson); + + var collectionSchemaObject = + new CollectionSchemaObject( + testConstants.TENANT, + null, + new IdConfig(idType), + VectorConfig.NOT_ENABLED_CONFIG, + null, + CollectionLexicalConfig.configForDisabled(), + CollectionRerankDef.configForDisabled()); WritableShreddedDocument doc = documentShredder.shred( inputDoc, null, IndexingProjector.identityProjector(), "test", - CollectionSchemaObject.MISSING.withIdType(idType), + collectionSchemaObject, null); DocumentId docId = doc.id(); From 45a470bc42856c48f345f34c110ff32f534ae7aa Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Fri, 9 Jan 2026 11:00:30 -0800 Subject: [PATCH 7/8] fix null tableMetaData --- src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java b/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java index 61b1a2db71..b407512ac8 100644 --- a/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java +++ b/src/test/java/io/stargate/sgv2/jsonapi/TestConstants.java @@ -212,8 +212,7 @@ public TestConstants() { MISSING = new CollectionSchemaObject( - TENANT, - null, + COLLECTION_IDENTIFIER, IdConfig.defaultIdConfig(), VectorConfig.NOT_ENABLED_CONFIG, null, From 43877e1a3c4f112b57c67c23e232d86cbe0c99df Mon Sep 17 00:00:00 2001 From: Yuqi Du Date: Fri, 9 Jan 2026 11:10:29 -0800 Subject: [PATCH 8/8] SchemaCacheSchemaChangeListener needs @NonNull annotation, instead of @NotNull from jarkada --- .../service/schema/SchemaObjectCache.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java index 6d624befac..39b3c9b1fc 100644 --- a/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java +++ b/src/main/java/io/stargate/sgv2/jsonapi/service/schema/SchemaObjectCache.java @@ -17,13 +17,13 @@ import io.stargate.sgv2.jsonapi.service.cqldriver.CqlSessionFactory; import io.stargate.sgv2.jsonapi.service.schema.tables.TableBasedSchemaObject; import io.stargate.sgv2.jsonapi.util.DynamicTTLCache; -import jakarta.validation.constraints.NotNull; import java.lang.ref.WeakReference; import java.time.Duration; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletionStage; +import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -426,7 +426,7 @@ private void evictKeyspace( } @Override - public void onSessionReady(@NotNull Session session) { + public void onSessionReady(@NonNull Session session) { // This is called when the session is ready, we can get the tenant from the session name // and set it in the listener so we can use it in the other methods. tenant = TenantFactory.instance().create(session.getName()); @@ -438,39 +438,39 @@ public void onSessionReady(@NotNull Session session) { * re-created */ @Override - public void onTableDropped(@NotNull TableMetadata table) { + public void onTableDropped(@NonNull TableMetadata table) { evictTable("onTableDropped", table); } /** When a table is created, evict from cache to avoid stale if it was re-created */ @Override - public void onTableCreated(@NotNull TableMetadata table) { + public void onTableCreated(@NonNull TableMetadata table) { evictTable("onTableCreated", table); } /** When a table is updated, evict from cache to avoid stale entries */ @Override - public void onTableUpdated(@NotNull TableMetadata current, @NotNull TableMetadata previous) { + public void onTableUpdated(@NonNull TableMetadata current, @NonNull TableMetadata previous) { // table name can never change evictTable("onTableUpdated", current); } /** When keyspace dropped, we dont need any more of the tables in the cache */ @Override - public void onKeyspaceDropped(@NotNull KeyspaceMetadata keyspace) { + public void onKeyspaceDropped(@NonNull KeyspaceMetadata keyspace) { evictKeyspace("onKeyspaceDropped", keyspace, true); } /** When keyspace created, evict KS and all other objects in case we missed the drop */ @Override - public void onKeyspaceCreated(@NotNull KeyspaceMetadata keyspace) { + public void onKeyspaceCreated(@NonNull KeyspaceMetadata keyspace) { evictKeyspace("onKeyspaceCreated", keyspace, true); } /** When keyspace updated, evict from cache in case stale keyspace or collections */ @Override public void onKeyspaceUpdated( - @NotNull KeyspaceMetadata current, @NotNull KeyspaceMetadata previous) { + @NonNull KeyspaceMetadata current, @NonNull KeyspaceMetadata previous) { evictKeyspace("onKeyspaceUpdated", current, false); } }