This is an automated email from the ASF dual-hosted git repository.
virajjasani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/phoenix-adapters.git
The following commit(s) were added to refs/heads/main by this push:
new 93985c5 Revert Skip last evaluated key when items
93985c5 is described below
commit 93985c5314ff45656b90fa655d4d93c8094ecfb0
Author: Palash Chauhan <[email protected]>
AuthorDate: Thu Feb 26 23:50:44 2026 -0800
Revert Skip last evaluated key when items
Co-authored-by: Viraj Jasani <[email protected]>
---
.../apache/phoenix/ddb/service/QueryService.java | 4 +-
.../apache/phoenix/ddb/service/ScanService.java | 6 +--
.../apache/phoenix/ddb/service/utils/DQLUtils.java | 7 +--
.../test/java/org/apache/phoenix/ddb/QueryIT.java | 63 +++++-----------------
.../java/org/apache/phoenix/ddb/QueryIndex1IT.java | 22 +++++---
.../phoenix/ddb/ScanExclusiveStartKeyIT.java | 4 +-
.../java/org/apache/phoenix/ddb/ScanTableIT.java | 48 -----------------
7 files changed, 37 insertions(+), 117 deletions(-)
diff --git
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/QueryService.java
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/QueryService.java
index 9325737..fe16acc 100644
---
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/QueryService.java
+++
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/QueryService.java
@@ -75,11 +75,9 @@ public class QueryService {
PreparedStatement stmt = pairVal.getFirst();
boolean isSingleRowExpected = pairVal.getSecond();
boolean countOnly =
ApiMetadata.SELECT_COUNT.equals(request.get(ApiMetadata.SELECT));
- Integer limit = (Integer) request.get(ApiMetadata.LIMIT);
- int effectiveLimit = limit == null ? MAX_QUERY_LIMIT :
Math.min(limit, MAX_QUERY_LIMIT);
return DQLUtils.executeStatementReturnResult(stmt,
getProjectionAttributes(request), useIndex, tablePKCols,
indexPKCols, tableName,
- isSingleRowExpected, false, countOnly, effectiveLimit);
+ isSingleRowExpected, false, countOnly);
} catch (SQLException e) {
throw new PhoenixServiceException(e);
}
diff --git
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/ScanService.java
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/ScanService.java
index 67e6ef9..9a086c5 100644
---
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/ScanService.java
+++
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/ScanService.java
@@ -150,7 +150,7 @@ public class ScanService {
PreparedStatement stmt = buildQuery(connection, request, config);
return DQLUtils.executeStatementReturnResult(stmt,
getProjectionAttributes(request),
config.useIndex(), config.getTablePKCols(),
config.getIndexPKCols(), config.getTableName(),
- false, false, config.isCountOnly(), config.getLimit());
+ false, false, config.isCountOnly());
}
/**
@@ -164,7 +164,7 @@ public class ScanService {
PreparedStatement firstStmt = buildQuery(connection, request, config);
Map<String, Object> firstResult =
DQLUtils.executeStatementReturnResult(firstStmt,
getProjectionAttributes(request), config.useIndex(),
config.getTablePKCols(), config.getIndexPKCols(),
- config.getTableName(), false, true, config.isCountOnly(),
config.getLimit());
+ config.getTableName(), false, true, config.isCountOnly());
List<Map<String, Object>> allItems = config.isCountOnly()
? new ArrayList<>()
@@ -180,7 +180,7 @@ public class ScanService {
PreparedStatement secondStmt = buildQuery(connection, request,
secondConfig);
Map<String, Object> secondResult =
DQLUtils.executeStatementReturnResult(secondStmt,
getProjectionAttributes(request), config.useIndex(),
config.getTablePKCols(), config.getIndexPKCols(),
- config.getTableName(), false, false, config.isCountOnly(),
secondConfig.getLimit());
+ config.getTableName(), false, false, config.isCountOnly());
if (!config.isCountOnly()) {
List<Map<String, Object>> secondItems = (List<Map<String,
Object>>) secondResult.get(ApiMetadata.ITEMS);
diff --git
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/utils/DQLUtils.java
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/utils/DQLUtils.java
index 15aa172..5b70f33 100644
---
a/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/utils/DQLUtils.java
+++
b/phoenix-ddb-rest/src/main/java/org/apache/phoenix/ddb/service/utils/DQLUtils.java
@@ -41,8 +41,7 @@ public class DQLUtils {
public static Map<String, Object>
executeStatementReturnResult(PreparedStatement stmt,
List<String> projectionAttributes, boolean useIndex,
List<PColumn> tablePKCols, List<PColumn> indexPKCols, String
tableName,
- boolean isSingleRowExpected, boolean isScanFirstQuery, boolean
countOnly,
- int effectiveLimit) throws SQLException {
+ boolean isSingleRowExpected, boolean isScanFirstQuery, boolean
countOnly) throws SQLException {
int count = 0;
int bytesSize = 0;
List<Map<String, Object>> items = new ArrayList<>();
@@ -70,9 +69,7 @@ public class DQLUtils {
response.put(ApiMetadata.ITEMS, items);
}
response.put(ApiMetadata.COUNT, count);
- if (count == effectiveLimit || sizeLimitReached) {
- response.put(ApiMetadata.LAST_EVALUATED_KEY, lastKey);
- }
+ response.put(ApiMetadata.LAST_EVALUATED_KEY, lastKey);
response.put(ApiMetadata.SCANNED_COUNT, countRowsScanned);
response.put(ApiMetadata.CONSUMED_CAPACITY,
CommonServiceUtils.getConsumedCapacity(tableName));
diff --git a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIT.java
b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIT.java
index 953d97a..1616c75 100644
--- a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIT.java
+++ b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIT.java
@@ -453,8 +453,20 @@ public class QueryIT {
Assert.assertTrue(phoenixResult.count() == 1);
// check last key
- Assert.assertTrue(phoenixResult.lastEvaluatedKey().isEmpty());
+ lastKey = phoenixResult.lastEvaluatedKey();
+ Assert.assertEquals("B", lastKey.get("attr_0").s());
+ Assert.assertEquals(4, Integer.parseInt(lastKey.get("attr_1").n()));
+
+ // note that dynamo's last evaluated key will be null here
+ // sdkv2 returns empty item
Assert.assertTrue(dynamoResult.lastEvaluatedKey().isEmpty());
+
+ // provide lastEvaluatedKey as exclusiveStartKey, no items should be
returned
+ qr.exclusiveStartKey(lastKey);
+ phoenixResult = phoenixDBClientV2.query(qr.build());
+ dynamoResult = dynamoDbClient.query(qr.build());
+ Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
+ Assert.assertTrue(phoenixResult.count() == 0);
}
@Test(timeout = 120000)
@@ -815,55 +827,6 @@ public class QueryIT {
} while (!lastEvaluatedKey.isEmpty());
}
- @Test(timeout = 120000)
- public void queryLastEvaluatedKeyNotSetWhenItemsLessThanLimit() {
- final String tableName = testName.getMethodName();
- CreateTableRequest createTableRequest =
- DDLTestUtils.getCreateTableRequest(tableName, "attr_0",
- ScalarAttributeType.S, "attr_1",
ScalarAttributeType.N);
- phoenixDBClientV2.createTable(createTableRequest);
- dynamoDbClient.createTable(createTableRequest);
-
- PutItemRequest putItemRequest1 =
PutItemRequest.builder().tableName(tableName).item(getItem1()).build();
- PutItemRequest putItemRequest2 =
PutItemRequest.builder().tableName(tableName).item(getItem2()).build();
- PutItemRequest putItemRequest3 =
PutItemRequest.builder().tableName(tableName).item(getItem3()).build();
- phoenixDBClientV2.putItem(putItemRequest1);
- phoenixDBClientV2.putItem(putItemRequest2);
- phoenixDBClientV2.putItem(putItemRequest3);
- dynamoDbClient.putItem(putItemRequest1);
- dynamoDbClient.putItem(putItemRequest2);
- dynamoDbClient.putItem(putItemRequest3);
-
- QueryRequest.Builder qr = QueryRequest.builder().tableName(tableName);
- qr.keyConditionExpression("#0 = :v0");
- Map<String, String> exprAttrNames = new HashMap<>();
- exprAttrNames.put("#0", "attr_0");
- qr.expressionAttributeNames(exprAttrNames);
- Map<String, AttributeValue> exprAttrVal = new HashMap<>();
- exprAttrVal.put(":v0", AttributeValue.builder().s("B").build());
- qr.expressionAttributeValues(exprAttrVal);
- qr.limit(10);
-
- QueryResponse phoenixResult = phoenixDBClientV2.query(qr.build());
- QueryResponse dynamoResult = dynamoDbClient.query(qr.build());
-
- Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
- Assert.assertEquals(2, phoenixResult.count().intValue());
- Assert.assertTrue(phoenixResult.lastEvaluatedKey().isEmpty());
- Assert.assertTrue(dynamoResult.lastEvaluatedKey().isEmpty());
- Assert.assertEquals(dynamoResult.items(), phoenixResult.items());
-
- qr.limit(1);
- phoenixResult = phoenixDBClientV2.query(qr.build());
- dynamoResult = dynamoDbClient.query(qr.build());
-
- Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
- Assert.assertEquals(1, phoenixResult.count().intValue());
- Assert.assertFalse(phoenixResult.lastEvaluatedKey().isEmpty());
- Assert.assertFalse(dynamoResult.lastEvaluatedKey().isEmpty());
- Assert.assertEquals(dynamoResult.lastEvaluatedKey(),
phoenixResult.lastEvaluatedKey());
- }
-
public static Map<String, AttributeValue> getItem1() {
Map<String, AttributeValue> item = new HashMap<>();
item.put("attr_0", AttributeValue.builder().s("A").build());
diff --git
a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIndex1IT.java
b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIndex1IT.java
index 6538999..58fa05c 100644
--- a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIndex1IT.java
+++ b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/QueryIndex1IT.java
@@ -152,7 +152,6 @@ public class QueryIndex1IT {
Assert.assertEquals(dynamoResult.scannedCount(),
phoenixResult.scannedCount());
// check last evaluated key
- Assert.assertEquals(0, phoenixResult.lastEvaluatedKey().size());
Assert.assertEquals(0, dynamoResult.lastEvaluatedKey().size());
// explain plan
@@ -205,7 +204,6 @@ public class QueryIndex1IT {
Assert.assertEquals(dynamoResult.items().get(0),
phoenixResult.items().get(0));
// check last evaluated key
- Assert.assertEquals(0, phoenixResult.lastEvaluatedKey().size());
Assert.assertEquals(0, dynamoResult.lastEvaluatedKey().size());
// explain plan
@@ -259,7 +257,11 @@ public class QueryIndex1IT {
Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
Assert.assertEquals(dynamoResult.items().get(0),
phoenixResult.items().get(0));
Assert.assertEquals(dynamoResult.scannedCount(),
phoenixResult.scannedCount());
- Assert.assertEquals(dynamoResult.lastEvaluatedKey(),
phoenixResult.lastEvaluatedKey());
+
+ // check last evaluated key
+ Map<String, AttributeValue> lastKey = phoenixResult.lastEvaluatedKey();
+ Assert.assertEquals("101.01", lastKey.get("IdS").s());
+ Assert.assertEquals(1.1, Double.parseDouble(lastKey.get("Id2").n()),
0);
// explain plan
TestUtils.validateIndexUsed(qr.build(), url);
@@ -311,7 +313,11 @@ public class QueryIndex1IT {
QueryResponse dynamoResult = dynamoDbClient.query(qr.build());
Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
Assert.assertEquals(dynamoResult.items().get(0),
phoenixResult.items().get(0));
- Assert.assertEquals(dynamoResult.lastEvaluatedKey(),
phoenixResult.lastEvaluatedKey());
+
+ // check last evaluated key
+ Map<String, AttributeValue> lastKey = phoenixResult.lastEvaluatedKey();
+ Assert.assertEquals("101.01", lastKey.get("IdS").s());
+ Assert.assertEquals(1.1, Double.parseDouble(lastKey.get("Id2").n()),
0);
// explain plan
TestUtils.validateIndexUsed(qr.build(), url);
@@ -363,7 +369,11 @@ public class QueryIndex1IT {
QueryResponse dynamoResult = dynamoDbClient.query(qr.build());
Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
Assert.assertEquals(dynamoResult.items().get(0),
phoenixResult.items().get(0));
- Assert.assertEquals(dynamoResult.lastEvaluatedKey(),
phoenixResult.lastEvaluatedKey());
+
+ // check last evaluated key
+ Map<String, AttributeValue> lastKey = phoenixResult.lastEvaluatedKey();
+ Assert.assertEquals("str_val_1", lastKey.get("attr_0").s());
+ Assert.assertEquals("101.01", lastKey.get("IdS").s());
// explain plan
TestUtils.validateIndexUsed(qr.build(), url);
@@ -611,7 +621,6 @@ public class QueryIndex1IT {
// check last evaluated key
Assert.assertTrue(dynamoResult.lastEvaluatedKey().isEmpty());
- Assert.assertTrue(phoenixResult.lastEvaluatedKey().isEmpty());
// explain plan
TestUtils.validateIndexUsed(qr.build(), url);
@@ -661,7 +670,6 @@ public class QueryIndex1IT {
// check last evaluated key
Assert.assertTrue(dynamoResult.lastEvaluatedKey().isEmpty());
- Assert.assertTrue(phoenixResult.lastEvaluatedKey().isEmpty());
// explain plan
TestUtils.validateIndexUsed(qr.build(), url);
diff --git
a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanExclusiveStartKeyIT.java
b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanExclusiveStartKeyIT.java
index 2fa34dc..712b819 100644
---
a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanExclusiveStartKeyIT.java
+++
b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanExclusiveStartKeyIT.java
@@ -262,7 +262,9 @@ public class ScanExclusiveStartKeyIT {
Assert.assertEquals("DynamoDB should return all 56 items", 56,
dynamoItems.size());
// Verify that both clients returned the same number of pagination
rounds
- Assert.assertEquals("Pagination count with same limit should be the
same", dynamoPaginationCount, phoenixPaginationCount);
+ // Note: The exact pagination behavior might differ slightly, but both
should complete
+ Assert.assertTrue("Phoenix pagination should complete",
phoenixPaginationCount > 0);
+ Assert.assertTrue("DynamoDB pagination should complete",
dynamoPaginationCount > 0);
// For limits smaller than 8, we should see multiple pagination rounds
if (scanLimit < 8) {
diff --git
a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanTableIT.java
b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanTableIT.java
index 01a9a8d..18fc91e 100644
--- a/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanTableIT.java
+++ b/phoenix-ddb-rest/src/test/java/org/apache/phoenix/ddb/ScanTableIT.java
@@ -1771,52 +1771,4 @@ public class ScanTableIT {
Assert.assertEquals("Expected 400 status code for DynamoDB", 400,
e.statusCode());
}
}
-
- @Test(timeout = 120000)
- public void testScanLastEvaluatedKeyNotSetWhenItemsLessThanLimit() {
- final String tableName = testName.getMethodName();
- CreateTableRequest createTableRequest =
- DDLTestUtils.getCreateTableRequest(tableName, "attr_0",
- ScalarAttributeType.S, "attr_1",
ScalarAttributeType.N);
- phoenixDBClientV2.createTable(createTableRequest);
- dynamoDbClient.createTable(createTableRequest);
-
- PutItemRequest putItemRequest1 =
PutItemRequest.builder().tableName(tableName).item(getItem1()).build();
- PutItemRequest putItemRequest2 =
PutItemRequest.builder().tableName(tableName).item(getItem2()).build();
- PutItemRequest putItemRequest3 =
PutItemRequest.builder().tableName(tableName).item(getItem3()).build();
- phoenixDBClientV2.putItem(putItemRequest1);
- phoenixDBClientV2.putItem(putItemRequest2);
- phoenixDBClientV2.putItem(putItemRequest3);
- dynamoDbClient.putItem(putItemRequest1);
- dynamoDbClient.putItem(putItemRequest2);
- dynamoDbClient.putItem(putItemRequest3);
-
- ScanRequest.Builder sr = ScanRequest.builder().tableName(tableName);
- sr.filterExpression("#0 = :v0");
- Map<String, String> exprAttrNames = new HashMap<>();
- exprAttrNames.put("#0", "title");
- sr.expressionAttributeNames(exprAttrNames);
- Map<String, AttributeValue> exprAttrVal = new HashMap<>();
- exprAttrVal.put(":v0", AttributeValue.builder().s("Title3").build());
- sr.expressionAttributeValues(exprAttrVal);
- sr.limit(10);
-
- ScanResponse phoenixResult = phoenixDBClientV2.scan(sr.build());
- ScanResponse dynamoResult = dynamoDbClient.scan(sr.build());
-
- Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
- Assert.assertEquals(1, phoenixResult.count().intValue());
- Assert.assertTrue(phoenixResult.lastEvaluatedKey().isEmpty());
- Assert.assertTrue(dynamoResult.lastEvaluatedKey().isEmpty());
-
- ScanRequest.Builder sr2 = ScanRequest.builder().tableName(tableName);
- sr2.limit(1);
- phoenixResult = phoenixDBClientV2.scan(sr2.build());
- dynamoResult = dynamoDbClient.scan(sr2.build());
-
- Assert.assertEquals(dynamoResult.count(), phoenixResult.count());
- Assert.assertEquals(1, phoenixResult.count().intValue());
- Assert.assertFalse(phoenixResult.lastEvaluatedKey().isEmpty());
- Assert.assertFalse(dynamoResult.lastEvaluatedKey().isEmpty());
- }
}