RangeVariableResolver.java (hsqldb-2.6.0) | : | RangeVariableResolver.java (hsqldb-2.6.1) | ||
---|---|---|---|---|
skipping to change at line 55 | skipping to change at line 55 | |||
import org.hsqldb.lib.MultiValueHashMap; | import org.hsqldb.lib.MultiValueHashMap; | |||
import org.hsqldb.lib.OrderedHashSet; | import org.hsqldb.lib.OrderedHashSet; | |||
import org.hsqldb.lib.OrderedIntHashSet; | import org.hsqldb.lib.OrderedIntHashSet; | |||
import org.hsqldb.persist.PersistentStore; | import org.hsqldb.persist.PersistentStore; | |||
/** | /** | |||
* Determines how JOIN and WHERE expressions are used in query | * Determines how JOIN and WHERE expressions are used in query | |||
* processing and which indexes are used for table access. | * processing and which indexes are used for table access. | |||
* | * | |||
* @author Fred Toussi (fredt@users dot sourceforge.net) | * @author Fred Toussi (fredt@users dot sourceforge.net) | |||
* @version 2.6.0 | * @version 2.6.1 | |||
* @since 1.9.0 | * @since 1.9.0 | |||
*/ | */ | |||
public class RangeVariableResolver { | public class RangeVariableResolver { | |||
Session session; | Session session; | |||
QuerySpecification select; | QuerySpecification select; | |||
RangeVariable[] rangeVariables; | RangeVariable[] rangeVariables; | |||
Expression conditions; | Expression conditions; | |||
OrderedHashSet rangeVarSet = new OrderedHashSet(); | OrderedHashSet rangeVarSet = new OrderedHashSet(); | |||
CompileContext compileContext; | CompileContext compileContext; | |||
skipping to change at line 894 | skipping to change at line 894 | |||
for (int i = 0; i < rangeVariables.length; i++) { | for (int i = 0; i < rangeVariables.length; i++) { | |||
boolean hasIndex = false; | boolean hasIndex = false; | |||
RangeVariableConditions conditions; | RangeVariableConditions conditions; | |||
if (i < firstLeftJoinIndex | if (i < firstLeftJoinIndex | |||
&& firstRightJoinIndex == rangeVariables.length) { | && firstRightJoinIndex == rangeVariables.length) { | |||
conditions = rangeVariables[i].joinConditions[0]; | conditions = rangeVariables[i].joinConditions[0]; | |||
joinExpressions[i].addAll(whereExpressions[i]); | joinExpressions[i].addAll(whereExpressions[i]); | |||
assignToRangeVariable(rangeVariables[i], conditions, i, | setIndexConditions(conditions, joinExpressions[i], i, true); | |||
joinExpressions[i]); | ||||
assignToRangeVariable(conditions, joinExpressions[i]); | assignToRangeVariable(conditions, joinExpressions[i]); | |||
} else { | } else { | |||
conditions = rangeVariables[i].joinConditions[0]; | conditions = rangeVariables[i].joinConditions[0]; | |||
assignToRangeVariable(rangeVariables[i], conditions, i, | setIndexConditions(conditions, joinExpressions[i], i, true); | |||
joinExpressions[i]); | ||||
conditions = rangeVariables[i].joinConditions[0]; | conditions = rangeVariables[i].joinConditions[0]; | |||
if (conditions.hasIndex()) { | if (conditions.hasIndex()) { | |||
hasIndex = true; | hasIndex = true; | |||
} | } | |||
assignToRangeVariable(conditions, joinExpressions[i]); | assignToRangeVariable(conditions, joinExpressions[i]); | |||
conditions = rangeVariables[i].whereConditions[0]; | conditions = rangeVariables[i].whereConditions[0]; | |||
for (int j = i + 1; j < rangeVariables.length; j++) { | for (int j = i + 1; j < rangeVariables.length; j++) { | |||
if (rangeVariables[j].isRightJoin) { | if (rangeVariables[j].isRightJoin) { | |||
assignToRangeVariable( | assignToRangeVariable( | |||
rangeVariables[j].whereConditions[0], | rangeVariables[j].whereConditions[0], | |||
whereExpressions[i]); | whereExpressions[i]); | |||
} | } | |||
} | } | |||
if (!hasIndex) { | if (!hasIndex) { | |||
assignToRangeVariable(rangeVariables[i], conditions, i, | setIndexConditions(conditions, whereExpressions[i], i, | |||
whereExpressions[i]); | true); | |||
} | } | |||
assignToRangeVariable(conditions, whereExpressions[i]); | assignToRangeVariable(conditions, whereExpressions[i]); | |||
} | } | |||
} | } | |||
} | } | |||
void assignToRangeVariable(RangeVariableConditions conditions, | void assignToRangeVariable(RangeVariableConditions conditions, | |||
List exprList) { | List exprList) { | |||
skipping to change at line 976 | skipping to change at line 974 | |||
int count = colIndexSetOther.get(idx, 0); | int count = colIndexSetOther.get(idx, 0); | |||
colIndexSetOther.put(idx, count + 1); | colIndexSetOther.put(idx, count + 1); | |||
} | } | |||
} | } | |||
} | } | |||
/** | /** | |||
* Assigns a set of conditions to a range variable. | * Assigns a set of conditions to a range variable. | |||
*/ | */ | |||
void assignToRangeVariable(RangeVariable rangeVar, | ||||
RangeVariableConditions conditions, | ||||
int rangeVarIndex, List exprList) { | ||||
if (exprList.isEmpty()) { | ||||
return; | ||||
} | ||||
setIndexConditions(conditions, exprList, rangeVarIndex, true); | ||||
} | ||||
private void setIndexConditions(RangeVariableConditions conditions, | private void setIndexConditions(RangeVariableConditions conditions, | |||
List exprList, int rangeVarIndex, | List exprList, int rangeVarIndex, | |||
boolean includeOr) { | boolean includeOr) { | |||
boolean hasIndex; | boolean hasIndex; | |||
if (exprList.isEmpty()) { | ||||
return; | ||||
} | ||||
colIndexSetEqual.clear(); | colIndexSetEqual.clear(); | |||
colIndexSetOther.clear(); | colIndexSetOther.clear(); | |||
for (int j = 0, size = exprList.size(); j < size; j++) { | for (int j = 0, size = exprList.size(); j < size; j++) { | |||
Expression e = (Expression) exprList.get(j); | Expression e = (Expression) exprList.get(j); | |||
if (e == null) { | if (e == null) { | |||
continue; | continue; | |||
} | } | |||
skipping to change at line 1191 | skipping to change at line 1182 | |||
} else { | } else { | |||
conditions.rangeVar.whereConditions[j] | conditions.rangeVar.whereConditions[j] | |||
.nonIndexCondition = | .nonIndexCondition = | |||
ExpressionLogical | ExpressionLogical | |||
.andExpressions(e, conditions.rangeVar | .andExpressions(e, conditions.rangeVar | |||
.whereConditions[j].nonIndexCondition); | .whereConditions[j].nonIndexCondition); | |||
} | } | |||
} | } | |||
} else { | } else { | |||
conditions.addCondition(e); | conditions.addCondition(e); | |||
exprList.set(i, null); | ||||
} | } | |||
} | } | |||
} | } | |||
private boolean setOrConditions(RangeVariableConditions conditions, | private boolean setOrConditions(RangeVariableConditions conditions, | |||
ExpressionLogical orExpression, | ExpressionLogical orExpression, | |||
int rangeVarIndex) { | int rangeVarIndex) { | |||
HsqlArrayList orExprList = new HsqlArrayList(); | HsqlArrayList orExprList = new HsqlArrayList(); | |||
End of changes. 7 change blocks. | ||||
18 lines changed or deleted | 10 lines changed or added |