[ https://issues.apache.org/jira/browse/HBASE-22969?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16926321#comment-16926321 ]
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} 2m 13s{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 1s{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 1 new or modified test files. {color} | || || || || {color:brown} master Compile Tests {color} || | {color:blue}0{color} | {color:blue} mvndep {color} | {color:blue} 0m 36s{color} | {color:blue} Maven dependency ordering for branch {color} | | {color:green}+1{color} | {color:green} mvninstall {color} | {color:green} 7m 36s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} compile {color} | {color:green} 1m 40s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} checkstyle {color} | {color:green} 0m 54s{color} | {color:green} master passed {color} | | {color:green}+1{color} | {color:green} shadedjars {color} | {color:green} 5m 1s{color} | {color:green} branch has no errors when building our shaded downstream artifacts. {color} | | {color:green}+1{color} | {color:green} javadoc {color} | {color:green} 0m 39s{color} | {color:green} master passed {color} | | {color:blue}0{color} | {color:blue} spotbugs {color} | {color:blue} 1m 16s{color} | {color:blue} Used deprecated FindBugs config; considering switching to SpotBugs. {color} | | {color:green}+1{color} | {color:green} findbugs {color} | {color:green} 5m 22s{color} | {color:green} master passed {color} | || || || || {color:brown} Patch Compile Tests {color} || | {color:blue}0{color} | {color:blue} mvndep {color} | {color:blue} 0m 14s{color} | {color:blue} Maven dependency ordering for patch {color} | | {color:green}+1{color} | {color:green} mvninstall {color} | {color:green} 5m 32s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} compile {color} | {color:green} 1m 27s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} cc {color} | {color:green} 1m 27s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} javac {color} | {color:green} 1m 27s{color} | {color:green} the patch passed {color} | | {color:red}-1{color} | {color:red} checkstyle {color} | {color:red} 0m 33s{color} | {color:red} hbase-client: The patch generated 9 new + 0 unchanged - 0 fixed = 9 total (was 0) {color} | | {color:green}+1{color} | {color:green} whitespace {color} | {color:green} 0m 0s{color} | {color:green} The patch has no whitespace issues. {color} | | {color:green}+1{color} | {color:green} shadedjars {color} | {color:green} 4m 59s{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 35s{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} 1m 47s{color} | {color:green} the patch passed {color} | | {color:green}+1{color} | {color:green} javadoc {color} | {color:green} 0m 40s{color} | {color:green} the patch passed {color} | | {color:red}-1{color} | {color:red} findbugs {color} | {color:red} 1m 28s{color} | {color:red} hbase-client generated 1 new + 0 unchanged - 0 fixed = 1 total (was 0) {color} | || || || || {color:brown} Other Tests {color} || | {color:green}+1{color} | {color:green} unit {color} | {color:green} 0m 41s{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 43s{color} | {color:green} hbase-client in the patch passed. {color} | | {color:green}+1{color} | {color:green} asflicense {color} | {color:green} 0m 25s{color} | {color:green} The patch does not generate ASF License warnings. {color} | | {color:black}{color} | {color:black} {color} | {color:black} 72m 48s{color} | {color:black} {color} | \\ \\ || Reason || Tests || | FindBugs | module:hbase-client | | | org.apache.hadoop.hbase.filter.BinaryComponentComparator defines compareTo(Object) and uses Object.equals() At BinaryComponentComparator.java:Object.equals() At BinaryComponentComparator.java:[line 34] | \\ \\ || Subsystem || Report/Notes || | Docker | Client=19.03.2 Server=19.03.2 base: https://builds.apache.org/job/PreCommit-HBASE-Build/888/artifact/patchprocess/Dockerfile | | JIRA Issue | HBASE-22969 | | JIRA Patch URL | https://issues.apache.org/jira/secure/attachment/12979912/HBASE-22969.0005.patch | | Optional Tests | dupname asflicense javac javadoc unit spotbugs findbugs shadedjars hadoopcheck hbaseanti checkstyle compile cc hbaseprotoc prototool | | uname | Linux 13f5d7ca8a79 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 / 4ca760fe9d | | Default Java | 1.8.0_181 | | checkstyle | https://builds.apache.org/job/PreCommit-HBASE-Build/888/artifact/patchprocess/diff-checkstyle-hbase-client.txt | | findbugs | https://builds.apache.org/job/PreCommit-HBASE-Build/888/artifact/patchprocess/new-findbugs-hbase-client.html | | Test Results | https://builds.apache.org/job/PreCommit-HBASE-Build/888/testReport/ | | Max. process+thread count | 260 (vs. ulimit of 10000) | | modules | C: hbase-protocol-shaded hbase-protocol hbase-client U: . | | Console output | https://builds.apache.org/job/PreCommit-HBASE-Build/888/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 > Priority: Minor > Attachments: HBASE-22969.0003.patch, HBASE-22969.0004.patch, > HBASE-22969.0005.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.2#803003)