private ArrayList<IndexCondition> getIndexConditions(TableFilter filter) { ArrayList<IndexCondition> indexConditions = filter.getIndexConditions(); if(joinCond.isEmpty()) { return indexConditions; } ArrayList<IndexCondition> original = New.arrayList(indexConditions); ArrayList<IndexCondition> result; try { for (Expression cond : joinCond) { //add to indexConditions cond.createIndexConditions(filter.getSession(), filter); } result = New.arrayList(indexConditions); return result; } finally { indexConditions.clear(); indexConditions.addAll(original); } }
public ConditionExtractor(TableFilter filter) { this.session = filter.getSession(); this.table = filter.getTable(); this.indexConditions = filter.getIndexConditions(); this.doExtract(); }
@Override public QueryWorker createQueryWorker(Column[] searchColumns, TableFilter filter, ObjectNode node) { SQLTranslated translated = repo.getSQLTranslator().translate(searchColumns, filter, node); JdbcQueryWorker handler = new JdbcQueryWorker(filter.getSession(), node.getShardName(), translated.sql, translated.params); return handler; }
/** * Remove all index conditions that can not be used. */ public void removeUnusableIndexConditions() { for (int i = 0; i < allFilters.length; i++) { TableFilter f = allFilters[i]; setEvaluatable(f, true); if (i < allFilters.length - 1 || f.getSession().getDatabase().getSettings().earlyFilter) { // the last table doesn't need the optimization, // otherwise the expression is calculated twice unnecessarily // (not that bad but not optimal) f.optimizeFullCondition(false); } f.removeUnusableIndexConditions(); } for (TableFilter f : allFilters) { setEvaluatable(f, false); } }
@Override public SQLTranslated translate(Column[] searchColumns, TableFilter filter, ObjectNode node) { // can not use the field sqlStatement because the parameter // indexes may be incorrect: ? may be in fact ?2 for a subquery // but indexes may be set manually as well if (node instanceof GroupObjectNode) { return translate(searchColumns, filter, (GroupObjectNode) node); } List<Value> params = New.arrayList(10); StatementBuilder buff = new StatementBuilder("SELECT"); int visibleColumnCount = searchColumns.length; for (int i = 0; i < visibleColumnCount; i++) { buff.appendExceptFirst(","); buff.append(' '); buff.append(identifier(searchColumns[i].getName())); } buff.append(" FROM "); buff.append(identifier(node.getCompositeObjectName())); buff.append(" AS "); buff.append(filter.getTableAlias()); Expression condition = filter.getFilterCondition(); if (condition != null) { buff.append(" WHERE ").append(StringUtils.unEnclose(condition.getPreparedSQL(filter.getSession(), params))); } return SQLTranslated.build().sql(buff.toString()).sqlParams(params); }