diff --git a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java index 10728ee2..6f7d4d85 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/OHTable.java +++ b/src/main/java/com/alipay/oceanbase/hbase/OHTable.java @@ -809,16 +809,16 @@ 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; } else { + List row = clientQueryStreamResult.getRow(); if (kv == null || compareByteArray(kv.getRow(), (byte[]) row.get(0).getValue()) <= 0) { if (kv != null @@ -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