From abcf0aa5ae01bb48a9330080f370a1777a1f289c Mon Sep 17 00:00:00 2001 From: maochongxin Date: Fri, 21 Mar 2025 18:34:55 +0800 Subject: [PATCH 1/2] add reverse scan case --- .../OHTableSecondaryPartScanTest.java | 175 +++++++++++++++++- 1 file changed, 171 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java b/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java index 90045ec0..cde1bd07 100644 --- a/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java +++ b/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java @@ -31,6 +31,8 @@ import static com.alipay.oceanbase.hbase.util.ObHTableSecondaryPartUtil.*; import static com.alipay.oceanbase.hbase.util.ObHTableTestUtil.FOR_EACH; +import static com.alipay.oceanbase.hbase.util.ObHTableTestUtil.secureCompare; +import static com.alipay.oceanbase.hbase.util.TableTemplateManager.TableType.SINGLE_PARTITIONED_REGULAR; import static org.apache.hadoop.hbase.util.Bytes.toBytes; import static org.junit.Assert.assertEquals; @@ -41,10 +43,8 @@ public class OHTableSecondaryPartScanTest { @BeforeClass public static void before() throws Exception { openDistributedExecute(); - for (TableTemplateManager.TableType type : TableTemplateManager.TableType.values()) { - if (!type.name().contains("TIME")) { - createTables(type, tableNames, group2tableNames, true); - } + for (TableTemplateManager.TableType type : TableTemplateManager.NORMAL_TABLES) { + createTables(type, tableNames, group2tableNames, true); } } @@ -486,14 +486,181 @@ public static void testMultiCFScanImpl(Map.Entry> entry) th } } } + + public static void testReverseScanImpl(String tableName) throws Throwable { + OHTableClient hTable = ObHTableTestUtil.newOHTableClient(getTableName(tableName)); + hTable.init(); + + String family = getColumnFamilyName(tableName); + String key = "putKey"; + String column = "putColumn"; + long timestamp = System.currentTimeMillis(); + String value = "value"; + + for (int i = 0; i < 10; ++i) { + Put put = new Put(toBytes(key + i)); + put.add(family.getBytes(), (column + 1).getBytes(), timestamp, toBytes(value + i)); + put.add(family.getBytes(), (column + 2).getBytes(), timestamp, toBytes(value + i)); + hTable.put(put); + } + + { + Scan scan = new Scan("putKey8".getBytes(), "putKey".getBytes()); + scan.addColumn(family.getBytes(), (column + "2").getBytes()); + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + ObHTableTestUtil.Assert(tableName, ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(9, finalCount)); + } + + { + Scan scan = new Scan("putKey8".getBytes(), "putKey".getBytes()); + scan.addFamily(family.getBytes()); + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); + ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(9, finalCount)); + } + + { + Scan scan = new Scan(); + scan.addFamily(family.getBytes()); + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (9 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); + ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(10, finalCount)); + } + } + + public static void testReverseScanMultiCFImpl(Map.Entry> entry) throws Throwable { + String groupName = getTableName(entry.getKey()); + OHTableClient hTable = ObHTableTestUtil.newOHTableClient(groupName); + hTable.init(); + + String key = "putKey"; + String column = "putColumn"; + long timestamp = System.currentTimeMillis(); + String value = "value"; + // prepare data + for (int i = 0; i < 10; ++i) { + Put put = new Put(toBytes(key + i)); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + put.add(family.getBytes(), (column + 1).getBytes(), timestamp, toBytes(family + value + i)); + put.add(family.getBytes(), (column + 2).getBytes(), timestamp, toBytes(family + value + i)); + } + hTable.put(put); + } + + { + Scan scan = new Scan("putKey8".getBytes(), "putKey".getBytes()); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + scan.addFamily(family.getBytes()); + } + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (8 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); + } + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(9, finalCount)); + } + + { + Scan scan = new Scan(); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + scan.addColumn(family.getBytes(), (column + 2).getBytes()); + } + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); + } + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(10, finalCount)); + } + + { + Scan scan = new Scan(); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + scan.addFamily(family.getBytes()); + } + scan.setReversed(true); + ResultScanner scanner = hTable.getScanner(scan); + int count = 0; + for (Result result : scanner) { + int c = count; + System.out.println(Arrays.toString(result.raw())); + for (String tableName : entry.getValue()) { + String family = getColumnFamilyName(tableName); + ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); + ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); + } + count++; + } + final int finalCount = count; + ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(10, finalCount)); + } + + } @Test public void testScan() throws Throwable { FOR_EACH(tableNames, OHTableSecondaryPartScanTest::testScanImpl); } + + @Test + public void testReverseScan() throws Throwable { + FOR_EACH(tableNames, OHTableSecondaryPartScanTest::testReverseScanImpl); + } @Test public void testMultiCFScan() throws Throwable { FOR_EACH(group2tableNames, OHTableSecondaryPartScanTest::testMultiCFScanImpl); } + + @Test + public void testMultiCFReverseScan() throws Throwable { + FOR_EACH(group2tableNames, OHTableSecondaryPartScanTest::testReverseScanMultiCFImpl); + } } From fa42a828f91a7d34bd3fd001955bceea4c63862e Mon Sep 17 00:00:00 2001 From: maochongxin Date: Mon, 31 Mar 2025 19:34:04 +0800 Subject: [PATCH 2/2] fix reverse scan case --- .../OHTableSecondaryPartScanTest.java | 112 ++---------------- 1 file changed, 10 insertions(+), 102 deletions(-) diff --git a/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java b/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java index cde1bd07..caad94c6 100644 --- a/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java +++ b/src/test/java/com/alipay/oceanbase/hbase/secondary/OHTableSecondaryPartScanTest.java @@ -20,6 +20,7 @@ import com.alipay.oceanbase.hbase.OHTableClient; import com.alipay.oceanbase.hbase.util.ObHTableTestUtil; import com.alipay.oceanbase.hbase.util.TableTemplateManager; +import com.alipay.oceanbase.rpc.exception.ObTableException; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.BinaryComparator; @@ -503,55 +504,16 @@ public static void testReverseScanImpl(String tableName) throws Throwable { put.add(family.getBytes(), (column + 2).getBytes(), timestamp, toBytes(value + i)); hTable.put(put); } - + { Scan scan = new Scan("putKey8".getBytes(), "putKey".getBytes()); scan.addColumn(family.getBytes(), (column + "2").getBytes()); scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - ObHTableTestUtil.Assert(tableName, ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); - count++; - } - final int finalCount = count; - ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(9, finalCount)); - } - - { - Scan scan = new Scan("putKey8".getBytes(), "putKey".getBytes()); - scan.addFamily(family.getBytes()); - scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); - ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (8 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); - count++; - } - final int finalCount = count; - ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(9, finalCount)); - } - - { - Scan scan = new Scan(); - scan.addFamily(family.getBytes()); - scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (9 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); - ObHTableTestUtil.Assert(tableName, () -> Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); - count++; + try { + ResultScanner scanner = hTable.getScanner(scan); + } catch (Exception e) { + Assert.assertTrue(e.getCause().getMessage().contains("OB_NOT_SUPPORTED")); } - final int finalCount = count; - ObHTableTestUtil.Assert(tableName, ()->Assert.assertEquals(10, finalCount)); } } @@ -582,66 +544,12 @@ public static void testReverseScanMultiCFImpl(Map.Entry> en scan.addFamily(family.getBytes()); } scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - for (String tableName : entry.getValue()) { - String family = getColumnFamilyName(tableName); - ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (8 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); - } - count++; - } - final int finalCount = count; - ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(9, finalCount)); - } - - { - Scan scan = new Scan(); - for (String tableName : entry.getValue()) { - String family = getColumnFamilyName(tableName); - scan.addColumn(family.getBytes(), (column + 2).getBytes()); - } - scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - for (String tableName : entry.getValue()) { - String family = getColumnFamilyName(tableName); - ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); - } - count++; - } - final int finalCount = count; - ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(10, finalCount)); - } - - { - Scan scan = new Scan(); - for (String tableName : entry.getValue()) { - String family = getColumnFamilyName(tableName); - scan.addFamily(family.getBytes()); - } - scan.setReversed(true); - ResultScanner scanner = hTable.getScanner(scan); - int count = 0; - for (Result result : scanner) { - int c = count; - System.out.println(Arrays.toString(result.raw())); - for (String tableName : entry.getValue()) { - String family = getColumnFamilyName(tableName); - ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "1").getBytes())))); - ObHTableTestUtil.Assert(entry.getValue(), ()->Assert.assertTrue(ObHTableTestUtil.secureCompare(toBytes(family + value + (9 - c)), result.getValue(family.getBytes(), (column + "2").getBytes())))); - } - count++; + try { + ResultScanner scanner = hTable.getScanner(scan); + } catch (Exception e) { + Assert.assertTrue(e.getCause().getMessage().contains("OB_NOT_SUPPORTED")); } - final int finalCount = count; - ObHTableTestUtil.Assert(entry.getKey(), ()->Assert.assertEquals(10, finalCount)); } - } @Test