Skip to content

Commit 868f52b

Browse files
authored
DependentColumnFilter, singleColumnValueExcludeFilter and single cf setColumnFamilyTimeRange development (#82)
* add DepentdentFilter and SingleColumnValueExcludeFilter * add singleColumnValueExcludeFilter and DependentColumnFilter; add test cases and optimize bufferedMutator test cases * add single cf timerange setting in Get * single cf setColumnFamilyTimeRange in Get and Scan * optimize code * report error when setColumnFamilyTimeRange for a column family that is not queryed * correct name
1 parent e8a6ce5 commit 868f52b

File tree

4 files changed

+863
-34
lines changed

4 files changed

+863
-34
lines changed

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,9 @@ public Result call() throws IOException {
585585
// In a Get operation where the family map is greater than 1 or equal to 0,
586586
// we handle this by appending the column family to the qualifier on the client side.
587587
// The server can then use this information to filter the appropriate column families and qualifiers.
588+
if (!get.getColumnFamilyTimeRange().isEmpty()) {
589+
throw new FeatureNotSupportedException("setColumnFamilyTimeRange is only supported in single column family for now");
590+
}
588591
NavigableSet<byte[]> columnFilters = new TreeSet<>(Bytes.BYTES_COMPARATOR);
589592
processColumnFilters(columnFilters, get.getFamilyMap());
590593
obTableQuery = buildObTableQuery(get, columnFilters);
@@ -598,6 +601,17 @@ public Result call() throws IOException {
598601
for (Map.Entry<byte[], NavigableSet<byte[]>> entry : get.getFamilyMap()
599602
.entrySet()) {
600603
family = entry.getKey();
604+
if (!get.getColumnFamilyTimeRange().isEmpty()) {
605+
Map<byte[], TimeRange> colFamTimeRangeMap = get.getColumnFamilyTimeRange();
606+
if (colFamTimeRangeMap.size() > 1) {
607+
throw new FeatureNotSupportedException("setColumnFamilyTimeRange is only supported in single column family for now");
608+
} else if (colFamTimeRangeMap.get(family) == null) {
609+
throw new IllegalArgumentException("Get family is not matched in ColumnFamilyTimeRange");
610+
} else {
611+
TimeRange tr = colFamTimeRangeMap.get(family);
612+
get.setTimeRange(tr.getMin(), tr.getMax());
613+
}
614+
}
601615
obTableQuery = buildObTableQuery(get, entry.getValue());
602616
request = buildObTableQueryAsyncRequest(obTableQuery,
603617
getTargetTableName(tableNameString, Bytes.toString(family),
@@ -668,6 +682,9 @@ public ResultScanner call() throws IOException {
668682
// In a Scan operation where the family map is greater than 1 or equal to 0,
669683
// we handle this by appending the column family to the qualifier on the client side.
670684
// The server can then use this information to filter the appropriate column families and qualifiers.
685+
if (!scan.getColumnFamilyTimeRange().isEmpty()) {
686+
throw new FeatureNotSupportedException("setColumnFamilyTimeRange is only supported in single column family for now");
687+
}
671688
NavigableSet<byte[]> columnFilters = new TreeSet<>(Bytes.BYTES_COMPARATOR);
672689
processColumnFilters(columnFilters, scan.getFamilyMap());
673690
filter = buildObHTableFilter(scan.getFilter(), scan.getTimeRange(),
@@ -684,6 +701,17 @@ public ResultScanner call() throws IOException {
684701
for (Map.Entry<byte[], NavigableSet<byte[]>> entry : scan.getFamilyMap()
685702
.entrySet()) {
686703
family = entry.getKey();
704+
if (!scan.getColumnFamilyTimeRange().isEmpty()) {
705+
Map<byte[], TimeRange> colFamTimeRangeMap = scan.getColumnFamilyTimeRange();
706+
if (colFamTimeRangeMap.size() > 1) {
707+
throw new FeatureNotSupportedException("setColumnFamilyTimeRange is only supported in single column family for now");
708+
} else if (colFamTimeRangeMap.get(family) == null) {
709+
throw new IllegalArgumentException("Scan family is not matched in ColumnFamilyTimeRange");
710+
} else {
711+
TimeRange tr = colFamTimeRangeMap.get(family);
712+
scan.setTimeRange(tr.getMin(), tr.getMax());
713+
}
714+
}
687715
filter = buildObHTableFilter(scan.getFilter(), scan.getTimeRange(),
688716
scan.getMaxVersions(), entry.getValue());
689717
obTableQuery = buildObTableQuery(filter, scan);

src/main/java/com/alipay/oceanbase/hbase/filter/HBaseFilterUtils.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,13 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream, Filte
4242
throws IOException {
4343
if (filter == null) {
4444
throw new IllegalArgumentException("Filter is null");
45+
} else if (filter instanceof DependentColumnFilter) {
46+
toParseableByteArray(byteStream, (DependentColumnFilter) filter);
4547
} else if (filter instanceof CompareFilter) {
4648
// RowFilter, ValueFilter, QualifierFilter
4749
toParseableByteArray(byteStream, (CompareFilter) filter);
50+
} else if (filter instanceof SingleColumnValueExcludeFilter) {
51+
toParseableByteArray(byteStream, (SingleColumnValueExcludeFilter) filter);
4852
} else if (filter instanceof SingleColumnValueFilter) {
4953
toParseableByteArray(byteStream, (SingleColumnValueFilter) filter);
5054
} else if (filter instanceof PageFilter) {
@@ -163,6 +167,25 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream,
163167
byteStream.write(')');
164168
}
165169

170+
// SingleColumnValueExcludeFilter('cf1','col1',=,'binary:123',true,true)
171+
private static void toParseableByteArray(ByteArrayOutputStream byteStream,
172+
SingleColumnValueExcludeFilter filter) throws IOException {
173+
byteStream.write(filter.getClass().getSimpleName().getBytes());
174+
byteStream.write("('".getBytes());
175+
writeBytesWithEscape(byteStream, filter.getFamily());
176+
byteStream.write("','".getBytes());
177+
writeBytesWithEscape(byteStream, filter.getQualifier());
178+
byteStream.write("',".getBytes());
179+
byteStream.write(toParseableByteArray(filter.getOperator()));
180+
byteStream.write(',');
181+
toParseableByteArray(byteStream, filter.getComparator());
182+
byteStream.write(',');
183+
byteStream.write(Boolean.toString(filter.getFilterIfMissing()).getBytes());
184+
byteStream.write(',');
185+
byteStream.write(Boolean.toString(filter.getLatestVersionOnly()).getBytes());
186+
byteStream.write(')');
187+
}
188+
166189
// PageFilter(100);
167190
private static void toParseableByteArray(ByteArrayOutputStream byteStream, PageFilter filter)
168191
throws IOException {
@@ -181,6 +204,34 @@ private static void toParseableByteArray(ByteArrayOutputStream byteStream,
181204
byteStream.write(')');
182205
}
183206

207+
private static void toParseableByteArray(ByteArrayOutputStream byteStream,
208+
DependentColumnFilter filter) throws IOException {
209+
// DependentColumnFilter '(' family ',' qualifier ',' BOOL_VALUE ')'
210+
if (filter.getComparator() == null) {
211+
byteStream.write(filter.getClass().getSimpleName().getBytes());
212+
byteStream.write("('".getBytes());
213+
writeBytesWithEscape(byteStream, filter.getFamily());
214+
byteStream.write("','".getBytes());
215+
writeBytesWithEscape(byteStream, filter.getQualifier());
216+
byteStream.write("',".getBytes());
217+
byteStream.write(Boolean.toString(filter.getDropDependentColumn()).getBytes());
218+
byteStream.write(')');
219+
} else { // DependentColumnFilter '(' family ',' qualifier ',' BOOL_VALUE ',' compare_op ',' comparator ')'
220+
byteStream.write(filter.getClass().getSimpleName().getBytes());
221+
byteStream.write("('".getBytes());
222+
writeBytesWithEscape(byteStream, filter.getFamily());
223+
byteStream.write("','".getBytes());
224+
writeBytesWithEscape(byteStream, filter.getQualifier());
225+
byteStream.write("',".getBytes());
226+
byteStream.write(Boolean.toString(filter.getDropDependentColumn()).getBytes());
227+
byteStream.write(',');
228+
byteStream.write(toParseableByteArray(filter.getOperator()));
229+
byteStream.write(',');
230+
toParseableByteArray(byteStream, filter.getComparator());
231+
byteStream.write(')');
232+
}
233+
}
234+
184235
private static void toParseableByteArray(ByteArrayOutputStream byteStream,
185236
ColumnPaginationFilter filter) throws IOException {
186237
byteStream.write(filter.getClass().getSimpleName().getBytes());

0 commit comments

Comments
 (0)