From ef2f4bc3a94dfb5fdc165fe0ffba95958a457876 Mon Sep 17 00:00:00 2001 From: JackShi148 Date: Mon, 17 Feb 2025 20:51:41 +0800 Subject: [PATCH 1/2] fix multi-cf checkExistenceOnly --- .../com/alipay/oceanbase/hbase/OHTable.java | 8 ++--- .../hbase/HTableMultiCFTestBase.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index 10728ee2..cda53ae5 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -809,12 +809,12 @@ public static int compareByteArray(byte[] bt1, byte[] bt2) { private void getMaxRowFromResult(AbstractQueryStreamResult clientQueryStreamResult, List keyValueList, boolean isTableGroup, - byte[] family) throws Exception { + byte[] family, boolean checkExistenceOnly) throws Exception { byte[][] familyAndQualifier = new byte[2][]; KeyValue kv = null; while (clientQueryStreamResult.next()) { List row = clientQueryStreamResult.getRow(); - if (row.isEmpty()) { + if (checkExistenceOnly) { // Currently, checkExistOnly is set, and if the row exists, it returns an empty row. keyValueList.add(new KeyValue()); return; @@ -904,7 +904,7 @@ public Result call() throws IOException { ObTableClientQueryAsyncStreamResult clientQueryStreamResult = (ObTableClientQueryAsyncStreamResult) obTableClient .execute(request); - getMaxRowFromResult(clientQueryStreamResult, keyValueList, true, family); + getMaxRowFromResult(clientQueryStreamResult, keyValueList, true, family, get.isCheckExistenceOnly()); } else { for (Map.Entry> entry : get.getFamilyMap() .entrySet()) { @@ -927,7 +927,7 @@ public Result call() throws IOException { ObTableClientQueryStreamResult clientQueryStreamResult = (ObTableClientQueryStreamResult) obTableClient .execute(request); getMaxRowFromResult(clientQueryStreamResult, keyValueList, false, - family); + family, get.isCheckExistenceOnly()); } } } catch (Exception e) { diff --git a/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java b/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java index edff6ed7..8914a286 100644 --- a/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java +++ b/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java @@ -1522,6 +1522,38 @@ public void testMultiColumnFamilyGet() throws Exception { } } assertEquals(5, keyValues.length); + + // test multi-cf get checkExistenceOnly + Delete delKey1 = new Delete(toBytes("Key1")); + multiCfHTable.delete(delKey1); + get = new Get(toBytes("Key1")); + Result allKey1Result = multiCfHTable.get(get); + Assert.assertEquals(0, allKey1Result.size()); + + boolean exist = multiCfHTable.exists(get); + assertFalse(exist); + Put put = new Put(toBytes("Key1")); + put.add(family1, family1_column1, family1_value); + multiCfHTable.put(put); + exist = multiCfHTable.exists(get); + assertTrue(exist); + + // test existsAll + multiCfHTable.delete(delKey1); + allKey1Result = multiCfHTable.get(get); + Assert.assertEquals(0, allKey1Result.size()); + + get = new Get(toBytes("Key0")); + get2 = new Get(toBytes("Key1")); + get3 = new Get(toBytes("Key2")); + ArrayList gets = new ArrayList<>(); + gets.add(get); + gets.add(get2); + gets.add(get3); + boolean[] exists = multiCfHTable.existsAll(gets); + Assert.assertTrue(exists[0]); + Assert.assertFalse(exists[1]); + Assert.assertTrue(exists[2]); } @Test From 55864173f5ea171a073f7e9abd3e526b2e4bb992 Mon Sep 17 00:00:00 2001 From: JackShi148 Date: Tue, 18 Feb 2025 15:33:49 +0800 Subject: [PATCH 2/2] refactor code --- src/main/java/com/alipay/oceanbase/hbase/OHTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index cda53ae5..6f7d4d85 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -813,12 +813,12 @@ private void getMaxRowFromResult(AbstractQueryStreamResult clientQueryStreamResu byte[][] familyAndQualifier = new byte[2][]; KeyValue kv = null; while (clientQueryStreamResult.next()) { - List row = clientQueryStreamResult.getRow(); if (checkExistenceOnly) { // Currently, checkExistOnly is set, and if the row exists, it returns an empty row. keyValueList.add(new KeyValue()); return; } else { + List row = clientQueryStreamResult.getRow(); if (kv == null || compareByteArray(kv.getRow(), (byte[]) row.get(0).getValue()) <= 0) { if (kv != null