[ https://issues.apache.org/jira/browse/HBASE-22969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16945328#comment-16945328 ]
HBase QA commented on HBASE-22969: ---------------------------------- | (x) *{color:red}-1 overall{color}* | \\ \\ || Vote || Subsystem || Runtime || Comment || | {color:blue}0{color} | {color:blue} reexec {color} | {color:blue} 1m 32s{color} | {color:blue} Docker mode activated. {color} | || || || || {color:brown} Prechecks {color} || | {color:green}+1{color} | {color:green} dupname {color} | {color:green} 0m 0s{color} | {color:green} No case conflicting files found. {color} | | {color:blue}0{color} | {color:blue} prototool {color} | {color:blue} 0m 0s{color} | {color:blue} prototool was not available. {color} | | {color:green}+1{color} | {color:green} hbaseanti {color} | {color:green} 0m 0s{color} | {color:green} Patch does not have any anti-patterns. {color} | | {color:green}+1{color} | {color:green} @author {color} | {color:green} 0m 0s{color} | {color:green} The patch does not contain any @author tags. {color} | | {color:green}+1{color} | {color:green} test4tests {color} | {color:green} 0m 0s{color} | {color:green} The patch appears to include 2 new or modified test files. {color} | || || || || {color:brown} master Compile Tests {color} || | {color:blue}0{color} | {color:blue} mvndep {color} | {color:blue} 0m 27s{color} | {color:blue} Maven dependency ordering for branch {color} | | {color:green}+1{color} | {color:green} mvninstall {color} | {color:green} 5m 29s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} compile {color} | {color:green} 2m 20s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} checkstyle {color} | {color:green} 2m 17s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} shadedjars {color} | {color:green} 4m 55s{color} | {color:green} branch has no errors when building our shaded downstream artifacts. {color} | | {color:green}+1{color} | {color:green} javadoc {color} | {color:green} 1m 12s{color} | {color:green} master passed {color} | | {color:blue}0{color} | {color:blue} spotbugs {color} | {color:blue} 4m 33s{color} | {color:blue} Used deprecated FindBugs config; considering switching to SpotBugs. {color} | | {color:green}+1{color} | {color:green} findbugs {color} | {color:green} 9m 34s{color} | {color:green} master passed {color} | || || || || {color:brown} Patch Compile Tests {color} || | {color:blue}0{color} | {color:blue} mvndep {color} | {color:blue} 0m 13s{color} | {color:blue} Maven dependency ordering for patch {color} | | {color:green}+1{color} | {color:green} mvninstall {color} | {color:green} 5m 25s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} compile {color} | {color:green} 2m 20s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} cc {color} | {color:green} 2m 20s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} javac {color} | {color:green} 2m 20s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} checkstyle {color} | {color:green} 2m 14s{color} | {color:green} the patch passed {color} | | {color:red}-1{color} | {color:red} whitespace {color} | {color:red} 0m 0s{color} | {color:red} The patch has 1 line(s) that end in whitespace. Use git apply --whitespace=fix <<patch_file>>. Refer https://git-scm.com/docs/git-apply {color} | | {color:green}+1{color} | {color:green} shadedjars {color} | {color:green} 4m 57s{color} | {color:green} patch has no errors when building our shaded downstream artifacts. {color} | | {color:green}+1{color} | {color:green} hadoopcheck {color} | {color:green} 17m 4s{color} | {color:green} Patch does not cause any errors with Hadoop 2.8.5 2.9.2 or 3.1.2. {color} | | {color:green}+1{color} | {color:green} hbaseprotoc {color} | {color:green} 2m 16s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} javadoc {color} | {color:green} 1m 12s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} findbugs {color} | {color:green} 10m 3s{color} | {color:green} the patch passed {color} | || || || || {color:brown} Other Tests {color} || | {color:green}+1{color} | {color:green} unit {color} | {color:green} 0m 40s{color} | {color:green} hbase-protocol-shaded in the patch passed. {color} | | {color:green}+1{color} | {color:green} unit {color} | {color:green} 0m 24s{color} | {color:green} hbase-protocol in the patch passed. {color} | | {color:green}+1{color} | {color:green} unit {color} | {color:green} 1m 42s{color} | {color:green} hbase-client in the patch passed. {color} | | {color:green}+1{color} | {color:green} unit {color} | {color:green}237m 0s{color} | {color:green} hbase-server in the patch passed. {color} | | {color:green}+1{color} | {color:green} asflicense {color} | {color:green} 1m 28s{color} | {color:green} The patch does not generate ASF License warnings. {color} | | {color:black}{color} | {color:black} {color} | {color:black}321m 21s{color} | {color:black} {color} | \\ \\ || Subsystem || Report/Notes || | Docker | Client=19.03.2 Server=19.03.2 base: https://builds.apache.org/job/PreCommit-HBASE-Build/943/artifact/patchprocess/Dockerfile | | JIRA Issue | HBASE-22969 | | JIRA Patch URL | https://issues.apache.org/jira/secure/attachment/12982300/HBASE-22969.0010.patch | | Optional Tests | dupname asflicense javac javadoc unit spotbugs findbugs shadedjars hadoopcheck hbaseanti checkstyle compile cc hbaseprotoc prototool | | uname | Linux 5a1576f134e4 4.15.0-58-generic #64-Ubuntu SMP Tue Aug 6 11:12:41 UTC 2019 x86_64 GNU/Linux | | Build tool | maven | | Personality | dev-support/hbase-personality.sh | | git revision | master / f69e7705e0 | | Default Java | 1.8.0_181 | | whitespace | https://builds.apache.org/job/PreCommit-HBASE-Build/943/artifact/patchprocess/whitespace-eol.txt | | Test Results | https://builds.apache.org/job/PreCommit-HBASE-Build/943/testReport/ | | Max. process+thread count | 4622 (vs. ulimit of 10000) | | modules | C: hbase-protocol-shaded hbase-protocol hbase-client hbase-server U: . | | Console output | https://builds.apache.org/job/PreCommit-HBASE-Build/943/console | | versions | git=2.11.0 maven=2018-06-17T18:33:14Z) findbugs=3.1.11 | | Powered by | Apache Yetus 0.11.0 https://yetus.apache.org | This message was automatically generated. > A new binary component comparator(BinaryComponentComparator) to perform > comparison of arbitrary length and position > ------------------------------------------------------------------------------------------------------------------- > > Key: HBASE-22969 > URL: https://issues.apache.org/jira/browse/HBASE-22969 > Project: HBase > Issue Type: Improvement > Components: Filters > Reporter: Udai Bhan Kashyap > Assignee: Udai Bhan Kashyap > Priority: Minor > Attachments: HBASE-22969.0003.patch, HBASE-22969.0004.patch, > HBASE-22969.0005.patch, HBASE-22969.0006.patch, HBASE-22969.0007.patch, > HBASE-22969.0008.patch, HBASE-22969.0009.patch, HBASE-22969.0010.patch, > HBASE-22969.HBASE-22969.0001.patch, HBASE-22969.master.0001.patch > > > Lets say you have composite key: a+b+c+d. And for simplicity assume that > a,b,c, and d all are 4 byte integers. > Now, if you want to execute a query which is semantically same to following > sql: > {{"SELECT * from table where a=1 and b > 10 and b < 20 and c > 90 and c < 100 > and d=1"}} > The only choice you have is to do client side filtering. That could be lots > of unwanted data going through various software components and network. > Solution: > We can create a "component" comparator which takes the value of the > "component" and its relative position in the key to pass the 'Filter' > subsystem of the server: > {code} > FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); > int bOffset = 4; > byte[] b10 = Bytes.toBytes(10); > Filter b10Filter = new RowFilter(CompareFilter.CompareOp.GREATER, > new BinaryComponentComparator(b10,bOffset)); > filterList.addFilter(b10Filter); > byte[] b20 = Bytes.toBytes(20); > Filter b20Filter = new RowFilter(CompareFilter.CompareOp.LESS, > new BinaryComponentComparator(b20,bOffset)); > filterList.addFilter(b20Filter); > int cOffset = 8; > byte[] c90 = Bytes.toBytes(90); > Filter c90Filter = new RowFilter(CompareFilter.CompareOp.GREATER, > new BinaryComponentComparator(c90,cOffset)); > filterList.addFilter(c90Filter); > byte[] c100 = Bytes.toBytes(100); > Filter c100Filter = new RowFilter(CompareFilter.CompareOp.LESS, > new BinaryComponentComparator(c100,cOffset)); > filterList.addFilter(c100Filter); > in dOffset = 12; > byte[] d1 = Bytes.toBytes(1); > Filter dFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, > new BinaryComponentComparator(d1,dOffset)); > filterList.addFilter(dFilter); > //build start and end key for scan > int aOffset = 0; > byte[] startKey = new byte[16]; //key size with four ints > Bytes.putInt(startKey,aOffset,1); //a=1 > Bytes.putInt(startKey,bOffset,11); //b=11, takes care of b > 10 > Bytes.putInt(startKey,cOffset,91); //c=91, > Bytes.putInt(startKey,dOffset,1); //d=1, > byte[] endKey = new byte[16]; > Bytes.putInt(endKey,aOffset,1); //a=1 > Bytes.putInt(endKey,bOffset,20); //b=20, takes care of b < 20 > Bytes.putInt(endKey,cOffset,100); //c=100, > Bytes.putInt(endKey,dOffset,1); //d=1, > //setup scan > Scan scan = new Scan(startKey,endKey); > scan.setFilter(filterList); > //The scanner below now should give only desired rows. > //No client side filtering is required. > ResultScanner scanner = table.getScanner(scan); > {code} > The comparator can be used with any filter which makes use of > ByteArrayComparable. Most notably it can be used with ValueFilter to filter > out KV based on partial comparison of 'values' : > {code} > byte[] partialValue = Bytes.toBytes("partial_value"); > int partialValueOffset = > Filter partialValueFilter = new > ValueFilter(CompareFilter.CompareOp.GREATER, > new BinaryComponentComparator(partialValue,partialValueOffset)); > {code} > Which in turn can be combined with RowFilter to create a poweful predicate: > {code} > RowFilter rowFilter = new RowFilter(GREATER, new > BinaryComponentComparator(Bytes.toBytes("a"),1); > FilterLiost fl = new FilterList > (MUST_PASS_ALL,rowFilter,partialValueFilter); > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)