hsqldb源码分析系列 查询引擎之查询操作(二)
gated && aggregateCheck[i]) {
continue;
} else {
data[i] = exprColumns[i].getValue(session);
}
}
for (int i = indexLimitVisible; i < indexLimitRowId; i++) {
if (i == indexLimitVisible) {
data[i] = it.getRowidObject();
} else {
data[i] = it.getCurrentRow();
}
}
session.sessionContext.rownum++;
if (skipCount > 0) {
skipCount--;
continue;
}
Object[] groupData = null;
if (isAggregated || isGrouped) {
groupData = navigator.getGroupData(data);
if (groupData != null) {
data = groupData;
}
}
for (int i = indexStartAggregates; i < indexLimitExpressions;
i++) {
data[i] = exprColumns[i].updateAggregatingValue(session,
data[i]);
}
if (groupData == null) {
navigator.add(data);
} else if (isAggregated) {
navigator.update(groupData, data);
}
int rowCount = navigator.getSize();
if (rowCount == session.resultMaxMemoryRows && !isAggregated
&& !isSingleMemoryTable) {
navigator = new RowSetNavigatorDataTable(session, this,
navigator);
result.setNavigator(navigator);
}
if (isAggregated || isGrouped) {
if (!sortAndSlice.isGenerated) {
continue;
}
}
if (rowCount >= limitCount) {
break;
}
}
navigator.reset();
for (int i = 0; i < rangeVariables.length; i++) {
rangeIterators[i].reset();
}
if (!isGrouped && !isAggregated) {
return result;
}
if (isAggregated) {
if (!isGrouped && navigator.getSize() == 0) {
Object[] data = new Object[exprColumns.length];
for (int i = 0; i < indexStartAggregates; i++) {
if (!aggregateCheck[i]) {
data[i] = exprColumns[i].getValue(session);
}
}
navigator.add(data);
}
navigator.reset();
session.sessionContext.setRangeIterator(navigator);
while (navigator.next()) {
Object[] data = navigator.getCurrent();
for (int i = indexStartAggregates; i < indexLimitExpressions;
i++) {
data[i] = exprColumns[i].getAggregatedValue(session,
data[i]);
}
for (int i = 0; i < indexStartAggregates; i++) {
if (aggregateCheck[i]) {
data[i] = exprColumns[i].getValue(session);
}
}
}
session.sessionContext.unsetRangeIterator(navigator);
}
navigator.reset();
if (havingCondition != null) {
while (navigator.hasNext()) {
Object[] data = (Object[]) navigator.getNext();
if (!Boolean.TRUE.equals(
data[indexLimitVisible + groupByColumnCount])) {
navigator.remove();
}
}
navigator.reset();
}
return result;
}
比如一个like操作,
查询结果: