From 508b2aadfbad4c6db796d54f0348c4c77e2f4346 Mon Sep 17 00:00:00 2001 From: miyuan-ljr Date: Mon, 21 Oct 2024 16:10:25 +0800 Subject: [PATCH] family filter --- .../hbase/filter/HBaseFilterUtils.java | 2 +- .../hbase/HTableMultiCFTestBase.java | 154 +++++++++++++++++- .../hbase/filter/HBaseFilterUtilsTest.java | 6 + 3 files changed, 160 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java b/src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java index ed98d1b3..833a539d 100644 --- a/src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java +++ b/src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java @@ -45,7 +45,7 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream, Filte } else if (filter instanceof DependentColumnFilter) { toParseableByteArray(byteStream, (DependentColumnFilter) filter); } else if (filter instanceof CompareFilter) { - // RowFilter, ValueFilter, QualifierFilter + // RowFilter, ValueFilter, QualifierFilter, FamilyFilter toParseableByteArray(byteStream, (CompareFilter) filter); } else if (filter instanceof SingleColumnValueExcludeFilter) { toParseableByteArray(byteStream, (SingleColumnValueExcludeFilter) filter); diff --git a/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java b/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java index c318b37f..ff176224 100644 --- a/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java +++ b/src/test/java/com/alipay/oceanbase/hbase/HTableMultiCFTestBase.java @@ -24,7 +24,7 @@ import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.client.coprocessor.Batch; -import org.apache.hadoop.hbase.filter.PrefixFilter; +import org.apache.hadoop.hbase.filter.*; import org.apache.hadoop.hbase.util.Bytes; import org.junit.*; import org.junit.rules.ExpectedException; @@ -1557,4 +1557,156 @@ public void testMultiColumnFamilyDelete() throws Exception { multiCfHTable.delete(deleteKey2Family); multiCfHTable.delete(deleteKey3Family); } + + @Test + public void testFamilyFilter() throws Exception { + String key1 = "getKey1"; + String key2 = "getKey2"; + String column1 = "abc"; + String column2 = "def"; + String value1 = "value1"; + String value2 = "value2"; + String family1 = "family_with_group1"; + String family2 = "family_with_group2"; + String family3 = "family_with_group3"; + + Delete deleteKey1 = new Delete(toBytes(key1)); + deleteKey1.deleteFamily(toBytes(family1)); + deleteKey1.deleteFamily(toBytes(family2)); + deleteKey1.deleteFamily(toBytes(family3)); + Delete deleteKey2 = new Delete(toBytes(key2)); + deleteKey2.deleteFamily(toBytes(family1)); + deleteKey2.deleteFamily(toBytes(family2)); + deleteKey2.deleteFamily(toBytes(family3)); + + Put putKey1Column1Value1 = new Put(toBytes(key1)); + putKey1Column1Value1.add(toBytes(family1), toBytes(column1), toBytes(value1)); + + Put putKey1Column1Value2 = new Put(toBytes(key1)); + putKey1Column1Value2.add(toBytes(family2), toBytes(column1), toBytes(value2)); + + Put putKey1Column2Value2 = new Put(toBytes(key1)); + putKey1Column2Value2.add(toBytes(family2), toBytes(column2), toBytes(value2)); + + Put putKey2Column2Value1 = new Put(toBytes(key2)); + putKey2Column2Value1.add(toBytes(family3), toBytes(column2), toBytes(value1)); + + Put putKey2Column1Value1 = new Put(toBytes(key2)); + putKey2Column1Value1.add(toBytes(family3), toBytes(column1), toBytes(value1)); + + Put putKey2Column1Value2 = new Put(toBytes(key2)); + putKey2Column1Value2.add(toBytes(family3), toBytes(column1), toBytes(value2)); + + multiCfHTable.delete(deleteKey1); + multiCfHTable.delete(deleteKey2); + multiCfHTable.put(putKey1Column1Value1); + multiCfHTable.put(putKey1Column1Value2); + multiCfHTable.put(putKey1Column2Value2); + multiCfHTable.put(putKey2Column2Value1); + multiCfHTable.put(putKey2Column1Value1); + multiCfHTable.put(putKey2Column1Value2); + + Scan scan; + scan = new Scan(); + scan.addFamily(family1.getBytes()); + scan.addFamily(family2.getBytes()); + scan.addFamily(family3.getBytes()); + scan.setMaxVersions(10); + FamilyFilter f = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes(family2))); + scan.setFilter(f); + ResultScanner scanner = multiCfHTable.getScanner(scan); + + int res_count = 0; + for (Result result : scanner) { + for (KeyValue keyValue : result.raw()) { + System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n", + Bytes.toString(result.getRow()), + Bytes.toString(keyValue.getFamily()), + Bytes.toString(keyValue.getQualifier()), + keyValue.getTimestamp(), + Bytes.toString(keyValue.getValue()) + ); + Assert.assertArrayEquals(family2.getBytes(), keyValue.getFamily()); + res_count += 1; + } + } + Assert.assertEquals(res_count, 2); + scanner.close(); + + scan = new Scan(); + scan.addFamily(family1.getBytes()); + scan.addFamily(family2.getBytes()); + scan.addFamily(family3.getBytes()); + scan.setMaxVersions(10); + f = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes(family2))); + scan.setFilter(f); + scanner = multiCfHTable.getScanner(scan); + + res_count = 0; + for (Result result : scanner) { + for (KeyValue keyValue : result.raw()) { + System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n", + Bytes.toString(result.getRow()), + Bytes.toString(keyValue.getFamily()), + Bytes.toString(keyValue.getQualifier()), + keyValue.getTimestamp(), + Bytes.toString(keyValue.getValue()) + ); + res_count += 1; + } + } + Assert.assertEquals(res_count, 4); + scanner.close(); + + scan = new Scan(); + scan.addFamily(family1.getBytes()); + scan.addFamily(family2.getBytes()); + scan.addFamily(family3.getBytes()); + scan.setMaxVersions(10); + f = new FamilyFilter(CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes(family2))); + scan.setFilter(f); + scanner = multiCfHTable.getScanner(scan); + + res_count = 0; + for (Result result : scanner) { + for (KeyValue keyValue : result.raw()) { + System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n", + Bytes.toString(result.getRow()), + Bytes.toString(keyValue.getFamily()), + Bytes.toString(keyValue.getQualifier()), + keyValue.getTimestamp(), + Bytes.toString(keyValue.getValue()) + ); + Assert.assertArrayEquals(family3.getBytes(), keyValue.getFamily()); + res_count += 1; + } + } + Assert.assertEquals(res_count, 3); + scanner.close(); + + scan = new Scan(); + scan.addFamily(family1.getBytes()); + scan.addFamily(family2.getBytes()); + scan.addFamily(family3.getBytes()); + scan.setMaxVersions(10); + f = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("family_with_group"))); + scan.setFilter(f); + scanner = multiCfHTable.getScanner(scan); + + res_count = 0; + for (Result result : scanner) { + for (KeyValue keyValue : result.raw()) { + System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n", + Bytes.toString(result.getRow()), + Bytes.toString(keyValue.getFamily()), + Bytes.toString(keyValue.getQualifier()), + keyValue.getTimestamp(), + Bytes.toString(keyValue.getValue()) + ); + res_count += 1; + } + } + Assert.assertEquals(res_count, 6); + scanner.close(); + } } diff --git a/src/test/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtilsTest.java b/src/test/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtilsTest.java index 4fac8402..f35f72a2 100644 --- a/src/test/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtilsTest.java +++ b/src/test/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtilsTest.java @@ -241,6 +241,12 @@ public void testMultipleColumnPrefixFilter() throws IOException { HBaseFilterUtils.toParseableByteArray(filter)); } + @Test + public void testFamilyFilter() throws IOException { + FamilyFilter filter = new FamilyFilter(CompareFilter.CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("cf"))); + Assert.assertArrayEquals("FamilyFilter(!=,'binary:cf')".getBytes(), HBaseFilterUtils.toParseableByteArray(filter)); + } + @Test public void testColumnCountGetFilter() throws IOException { ColumnCountGetFilter filter = new ColumnCountGetFilter(513);