From dda2bace0e7924c29affaa9de55be1aaa7e594f3 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 19:05:31 +0530 Subject: [PATCH 1/7] SK-3026 remove unused tokens key in insert --- .../main/java/com/skyflow/utils/Utils.java | 3 - .../vault/data/BulkInsertRequestRecord.java | 6 -- .../vault/data/InsertRequestRecord.java | 10 --- .../skyflow/utils/RequestFidelityTests.java | 67 ------------------- .../java/com/skyflow/utils/UtilsTests.java | 18 ----- .../utils/validations/ValidationsTests.java | 14 ---- .../vault/data/RecordAndRedactionTests.java | 10 --- .../data/RequestResponseWrapperTests.java | 4 -- 8 files changed, 132 deletions(-) diff --git a/flowvault/src/main/java/com/skyflow/utils/Utils.java b/flowvault/src/main/java/com/skyflow/utils/Utils.java index e4261a00..f1fb7d5c 100644 --- a/flowvault/src/main/java/com/skyflow/utils/Utils.java +++ b/flowvault/src/main/java/com/skyflow/utils/Utils.java @@ -148,9 +148,6 @@ public static V1InsertRequest getInsertRequestBody(InsertRequest request, VaultC if (hasText(record.getTableName())) { data.tableName(record.getTableName()); } - if (record.getTokens() != null && !record.getTokens().isEmpty()) { - data.tokens(record.getTokens()); - } UpsertOptions recordUpsert = record.getUpsert(); if (recordUpsert != null && recordUpsert.getUniqueColumns() != null && !recordUpsert.getUniqueColumns().isEmpty()) { diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java index 6cddda6b..1f05fcec 100644 --- a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java @@ -31,12 +31,6 @@ public BulkInsertRequestRecordBuilder data(Map data) { return this; } - @Override - public BulkInsertRequestRecordBuilder tokens(Map tokens) { - super.tokens(tokens); - return this; - } - @Override public BulkInsertRequestRecordBuilder upsert(UpsertOptions upsert) { super.upsert(upsert); diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java index 75747a84..ea9979d6 100644 --- a/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java @@ -18,10 +18,6 @@ public Map getData() { return this.builder.data; } - public Map getTokens() { - return this.builder.tokens; - } - public UpsertOptions getUpsert() { return this.builder.upsert; } @@ -30,7 +26,6 @@ public UpsertOptions getUpsert() { public static class InsertRequestRecordBuilder { private String tableName; private Map data; - private Map tokens; private UpsertOptions upsert; public InsertRequestRecordBuilder tableName(String tableName) { @@ -43,11 +38,6 @@ public InsertRequestRecordBuilder data(Map data) { return this; } - public InsertRequestRecordBuilder tokens(Map tokens) { - this.tokens = tokens; - return this; - } - public InsertRequestRecordBuilder upsert(UpsertOptions upsert) { this.upsert = upsert; return this; diff --git a/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java b/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java index 13e2506e..8501abf6 100644 --- a/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java @@ -74,8 +74,6 @@ private static ArrayList recordList(InsertRequestRecord... public void testBulkInsert_everyRecordFieldReachesWire() { Map data = new LinkedHashMap<>(); data.put("name", "john"); - Map tokens = new LinkedHashMap<>(); - tokens.put("name", "tok-abc"); UpsertOptions upsert = UpsertOptions.builder() .updateType("UPDATE") .uniqueColumns(Arrays.asList("email", "phone")) @@ -84,7 +82,6 @@ public void testBulkInsert_everyRecordFieldReachesWire() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName("cards") .data(data) - .tokens(tokens) .upsert(upsert) .build(); BulkInsertRequest request = BulkInsertRequest.builder() @@ -100,7 +97,6 @@ public void testBulkInsert_everyRecordFieldReachesWire() { Assert.assertEquals("cards", wire.getTableName().get()); // The user's own map instances must be handed to the wire object untouched. Assert.assertSame(data, wire.getData().get()); - Assert.assertSame(tokens, wire.getTokens().get()); Assert.assertEquals(FlowEnumUpdateType.UPDATE, wire.getUpsert().get().getUpdateType().get()); Assert.assertEquals(Arrays.asList("email", "phone"), wire.getUpsert().get().getUniqueColumns().get()); } @@ -110,13 +106,10 @@ public void testBulkInsert_nonAsciiAndSpacedValues_userValueReachesWire() { Map data = new LinkedHashMap<>(); data.put("name", NON_ASCII_NAME); data.put("street address", "12 東京都 千代田区"); - Map tokens = new LinkedHashMap<>(); - tokens.put("name", "tök-ábc 123"); BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName(NON_ASCII_TABLE) .data(data) - .tokens(tokens) .build(); BulkInsertRequest request = BulkInsertRequest.builder() .tableName(SPACED_TABLE) @@ -130,7 +123,6 @@ public void testBulkInsert_nonAsciiAndSpacedValues_userValueReachesWire() { Assert.assertEquals(NON_ASCII_TABLE, wire.getTableName().get()); Assert.assertEquals(NON_ASCII_NAME, wire.getData().get().get("name")); Assert.assertEquals("12 東京都 千代田区", wire.getData().get().get("street address")); - Assert.assertEquals("tök-ábc 123", wire.getTokens().get().get("name")); } @Test @@ -525,65 +517,6 @@ private static com.skyflow.generated.rest.types.V1Upsert upsertWire(String updat .getRecords().get().get(0).getUpsert().get(); } - // ── insert: tokens map ─────────────────────────────────────────────────── - - @Test - public void testBulkInsert_emptyTokensMapIsOmittedFromWire_knownGap() { - // KNOWN GAP: an explicitly-set-but-empty tokens map is dropped rather than sent as {}. - // Pinning current behavior — a caller cannot distinguish "no tokens" from "empty tokens". - Map data = new HashMap<>(); - data.put("name", "john"); - BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() - .tableName("cards") - .data(data) - .tokens(new HashMap<>()) - .build(); - BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); - - V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); - - Assert.assertFalse(body.getRecords().get().get(0).getTokens().isPresent()); - } - - @Test - public void testBulkInsert_nullTokensMapIsOmittedFromWire() { - Map data = new HashMap<>(); - data.put("name", "john"); - BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() - .tableName("cards") - .data(data) - .build(); - BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); - - V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); - - Assert.assertFalse(body.getRecords().get().get(0).getTokens().isPresent()); - } - - @Test - public void testBulkInsert_multiValueTokensMapReachesWireVerbatim() { - Map data = new HashMap<>(); - data.put("name", "john"); - Map tokens = new LinkedHashMap<>(); - tokens.put("name", "tok-1"); - tokens.put("ssn", "tok-2"); - tokens.put("nested", Collections.singletonMap("group", "tok-3")); - BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() - .tableName("cards") - .data(data) - .tokens(tokens) - .build(); - BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); - - V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); - - Map wireTokens = body.getRecords().get().get(0).getTokens().get(); - Assert.assertSame(tokens, wireTokens); - Assert.assertEquals("tok-1", wireTokens.get("name")); - Assert.assertEquals("tok-2", wireTokens.get("ssn")); - Assert.assertEquals(Collections.singletonMap("group", "tok-3"), wireTokens.get("nested")); - } - // ───────────────────────────────────────────────────────────────────────── // Bulk detokenize // ───────────────────────────────────────────────────────────────────────── diff --git a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java index d220084a..53e8b565 100644 --- a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -258,24 +258,6 @@ public void testGetInsertRequestBody_keepsRequestLevelTableNameOnEnvelopeOnly() Assert.assertFalse(body.getRecords().get().get(0).getTableName().isPresent()); } - @Test - public void testGetInsertRequestBody_withTokens() { - Map data = new HashMap<>(); - data.put("name", "john"); - Map tokens = new HashMap<>(); - tokens.put("name", "tok-abc"); - InsertRequestRecord record = InsertRequestRecord.builder().tableName("table1").data(data).tokens(tokens).build(); - ArrayList records = new ArrayList<>(); - records.add(record); - InsertRequest request = InsertRequest.builder().records(records).build(); - VaultConfig config = new VaultConfig(); - config.setVaultId("vault123"); - - V1InsertRequest body = Utils.getInsertRequestBody(request, config); - - Assert.assertEquals(tokens, body.getRecords().get().get(0).getTokens().get()); - } - @Test public void testGetInsertRequestBody_withUpsertAtRequestLevel() { Map data = new HashMap<>(); 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 44a58686..94e64ae4 100644 --- a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -554,20 +554,6 @@ public void testValidateInsertRequest_validRequestWithUpsertAtRecordLevel() { } } - @Test - public void testValidateInsertRequest_validRequestWithTokens() { - Map tokens = new HashMap<>(); - tokens.put("name", "tok-abc"); - ArrayList records = new ArrayList<>(); - records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); - InsertRequest request = InsertRequest.builder().records(records).build(); - try { - Validations.validateInsertRequest(request); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - // ── validateDetokenizeRequest ───────────────────────────────────────────── @Test diff --git a/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java b/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java index 52cbf10c..20d0c95c 100644 --- a/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java @@ -45,8 +45,6 @@ public void testTokenGroupRedactions_defaultsAreNull() { public void testInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "John"); - Map tokens = new HashMap<>(); - tokens.put("name", "token-value"); UpsertOptions upsert = UpsertOptions.builder() .uniqueColumns(Arrays.asList("id")) .updateType("UPDATE") @@ -55,13 +53,11 @@ public void testInsertRequestRecord_gettersReturnBuilderValues() { InsertRequestRecord record = InsertRequestRecord.builder() .tableName("persons") .data(data) - .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); - Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); } @@ -70,7 +66,6 @@ public void testInsertRequestRecord_defaultsAreNull() { InsertRequestRecord record = InsertRequestRecord.builder().build(); Assert.assertNull(record.getTableName()); Assert.assertNull(record.getData()); - Assert.assertNull(record.getTokens()); Assert.assertNull(record.getUpsert()); } @@ -80,8 +75,6 @@ public void testInsertRequestRecord_defaultsAreNull() { public void testBulkInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "Jane"); - Map tokens = new HashMap<>(); - tokens.put("name", "token-1"); UpsertOptions upsert = UpsertOptions.builder() .updateType("REPLACE") .uniqueColumns(Arrays.asList("id")) @@ -90,13 +83,11 @@ public void testBulkInsertRequestRecord_gettersReturnBuilderValues() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName("persons") .data(data) - .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); - Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); Assert.assertEquals("REPLACE", record.getUpsert().getUpdateType()); Assert.assertEquals(Arrays.asList("id"), record.getUpsert().getUniqueColumns()); @@ -107,7 +98,6 @@ public void testBulkInsertRequestRecord_defaultsAreNull() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder().build(); Assert.assertNull(record.getTableName()); Assert.assertNull(record.getData()); - Assert.assertNull(record.getTokens()); Assert.assertNull(record.getUpsert()); } diff --git a/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java b/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java index 393a98d1..2662eadf 100644 --- a/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java @@ -60,20 +60,16 @@ public void testInsertRequest_defaultsAreNull() { public void testInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "john"); - Map tokens = new HashMap<>(); - tokens.put("name", "tok-abc"); UpsertOptions upsert = UpsertOptions.builder().uniqueColumns(Arrays.asList("id")).build(); InsertRequestRecord record = InsertRequestRecord.builder() .tableName("persons") .data(data) - .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); - Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); } From 60f44cc9067c72ec15fa1de1078c1b23dcba63b0 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 13:36:12 +0000 Subject: [PATCH 2/7] [AUTOMATED] Private Release 3.0.0-beta.13-dev-dda2bace --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index baa12ea2..2c0d120f 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -11,7 +11,7 @@ skyflow-flowvault-java - 3.0.0-beta.13-dev.5e368050 + 3.0.0-beta.13-dev.dda2bace jar ${project.groupId}:${project.artifactId} Skyflow V3 SDK for the Java programming language From 46cbffad10b85ddb38b8a725da106c58995b37f7 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 19:08:27 +0530 Subject: [PATCH 3/7] SK-3026 fix tests --- .../java/com/skyflow/utils/validations/ValidationsTests.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 94e64ae4..9981bf46 100644 --- a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -872,16 +872,13 @@ public void testValidateBulkInsertRequest_validRequest() { } @Test - public void testValidateBulkInsertRequest_validRequestWithUpsertAndTokens() { + public void testValidateBulkInsertRequest_validRequestWithUpsert() { Map data = new HashMap<>(); data.put("name", "john"); - Map tokens = new HashMap<>(); - tokens.put("name", "tok-abc"); ArrayList records = new ArrayList<>(); records.add(BulkInsertRequestRecord.builder() .tableName("table1") .data(data) - .tokens(tokens) .upsert(UpsertOptions.builder() .updateType("REPLACE") .uniqueColumns(Collections.singletonList("email")) From 0abbbb4f6ad8386df2d54ff17993a2d87ae41d69 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 13:39:07 +0000 Subject: [PATCH 4/7] [AUTOMATED] Private Release 3.0.0-beta.13-dev-46cbffad --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 2c0d120f..f5e7de1c 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -11,7 +11,7 @@ skyflow-flowvault-java - 3.0.0-beta.13-dev.dda2bace + 3.0.0-beta.13-dev.46cbffad jar ${project.groupId}:${project.artifactId} Skyflow V3 SDK for the Java programming language From 78fb577236d9feae77510a511a4c33a725dcef30 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 13:40:14 +0000 Subject: [PATCH 5/7] [AUTOMATED] Private Release 3.0.0-beta.13-dev-7e97883a --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 14e6e75a..37233959 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -11,7 +11,7 @@ skyflow-flowvault-java - 3.0.0-beta.13-dev.962614b1 + 3.0.0-beta.13-dev.7e97883a jar ${project.groupId}:${project.artifactId} Skyflow V3 SDK for the Java programming language From 7c0fb7bebccb048cf2377be13c9dc7d50f9ca756 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 19:30:13 +0530 Subject: [PATCH 6/7] SK-3026 added tokens support --- .../main/java/com/skyflow/utils/Utils.java | 3 + .../utils/validations/Validations.java | 31 +++++++ .../vault/data/BulkInsertRequestRecord.java | 6 ++ .../vault/data/InsertRequestRecord.java | 10 ++ .../skyflow/utils/RequestFidelityTests.java | 67 ++++++++++++++ .../java/com/skyflow/utils/UtilsTests.java | 18 ++++ .../utils/validations/ValidationsTests.java | 92 ++++++++++++++++++- .../vault/data/RecordAndRedactionTests.java | 10 ++ .../data/RequestResponseWrapperTests.java | 4 + 9 files changed, 240 insertions(+), 1 deletion(-) diff --git a/flowvault/src/main/java/com/skyflow/utils/Utils.java b/flowvault/src/main/java/com/skyflow/utils/Utils.java index 7dcdc5ad..d6011dec 100644 --- a/flowvault/src/main/java/com/skyflow/utils/Utils.java +++ b/flowvault/src/main/java/com/skyflow/utils/Utils.java @@ -148,6 +148,9 @@ public static V1InsertRequest getInsertRequestBody(InsertRequest request, VaultC if (hasText(record.getTableName())) { data.tableName(record.getTableName()); } + if (record.getTokens() != null && !record.getTokens().isEmpty()) { + data.tokens(record.getTokens()); + } UpsertOptions recordUpsert = record.getUpsert(); if (recordUpsert != null && recordUpsert.getUniqueColumns() != null && !recordUpsert.getUniqueColumns().isEmpty()) { 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 39565674..667028ce 100644 --- a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -205,6 +205,37 @@ public static void validateInsertRequest(InsertRequest insertRequest) throws Sky } } } + validateInsertRecordTokens(record.getTokens()); + } + } + + // Tokens are optional on an insert record, but when supplied the map must not be empty and + // every entry must have a non-blank key and value — mirroring the checks on data above. + private static void validateInsertRecordTokens(Map tokens) throws SkyflowException { + if (tokens == null) { + return; + } + if (tokens.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokens.getMessage()); + } + for (String key : tokens.keySet()) { + if (key == null || key.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_KEY_IN_TOKENS.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInTokens.getMessage()); + } + Object value = tokens.get(key); + if (value == null || value.toString().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_VALUE_IN_TOKENS.getLog(), + InterfaceName.INSERT.getName(), key + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInTokens.getMessage()); + } } } diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java index 1f05fcec..6cddda6b 100644 --- a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequestRecord.java @@ -31,6 +31,12 @@ public BulkInsertRequestRecordBuilder data(Map data) { return this; } + @Override + public BulkInsertRequestRecordBuilder tokens(Map tokens) { + super.tokens(tokens); + return this; + } + @Override public BulkInsertRequestRecordBuilder upsert(UpsertOptions upsert) { super.upsert(upsert); diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java index ea9979d6..75747a84 100644 --- a/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequestRecord.java @@ -18,6 +18,10 @@ public Map getData() { return this.builder.data; } + public Map getTokens() { + return this.builder.tokens; + } + public UpsertOptions getUpsert() { return this.builder.upsert; } @@ -26,6 +30,7 @@ public UpsertOptions getUpsert() { public static class InsertRequestRecordBuilder { private String tableName; private Map data; + private Map tokens; private UpsertOptions upsert; public InsertRequestRecordBuilder tableName(String tableName) { @@ -38,6 +43,11 @@ public InsertRequestRecordBuilder data(Map data) { return this; } + public InsertRequestRecordBuilder tokens(Map tokens) { + this.tokens = tokens; + return this; + } + public InsertRequestRecordBuilder upsert(UpsertOptions upsert) { this.upsert = upsert; return this; diff --git a/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java b/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java index 8501abf6..42b3dac9 100644 --- a/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/RequestFidelityTests.java @@ -74,6 +74,8 @@ private static ArrayList recordList(InsertRequestRecord... public void testBulkInsert_everyRecordFieldReachesWire() { Map data = new LinkedHashMap<>(); data.put("name", "john"); + Map tokens = new LinkedHashMap<>(); + tokens.put("name", "tok-abc"); UpsertOptions upsert = UpsertOptions.builder() .updateType("UPDATE") .uniqueColumns(Arrays.asList("email", "phone")) @@ -82,6 +84,7 @@ public void testBulkInsert_everyRecordFieldReachesWire() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName("cards") .data(data) + .tokens(tokens) .upsert(upsert) .build(); BulkInsertRequest request = BulkInsertRequest.builder() @@ -97,6 +100,7 @@ public void testBulkInsert_everyRecordFieldReachesWire() { Assert.assertEquals("cards", wire.getTableName().get()); // The user's own map instances must be handed to the wire object untouched. Assert.assertSame(data, wire.getData().get()); + Assert.assertSame(tokens, wire.getTokens().get()); Assert.assertEquals(FlowEnumUpdateType.UPDATE, wire.getUpsert().get().getUpdateType().get()); Assert.assertEquals(Arrays.asList("email", "phone"), wire.getUpsert().get().getUniqueColumns().get()); } @@ -106,10 +110,13 @@ public void testBulkInsert_nonAsciiAndSpacedValues_userValueReachesWire() { Map data = new LinkedHashMap<>(); data.put("name", NON_ASCII_NAME); data.put("street address", "12 東京都 千代田区"); + Map tokens = new LinkedHashMap<>(); + tokens.put("name", "tök-ábc 123"); BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName(NON_ASCII_TABLE) .data(data) + .tokens(tokens) .build(); BulkInsertRequest request = BulkInsertRequest.builder() .tableName(SPACED_TABLE) @@ -123,6 +130,7 @@ public void testBulkInsert_nonAsciiAndSpacedValues_userValueReachesWire() { Assert.assertEquals(NON_ASCII_TABLE, wire.getTableName().get()); Assert.assertEquals(NON_ASCII_NAME, wire.getData().get().get("name")); Assert.assertEquals("12 東京都 千代田区", wire.getData().get().get("street address")); + Assert.assertEquals("tök-ábc 123", wire.getTokens().get().get("name")); } @Test @@ -517,6 +525,65 @@ private static com.skyflow.generated.rest.types.V1Upsert upsertWire(String updat .getRecords().get().get(0).getUpsert().get(); } + // ── insert: tokens map ─────────────────────────────────────────────────── + + @Test + public void testBulkInsert_emptyTokensMapIsOmittedFromWire() { + // Validations.validateInsertRequest rejects an explicitly-set-but-empty tokens map before + // the body builder runs; this pins the builder's own behavior when called directly. + Map data = new HashMap<>(); + data.put("name", "john"); + BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() + .tableName("cards") + .data(data) + .tokens(new HashMap<>()) + .build(); + BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); + + Assert.assertFalse(body.getRecords().get().get(0).getTokens().isPresent()); + } + + @Test + public void testBulkInsert_nullTokensMapIsOmittedFromWire() { + Map data = new HashMap<>(); + data.put("name", "john"); + BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() + .tableName("cards") + .data(data) + .build(); + BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); + + Assert.assertFalse(body.getRecords().get().get(0).getTokens().isPresent()); + } + + @Test + public void testBulkInsert_multiValueTokensMapReachesWireVerbatim() { + Map data = new HashMap<>(); + data.put("name", "john"); + Map tokens = new LinkedHashMap<>(); + tokens.put("name", "tok-1"); + tokens.put("ssn", "tok-2"); + tokens.put("nested", Collections.singletonMap("group", "tok-3")); + BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() + .tableName("cards") + .data(data) + .tokens(tokens) + .build(); + BulkInsertRequest request = BulkInsertRequest.builder().records(recordList(record)).build(); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, vaultConfig()); + + Map wireTokens = body.getRecords().get().get(0).getTokens().get(); + Assert.assertSame(tokens, wireTokens); + Assert.assertEquals("tok-1", wireTokens.get("name")); + Assert.assertEquals("tok-2", wireTokens.get("ssn")); + Assert.assertEquals(Collections.singletonMap("group", "tok-3"), wireTokens.get("nested")); + } + // ───────────────────────────────────────────────────────────────────────── // Bulk detokenize // ───────────────────────────────────────────────────────────────────────── diff --git a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java index 3243beb8..4e034bfd 100644 --- a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -258,6 +258,24 @@ public void testGetInsertRequestBody_keepsRequestLevelTableNameOnEnvelopeOnly() Assert.assertFalse(body.getRecords().get().get(0).getTableName().isPresent()); } + @Test + public void testGetInsertRequestBody_withTokens() { + Map data = new HashMap<>(); + data.put("name", "john"); + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + InsertRequestRecord record = InsertRequestRecord.builder().tableName("table1").data(data).tokens(tokens).build(); + ArrayList records = new ArrayList<>(); + records.add(record); + InsertRequest request = InsertRequest.builder().records(records).build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getInsertRequestBody(request, config); + + Assert.assertEquals(tokens, body.getRecords().get().get(0).getTokens().get()); + } + @Test public void testGetInsertRequestBody_withUpsertAtRequestLevel() { Map data = new HashMap<>(); 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 9981bf46..7c20526a 100644 --- a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -554,6 +554,93 @@ public void testValidateInsertRequest_validRequestWithUpsertAtRecordLevel() { } } + @Test + public void testValidateInsertRequest_validRequestWithTokens() { + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateInsertRequest_emptyTokensMapThrows() { + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(new HashMap<>()).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorMessage.EmptyTokens.getMessage(), e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_nullKeyInTokensThrows() { + Map tokens = new HashMap<>(); + tokens.put(null, "tok-abc"); + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_blankKeyInTokensThrows() { + Map tokens = new HashMap<>(); + tokens.put(" ", "tok-abc"); + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_nullValueInTokensThrows() { + Map tokens = new HashMap<>(); + tokens.put("name", null); + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorMessage.EmptyValueInTokens.getMessage(), e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_blankValueInTokensThrows() { + Map tokens = new HashMap<>(); + tokens.put("name", " "); + ArrayList records = new ArrayList<>(); + records.add(InsertRequestRecord.builder().tableName("table1").tokens(tokens).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorMessage.EmptyValueInTokens.getMessage(), e.getMessage()); + } + } + // ── validateDetokenizeRequest ───────────────────────────────────────────── @Test @@ -872,13 +959,16 @@ public void testValidateBulkInsertRequest_validRequest() { } @Test - public void testValidateBulkInsertRequest_validRequestWithUpsert() { + public void testValidateBulkInsertRequest_validRequestWithUpsertAndTokens() { Map data = new HashMap<>(); data.put("name", "john"); + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); ArrayList records = new ArrayList<>(); records.add(BulkInsertRequestRecord.builder() .tableName("table1") .data(data) + .tokens(tokens) .upsert(UpsertOptions.builder() .updateType("REPLACE") .uniqueColumns(Collections.singletonList("email")) diff --git a/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java b/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java index 20d0c95c..52cbf10c 100644 --- a/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/data/RecordAndRedactionTests.java @@ -45,6 +45,8 @@ public void testTokenGroupRedactions_defaultsAreNull() { public void testInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "John"); + Map tokens = new HashMap<>(); + tokens.put("name", "token-value"); UpsertOptions upsert = UpsertOptions.builder() .uniqueColumns(Arrays.asList("id")) .updateType("UPDATE") @@ -53,11 +55,13 @@ public void testInsertRequestRecord_gettersReturnBuilderValues() { InsertRequestRecord record = InsertRequestRecord.builder() .tableName("persons") .data(data) + .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); + Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); } @@ -66,6 +70,7 @@ public void testInsertRequestRecord_defaultsAreNull() { InsertRequestRecord record = InsertRequestRecord.builder().build(); Assert.assertNull(record.getTableName()); Assert.assertNull(record.getData()); + Assert.assertNull(record.getTokens()); Assert.assertNull(record.getUpsert()); } @@ -75,6 +80,8 @@ public void testInsertRequestRecord_defaultsAreNull() { public void testBulkInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "Jane"); + Map tokens = new HashMap<>(); + tokens.put("name", "token-1"); UpsertOptions upsert = UpsertOptions.builder() .updateType("REPLACE") .uniqueColumns(Arrays.asList("id")) @@ -83,11 +90,13 @@ public void testBulkInsertRequestRecord_gettersReturnBuilderValues() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder() .tableName("persons") .data(data) + .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); + Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); Assert.assertEquals("REPLACE", record.getUpsert().getUpdateType()); Assert.assertEquals(Arrays.asList("id"), record.getUpsert().getUniqueColumns()); @@ -98,6 +107,7 @@ public void testBulkInsertRequestRecord_defaultsAreNull() { BulkInsertRequestRecord record = BulkInsertRequestRecord.builder().build(); Assert.assertNull(record.getTableName()); Assert.assertNull(record.getData()); + Assert.assertNull(record.getTokens()); Assert.assertNull(record.getUpsert()); } diff --git a/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java b/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java index 2662eadf..393a98d1 100644 --- a/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/data/RequestResponseWrapperTests.java @@ -60,16 +60,20 @@ public void testInsertRequest_defaultsAreNull() { public void testInsertRequestRecord_gettersReturnBuilderValues() { Map data = new HashMap<>(); data.put("name", "john"); + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); UpsertOptions upsert = UpsertOptions.builder().uniqueColumns(Arrays.asList("id")).build(); InsertRequestRecord record = InsertRequestRecord.builder() .tableName("persons") .data(data) + .tokens(tokens) .upsert(upsert) .build(); Assert.assertEquals("persons", record.getTableName()); Assert.assertEquals(data, record.getData()); + Assert.assertEquals(tokens, record.getTokens()); Assert.assertEquals(upsert, record.getUpsert()); } From c784ff3a9361a730bcfd69003ccb28c11492ef9b Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 3 Aug 2026 14:00:50 +0000 Subject: [PATCH 7/7] [AUTOMATED] Private Release 3.0.0-beta.13-dev-7c0fb7be --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 37233959..66c6b7c1 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -11,7 +11,7 @@ skyflow-flowvault-java - 3.0.0-beta.13-dev.7e97883a + 3.0.0-beta.13-dev.7c0fb7be jar ${project.groupId}:${project.artifactId} Skyflow V3 SDK for the Java programming language