Skip to content

Commit ac8a0ca

Browse files
committed
get bugfix
1 parent 1376713 commit ac8a0ca

File tree

2 files changed

+64
-62
lines changed

2 files changed

+64
-62
lines changed

src/main/java/com/alipay/oceanbase/hbase/OHTable.java

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import org.apache.hadoop.hbase.client.coprocessor.Batch;
5555
import org.apache.hadoop.hbase.filter.CompareFilter;
5656
import org.apache.hadoop.hbase.filter.Filter;
57+
import org.apache.hadoop.hbase.filter.FilterList;
58+
import org.apache.hadoop.hbase.filter.PageFilter;
5759
import org.apache.hadoop.hbase.io.TimeRange;
5860
import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
5961
import org.apache.hadoop.hbase.util.Bytes;
@@ -503,24 +505,10 @@ public Result call() throws IOException {
503505
ObTableClientQueryStreamResult clientQueryStreamResult;
504506
ObTableQueryRequest request;
505507
ObTableQuery obTableQuery;
506-
ObHTableFilter filter;
507508
try {
508509
if (get.getFamilyMap().keySet() == null
509510
|| get.getFamilyMap().keySet().size() == 0) {
510-
filter = buildObHTableFilter(get.getFilter(), get.getTimeRange(),
511-
get.getMaxVersions(), null);
512-
if (get.isClosestRowBefore()) {
513-
Scan scan = new Scan();
514-
scan.setStartRow(get.getRow());
515-
scan.setCaching(1);
516-
scan.setReversed(true);
517-
obTableQuery = buildObTableQuery(filter, scan);
518-
obTableQuery.setObKVParams(buildOBKVParams(scan));
519-
} else {
520-
obTableQuery = buildObTableQuery(filter, get.getRow(), true,
521-
get.getRow(), true);
522-
obTableQuery.setObKVParams(buildOBKVParams(get));
523-
}
511+
obTableQuery = buildObTableQuery(get, null);
524512
request = buildObTableQueryRequest(obTableQuery,
525513
getTargetTableName(tableNameString));
526514

@@ -531,19 +519,7 @@ public Result call() throws IOException {
531519
for (Map.Entry<byte[], NavigableSet<byte[]>> entry : get.getFamilyMap()
532520
.entrySet()) {
533521
family = entry.getKey();
534-
filter = buildObHTableFilter(get.getFilter(), get.getTimeRange(),
535-
get.getMaxVersions(), entry.getValue());
536-
if (get.isClosestRowBefore()) {
537-
Scan scan = new Scan(get.getRow());
538-
scan.setCaching(1);
539-
scan.setReversed(true);
540-
obTableQuery = buildObTableQuery(filter, scan);
541-
obTableQuery.setObKVParams(buildOBKVParams(scan));
542-
} else {
543-
obTableQuery = buildObTableQuery(filter, get.getRow(), true,
544-
get.getRow(), true);
545-
obTableQuery.setObKVParams(buildOBKVParams(get));
546-
}
522+
obTableQuery = buildObTableQuery(get, entry.getValue());
547523
request = buildObTableQueryRequest(obTableQuery,
548524
getTargetTableName(tableNameString, Bytes.toString(family)));
549525
clientQueryStreamResult = (ObTableClientQueryStreamResult) obTableClient
@@ -870,7 +846,7 @@ private boolean checkAndMutation(byte[] row, byte[] family, byte[] qualifier, Co
870846
keyValueList.addAll(entry.getValue());
871847
}
872848
}
873-
ObTableQuery obTableQuery = buildObTableQuery(filter, row, true, row, true);
849+
ObTableQuery obTableQuery = buildObTableQuery(filter, row, true, row, true, false);
874850

875851
ObTableBatchOperation batch = buildObTableBatchOperation(keyValueList, false, null);
876852

@@ -908,7 +884,7 @@ public Result append(Append append) throws IOException {
908884
true, qualifiers);
909885
// the later hbase has supported timeRange
910886
ObHTableFilter filter = buildObHTableFilter(null, null, 1, qualifiers);
911-
ObTableQuery obTableQuery = buildObTableQuery(filter, r, true, r, true);
887+
ObTableQuery obTableQuery = buildObTableQuery(filter, r, true, r, true, false);
912888
ObTableQueryAndMutate queryAndMutate = new ObTableQueryAndMutate();
913889
queryAndMutate.setTableQuery(obTableQuery);
914890
queryAndMutate.setMutations(batchOperation);
@@ -963,11 +939,11 @@ public Result increment(Increment increment) throws IOException {
963939
batch.addTableOperation(getInstance(INCREMENT, new Object[] { rowKey, qualifier,
964940
Long.MAX_VALUE }, V_COLUMNS, new Object[] { cell.getValue() }));
965941
});
966-
942+
967943
ObHTableFilter filter = buildObHTableFilter(null, increment.getTimeRange(), 1,
968944
qualifiers);
969945

970-
ObTableQuery obTableQuery = buildObTableQuery(filter, rowKey, true, rowKey, true);
946+
ObTableQuery obTableQuery = buildObTableQuery(filter, rowKey, true, rowKey, true, false);
971947
ObTableQueryAndMutate queryAndMutate = new ObTableQueryAndMutate();
972948
queryAndMutate.setMutations(batch);
973949
queryAndMutate.setTableQuery(obTableQuery);
@@ -1017,7 +993,7 @@ public long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, lo
1017993

1018994
ObHTableFilter filter = buildObHTableFilter(null, null, 1, qualifiers);
1019995

1020-
ObTableQuery obTableQuery = buildObTableQuery(filter, row, true, row, true);
996+
ObTableQuery obTableQuery = buildObTableQuery(filter, row, true, row, true, false);
1021997
ObTableQueryAndMutate queryAndMutate = new ObTableQueryAndMutate();
1022998
queryAndMutate.setMutations(batch);
1023999
queryAndMutate.setTableQuery(obTableQuery);
@@ -1419,7 +1395,8 @@ private ObHTableFilter buildObHTableFilter(String filterString, TimeRange timeRa
14191395
}
14201396

14211397
private ObTableQuery buildObTableQuery(ObHTableFilter filter, byte[] start,
1422-
boolean includeStart, byte[] stop, boolean includeStop) {
1398+
boolean includeStart, byte[] stop, boolean includeStop,
1399+
boolean isReversed) {
14231400
ObNewRange obNewRange = new ObNewRange();
14241401

14251402
if (Arrays.equals(start, HConstants.EMPTY_BYTE_ARRAY)) {
@@ -1440,6 +1417,9 @@ private ObTableQuery buildObTableQuery(ObHTableFilter filter, byte[] start,
14401417
obNewRange.setEndKey(ObRowKey.getInstance(stop, ObObj.getMin(), ObObj.getMin()));
14411418
}
14421419
ObTableQuery obTableQuery = new ObTableQuery();
1420+
if (isReversed) {
1421+
obTableQuery.setScanOrder(ObScanOrder.Reverse);
1422+
}
14431423
obTableQuery.setIndexName("PRIMARY");
14441424
obTableQuery.sethTableFilter(filter);
14451425
for (String column : ALL_COLUMNS) {
@@ -1459,11 +1439,10 @@ private ObTableQuery buildObTableQuery(ObHTableFilter filter, final Scan scan) {
14591439
}
14601440
if (scan.isReversed()) {
14611441
obTableQuery = buildObTableQuery(filter, scan.getStopRow(), false, scan.getStartRow(),
1462-
true);
1463-
obTableQuery.setScanOrder(ObScanOrder.Reverse);
1442+
true, true);
14641443
} else {
14651444
obTableQuery = buildObTableQuery(filter, scan.getStartRow(), true, scan.getStopRow(),
1466-
false);
1445+
false, false);
14671446
}
14681447
if (scan.getBatch() > 0) {
14691448
obTableQuery.setBatchSize(scan.getBatch());
@@ -1475,6 +1454,29 @@ private ObTableQuery buildObTableQuery(ObHTableFilter filter, final Scan scan) {
14751454
return obTableQuery;
14761455
}
14771456

1457+
private ObTableQuery buildObTableQuery(final Get get, Collection<byte[]> columnQualifiers) {
1458+
ObTableQuery obTableQuery;
1459+
if (get.isClosestRowBefore()) {
1460+
PageFilter pageFilter = new PageFilter(1);
1461+
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
1462+
filterList.addFilter(pageFilter);
1463+
if (null != get.getFilter()) {
1464+
filterList.addFilter(get.getFilter());
1465+
}
1466+
get.setFilter(filterList);
1467+
}
1468+
ObHTableFilter filter = buildObHTableFilter(get.getFilter(), get.getTimeRange(),
1469+
get.getMaxVersions(), columnQualifiers);
1470+
if (get.isClosestRowBefore()) {
1471+
obTableQuery = buildObTableQuery(filter, HConstants.EMPTY_BYTE_ARRAY, true,
1472+
get.getRow(), true, true);
1473+
} else {
1474+
obTableQuery = buildObTableQuery(filter, get.getRow(), true, get.getRow(), true, false);
1475+
}
1476+
obTableQuery.setObKVParams(buildOBKVParams(get));
1477+
return obTableQuery;
1478+
}
1479+
14781480
private ObTableBatchOperation buildObTableBatchOperation(List<KeyValue> keyValueList,
14791481
boolean putToAppend,
14801482
List<byte[]> qualifiers) {

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

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ public void testFilter() throws Exception {
495495

496496
Get get;
497497
Result r;
498+
ColumnPrefixFilter filter;
498499

499500
hTable.delete(deleteKey1Family);
500501
hTable.delete(deleteKey2Family);
@@ -508,31 +509,31 @@ public void testFilter() throws Exception {
508509
tryPut(hTable, putKey2Column2Value1);
509510
tryPut(hTable, putKey2Column2Value2);
510511

511-
ColumnPrefixFilter filter = new ColumnPrefixFilter(Bytes.toBytes("a"));
512+
filter = new ColumnPrefixFilter(Bytes.toBytes("e"));
512513
get = new Get(toBytes(key1));
513514
get.setMaxVersions(10);
514515
get.addFamily(toBytes(family));
515516
get.setFilter(filter);
516517
r = hTable.get(get);
517-
Assert.assertEquals(3, r.raw().length);
518+
Assert.assertEquals(0, r.raw().length);
518519

519-
filter = new ColumnPrefixFilter(Bytes.toBytes("d"));
520+
filter = new ColumnPrefixFilter(Bytes.toBytes("a"));
520521
get = new Get(toBytes(key1));
521522
get.setMaxVersions(10);
522523
get.addFamily(toBytes(family));
523524
get.setFilter(filter);
524525
r = hTable.get(get);
525-
Assert.assertEquals(4, r.raw().length);
526+
Assert.assertEquals(3, r.raw().length);
526527

527-
filter = new ColumnPrefixFilter(Bytes.toBytes("b"));
528+
filter = new ColumnPrefixFilter(Bytes.toBytes("d"));
528529
get = new Get(toBytes(key1));
529530
get.setMaxVersions(10);
530531
get.addFamily(toBytes(family));
531532
get.setFilter(filter);
532533
r = hTable.get(get);
533-
Assert.assertEquals(0, r.raw().length);
534+
Assert.assertEquals(4, r.raw().length);
534535

535-
filter = new ColumnPrefixFilter(Bytes.toBytes("e"));
536+
filter = new ColumnPrefixFilter(Bytes.toBytes("b"));
536537
get = new Get(toBytes(key1));
537538
get.setMaxVersions(10);
538539
get.addFamily(toBytes(family));
@@ -1732,6 +1733,7 @@ public void testScan() throws Exception {
17321733
Get get;
17331734
Scan scan;
17341735
Result r;
1736+
ResultScanner scanner;
17351737
int res_count = 0;
17361738

17371739
tryPut(hTable, putKey1Column1Value1);
@@ -1769,6 +1771,21 @@ public void testScan() throws Exception {
17691771
//| scanKey3x | column2 | -1709714409977 | value1 |
17701772
//+-----------+---------+----------------+--------+
17711773

1774+
scan = new Scan();
1775+
scan.addFamily(family.getBytes());
1776+
scan.setStartRow("scanKey1x".getBytes());
1777+
scan.setStopRow("scanKey3x".getBytes());
1778+
scan.setMaxVersions(10);
1779+
scan.setMaxResultsPerColumnFamily(2);
1780+
scan.setRowOffsetPerColumnFamily(1);
1781+
scanner = hTable.getScanner(scan);
1782+
res_count = 0;
1783+
for (Result result : scanner) {
1784+
res_count += result.size();
1785+
}
1786+
Assert.assertEquals(3, res_count);
1787+
scanner.close();
1788+
17721789
// check insert ok
17731790
get = new Get(toBytes(key1));
17741791
get.addFamily(toBytes(family));
@@ -1790,7 +1807,7 @@ public void testScan() throws Exception {
17901807
scan.setStartRow("scanKey1x".getBytes());
17911808
scan.setStopRow("scanKey2x".getBytes());
17921809
scan.setMaxVersions(10);
1793-
ResultScanner scanner = hTable.getScanner(scan);
1810+
scanner = hTable.getScanner(scan);
17941811
res_count = 0;
17951812
for (Result result : scanner) {
17961813
for (KeyValue keyValue : result.raw()) {
@@ -1852,23 +1869,6 @@ public void testScan() throws Exception {
18521869

18531870
scanner.close();
18541871

1855-
scan = new Scan();
1856-
scan.addFamily(family.getBytes());
1857-
scan.setStartRow("scanKey1x".getBytes());
1858-
scan.setStopRow("scanKey3x".getBytes());
1859-
scan.setMaxVersions(10);
1860-
scan.setMaxResultsPerColumnFamily(2);
1861-
scan.setRowOffsetPerColumnFamily(1);
1862-
scanner = hTable.getScanner(scan);
1863-
res_count = 0;
1864-
for (Result result : scanner) {
1865-
for (KeyValue keyValue : result.raw()) {
1866-
res_count += 1;
1867-
}
1868-
}
1869-
Assert.assertEquals(3, res_count);
1870-
scanner.close();
1871-
18721872
// scan with prefixFilter
18731873
scan = new Scan();
18741874
scan.addFamily(family.getBytes());

0 commit comments

Comments
 (0)