日期:2014-05-16 浏览次数:20541 次
查询过程前面解析类似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;
}
}