diff --git a/flowvault/README.md b/flowvault/README.md index 214e2faa..047f97a6 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -42,7 +42,6 @@ The `flowvault` module is a Skyflow Java SDK built for high-throughput vault ope - [Get](#get) - [Update](#update) - [Delete](#delete) -- [Query](#query) - [Custom Request Headers](#custom-request-headers) - [Error Handling](#error-handling) - [Two layers of errors](#two-layers-of-errors) @@ -55,7 +54,7 @@ The `flowvault` module is a Skyflow Java SDK built for high-throughput vault ope - Authenticate using a Skyflow service account, an API key, or a bearer token — see [Authenticate](#authenticate). - Perform bulk Vault API operations — insert, tokenize, detokenize, and delete tokens — each with a synchronous and an async variant, built for high-throughput Flow DB workloads. -- Perform unary Vault API operations — insert, detokenize, get, update, delete, and query — a single API call each, for when you want a plain request and response rather than the bulk batching machinery. See [VaultController — Unary operations](#vaultcontroller--unary-operations). +- Perform unary Vault API operations — insert, detokenize, get, update, and delete — a single API call each, for when you want a plain request and response rather than the bulk batching machinery. See [VaultController — Unary operations](#vaultcontroller--unary-operations). - **Per-record reporting, not all-or-nothing.** A bulk call succeeds as a call even when individual records fail; every response reports a summary plus the outcome of each individual record or token. See [Error Handling](#error-handling). # Install @@ -366,7 +365,7 @@ The 100,000-item ceiling per bulk call is a separate, fixed limit and is not con # VaultController — Unary operations -Alongside the bulk methods, `VaultController` exposes six **unary** operations. Each sends exactly one API call and hands the result straight back: +Alongside the bulk methods, `VaultController` exposes five **unary** operations. Each sends exactly one API call and hands the result straight back: | Method | Parameters | Returns | Description | |--------|-----------|---------|-------------| @@ -375,11 +374,10 @@ Alongside the bulk methods, `VaultController` exposes six **unary** operations. | `get(GetRequest)` | `GetRequest`, optional `GetOptions` | `GetResponse` | Read records by skyflow ID or unique value, optionally with a redaction override per column | | `update(UpdateRequest)` | `UpdateRequest`, optional `UpdateOptions` | `UpdateResponse` | Update records by skyflow ID | | `delete(DeleteRequest)` | `DeleteRequest`, optional `DeleteOptions` | `DeleteResponse` | Delete records by skyflow ID or unique value | -| `query(QueryRequest)` | `QueryRequest`, optional `QueryOptions` | `QueryResponse` | Run a SQL-style query against the vault | -`insert` and `detokenize` are the unary counterparts of `bulkInsert` and `bulkDetokenize` — the same request builders, sent as one call instead of many batches. `get`, `update`, `delete`, and `query` have no bulk counterpart at all; they exist only in this unary form. +`insert` and `detokenize` are the unary counterparts of `bulkInsert` and `bulkDetokenize` — the same request builders, sent as one call instead of many batches. `get`, `update`, and `delete` have no bulk counterpart at all; they exist only in this unary form. -Each method also accepts an optional options object (`InsertOptions`, `DetokenizeOptions`, `GetOptions`, `UpdateOptions`, `DeleteOptions`, `QueryOptions`) — see [Custom Request Headers](#custom-request-headers). +Each method also accepts an optional options object (`InsertOptions`, `DetokenizeOptions`, `GetOptions`, `UpdateOptions`, `DeleteOptions`) — see [Custom Request Headers](#custom-request-headers). ## Unary vs. bulk @@ -393,11 +391,11 @@ Everything the bulk machinery adds — batching, concurrency, the payload ceilin | Response summary | `getSummary()` | None — read the records list | | Per-item `getIndex()` / `getRequestId()` | Yes | No. Records come back in submitted order, and the `x-request-id` of the single call reaches you only through a thrown `SkyflowException` | | Retry helper | `getRecordsToRetry()` / `getTokensToRetry()` | None — filter the records yourself, see [Retrying the failed records](#retrying-the-failed-records) | -| Per-item `getHttpCode()` / `getError()` | Yes | Yes, on every unary operation except `query` | +| Per-item `getHttpCode()` / `getError()` | Yes | Yes, on every unary operation | ## Vault type support -The same distinction as [Schema vs. schemaless vaults](#schema-vs-schemaless-vaults) applies. Five of the six unary operations address records inside a table, so they only make sense against a structured vault: +The same distinction as [Schema vs. schemaless vaults](#schema-vs-schemaless-vaults) applies. Four of the five unary operations address records inside a table, so they only make sense against a structured vault: | Operation | Supported on | |---|---| @@ -405,7 +403,6 @@ The same distinction as [Schema vs. schemaless vaults](#schema-vs-schemaless-vau | `get` | Structured vaults — reads a table's records by skyflow ID or unique value. | | `update` | Structured vaults — updates a table's records by skyflow ID. | | `delete` | Structured vaults — deletes a table's records. Distinct from `bulkDeleteTokens`, which removes tokens only and leaves the record in place. | -| `query` | Structured vaults — the query itself addresses tables and columns. | | `detokenize` | Both — detokenizing only needs the token itself, not a table, so it works regardless of which kind of vault the token came from. | # Bulk Insert @@ -1263,64 +1260,6 @@ for (DeleteResponseRecord record : deleteResponse.getRecords()) { } ``` -# Query - -Run a SQL-style query against the vault in a single API call. - -> **Vault type supported:** structured (schema) vaults. See [Vault type support](#vault-type-support). - -**Note:** - -- `query` is required and must not be blank. That is the whole request — there are no other fields. -- This is the one unary operation with **no per-record status**: rows either come back or the call throws. There is no `httpCode` or `error` on a `QueryResponseRecord`. - -### Construct a query request - -```java -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; -import com.skyflow.vault.data.QueryResponseRecord; - -public class QueryExample { - public static void main(String[] args) throws SkyflowException { - QueryRequest queryRequest = QueryRequest.builder() - .query("SELECT card_number, cardholder_name FROM table1 LIMIT 10") - .build(); - - QueryResponse queryResponse = vault.query(queryRequest); - System.out.println(queryResponse); - } -} -``` - -There is no async variant: `query` returns its `QueryResponse` directly. - -Sample response: - -```json -{ - "records": [ - { "data": { "card_number": "4111-1111-1111-1111", "cardholder_name": "John Doe" } }, - { "data": { "card_number": "5484-7829-1702-9110", "cardholder_name": "Jane Doe" } } - ], - "metadata": { - "columns": ["card_number", "cardholder_name"] - } -} -``` - -Each row is a free-form column/value map — the query API has no notion of tokens, so unlike insert or detokenize there is no typed `Token` data here. `getMetadata()` returns a `QueryResponseMetadata` wrapping the query's return columns via `getColumns()`; both `getMetadata()` and `getColumns()` are `null` when the vault doesn't report columns. - -Accessors: `queryResponse.getRecords()` and `queryResponse.getMetadata()`, and on each record `getData()`. - -```java -System.out.println("columns: " + (queryResponse.getMetadata() != null ? queryResponse.getMetadata().getColumns() : null)); -for (QueryResponseRecord row : queryResponse.getRecords()) { - System.out.println(row.getData()); -} -``` - # Custom Request Headers To include custom HTTP headers on an outgoing request — bulk or unary — pass a `RequestInterceptor` via that operation's options object. The headers available are defined by the `CustomHeaderKey` enum: @@ -1357,7 +1296,6 @@ The same pattern applies to every operation, via its corresponding options class | `get` | `GetOptions` | | `update` | `UpdateOptions` | | `delete` | `DeleteOptions` | -| `query` | `QueryOptions` | # Error Handling @@ -1372,7 +1310,7 @@ This is the mental model to hold for every operation, bulk or unary: The second layer is what distinguishes `flowvault` from an all-or-nothing API: **a call that returns normally can still contain failures, and a call where every single record failed also returns normally rather than throwing.** Checking only for a thrown exception will silently miss failed records — always read the summary and the per-record results. -Unary operations follow the same two layers. Their records carry the same `requestId` behavior as bulk records — `null` on success, the failing call's `x-request-id` on error — the only structural differences are that unary records have no `getIndex()` (there is no batch position to report), and `query` has no record-level layer at all — rows either come back or the call throws, so `QueryResponse` carries no per-record `requestId` either. +Unary operations follow the same two layers. Their records carry the same `requestId` behavior as bulk records — `null` on success, the failing call's `x-request-id` on error — the only structural difference is that unary records have no `getIndex()` (there is no batch position to report). ## Per-record success and failure @@ -1383,7 +1321,7 @@ Every bulk response exposes `getSummary()` and `getRecords()`. The records list | `getIndex()` | bulk only | Position of this item in the payload you submitted — use it to line results back up with your input. | | `getHttpCode()` | always | Per-item status. `2xx` for success; `4xx`/`5xx` for failure. | | `getError()` | failures only | Error message for this item. `null` means this item succeeded. | -| `getRequestId()` | failures only | The `x-request-id` of the call this item was part of — quote it in support escalations. In bulk responses, items from the same batch share one id. Present on both bulk and unary per-record types; `QueryResponse` is the one exception (see below). | +| `getRequestId()` | failures only | The `x-request-id` of the call this item was part of — quote it in support escalations. In bulk responses, items from the same batch share one id. Present on both bulk and unary per-record types. | The success payload sits alongside those fields on the same object: `getSkyflowId()`/`getTokens()`/`getData()` for insert (`getFields()` is deprecated — it returns the same data in its original, pre-typed `Map` shape, not `getTokens()`'s `Token` objects), `getValue()`/`getTokenGroupName()`/`getMetadata()` for detokenize, `getValue()`/`getTokenGroupName()`/`getToken()` for tokenize, `getToken()` for delete. @@ -1396,7 +1334,7 @@ Summaries per operation: | `BulkDetokenizeResponse` | `DetokenizeSummary` | `totalTokens`, `totalDetokenized`, `totalFailed` | | `BulkDeleteTokensResponse` | `DeleteTokensSummary` | `totalTokens`, `totalDeleted`, `totalFailed` | -A unary response has no summary and no `getIndex()` — just `getRecords()`, in submitted order, with `getHttpCode()`, `getError()`, and `getRequestId()` on each entry alongside that operation's payload: `getSkyflowId()`/`getTokens()`/`getData()`/`getHashedData()` for `insert`, `get`, and `update`; `getSkyflowId()` alone for `delete`; `getToken()`/`getValue()`/`getTokenGroupName()`/`getMetadata()` for `detokenize`. `QueryResponse` is the exception — its records carry only `getData()`, with no `getRequestId()` anywhere on the response, and the call's return columns on `getMetadata().getColumns()`. +A unary response has no summary and no `getIndex()` — just `getRecords()`, in submitted order, with `getHttpCode()`, `getError()`, and `getRequestId()` on each entry alongside that operation's payload: `getSkyflowId()`/`getTokens()`/`getData()`/`getHashedData()` for `insert`, `get`, and `update`; `getSkyflowId()` alone for `delete`; `getToken()`/`getValue()`/`getTokenGroupName()`/`getMetadata()` for `detokenize`. The idiomatic way to consume a bulk response: diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index 226cca9c..1defab78 100644 Binary files a/flowvault/api-report/skyflow-flowvault-java.baseline.jar and b/flowvault/api-report/skyflow-flowvault-java.baseline.jar differ diff --git a/flowvault/samples/src/main/java/com/example/vault/QueryExample.java b/flowvault/samples/src/main/java/com/example/vault/QueryExample.java deleted file mode 100644 index 36bcc553..00000000 --- a/flowvault/samples/src/main/java/com/example/vault/QueryExample.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.vault; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; -import com.skyflow.vault.data.QueryResponseRecord; - -/** - * This sample demonstrates the Skyflow Java SDK's query operation. There is no bulk/batched - * counterpart of this operation — a single call runs the query as-is. - */ -public class QueryExample { - - public static void main(String[] args) { - try { - // Step 1: Initialize credentials with the path to your service account key file -// String filePath = ""; - Credentials credentials = new Credentials(); - credentials.setToken(""); - - // Step 2: Configure the vault with required parameters - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); - vaultConfig.setClusterId(""); - vaultConfig.setEnv(Env.DEV); - vaultConfig.setCredentials(credentials); - - // Step 3: Create Skyflow client instance with error logging - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) - .addVaultConfig(vaultConfig) - .build(); - - // Step 4: Build and execute the query request - QueryRequest request = QueryRequest.builder() - .query("SELECT * FROM table1") - .build(); - - QueryResponse response = skyflowClient.vault().query(request); - - // Step 5: Read the returned rows and the reported columns - for (QueryResponseRecord record : response.getRecords()) { - System.out.println("query row: " + record.getData()); - } - System.out.println("columns: " + (response.getMetadata() != null ? response.getMetadata().getColumns() : null)); - } catch (SkyflowException e) { - // Step 6: Handle any errors that occur during the process - System.err.println("Error in query operation:\t" + e.getMessage()); - } - } -} diff --git a/flowvault/src/main/java/com/skyflow/VaultClient.java b/flowvault/src/main/java/com/skyflow/VaultClient.java index 68d7c7ae..93a677e0 100644 --- a/flowvault/src/main/java/com/skyflow/VaultClient.java +++ b/flowvault/src/main/java/com/skyflow/VaultClient.java @@ -6,7 +6,6 @@ import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.ApiClientBuilder; import com.skyflow.generated.rest.resources.flowservice.FlowserviceClient; -import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.utils.SkyflowRetryInterceptor; import com.skyflow.utils.Utils; @@ -87,10 +86,6 @@ protected FlowserviceClient getRecordsApi() { return this.apiClient.flowservice(); } - protected RecordsClient getQueryApi() { - return this.apiClient.records(); - } - protected void setCommonCredentials(Credentials commonCredentials) throws SkyflowException { this.commonCredentials = commonCredentials; super.prioritiseCredentials(this.vaultConfig.getCredentials()); diff --git a/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java b/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java index 7681bc87..7de88335 100644 --- a/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java +++ b/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java @@ -7,7 +7,6 @@ public enum InterfaceName { DELETE("delete tokens"), DELETE_RECORDS("delete"), TOKENIZE("tokenize"), - QUERY("query"), GET("get"); diff --git a/flowvault/src/main/java/com/skyflow/utils/Utils.java b/flowvault/src/main/java/com/skyflow/utils/Utils.java index 4c3ab8cf..61072231 100644 --- a/flowvault/src/main/java/com/skyflow/utils/Utils.java +++ b/flowvault/src/main/java/com/skyflow/utils/Utils.java @@ -23,14 +23,11 @@ import com.skyflow.generated.rest.resources.flowservice.requests.V1GetRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1UpdateRequest; -import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; import com.skyflow.generated.rest.types.FlowEnumUpdateType; import com.skyflow.generated.rest.types.V1ColumnRedactions; import com.skyflow.generated.rest.types.V1DeleteResponse; import com.skyflow.generated.rest.types.V1DeleteResponseObject; import com.skyflow.generated.rest.types.V1DeleteTokenResponseObject; -import com.skyflow.generated.rest.types.V1ExecuteQueryRecordResponse; -import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponseObject; @@ -78,10 +75,6 @@ import com.skyflow.vault.data.InsertRequestRecord; import com.skyflow.vault.data.InsertResponse; import com.skyflow.vault.data.InsertResponseRecord; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; -import com.skyflow.vault.data.QueryResponseMetadata; -import com.skyflow.vault.data.QueryResponseRecord; import com.skyflow.vault.data.Token; import com.skyflow.vault.data.TokenGroupRedactions; import com.skyflow.vault.data.TokenizeRequestRecord; @@ -356,13 +349,6 @@ public static V1FlowDetokenizeRequest getBulkDetokenizeRequestBody(BulkDetokeniz return getDetokenizeRequestBody(request, vaultId); } - public static V1ExecuteQueryRequest getQueryRequestBody(QueryRequest request, String vaultId) { - return V1ExecuteQueryRequest.builder() - .vaultId(vaultId) - .query(request.getQuery()) - .build(); - } - public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest getBulkDeleteTokensRequestBody(BulkDeleteTokensRequest request, String vaultId) { return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder() .vaultId(vaultId) @@ -1195,23 +1181,6 @@ public static BulkDetokenizeResponse formatBulkDetokenizeResponse(V1FlowDetokeni return null; } - // Query has no batching/bulk counterpart, so there is no index or requestId to attach here. - public static QueryResponse formatQueryResponse(V1ExecuteQueryResponse response) { - List records = new ArrayList<>(); - QueryResponseMetadata metadata = null; - if (response != null) { - if (response.getRecords().isPresent()) { - for (V1ExecuteQueryRecordResponse record : response.getRecords().get()) { - records.add(new QueryResponseRecord(record.getData().orElse(null))); - } - } - if (response.getMetadata().isPresent()) { - metadata = new QueryResponseMetadata(response.getMetadata().get().getColumns().orElse(null)); - } - } - return new QueryResponse(records, metadata); - } - public static BulkDeleteTokensResponse formatBulkDeleteTokensResponse( V1FlowDeleteTokenResponse response, com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batchRequest, diff --git a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java index 7c272d80..084b01d7 100644 --- a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -453,27 +453,6 @@ public static void validateBulkDeleteTokensRequest(BulkDeleteTokensRequest reque } } - public static void validateQueryRequest(QueryRequest queryRequest) throws SkyflowException { - if (queryRequest == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.QUERY_REQUEST_NULL.getLog(), InterfaceName.QUERY.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.QueryRequestNull.getMessage()); - } - String query = queryRequest.getQuery(); - if (query == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.QUERY_IS_REQUIRED.getLog(), InterfaceName.QUERY.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.QueryKeyError.getMessage()); - } else if (query.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_QUERY.getLog(), InterfaceName.QUERY.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyQuery.getMessage()); - } - } - public static void validateUpdateRequest(UpdateRequest updateRequest) throws SkyflowException { if (updateRequest == null) { LogUtil.printErrorLog(Utils.parameterizedString( diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java index c0ab02cc..0a4f544e 100644 --- a/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java +++ b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -25,8 +25,6 @@ import com.skyflow.generated.rest.resources.flowservice.requests.V1DeleteRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1GetRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1UpdateRequest; -import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; -import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; import com.skyflow.generated.rest.types.V1FlowTokenizeResponse; import com.skyflow.generated.rest.types.V1InsertRecordData; @@ -66,9 +64,6 @@ import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.InsertRequestRecord; import com.skyflow.vault.data.InsertResponse; -import com.skyflow.vault.data.QueryOptions; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; import com.skyflow.vault.data.RequestContext; import com.skyflow.vault.data.UpdateOptions; import com.skyflow.vault.data.UpdateRequest; @@ -570,41 +565,6 @@ public CompletableFuture bulkTokenizeAsync(BulkTokenizeReq } } - // ── Query ───────────────────────────────────────────────────────────────── - // Runs a query in a single API call. There is no bulk/batched counterpart of this operation. - - public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { - return query(queryRequest, null); - } - - public QueryResponse query(QueryRequest queryRequest, QueryOptions options) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.QUERY_TRIGGERED.getLog()); - try { - LogUtil.printInfoLog(InfoLogs.VALIDATING_QUERY_REQUEST.getLog()); - Validations.validateQueryRequest(queryRequest); - - setBearerToken(); - V1ExecuteQueryRequest request = Utils.getQueryRequestBody(queryRequest, this.getVaultConfig().getVaultId()); - RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; - RequestContext ctx = new RequestContext("QUERY", 0, 1); - if (interceptor != null) interceptor.intercept(ctx); - - ApiClientHttpResponse response = - this.getQueryApi().withRawResponse().flowServiceExecuteQuery(request, buildRequestOptions(ctx)); - - QueryResponse formattedResponse = Utils.formatQueryResponse(response.body()); - LogUtil.printInfoLog(InfoLogs.QUERY_REQUEST_RESOLVED.getLog()); - return formattedResponse; - } catch (ApiClientApiException e) { - String bodyString = gson.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.QUERY_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - LogUtil.printErrorLog(ErrorLogs.QUERY_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e); - } - } - // ── Update ──────────────────────────────────────────────────────────────── // Runs an update in a single API call. There is no bulk/batched counterpart of this operation. diff --git a/flowvault/src/main/java/com/skyflow/vault/data/QueryOptions.java b/flowvault/src/main/java/com/skyflow/vault/data/QueryOptions.java deleted file mode 100644 index fb472bd7..00000000 --- a/flowvault/src/main/java/com/skyflow/vault/data/QueryOptions.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.skyflow.vault.data; - -public class QueryOptions { - private final RequestInterceptor interceptor; - - protected QueryOptions(Builder builder) { - this.interceptor = builder.interceptor; - } - - public RequestInterceptor getInterceptor() { - return interceptor; - } - - public static Builder builder() { - return new Builder(); - } - - public static class Builder { - private RequestInterceptor interceptor; - - protected Builder() { - } - - public Builder interceptor(RequestInterceptor interceptor) { - this.interceptor = interceptor; - return this; - } - - public QueryOptions build() { - return new QueryOptions(this); - } - } -} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/QueryRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/QueryRequest.java deleted file mode 100644 index 871375cb..00000000 --- a/flowvault/src/main/java/com/skyflow/vault/data/QueryRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.skyflow.vault.data; - -public class QueryRequest extends BaseQueryRequest { - - protected QueryRequest(QueryRequestBuilder builder) { - super(builder); - } - - public static QueryRequestBuilder builder() { - return new QueryRequestBuilder(); - } - - public static final class QueryRequestBuilder extends BaseQueryRequestBuilder { - - private QueryRequestBuilder() { - } - - @Override - public QueryRequestBuilder query(String query) { - super.query(query); - return this; - } - - public QueryRequest build() { - return new QueryRequest(this); - } - } -} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/QueryResponse.java deleted file mode 100644 index 8eeaa8b3..00000000 --- a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.skyflow.vault.data; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -public class QueryResponse { - private final List records; - private final QueryResponseMetadata metadata; - - public QueryResponse(List records, QueryResponseMetadata metadata) { - this.records = records; - this.metadata = metadata; - } - - public List getRecords() { - return records; - } - - /** Wraps the query's return columns, mirroring the wire shape (metadata.columns) directly. */ - public QueryResponseMetadata getMetadata() { - return metadata; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseMetadata.java b/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseMetadata.java deleted file mode 100644 index 7f86e540..00000000 --- a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseMetadata.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.skyflow.vault.data; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -// Wraps the query's return columns, mirroring the wire shape (metadata.columns) directly instead -// of a flat columns field bolted onto QueryResponse. -public class QueryResponseMetadata { - private final List columns; - - public QueryResponseMetadata(List columns) { - this.columns = columns; - } - - /** The return columns for the query, when the vault reports them. */ - public List getColumns() { - return columns; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseRecord.java deleted file mode 100644 index 23aa89e5..00000000 --- a/flowvault/src/main/java/com/skyflow/vault/data/QueryResponseRecord.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.skyflow.vault.data; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.Map; - -// A single row returned by a query, as the free-form column/value map the vault sends back. -// The query API has no notion of tokens, so unlike insert/detokenize there is no typed Token data here. -public class QueryResponseRecord { - private final Map data; - - public QueryResponseRecord(Map data) { - this.data = data; - } - - public Map getData() { - return data; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/flowvault/src/test/java/com/skyflow/AuthInterceptorTests.java b/flowvault/src/test/java/com/skyflow/AuthInterceptorTests.java index e4c56165..9b006aab 100644 --- a/flowvault/src/test/java/com/skyflow/AuthInterceptorTests.java +++ b/flowvault/src/test/java/com/skyflow/AuthInterceptorTests.java @@ -99,17 +99,4 @@ public void testAuthInterceptor_returnsTheChainResponseUntouched() throws Skyflo Assert.assertEquals(503, authInterceptorOf(client).intercept(chain).code()); Assert.assertEquals("auth must not retry - that is the outer interceptor's job", 1, chain.calls()); } - - @Test - public void testGetQueryApi_availableAfterSetBearerToken() throws SkyflowException { - Credentials credentials = new Credentials(); - credentials.setApiKey(API_KEY); - VaultConfig config = config(); - config.setCredentials(credentials); - - VaultClient client = new VaultClient(config, null); - client.setBearerToken(); - - Assert.assertNotNull(client.getQueryApi()); - } } diff --git a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java index 937aafc3..e197569b 100644 --- a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -14,14 +14,10 @@ import com.skyflow.generated.rest.resources.flowservice.requests.V1GetRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest; import com.skyflow.generated.rest.resources.flowservice.requests.V1UpdateRequest; -import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; import com.skyflow.generated.rest.types.FlowEnumUpdateType; import com.skyflow.generated.rest.types.V1DeleteResponse; import com.skyflow.generated.rest.types.V1DeleteResponseObject; import com.skyflow.generated.rest.types.V1DeleteTokenResponseObject; -import com.skyflow.generated.rest.types.V1ExecuteQueryRecordResponse; -import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; -import com.skyflow.generated.rest.types.V1ExecuteQueryResponseMetadata; import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponseObject; @@ -61,8 +57,6 @@ import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.InsertResponse; import com.skyflow.vault.data.InsertResponseRecord; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; import com.skyflow.vault.data.TokenGroupRedactions; import com.skyflow.vault.data.BulkTokenizeResponseRecord; import com.skyflow.vault.data.TokenizeRequestRecord; @@ -708,42 +702,6 @@ public void testFormatDeleteResponse_requestIdOnlyPopulatedOnError() { Assert.assertEquals("req-delete-1", formatted.getRecords().get(1).getRequestId()); } - // ── getQueryRequestBody / formatQueryResponse ───────────────────────────── - - @Test - public void testGetQueryRequestBody_buildsCorrectRequest() { - QueryRequest request = QueryRequest.builder().query("SELECT * FROM table1").build(); - - V1ExecuteQueryRequest body = Utils.getQueryRequestBody(request, "vault123"); - - Assert.assertEquals("vault123", body.getVaultId().get()); - Assert.assertEquals("SELECT * FROM table1", body.getQuery().get()); - } - - @Test - public void testFormatQueryResponse_withRecordsAndMetadata() { - Map row = new HashMap<>(); - row.put("name", "john"); - V1ExecuteQueryRecordResponse record = V1ExecuteQueryRecordResponse.builder().data(row).build(); - V1ExecuteQueryResponseMetadata metadata = V1ExecuteQueryResponseMetadata.builder() - .columns(Collections.singletonList("name")).build(); - V1ExecuteQueryResponse response = V1ExecuteQueryResponse.builder() - .records(Collections.singletonList(record)).metadata(metadata).build(); - - QueryResponse formatted = Utils.formatQueryResponse(response); - - Assert.assertEquals(1, formatted.getRecords().size()); - Assert.assertEquals(row, formatted.getRecords().get(0).getData()); - Assert.assertEquals(Collections.singletonList("name"), formatted.getMetadata().getColumns()); - } - - @Test - public void testFormatQueryResponse_nullResponseReturnsEmptyRecordsAndNullMetadata() { - QueryResponse formatted = Utils.formatQueryResponse(null); - Assert.assertTrue(formatted.getRecords().isEmpty()); - Assert.assertNull(formatted.getMetadata()); - } - // ── getBulkInsertRequestBody (bulk overload) ────────────────────────────── @Test diff --git a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java index 7ad11ab4..f900c03a 100644 --- a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -31,7 +31,6 @@ import com.skyflow.vault.data.GetRequestRecord; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.InsertRequestRecord; -import com.skyflow.vault.data.QueryRequest; import com.skyflow.vault.data.TokenGroupRedactions; import com.skyflow.vault.data.UpdateRequest; import com.skyflow.vault.data.UpdateRequestRecord; @@ -1603,50 +1602,6 @@ public void testValidateBulkTokenizeRequest_nonSequentialIndexesAccepted() { } } - // ── validateQueryRequest ────────────────────────────────────────────────── - - @Test - public void testValidateQueryRequest_nullRequestThrows() { - try { - Validations.validateQueryRequest(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.QueryRequestNull.getMessage(), e.getMessage()); - } - } - - @Test - public void testValidateQueryRequest_nullQueryThrows() { - QueryRequest request = QueryRequest.builder().build(); - try { - Validations.validateQueryRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.QueryKeyError.getMessage(), e.getMessage()); - } - } - - @Test - public void testValidateQueryRequest_blankQueryThrows() { - QueryRequest request = QueryRequest.builder().query(" ").build(); - try { - Validations.validateQueryRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyQuery.getMessage(), e.getMessage()); - } - } - - @Test - public void testValidateQueryRequest_validRequestDoesNotThrow() { - QueryRequest request = QueryRequest.builder().query("SELECT * FROM table1").build(); - try { - Validations.validateQueryRequest(request); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - // ── validateDeleteRequest ───────────────────────────────────────────────── @Test diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java index 2314a04b..5d711ff1 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java @@ -12,13 +12,9 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.flowservice.FlowserviceClient; import com.skyflow.generated.rest.resources.flowservice.RawFlowserviceClient; -import com.skyflow.generated.rest.resources.records.RawRecordsClient; -import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.types.V1DeleteResponse; import com.skyflow.generated.rest.types.V1DeleteResponseObject; import com.skyflow.generated.rest.types.V1DeleteTokenResponseObject; -import com.skyflow.generated.rest.types.V1ExecuteQueryRecordResponse; -import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponse; import com.skyflow.generated.rest.types.V1FlowDetokenizeResponseObject; @@ -60,9 +56,6 @@ import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.InsertRequestRecord; import com.skyflow.vault.data.InsertResponse; -import com.skyflow.vault.data.QueryOptions; -import com.skyflow.vault.data.QueryRequest; -import com.skyflow.vault.data.QueryResponse; import com.skyflow.vault.data.RequestInterceptor; import com.skyflow.vault.data.Token; import com.skyflow.vault.data.TokenGroupRedactions; @@ -132,14 +125,6 @@ private static RawFlowserviceClient mockRawFlowservice(ApiClient mockApi) { return mockRaw; } - private static RawRecordsClient mockRawRecords(ApiClient mockApi) { - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - RawRecordsClient mockRaw = Mockito.mock(RawRecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.withRawResponse()).thenReturn(mockRaw); - return mockRaw; - } - // ── insert (unary) ──────────────────────────────────────────────────────── @Test @@ -440,41 +425,6 @@ public void testGet_invalidRequestThrowsSkyflowException() throws Exception { } } - // ── query (unary) ───────────────────────────────────────────────────────── - - @Test - public void testQuery_success() throws Exception { - ApiClient mockApi = Mockito.mock(ApiClient.class); - RawRecordsClient mockRaw = mockRawRecords(mockApi); - - Map row = new HashMap<>(); - row.put("name", "john"); - V1ExecuteQueryRecordResponse record = V1ExecuteQueryRecordResponse.builder().data(row).build(); - V1ExecuteQueryResponse body = V1ExecuteQueryResponse.builder().records(Collections.singletonList(record)).build(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); - when(mockRaw.flowServiceExecuteQuery(any(), any())).thenReturn(httpResp); - - VaultController controller = createControllerWithMock(mockApi); - QueryRequest request = QueryRequest.builder().query("SELECT * FROM table1").build(); - - QueryResponse response = controller.query(request); - Assert.assertEquals(1, response.getRecords().size()); - Assert.assertEquals(row, response.getRecords().get(0).getData()); - } - - @Test - public void testQuery_invalidRequestThrowsSkyflowException() throws Exception { - ApiClient mockApi = Mockito.mock(ApiClient.class); - VaultController controller = createControllerWithMock(mockApi); - QueryRequest request = QueryRequest.builder().build(); - try { - controller.query(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertNotNull(e.getMessage()); - } - } - // ── bulkInsert ──────────────────────────────────────────────────────────── @Test