日期:2014-05-16 浏览次数:20458 次
查询过程前面解析类似insert,最终调用是在下面这个QuerySpecification类的getSingleResult方法,RangeVariable是查询条件相关
private Result getSingleResult(Session session, int maxRows) { int[] limits = sortAndSlice.getLimits(session, this, maxRows); Result r = buildResult(session, limits); RowSetNavigatorData navigator = (RowSetNavigatorData) r.getNavigator(); if (isDistinctSelect) { navigator.removeDuplicates(session); } if (sortAndSlice.hasOrder()) { navigator.sortOrder(session); } if (limits != SortAndSlice.defaultLimits && !sortAndSlice.skipFullResult) { navigator.trim(limits[0], limits[1]); } return r; } private Result buildResult(Session session, int[] limits) { RowSetNavigatorData navigator = new RowSetNavigatorData(session, (QuerySpecification) this); Result result = Result.newResult(navigator); result.metaData = resultMetaData; if (isUpdatable) { result.rsProperties = ResultProperties.updatablePropsValue; } int skipCount = 0; int limitCount = limits[2]; if (sortAndSlice.skipFullResult) { skipCount = limits[0]; limitCount = limits[1]; } if (this.isSimpleCount) { Object[] data = new Object[indexLimitData]; Table table = rangeVariables[0].getTable(); table.materialise(session); PersistentStore store = table.getRowStore(session); long count = store.elementCount(session); data[0] = data[indexStartAggregates] = ValuePool.getLong(count); navigator.add(data); return result; } int fullJoinIndex = 0; RangeIterator[] rangeIterators = new RangeIterator[rangeVariables.length]; for (int i = 0; i < rangeVariables.length; i++) { rangeIterators[i] = rangeVariables[i].getIterator(session); } session.sessionContext.rownum = 1; for (int currentIndex = 0; ; ) { if (currentIndex < fullJoinIndex) { // finished current span // or finished outer rows on right navigator boolean end = true; for (int i = fullJoinIndex + 1; i < rangeVariables.length; i++) { if (rangeVariables[i].isRightJoin) { fullJoinIndex = i; currentIndex = i; end = false; ((RangeIteratorRight) rangeIterators[i]) .setOnOuterRows(); break; } } if (end) { break; } } RangeIterator it = rangeIterators[currentIndex]; if (it.next()) { if (currentIndex < rangeVariables.length - 1) { currentIndex++; continue; } }