[ https://issues.apache.org/jira/browse/HBASE-8930?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Federico Gaule updated HBASE-8930: ---------------------------------- Description: 1- Fill row with some columns 2- Get row with some columns less than universe - Use filter to print kvs 3- Filter prints not requested columns <code> public class ExtraColumnTest { @Test public void testFilter() throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "fgaule-despegar"); HTable hTable = new HTable(config, "availability"); byte[] cf = new AvailabilityColumnFamilyConverter().objectToByteArray(new AvailabilityColumnFamily('H', AvailabilityColumnFamilyType.SEARCH)); AvailabilityRowKey availabilityRowKey = AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642) .setHotelOID(351802).setRoomTypeOID(41048).build(); byte[] row = new AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey); byte[] col1 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col2 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col3 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 560, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col4 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 561, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col5 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 562, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col6 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 563, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col1g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); byte[] col2g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); byte[] col1v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col2v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col3v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 560, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col4v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 561, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col5v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 562, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col6v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 563, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.MINIMUM_RELEASE_DAYS)); Put put = new Put(row); put.add(cf, col1, Bytes.toBytes((short) 1)); put.add(cf, col2, Bytes.toBytes((short) 1)); put.add(cf, col3, Bytes.toBytes((short) 3)); put.add(cf, col4, Bytes.toBytes((short) 3)); put.add(cf, col5, Bytes.toBytes((short) 3)); put.add(cf, col6, Bytes.toBytes((short) 3)); hTable.put(put); put = new Put(row); put.add(cf, col1v, Bytes.toBytes((short) 10)); put.add(cf, col2v, Bytes.toBytes((short) 10)); put.add(cf, col3v, Bytes.toBytes((short) 10)); put.add(cf, col4v, Bytes.toBytes((short) 10)); put.add(cf, col5v, Bytes.toBytes((short) 10)); put.add(cf, col6v, Bytes.toBytes((short) 10)); hTable.put(put); hTable.flushCommits(); Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter(); Get get = new Get(row); get.addColumn(cf, col1); get.addColumn(cf, col2); get.addColumn(cf, col1v); get.addColumn(cf, col2v); get.addColumn(cf, col1g); get.addColumn(cf, col2g); get.setFilter(releaseDayAvailabilityFilter); get.setMaxVersions(1); System.out.println(get); Scan scan = new Scan(get); ResultScanner scanner = hTable.getScanner(scan); Iterator<Result> iterator = scanner.iterator(); System.out.println("SCAN"); while (iterator.hasNext()) { Result next = iterator.next(); for (KeyValue kv : next.list()) { System.out.println(new AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier())); } } } } </code> <sysout.filter> bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2 bq. AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3 bq. AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2 bq. AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} bq. \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3 bq. AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} bq. bq. *\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2* bq. *AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}* </sysout.filter> <sysout.test> {"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"} SCAN AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} </sysout.test> was: 1- Fill row with some columns 2- Get row with some columns less than universe - Use filter to print kvs 3- Filter prints not requested columns <code> public class ExtraColumnTest { @Test public void testFilter() throws Exception { Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "fgaule-despegar"); HTable hTable = new HTable(config, "availability"); byte[] cf = new AvailabilityColumnFamilyConverter().objectToByteArray(new AvailabilityColumnFamily('H', AvailabilityColumnFamilyType.SEARCH)); AvailabilityRowKey availabilityRowKey = AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642) .setHotelOID(351802).setRoomTypeOID(41048).build(); byte[] row = new AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey); byte[] col1 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col2 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col3 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 560, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col4 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 561, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col5 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 562, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col6 = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 563, AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); byte[] col1g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); byte[] col2g = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); byte[] col1v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col2v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 559, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col3v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 560, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col4v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 561, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col5v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 562, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); byte[] col6v = new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 563, AvailabilityQualifierType.VARIABLE_ALLOTMENT)); new AvailabilityQualifierConverter().objectToByteArray(new AvailabilityQualifier((short) 558, AvailabilityQualifierType.MINIMUM_RELEASE_DAYS)); Put put = new Put(row); put.add(cf, col1, Bytes.toBytes((short) 1)); put.add(cf, col2, Bytes.toBytes((short) 1)); put.add(cf, col3, Bytes.toBytes((short) 3)); put.add(cf, col4, Bytes.toBytes((short) 3)); put.add(cf, col5, Bytes.toBytes((short) 3)); put.add(cf, col6, Bytes.toBytes((short) 3)); hTable.put(put); put = new Put(row); put.add(cf, col1v, Bytes.toBytes((short) 10)); put.add(cf, col2v, Bytes.toBytes((short) 10)); put.add(cf, col3v, Bytes.toBytes((short) 10)); put.add(cf, col4v, Bytes.toBytes((short) 10)); put.add(cf, col5v, Bytes.toBytes((short) 10)); put.add(cf, col6v, Bytes.toBytes((short) 10)); hTable.put(put); hTable.flushCommits(); Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter(); Get get = new Get(row); get.addColumn(cf, col1); get.addColumn(cf, col2); get.addColumn(cf, col1v); get.addColumn(cf, col2v); get.addColumn(cf, col1g); get.addColumn(cf, col2g); get.setFilter(releaseDayAvailabilityFilter); get.setMaxVersions(1); System.out.println(get); Scan scan = new Scan(get); ResultScanner scanner = hTable.getScanner(scan); Iterator<Result> iterator = scanner.iterator(); System.out.println("SCAN"); while (iterator.hasNext()) { Result next = iterator.next(); for (KeyValue kv : next.list()) { System.out.println(new AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier())); } } } } </code> <sysout.filter> \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2 AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3 AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2 AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3 AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} *\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2* *AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}* </sysout.filter> <sysout.test> {"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"} SCAN AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} </sysout.test> > Filter evaluates KVs outside requested columns > ---------------------------------------------- > > Key: HBASE-8930 > URL: https://issues.apache.org/jira/browse/HBASE-8930 > Project: HBase > Issue Type: Bug > Components: Filters > Affects Versions: 0.94.7 > Reporter: Federico Gaule > Priority: Critical > > 1- Fill row with some columns > 2- Get row with some columns less than universe - Use filter to print kvs > 3- Filter prints not requested columns > <code> > public class ExtraColumnTest { > @Test > public void testFilter() throws Exception { > Configuration config = HBaseConfiguration.create(); > config.set("hbase.zookeeper.quorum", "fgaule-despegar"); > HTable hTable = new HTable(config, "availability"); > byte[] cf = new > AvailabilityColumnFamilyConverter().objectToByteArray(new > AvailabilityColumnFamily('H', > AvailabilityColumnFamilyType.SEARCH)); > AvailabilityRowKey availabilityRowKey = > AvailabilityRowKeyBuilder.create().setCityOID(6846).setContractOID(15642) > .setHotelOID(351802).setRoomTypeOID(41048).build(); > byte[] row = new > AvailabilityRowKeyByteConverter().objectToByteArray(availabilityRowKey); > byte[] col1 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 558, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col2 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 559, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col3 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 560, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col4 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 561, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col5 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 562, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col6 = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 563, > AvailabilityQualifierType.MINIMUM_RESERVATION_DAYS)); > byte[] col1g = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 558, > AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); > byte[] col2g = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 559, > AvailabilityQualifierType.GUARANTEE_ALLOTMENT)); > byte[] col1v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 558, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > byte[] col2v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 559, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > byte[] col3v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 560, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > byte[] col4v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 561, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > byte[] col5v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 562, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > byte[] col6v = new > AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 563, > AvailabilityQualifierType.VARIABLE_ALLOTMENT)); > new AvailabilityQualifierConverter().objectToByteArray(new > AvailabilityQualifier((short) 558, > AvailabilityQualifierType.MINIMUM_RELEASE_DAYS)); > Put put = new Put(row); > put.add(cf, col1, Bytes.toBytes((short) 1)); > put.add(cf, col2, Bytes.toBytes((short) 1)); > put.add(cf, col3, Bytes.toBytes((short) 3)); > put.add(cf, col4, Bytes.toBytes((short) 3)); > put.add(cf, col5, Bytes.toBytes((short) 3)); > put.add(cf, col6, Bytes.toBytes((short) 3)); > hTable.put(put); > put = new Put(row); > put.add(cf, col1v, Bytes.toBytes((short) 10)); > put.add(cf, col2v, Bytes.toBytes((short) 10)); > put.add(cf, col3v, Bytes.toBytes((short) 10)); > put.add(cf, col4v, Bytes.toBytes((short) 10)); > put.add(cf, col5v, Bytes.toBytes((short) 10)); > put.add(cf, col6v, Bytes.toBytes((short) 10)); > hTable.put(put); > hTable.flushCommits(); > Filter releaseDayAvailabilityFilter = new AllwaysNextColFilter(); > Get get = new Get(row); > get.addColumn(cf, col1); > get.addColumn(cf, col2); > get.addColumn(cf, col1v); > get.addColumn(cf, col2v); > get.addColumn(cf, col1g); > get.addColumn(cf, col2g); > get.setFilter(releaseDayAvailabilityFilter); > get.setMaxVersions(1); > System.out.println(get); > Scan scan = new Scan(get); > ResultScanner scanner = hTable.getScanner(scan); > Iterator<Result> iterator = scanner.iterator(); > System.out.println("SCAN"); > while (iterator.hasNext()) { > Result next = iterator.next(); > for (KeyValue kv : next.list()) { > System.out.println(new > AvailabilityQualifierConverter().byteArrayToObject(kv.getQualifier())); > } > } > } > } > </code> > <sysout.filter> > bq. > \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x01/1373577819267/Put/vlen=2/ts=2 > bq. AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} > bq. > \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02.\x02/1373577819272/Put/vlen=2/ts=3 > bq. AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} > bq. > \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x01/1373577819267/Put/vlen=2/ts=2 > bq. AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} > bq. > \x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x02/\x02/1373577819272/Put/vlen=2/ts=3 > bq. AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} > bq. > bq. > *\x00\x00\x1A\xBE\x00\x05^:\x00\x00\xA0X\x00\x00=\x1A/H0:\x020\x01/1373577819267/Put/vlen=2/ts=2* > bq. *AvailabilityQualifier{date=560, type=MINIMUM_RESERVATION_DAYS}* > </sysout.filter> > <sysout.test> > {"timeRange":[0,9223372036854775807],"totalColumns":6,"cacheBlocks":true,"families":{"H0":["\\x02.\\x01","\\x02.\\x02","\\x02.\\x06","\\x02/\\x01"]},"maxVersions":1,"filter":"AllwaysNextColFilter","row":"\\x00\\x00\\x1A\\xBE\\x00\\x05^:\\x00\\x00\\xA0X\\x00\\x00=\\x1A"} > SCAN > AvailabilityQualifier{date=558, type=MINIMUM_RESERVATION_DAYS} > AvailabilityQualifier{date=558, type=VARIABLE_ALLOTMENT} > AvailabilityQualifier{date=559, type=MINIMUM_RESERVATION_DAYS} > AvailabilityQualifier{date=559, type=VARIABLE_ALLOTMENT} > </sysout.test> -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira