/** * Add one join to another. This method creates nested join between them if * required. * * @param top parent join * @param join child join * @param outer if child join is an outer join * @param on the join condition * @see TableFilter#addJoin(TableFilter, boolean, Expression) */ private void addJoin(TableFilter top, TableFilter join, boolean outer, Expression on) { if (join.getJoin() != null) { String joinTable = Constants.PREFIX_JOIN + parseIndex; TableFilter n = new TableFilter(session, getDualTable(true), joinTable, rightsChecked, currentSelect, join.getOrderInFrom(), null); n.setNestedJoin(join); join = n; } top.addJoin(join, outer, on); }
/** * Calculate the best query plan to use. * * @param parse If we do not need to really get the best plan because it is * a view parsing stage. */ void optimize(boolean parse) { if (parse) { calculateFakePlan(); } else { calculateBestPlan(); bestPlan.removeUnusableIndexConditions(); } TableFilter[] f2 = bestPlan.getFilters(); topFilter = f2[0]; for (int i = 0; i < f2.length - 1; i++) { f2[i].addJoin(f2[i + 1], false, null); } if (parse) { return; } for (TableFilter f : f2) { PlanItem item = bestPlan.getItem(f); f.setPlanItem(item); } }
/** * Add a joined table. * * @param filter the joined table filter * @param outer if this is an outer join * @param on the join condition */ public void addJoin(TableFilter filter, boolean outer, Expression on) { if (on != null) { on.mapColumns(this, 0); TableFilterVisitor visitor = new MapColumnsVisitor(on); visit(visitor); filter.visit(visitor); } if (join == null) { join = filter; filter.joinOuter = outer; if (outer) { filter.visit(new JOIVisitor()); } if (on != null) { filter.mapAndAddFilter(on); } } else { join.addJoin(filter, outer, on); } }
if (idx >= 0) { filters.remove(idx); leftFilter.addJoin(rightFilter, true, r); } else { rightFilter.mapAndAddFilter(r);
public void addJoin(TableFilter filter, boolean outer, Expression on) throws SQLException { if (on != null) { on.mapColumns(this, 0); } if (join == null) { this.join = filter; filter.outerJoin = outer; if (on != null) { filter.mapAndAddFilter(on); } } else { join.addJoin(filter, outer, on); } }
private TableFilter getNested(TableFilter n) { String joinTable = Constants.PREFIX_JOIN + parseIndex; TableFilter top = new TableFilter(session, getDualTable(true), joinTable, rightsChecked, currentSelect, n.getOrderInFrom()); top.addJoin(n, false, true, null); return top; }
private TableFilter getNested(TableFilter n) { String joinTable = Constants.PREFIX_JOIN + parseIndex; TableFilter top = new TableFilter(session, getDualTable(true), joinTable, rightsChecked, currentSelect, n.getOrderInFrom()); top.addJoin(n, false, true, null); return top; }
void optimize() throws SQLException { calculateBestPlan(); bestPlan.removeUnusableIndexConditions(); TableFilter[] f2 = bestPlan.getFilters(); topFilter = f2[0]; for (int i = 0; i < f2.length - 1; i++) { f2[i].addJoin(f2[i + 1], false, null); } for (int i = 0; i < f2.length; i++) { PlanItem item = bestPlan.getItem(f2[i]); f2[i].setPlanItem(item); } }
/** * Calculate the best query plan to use. * * @param parse If we do not need to really get the best plan because it is * a view parsing stage. */ void optimize(boolean parse) { if (parse) { calculateFakePlan(); } else { calculateBestPlan(); bestPlan.removeUnusableIndexConditions(); } TableFilter[] f2 = bestPlan.getFilters(); topFilter = f2[0]; for (int i = 0; i < f2.length - 1; i++) { f2[i].addJoin(f2[i + 1], false, false, null); } if (parse) { return; } for (TableFilter f : f2) { PlanItem item = bestPlan.getItem(f); f.setPlanItem(item); } }
/** * Calculate the best query plan to use. * * @param parse If we do not need to really get the best plan because it is * a view parsing stage. */ void optimize(boolean parse) { if (parse) { calculateFakePlan(); } else { calculateBestPlan(); bestPlan.removeUnusableIndexConditions(); } TableFilter[] f2 = bestPlan.getFilters(); topFilter = f2[0]; for (int i = 0; i < f2.length - 1; i++) { f2[i].addJoin(f2[i + 1], false, false, null); } if (parse) { return; } for (TableFilter f : f2) { PlanItem item = bestPlan.getItem(f); f.setPlanItem(item); } }
newTop.addJoin(top, true, false, on); } else { newTop.addJoin(top, true, false, on); on = readExpression(); top.addJoin(join, true, false, on); last = join; } else if (readIf("FULL")) { top.addJoin(join, false, false, on); } else { top.addJoin(join, fromOuter, false, on); top.addJoin(join, false, false, on); } else { top.addJoin(join, fromOuter, false, on); TableFilter join = readTableFilter(fromOuter); if (nestedJoins) { top.addJoin(join, false, false, null); } else { top.addJoin(join, fromOuter, false, null); top.addJoin(join, false, nested, on); } else { top.addJoin(join, fromOuter, false, on);
newTop.addJoin(top, true, false, on); } else { newTop.addJoin(top, true, false, on); on = readExpression(); top.addJoin(join, true, false, on); last = join; } else if (readIf("FULL")) { top.addJoin(join, false, false, on); } else { top.addJoin(join, fromOuter, false, on); top.addJoin(join, false, false, on); } else { top.addJoin(join, fromOuter, false, on); TableFilter join = readTableFilter(fromOuter); if (nestedJoins) { top.addJoin(join, false, false, null); } else { top.addJoin(join, fromOuter, false, null); top.addJoin(join, false, nested, on); } else { top.addJoin(join, fromOuter, false, on);
on = readExpression(); newTop.addJoin(top, true, on); top = newTop; last = newTop; on = readExpression(); top.addJoin(join, true, on); last = join; } else if (readIf("FULL")) { top.addJoin(join, fromOuter, on); last = join; } else if (readIf("JOIN")) { top.addJoin(join, fromOuter, on); last = join; } else if (readIf("CROSS")) { read("JOIN"); TableFilter join = readTableFilter(fromOuter); top.addJoin(join, fromOuter, null); last = join; } else if (readIf("NATURAL")) { top.addJoin(join, fromOuter, on); last = join; } else {
join.addJoin(filter, outer, nested, on);
join.addJoin(filter, outer, nested, on);
if (idx >= 0) { filters.remove(idx); leftFilter.addJoin(rightFilter, true, false, r); } else {
if (idx >= 0) { filters.remove(idx); leftFilter.addJoin(rightFilter, true, false, r); } else {
if (leftFilter != null && rightFilter != null) { filters.remove(filters.indexOf(rightFilter)); leftFilter.addJoin(rightFilter, true, r); r = ValueExpression.get(ValueBoolean.get(true));