Boris created HBASE-26967:
-----------------------------
Summary: FilterList with FuzzyRowFilter and
SingleColumnValueFilter evaluated with operator MUST_PASS_ONE doesn't work as
expected
Key: HBASE-26967
URL: https://issues.apache.org/jira/browse/HBASE-26967
Project: HBase
Issue Type: Bug
Components: Filters
Affects Versions: 2.4.11
Reporter: Boris
I created test table with two column families:
{quote}_create 'test_table2', 'f1', 'f2'_
_put 'test_table2', '1', 'f1:col1', 'a1'_
_put 'test_table2', '1', 'f2:col2', 'a2'_
_put 'test_table2', '2', 'f1:col1', 'b1'_
_put 'test_table2', '2', 'f2:col2', 'b2'_
{quote}
code snippet below doesn't work as expected:
{quote}_{color:#0033b3}try {color}({color:#000000}Table table {color}=
{color:#000000}connection{color}.getTable({color:#000000}TableName{color}.valueOf({color:#067d17}"test_table2"{color})))
{_
_{color:#000000}Scan scan {color}= {color:#0033b3}new {color}Scan();_
_{color:#000000}scan{color}.addFamily({color:#000000}Bytes{color}.toBytes({color:#067d17}"f1"{color}));_
_{color:#000000}scan{color}.addFamily({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}));_
_{color:#000000}scan{color}.setFilter({color:#0033b3}new
{color}FuzzyRowFilter({color:#000000}List{color}.of({color:#0033b3}new
{color}Pair<>({color:#000000}Bytes{color}.toBytes({color:#067d17}"1"{color}),
{color:#0033b3}new byte{color}[] { {color:#1750eb}0x00 {color}}))));_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of fuzzy filter:"{color});_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of single column value filter:"{color});_
_{color:#000000}scan{color}.setFilter(_
_{color:#0033b3}new
{color}SingleColumnValueFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}),
{color:#000000}Bytes{color}.toBytes({color:#067d17}"col2"{color}),
{color:#000000}CompareOperator{color}.{color:#871094}EQUAL{color},
{color:#000000}Bytes{color}.toBytes({color:#067d17}"x"{color})));_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of fuzzy or single column value filters:"{color});_
_{color:#000000}FilterList filterList {color}= {color:#0033b3}new
{color}FilterList({color:#000000}Operator{color}.{color:#871094}MUST_PASS_ONE{color});_
_{color:#000000}filterList{color}.addFilter({color:#0033b3}new
{color}FuzzyRowFilter({color:#000000}List{color}.of({color:#0033b3}new
{color}Pair<>({color:#000000}Bytes{color}.toBytes({color:#067d17}"1"{color}),
{color:#0033b3}new byte{color}[] { {color:#1750eb}0x00 {color}}))));_
_{color:#000000}filterList{color}.addFilter(_
_{color:#0033b3}new
{color}SingleColumnValueFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}),
{color:#000000}Bytes{color}.toBytes({color:#067d17}"col2"{color}),
{color:#000000}CompareOperator{color}.{color:#871094}EQUAL{color},
{color:#000000}Bytes{color}.toBytes({color:#067d17}"x"{color})));_
_{color:#000000}scan{color}.setFilter({color:#000000}filterList{color});_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_}_
{quote}
Expected result in my opinion is:
{quote}result of fuzzy filter:
1
result of single column value filter:
result of fuzzy or single column value filters:
1
{quote}
But i got (NOT OK):
{quote}result of fuzzy filter:
1
result of single column value filter:
result of fuzzy or single column value filters:
1
2
{quote}
For tables with one column family or commentig out line
_{color:#000000}scan{color}.addFamily({color:#000000}Bytes{color}.toBytes({color:#067d17}"f1"{color}))_
filter list evaluation is working OK. Similar example with PrefixFilter is
working like a charm:
{quote}_{color:#0033b3}try {color}({color:#000000}Table table {color}=
{color:#000000}connection{color}.getTable({color:#000000}TableName{color}.valueOf({color:#067d17}"test_table2"{color})))
{_
_{color:#000000}Scan scan {color}= {color:#0033b3}new {color}Scan();_
_{color:#000000}scan{color}.addFamily({color:#000000}Bytes{color}.toBytes({color:#067d17}"f1"{color}));_
_{color:#000000}scan{color}.addFamily({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}));_
_{color:#000000}scan{color}.setFilter({color:#0033b3}new
{color}PrefixFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"1"{color})));_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of prefix filter:"{color});_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of single column value filter:"{color});_
_{color:#000000}scan{color}.setFilter(_
_{color:#0033b3}new
{color}SingleColumnValueFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}),
{color:#000000}Bytes{color}.toBytes({color:#067d17}"col2"{color}),
{color:#000000}CompareOperator{color}.{color:#871094}EQUAL{color},
{color:#000000}Bytes{color}.toBytes({color:#067d17}"x"{color})));_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#067d17}"result
of prefix or single column value filters"{color});_
_{color:#000000}FilterList filterList {color}= {color:#0033b3}new
{color}FilterList({color:#000000}Operator{color}.{color:#871094}MUST_PASS_ONE{color});_
_{color:#000000}filterList{color}.addFilter({color:#0033b3}new
{color}PrefixFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"1"{color})));_
_{color:#000000}filterList{color}.addFilter(_
_{color:#0033b3}new
{color}SingleColumnValueFilter({color:#000000}Bytes{color}.toBytes({color:#067d17}"f2"{color}),
{color:#000000}Bytes{color}.toBytes({color:#067d17}"col2"{color}),
{color:#000000}CompareOperator{color}.{color:#871094}EQUAL{color},
{color:#000000}Bytes{color}.toBytes({color:#067d17}"x"{color})));_
_{color:#000000}scan{color}.setFilter({color:#000000}filterList{color});_
_{color:#0033b3}for {color}({color:#000000}Result r {color}:
{color:#000000}table{color}.getScanner({color:#000000}scan{color})) {_
_{color:#000000}System{color}.{color:#871094}out{color}.println({color:#000000}Bytes{color}.toString({color:#000000}r{color}.getRow()));_
_}_
_}_
{quote}
Result OK{_}:{_}
{quote}result of prefix filter:
1
result of single column value filter:
result of prefix or single column value filters
1
{quote}
--
This message was sent by Atlassian Jira
(v8.20.7#820007)