/** * Gets the alias of a table, if it is registered (and visible, ie. not part * of a sub-query) in the FromClause * * @param table * the table to get the alias for * @return the alias or null if none is found */ public String getAlias(Table table) { if (table != null) { for (FromItem item : getItems()) { String alias = item.getAlias(table); if (alias != null) { return alias; } } } return null; }
private void replaceParametersInFromClause(Object[] values, AtomicInteger parameterIndex, Query originalQuery, Query newQuery) { final List<FromItem> fromItems = originalQuery.getFromClause().getItems(); int i = 0; for (FromItem fromItem : fromItems) { final Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { final Query newSubQuery = newQuery.getFromClause().getItem(i).getSubQuery(); replaceParametersInQuery(values, parameterIndex, subQuery, newSubQuery); newQuery.getFromClause().removeItem(i); newQuery.getFromClause().addItem(i, new FromItem(newSubQuery).setAlias(fromItem.getAlias())); } i++; } }
protected String rewriteFromClause(Query query, FromClause fromClause) { StringBuilder sb = new StringBuilder(); if (fromClause.getItemCount() > 0) { sb.append(AbstractQueryClause.PREFIX_FROM); List<FromItem> items = fromClause.getItems(); for (int i = 0; i < items.size(); i++) { FromItem item = items.get(i); if (i != 0) { sb.append(AbstractQueryClause.DELIM_COMMA); } sb.append(rewriteFromItem(query, item)); } } return sb.toString(); }
/** * Retrieves a table by it's reference which may be it's alias or it's * qualified table name. Typically, this method is used to resolve a * SelectItem with a reference like "foo.bar", where "foo" may either be an * alias or a table name * * @param reference * @return a FromItem which matches the provided reference string */ public FromItem getItemByReference(String reference) { if (reference == null) { return null; } for (final FromItem item : getItems()) { FromItem result = getItemByReference(item, reference); if (result != null) { return result; } } return null; }
@Override public DataSet executeQuery(final Query query) { final List<SelectItem> selectItems = query.getSelectClause().getItems(); final List<FromItem> fromItems = query.getFromClause().getItems(); final List<FilterItem> whereItems = query.getWhereClause().getItems(); final List<SelectItem> whereSelectItems = query.getWhereClause().getEvaluatedSelectItems(); if (singleFromItem && noGrouping) { final FromItem fromItem = query.getFromClause().getItem(0); final Table table = MetaModelHelper.resolveTable(fromItem); if (table != null) {
final String prefix = expression.substring(0, splitIndex); columnName = expression.substring(splitIndex + 1); fromItem = _query.getFromClause().getItemByReference(prefix); if (_query.getFromClause().getItemCount() == 1) { fromItem = _query.getFromClause().getItem(0); columnName = expression; } else {
private List<Query> splitQueryBasedOnSubQueries(int fromItemIndex) { Query subQuery = _query.getFromClause().getItem(fromItemIndex).getSubQuery(); QuerySplitter subQuerySplitter = new QuerySplitter(_dataContext, subQuery); subQuerySplitter.setMaxRows(_maxRows); List<Query> splitQueries = subQuerySplitter.splitQuery(); List<Query> result = new ArrayList<Query>(splitQueries.size()); for (Query splitQuery : splitQueries) { Query newQuery = _query.clone(); FromClause fromClause = newQuery.getFromClause(); String alias = fromClause.getItem(fromItemIndex).getAlias(); fromClause.removeItem(fromItemIndex); newQuery.from(new FromItem(splitQuery).setAlias(alias)); result.add(newQuery); } return result; }
/** * Creates a clone of the {@link SelectItem} for use within a cloned {@link Query}. * * @param clonedQuery a new {@link Query} object that represents the clone-to-be of a query. It is expected that * {@link FromItem}s have already been cloned in this {@link Query}. * @return */ protected SelectItem clone(Query clonedQuery) { final SelectItem subQuerySelectItem = (_subQuerySelectItem == null ? null : _subQuerySelectItem.clone()); final FromItem fromItem; if (_fromItem == null) { fromItem = null; } else if (clonedQuery != null && _query != null) { final int indexOfFromItem = _query.getFromClause().indexOf(_fromItem); if (indexOfFromItem != -1) { fromItem = clonedQuery.getFromClause().getItem(indexOfFromItem); } else { fromItem = _fromItem.clone(); } } else { fromItem = _fromItem.clone(); } final SelectItem s = new SelectItem(_column, fromItem, _function, _functionParameters, _expression, subQuerySelectItem, _alias, _functionApproximationAllowed); return s; }
@Override public SatisfiedFromBuilder on(Column left, Column right) throws IllegalArgumentException { if (left == null) { throw new IllegalArgumentException("left cannot be null"); } if (right == null) { throw new IllegalArgumentException("right cannot be null"); } getQuery().getFromClause().removeItem(leftItem); SelectItem[] leftOn = new SelectItem[] { new SelectItem(left) }; SelectItem[] rightOn = new SelectItem[] { new SelectItem(right) }; FromItem fromItem = new FromItem(joinType, leftItem, rightItem, leftOn, rightOn); getQuery().from(fromItem); return this; }
public Query() { _selectClause = new SelectClause(this); _fromClause = new FromClause(this); _whereClause = new FilterClause(this, AbstractQueryClause.PREFIX_WHERE); _groupByClause = new GroupByClause(this); _havingClause = new FilterClause(this, AbstractQueryClause.PREFIX_HAVING); _orderByClause = new OrderByClause(this); }
@Override public DataSet executeQuery(final Query query) { final List<SelectItem> selectItems = query.getSelectClause().getItems(); final List<FromItem> fromItems = query.getFromClause().getItems(); final List<FilterItem> whereItems = query.getWhereClause().getItems(); final List<SelectItem> whereSelectItems = query.getWhereClause().getEvaluatedSelectItems(); if (singleFromItem && noGrouping) { final FromItem fromItem = query.getFromClause().getItem(0); final Table table = MetaModelHelper.resolveTable(fromItem); if (table != null) {
/** * Retrieves a table by it's reference which may be it's alias or it's * qualified table name. Typically, this method is used to resolve a * SelectItem with a reference like "foo.bar", where "foo" may either be an * alias or a table name * * @param reference * @return a FromItem which matches the provided reference string */ public FromItem getItemByReference(String reference) { if (reference == null) { return null; } for (final FromItem item : getItems()) { FromItem result = getItemByReference(item, reference); if (result != null) { return result; } } return null; }
final String prefix = expression.substring(0, splitIndex); columnName = expression.substring(splitIndex + 1); fromItem = _query.getFromClause().getItemByReference(prefix); if (_query.getFromClause().getItemCount() == 1) { fromItem = _query.getFromClause().getItem(0); columnName = expression; } else {
private List<Query> splitQueryBasedOnSubQueries(int fromItemIndex) { Query subQuery = _query.getFromClause().getItem(fromItemIndex).getSubQuery(); QuerySplitter subQuerySplitter = new QuerySplitter(_dataContext, subQuery); subQuerySplitter.setMaxRows(_maxRows); List<Query> splitQueries = subQuerySplitter.splitQuery(); List<Query> result = new ArrayList<Query>(splitQueries.size()); for (Query splitQuery : splitQueries) { Query newQuery = _query.clone(); FromClause fromClause = newQuery.getFromClause(); String alias = fromClause.getItem(fromItemIndex).getAlias(); fromClause.removeItem(fromItemIndex); newQuery.from(new FromItem(splitQuery).setAlias(alias)); result.add(newQuery); } return result; }
/** * Creates a clone of the {@link SelectItem} for use within a cloned {@link Query}. * * @param clonedQuery a new {@link Query} object that represents the clone-to-be of a query. It is expected that * {@link FromItem}s have already been cloned in this {@link Query}. * @return */ protected SelectItem clone(Query clonedQuery) { final SelectItem subQuerySelectItem = (_subQuerySelectItem == null ? null : _subQuerySelectItem.clone()); final FromItem fromItem; if (_fromItem == null) { fromItem = null; } else if (clonedQuery != null && _query != null) { final int indexOfFromItem = _query.getFromClause().indexOf(_fromItem); if (indexOfFromItem != -1) { fromItem = clonedQuery.getFromClause().getItem(indexOfFromItem); } else { fromItem = _fromItem.clone(); } } else { fromItem = _fromItem.clone(); } final SelectItem s = new SelectItem(_column, fromItem, _function, _functionParameters, _expression, subQuerySelectItem, _alias, _functionApproximationAllowed); return s; }
@Override public SatisfiedFromBuilder on(Column left, Column right) throws IllegalArgumentException { if (left == null) { throw new IllegalArgumentException("left cannot be null"); } if (right == null) { throw new IllegalArgumentException("right cannot be null"); } getQuery().getFromClause().removeItem(leftItem); SelectItem[] leftOn = new SelectItem[] { new SelectItem(left) }; SelectItem[] rightOn = new SelectItem[] { new SelectItem(right) }; FromItem fromItem = new FromItem(joinType, leftItem, rightItem, leftOn, rightOn); getQuery().from(fromItem); return this; }
public Query() { _selectClause = new SelectClause(this); _fromClause = new FromClause(this); _whereClause = new FilterClause(this, AbstractQueryClause.PREFIX_WHERE); _groupByClause = new GroupByClause(this); _havingClause = new FilterClause(this, AbstractQueryClause.PREFIX_HAVING); _orderByClause = new OrderByClause(this); }
/** * Gets the alias of a table, if it is registered (and visible, ie. not part * of a sub-query) in the FromClause * * @param table * the table to get the alias for * @return the alias or null if none is found */ public String getAlias(Table table) { if (table != null) { for (FromItem item : getItems()) { String alias = item.getAlias(table); if (alias != null) { return alias; } } } return null; }
private void replaceParametersInFromClause(Object[] values, AtomicInteger parameterIndex, Query originalQuery, Query newQuery) { final List<FromItem> fromItems = originalQuery.getFromClause().getItems(); int i = 0; for (FromItem fromItem : fromItems) { final Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { final Query newSubQuery = newQuery.getFromClause().getItem(i).getSubQuery(); replaceParametersInQuery(values, parameterIndex, subQuery, newSubQuery); newQuery.getFromClause().removeItem(i); newQuery.getFromClause().addItem(i, new FromItem(newSubQuery).setAlias(fromItem.getAlias())); } i++; } }
protected String rewriteFromClause(Query query, FromClause fromClause) { StringBuilder sb = new StringBuilder(); if (fromClause.getItemCount() > 0) { sb.append(AbstractQueryClause.PREFIX_FROM); List<FromItem> items = fromClause.getItems(); for (int i = 0; i < items.size(); i++) { FromItem item = items.get(i); if (i != 0) { sb.append(AbstractQueryClause.DELIM_COMMA); } sb.append(rewriteFromItem(query, item)); } } return sb.toString(); }