`
william_ai
  • 浏览: 20642 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

HBase 源码

 
阅读更多
HBase的源码中FilterList是一个不常用到的类,今日用到了,小研究了下,发现还是有优化的空间的。优化以后可以减少近一半的 ( operator == ? ) 判断。
// 优化前
	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两个方法中也做同样的修改。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics