Skip to content

Commit 29c93a2

Browse files
authored
ColumnValueFilter (#93)
1 parent 10ecc2e commit 29c93a2

File tree

3 files changed

+242
-4
lines changed

3 files changed

+242
-4
lines changed

src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.alipay.oceanbase.hbase.filter;
1919

2020
import org.apache.hadoop.classification.InterfaceAudience;
21+
import org.apache.hadoop.hbase.CompareOperator;
2122
import org.apache.hadoop.hbase.filter.*;
2223
import org.apache.hadoop.hbase.util.Bytes;
2324
import org.apache.hadoop.hbase.util.Pair;
@@ -75,6 +76,8 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream, Filte
7576
toParseableByteArray(byteStream, (FuzzyRowFilter) filter);
7677
} else if (filter instanceof TimestampsFilter) {
7778
toParseableByteArray(byteStream, (TimestampsFilter) filter);
79+
} else if (filter instanceof ColumnValueFilter) {
80+
toParseableByteArray(byteStream, (ColumnValueFilter) filter);
7881
} else if (filter instanceof MultiRowRangeFilter) {
7982
toParseableByteArray(byteStream, (MultiRowRangeFilter) filter);
8083
} else if (filter instanceof InclusiveStopFilter) {
@@ -114,6 +117,28 @@ public static byte[] toParseableByteArray(CompareFilter.CompareOp op) {
114117
}
115118
}
116119

120+
public static byte[] toParseableByteArray(CompareOperator op) {
121+
if (op == null) {
122+
throw new IllegalArgumentException("Compare operator is null");
123+
}
124+
switch (op) {
125+
case LESS:
126+
return ParseConstants.LESS_THAN_ARRAY;
127+
case LESS_OR_EQUAL:
128+
return ParseConstants.LESS_THAN_OR_EQUAL_TO_ARRAY;
129+
case EQUAL:
130+
return ParseConstants.EQUAL_TO_ARRAY;
131+
case NOT_EQUAL:
132+
return ParseConstants.NOT_EQUAL_TO_ARRAY;
133+
case GREATER_OR_EQUAL:
134+
return ParseConstants.GREATER_THAN_OR_EQUAL_TO_ARRAY;
135+
case GREATER:
136+
return ParseConstants.GREATER_THAN_ARRAY;
137+
default:
138+
throw new IllegalArgumentException("Invalid compare operator: " + op);
139+
}
140+
}
141+
117142
private static void toParseableByteArray(ByteArrayOutputStream byteStream,
118143
ByteArrayComparable comparator) throws IOException {
119144
if (comparator == null) {
@@ -329,6 +354,21 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream, Times
329354
byteStream.write(')');
330355
}
331356

357+
// ColumnValueFilter('cf','q')
358+
private static void toParseableByteArray(ByteArrayOutputStream byteStream, ColumnValueFilter filter) throws IOException {
359+
byteStream.write(filter.getClass().getSimpleName().getBytes());
360+
byteStream.write('(');
361+
byteStream.write("'".getBytes());
362+
byteStream.write(filter.getFamily());
363+
byteStream.write("','".getBytes());
364+
byteStream.write(filter.getQualifier());
365+
byteStream.write("',".getBytes());
366+
byteStream.write(toParseableByteArray(filter.getCompareOperator()));
367+
byteStream.write(',');
368+
toParseableByteArray(byteStream, filter.getComparator());
369+
byteStream.write(')');
370+
}
371+
332372
// MultiRowRangeFilter('a',true,'b',false,'c',true,'d',false);
333373
private static void toParseableByteArray(ByteArrayOutputStream byteStream,
334374
MultiRowRangeFilter filter) throws IOException {

src/test/java/com/alipay/oceanbase/hbase/HTableTestBase.java

Lines changed: 193 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@
1818
package com.alipay.oceanbase.hbase;
1919

2020
import com.alipay.oceanbase.hbase.exception.FeatureNotSupportedException;
21-
import org.apache.hadoop.hbase.Cell;
22-
import org.apache.hadoop.hbase.CellUtil;
23-
import org.apache.hadoop.hbase.HConstants;
24-
import org.apache.hadoop.hbase.KeyValue;
21+
import org.apache.hadoop.hbase.*;
2522
import org.apache.hadoop.hbase.client.*;
2623
import org.apache.hadoop.hbase.filter.*;
2724
import org.apache.hadoop.hbase.util.Bytes;
@@ -1796,6 +1793,198 @@ public void testFilter2() throws Exception {
17961793
scanner.close();
17971794
}
17981795

1796+
@Test
1797+
public void testColumnValueFilter() throws Exception {
1798+
String key1 = "abab";
1799+
String key2 = "abcc";
1800+
String column1 = "c1";
1801+
String column2 = "c2";
1802+
String column3 = "c3";
1803+
String column4 = "c4";
1804+
String column5 = "c5";
1805+
String value1 = "value1";
1806+
String value2 = "value2";
1807+
String value3 = "value3";
1808+
String family = "family1";
1809+
Delete deleteKey1Family = new Delete(toBytes(key1));
1810+
deleteKey1Family.addFamily(toBytes(family));
1811+
1812+
Delete deleteKey2Family = new Delete(toBytes(key2));
1813+
deleteKey2Family.addFamily(toBytes(family));
1814+
1815+
hTable.delete(deleteKey1Family);
1816+
hTable.delete(deleteKey2Family);
1817+
1818+
try {
1819+
Put putKey1Column1Value1 = new Put(toBytes(key1));
1820+
putKey1Column1Value1.addColumn(toBytes(family), toBytes(column1), toBytes(value1));
1821+
1822+
Put putKey1Column1Value2 = new Put(toBytes(key1));
1823+
putKey1Column1Value2.addColumn(toBytes(family), toBytes(column1), toBytes(value2));
1824+
1825+
Put putKey1Column2Value2 = new Put(toBytes(key1));
1826+
putKey1Column2Value2.addColumn(toBytes(family), toBytes(column2), toBytes(value2));
1827+
1828+
Put putKey1Column2Value1 = new Put(toBytes(key1));
1829+
putKey1Column2Value1.addColumn(toBytes(family), toBytes(column2), toBytes(value1));
1830+
1831+
Put putKey1Column3Value1 = new Put(toBytes(key1));
1832+
putKey1Column3Value1.addColumn(toBytes(family), toBytes(column3), toBytes(value1));
1833+
1834+
Put putKey1Column4Value1 = new Put(toBytes(key1));
1835+
putKey1Column4Value1.addColumn(toBytes(family), toBytes(column4), toBytes(value1));
1836+
1837+
Put putKey1Column5Value1 = new Put(toBytes(key1));
1838+
putKey1Column5Value1.addColumn(toBytes(family), toBytes(column5), toBytes(value1));
1839+
1840+
Put putKey2Column1Value1 = new Put(toBytes(key2));
1841+
putKey2Column1Value1.addColumn(toBytes(family), toBytes(column1), toBytes(value1));
1842+
1843+
Put putKey2Column1Value2 = new Put(toBytes(key2));
1844+
putKey2Column1Value2.addColumn(toBytes(family), toBytes(column1), toBytes(value2));
1845+
1846+
Put putKey2Column2Value2 = new Put(toBytes(key2));
1847+
putKey2Column2Value2.addColumn(toBytes(family), toBytes(column2), toBytes(value2));
1848+
1849+
Put putKey2Column2Value1 = new Put(toBytes(key2));
1850+
putKey2Column2Value1.addColumn(toBytes(family), toBytes(column2), toBytes(value1));
1851+
1852+
hTable.delete(deleteKey1Family);
1853+
hTable.delete(deleteKey2Family);
1854+
tryPut(hTable, putKey1Column1Value1);
1855+
tryPut(hTable, putKey1Column1Value2);
1856+
tryPut(hTable, putKey1Column1Value1);
1857+
tryPut(hTable, putKey1Column2Value1);
1858+
tryPut(hTable, putKey1Column2Value2);
1859+
tryPut(hTable, putKey1Column2Value1);
1860+
tryPut(hTable, putKey1Column2Value2);
1861+
tryPut(hTable, putKey1Column3Value1);
1862+
tryPut(hTable, putKey1Column4Value1);
1863+
tryPut(hTable, putKey1Column5Value1);
1864+
tryPut(hTable, putKey2Column2Value1);
1865+
tryPut(hTable, putKey2Column2Value2);
1866+
1867+
Scan scan;
1868+
scan = new Scan();
1869+
scan.addFamily(family.getBytes());
1870+
scan.setMaxVersions(10);
1871+
ColumnValueFilter filter = new ColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column2), CompareOperator.EQUAL, Bytes.toBytes(value1));
1872+
scan.setFilter(filter);
1873+
ResultScanner scanner = hTable.getScanner(scan);
1874+
1875+
int res_count = 0;
1876+
for (Result result : scanner) {
1877+
for (Cell keyValue : result.rawCells()) {
1878+
System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n",
1879+
Bytes.toString(result.getRow()),
1880+
Bytes.toString(CellUtil.cloneFamily(keyValue)),
1881+
Bytes.toString(CellUtil.cloneQualifier(keyValue)),
1882+
keyValue.getTimestamp(),
1883+
Bytes.toString(CellUtil.cloneValue(keyValue))
1884+
);
1885+
res_count += 1;
1886+
}
1887+
}
1888+
Assert.assertEquals(res_count, 3);
1889+
scanner.close();
1890+
1891+
scan = new Scan();
1892+
scan.addFamily(family.getBytes());
1893+
scan.setMaxVersions(10);
1894+
filter = new ColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column2), CompareOperator.EQUAL, new BinaryPrefixComparator(Bytes.toBytes("value")));
1895+
scan.setFilter(filter);
1896+
scanner = hTable.getScanner(scan);
1897+
1898+
res_count = 0;
1899+
for (Result result : scanner) {
1900+
for (Cell keyValue : result.rawCells()) {
1901+
System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n",
1902+
Bytes.toString(result.getRow()),
1903+
Bytes.toString(CellUtil.cloneFamily(keyValue)),
1904+
Bytes.toString(CellUtil.cloneQualifier(keyValue)),
1905+
keyValue.getTimestamp(),
1906+
Bytes.toString(CellUtil.cloneValue(keyValue))
1907+
);
1908+
res_count += 1;
1909+
}
1910+
}
1911+
Assert.assertEquals(res_count, 6);
1912+
scanner.close();
1913+
1914+
scan = new Scan();
1915+
scan.addFamily(family.getBytes());
1916+
scan.setMaxVersions(10);
1917+
filter = new ColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column2), CompareOperator.GREATER, Bytes.toBytes(value1));
1918+
scan.setFilter(filter);
1919+
scanner = hTable.getScanner(scan);
1920+
1921+
res_count = 0;
1922+
for (Result result : scanner) {
1923+
for (Cell keyValue : result.rawCells()) {
1924+
System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n",
1925+
Bytes.toString(result.getRow()),
1926+
Bytes.toString(CellUtil.cloneFamily(keyValue)),
1927+
Bytes.toString(CellUtil.cloneQualifier(keyValue)),
1928+
keyValue.getTimestamp(),
1929+
Bytes.toString(CellUtil.cloneValue(keyValue))
1930+
);
1931+
res_count += 1;
1932+
}
1933+
}
1934+
Assert.assertEquals(res_count, 3);
1935+
scanner.close();
1936+
1937+
scan = new Scan();
1938+
scan.addFamily(family.getBytes());
1939+
scan.setMaxVersions(10);
1940+
filter = new ColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(column1), CompareOperator.NOT_EQUAL, Bytes.toBytes(value1));
1941+
scan.setFilter(filter);
1942+
scanner = hTable.getScanner(scan);
1943+
1944+
res_count = 0;
1945+
for (Result result : scanner) {
1946+
for (Cell keyValue : result.rawCells()) {
1947+
System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n",
1948+
Bytes.toString(result.getRow()),
1949+
Bytes.toString(CellUtil.cloneFamily(keyValue)),
1950+
Bytes.toString(CellUtil.cloneQualifier(keyValue)),
1951+
keyValue.getTimestamp(),
1952+
Bytes.toString(CellUtil.cloneValue(keyValue))
1953+
);
1954+
res_count += 1;
1955+
}
1956+
}
1957+
Assert.assertEquals(res_count, 1);
1958+
scanner.close();
1959+
1960+
scan = new Scan();
1961+
scan.addFamily(family.getBytes());
1962+
scan.setMaxVersions(10);
1963+
filter = new ColumnValueFilter(Bytes.toBytes("ff"), Bytes.toBytes(column1), CompareOperator.NOT_EQUAL, Bytes.toBytes(value1));
1964+
scan.setFilter(filter);
1965+
scanner = hTable.getScanner(scan);
1966+
1967+
res_count = 0;
1968+
for (Result result : scanner) {
1969+
for (Cell keyValue : result.rawCells()) {
1970+
System.out.printf("Rowkey: %s, Column Family: %s, Column Qualifier: %s, Timestamp: %d, Value: %s%n",
1971+
Bytes.toString(result.getRow()),
1972+
Bytes.toString(CellUtil.cloneFamily(keyValue)),
1973+
Bytes.toString(CellUtil.cloneQualifier(keyValue)),
1974+
keyValue.getTimestamp(),
1975+
Bytes.toString(CellUtil.cloneValue(keyValue))
1976+
);
1977+
res_count += 1;
1978+
}
1979+
}
1980+
Assert.assertEquals(res_count, 0);
1981+
scanner.close();
1982+
} finally {
1983+
hTable.delete(deleteKey1Family);
1984+
hTable.delete(deleteKey2Family);
1985+
}
1986+
}
1987+
17991988
@Test
18001989
public void testFuzzyRowFilter() throws Exception {
18011990
String key1 = "abab";

src/test/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtilsTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.alipay.oceanbase.hbase.filter;
1919

20+
import org.apache.hadoop.hbase.CompareOperator;
2021
import org.apache.hadoop.hbase.filter.*;
2122
import org.apache.hadoop.hbase.util.Bytes;
2223
import org.apache.hadoop.hbase.util.Pair;
@@ -207,6 +208,14 @@ public void testFuzzyRowFilter() throws IOException {
207208
Assert.assertArrayEquals("FuzzyRowFilter('abc','101','ddd','010')".getBytes(), HBaseFilterUtils.toParseableByteArray(filter));
208209
}
209210

211+
@Test
212+
public void testColumnValueFilter() throws IOException {
213+
ColumnValueFilter filter = new ColumnValueFilter(Bytes.toBytes("cf"), Bytes.toBytes("q"), CompareOperator.EQUAL, Bytes.toBytes("v"));
214+
System.out.println(Bytes.toString(HBaseFilterUtils.toParseableByteArray(filter)));
215+
Assert.assertArrayEquals("ColumnValueFilter('cf','q',=,'binary:v')".getBytes(),
216+
HBaseFilterUtils.toParseableByteArray(filter));
217+
}
218+
210219
@Test
211220
public void testMultiRowRangeFilter() throws IOException {
212221
List<MultiRowRangeFilter.RowRange> ranges = new ArrayList<>();

0 commit comments

Comments
 (0)