HBase的源码中FilterList是一个不常用到的类,今日用到了,小研究了下,发现还是有优化的空间的。优化以后可以减少近一半的 ( operator == ? ) 判断。
在filterRow和filterRowKey两个方法中也做同样的修改。
// 优化前
public ReturnCode filterKeyValue(KeyValue v) {
ReturnCode rc = operator == Operator.MUST_PASS_ONE ? ReturnCode.SKIP
: ReturnCode.INCLUDE;
for (Filter filter : filters) {
if (operator == Operator.MUST_PASS_ALL) { // @here
if (filter.filterAllRemaining()) {
return ReturnCode.NEXT_ROW;
}
ReturnCode code = filter.filterKeyValue(v);
switch (code) {
case INCLUDE:
continue;
case NEXT_ROW:
case SKIP:
return ReturnCode.SKIP;
default:
return code;
}
} else if (operator == Operator.MUST_PASS_ONE) { //@here
if (filter.filterAllRemaining()) {
continue;
}
switch (filter.filterKeyValue(v)) {
case INCLUDE:
rc = ReturnCode.INCLUDE;
// must continue here to evaluate all filters
case NEXT_ROW:
case SKIP:
// continue;
}
}
}
return rc;
}
优化后
public ReturnCode filterKeyValueNew(KeyValue v) {
ReturnCode rc = operator == Operator.MUST_PASS_ONE ? ReturnCode.SKIP
: ReturnCode.INCLUDE;
switch (operator) {
case MUST_PASS_ALL: //@here
for (Filter filter : filters) {
if (filter.filterAllRemaining()) {
return ReturnCode.NEXT_ROW;
}
ReturnCode code = filter.filterKeyValue(v);
switch (code) {
case INCLUDE:
continue;
case NEXT_ROW:
case SKIP:
return ReturnCode.SKIP;
default:
return code;
}
}
break;
case MUST_PASS_ONE: //@here
for (Filter filter : filters) {
if (filter.filterAllRemaining()) {
continue;
}
if (filter.filterKeyValue(v) == ReturnCode.INCLUDE) {
rc = ReturnCode.INCLUDE;
}
}
break;
default:
break;
}
return rc;
}
在filterRow和filterRowKey两个方法中也做同样的修改。