HBASE-942, HBASE-943 Add convenience methods to RowFilterSet, to ColumnValueFilter: add filterIfColumnMissing property, add

SubString operator

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@707547 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Michael Stack 2008-10-24 05:19:24 +00:00
parent a28c5c7ba8
commit 8b6b089f45
3 changed files with 83 additions and 7 deletions

View File

@ -57,6 +57,10 @@ Release 0.19.0 - Unreleased
HBASE-576 Investigate IPC performance HBASE-576 Investigate IPC performance
HBASE-920 Make region balancing sloppier HBASE-920 Make region balancing sloppier
HBASE-902 Add force compaction and force split operations to UI and Admin HBASE-902 Add force compaction and force split operations to UI and Admin
HBASE-942 Add convenience methods to RowFilterSet
(Clint Morgan via Stack)
HBASE-943 to ColumnValueFilter: add filterIfColumnMissing property, add
SubString operator (Clint Morgan via Stack)
NEW FEATURES NEW FEATURES
HBASE-875 Use MurmurHash instead of JenkinsHash [in bloomfilters] HBASE-875 Use MurmurHash instead of JenkinsHash [in bloomfilters]

View File

@ -53,13 +53,18 @@ public class ColumnValueFilter implements RowFilterInterface {
/** greater than or equal to */ /** greater than or equal to */
GREATER_OR_EQUAL, GREATER_OR_EQUAL,
/** greater than */ /** greater than */
GREATER; GREATER,
// Below are more specific operators.
/** sub-string. Case insensitive. */
SUB_STRING;
} }
private byte[] columnName; private byte[] columnName;
private CompareOp compareOp; private CompareOp compareOp;
private byte[] value; private byte[] value;
private WritableByteArrayComparable comparator; private WritableByteArrayComparable comparator;
private boolean filterIfColumnMissing;
ColumnValueFilter() { ColumnValueFilter() {
// for Writable // for Writable
@ -74,9 +79,23 @@ public class ColumnValueFilter implements RowFilterInterface {
*/ */
public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp, public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp,
final byte[] value) { final byte[] value) {
this(columnName, compareOp, value, true);
}
/**
* Constructor.
*
* @param columnName name of column
* @param compareOp operator
* @param value value to compare column values against
* @param filterIfColumnMissing if true then we will filter rows that don't have the column.
*/
public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp,
final byte[] value, boolean filterIfColumnMissing) {
this.columnName = columnName; this.columnName = columnName;
this.compareOp = compareOp; this.compareOp = compareOp;
this.value = value; this.value = value;
this.filterIfColumnMissing = filterIfColumnMissing;
} }
/** /**
@ -88,20 +107,47 @@ public class ColumnValueFilter implements RowFilterInterface {
*/ */
public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp, public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp,
final WritableByteArrayComparable comparator) { final WritableByteArrayComparable comparator) {
this.columnName = columnName; this(columnName, compareOp, comparator, true);
this.compareOp = compareOp;
this.comparator = comparator;
} }
/**
* Constructor.
*
* @param columnName name of column
* @param compareOp operator
* @param comparator Comparator to use.
* @param filterIfColumnMissing if true then we will filter rows that don't have the column.
*/
public ColumnValueFilter(final byte[] columnName, final CompareOp compareOp,
final WritableByteArrayComparable comparator, boolean filterIfColumnMissing) {
this.columnName = columnName;
this.compareOp = compareOp;
this.comparator = comparator;
this.filterIfColumnMissing = filterIfColumnMissing;
}
public boolean filterRowKey(@SuppressWarnings("unused") final byte[] rowKey) { public boolean filterRowKey(@SuppressWarnings("unused") final byte[] rowKey) {
return false; return false;
} }
public boolean filterColumn(@SuppressWarnings("unused") final byte[] rowKey, public boolean filterColumn(@SuppressWarnings("unused") final byte[] rowKey,
final byte[] colKey, final byte[] data) { final byte[] colKey, final byte[] data) {
if (!filterIfColumnMissing) {
return false; // Must filter on the whole row
}
if (!Arrays.equals(colKey, columnName)) { if (!Arrays.equals(colKey, columnName)) {
return false; return false;
} }
return filterColumnValue(data);
}
private boolean filterColumnValue(final byte [] data) {
// Special case for Substring operator
if (compareOp == CompareOp.SUB_STRING) {
return !Bytes.toString(data).toLowerCase().contains(
(Bytes.toString(value)).toLowerCase());
}
int compareResult; int compareResult;
if (comparator != null) { if (comparator != null) {
@ -133,8 +179,16 @@ public class ColumnValueFilter implements RowFilterInterface {
} }
public boolean filterRow(final SortedMap<byte[], Cell> columns) { public boolean filterRow(final SortedMap<byte[], Cell> columns) {
// Don't let rows through if they don't have the column we are checking if (filterIfColumnMissing) {
return !columns.containsKey(columnName); return !columns.containsKey(columnName);
}
// Otherwise we must do the filter here
Cell colCell = columns.get(columnName);
if (colCell == null) {
return false;
}
return this.filterColumnValue(colCell.getValue());
} }
private int compare(final byte[] b1, final byte[] b2) { private int compare(final byte[] b1, final byte[] b2) {
@ -175,6 +229,7 @@ public class ColumnValueFilter implements RowFilterInterface {
compareOp = CompareOp.valueOf(in.readUTF()); compareOp = CompareOp.valueOf(in.readUTF());
comparator = (WritableByteArrayComparable) ObjectWritable.readObject(in, comparator = (WritableByteArrayComparable) ObjectWritable.readObject(in,
new HBaseConfiguration()); new HBaseConfiguration());
filterIfColumnMissing = in.readBoolean();
} }
public void write(final DataOutput out) throws IOException { public void write(final DataOutput out) throws IOException {
@ -188,6 +243,7 @@ public class ColumnValueFilter implements RowFilterInterface {
out.writeUTF(compareOp.name()); out.writeUTF(compareOp.name());
ObjectWritable.writeObject(out, comparator, ObjectWritable.writeObject(out, comparator,
WritableByteArrayComparable.class, new HBaseConfiguration()); WritableByteArrayComparable.class, new HBaseConfiguration());
out.writeBoolean(filterIfColumnMissing);
} }
} }

View File

@ -80,6 +80,22 @@ public class RowFilterSet implements RowFilterInterface {
this.operator = operator; this.operator = operator;
} }
/** Get the operator.
*
* @return operator
*/
public Operator getOperator() {
return operator;
}
/** Add a filter.
*
* @param filter
*/
public void addFilter(RowFilterInterface filter) {
this.filters.add(filter);
}
public void validate(final byte [][] columns) { public void validate(final byte [][] columns) {
for (RowFilterInterface filter : filters) { for (RowFilterInterface filter : filters) {
filter.validate(columns); filter.validate(columns);