/** * 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; }
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(); }
/** * 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; }
/** * 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; }
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; }
/** * Examines a query and extracts an array of FromItem's that refer (directly) to tables (hence Joined FromItems and * SubQuery FromItems are traversed but not included). * * @param q the query to examine * @return an array of FromItem's that refer directly to tables */ public static FromItem[] getTableFromItems(Query q) { List<FromItem> result = new ArrayList<FromItem>(); List<FromItem> items = q.getFromClause().getItems(); for (FromItem item : items) { result.addAll(getTableFromItems(item)); } return result.toArray(new FromItem[result.size()]); }
/** * Examines a query and extracts an array of FromItem's that refer (directly) to tables (hence Joined FromItems and * SubQuery FromItems are traversed but not included). * * @param q the query to examine * @return an array of FromItem's that refer directly to tables */ public static FromItem[] getTableFromItems(Query q) { List<FromItem> result = new ArrayList<FromItem>(); List<FromItem> items = q.getFromClause().getItems(); for (FromItem item : items) { result.addAll(getTableFromItems(item)); } return result.toArray(new FromItem[result.size()]); }
/** * Select all available select items from all currently available FROM * items. Equivalent of the expression "SELECT * FROM ..." in SQL. * * @return */ public Query selectAll() { List<FromItem> items = getFromClause().getItems(); for (FromItem fromItem : items) { selectAll(fromItem); } return this; }
private Integer getSubQueryFromItemIndex() { List<FromItem> fromItems = _query.getFromClause().getItems(); for (int i = 0; i < fromItems.size(); i++) { Query subQuery = fromItems.get(i).getSubQuery(); if (subQuery != null) { if (isSplittable(subQuery)) { return i; } } } return null; }
private Integer getSubQueryFromItemIndex() { List<FromItem> fromItems = _query.getFromClause().getItems(); for (int i = 0; i < fromItems.size(); i++) { Query subQuery = fromItems.get(i).getSubQuery(); if (subQuery != null) { if (isSplittable(subQuery)) { return i; } } } return null; }
/** * Select all available select items from all currently available FROM * items. Equivalent of the expression "SELECT * FROM ..." in SQL. * * @return */ public Query selectAll() { List<FromItem> items = getFromClause().getItems(); for (FromItem fromItem : items) { selectAll(fromItem); } return this; }
private void buildParameterListInFromClause(List<QueryParameter> parameters, Query query) { List<FromItem> fromItems = query.getFromClause().getItems(); for (FromItem fromItem : fromItems) { Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { buildParameterListInFromClause(parameters, subQuery); buildParameterListInWhereClause(parameters, subQuery); } } }
private void buildParameterListInFromClause(List<QueryParameter> parameters, Query query) { List<FromItem> fromItems = query.getFromClause().getItems(); for (FromItem fromItem : fromItems) { Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { buildParameterListInFromClause(parameters, subQuery); buildParameterListInWhereClause(parameters, subQuery); } } }
private Column findColumnInAliasedTable(Column column, FromItem fromItem, String aliasPart, String columnPart) { if (column != null) { // ensure that if the column has already been found, return it return column; } Table table = fromItem.getTable(); if (table != null) { String alias = fromItem.getAlias(); if (alias != null && alias.equals(aliasPart)) { column = table.getColumnByName(columnPart); } } else { FromItem leftSide = fromItem.getLeftSide(); column = findColumnInAliasedTable(column, leftSide, aliasPart, columnPart); FromItem rightSide = fromItem.getRightSide(); column = findColumnInAliasedTable(column, rightSide, aliasPart, columnPart); if (column != null) { Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { List<FromItem> items = subQuery.getFromClause().getItems(); for (FromItem subQueryFromItem : items) { column = findColumnInAliasedTable(column, subQueryFromItem, aliasPart, columnPart); } } } } return column; }
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++; } }
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++; } }
@Override protected Query beforeRewrite(Query query) { query = query.clone(); JdbcDataContext dataContext = getDataContext(); if (dataContext != null) { String identifierQuoteString = dataContext.getIdentifierQuoteString(); if (identifierQuoteString != null) { List<SelectItem> selectItems = query.getSelectClause().getItems(); for (SelectItem item : selectItems) { String alias = item.getAlias(); if (needsQuoting(alias, identifierQuoteString)) { item.setAlias(identifierQuoteString + alias + identifierQuoteString); } } List<FromItem> fromItems = query.getFromClause().getItems(); for (FromItem item : fromItems) { String alias = item.getAlias(); if (needsQuoting(alias, identifierQuoteString)) { item.setAlias(identifierQuoteString + alias + identifierQuoteString); } } } } return query; }
@Override protected Query beforeRewrite(Query query) { query = query.clone(); JdbcDataContext dataContext = getDataContext(); if (dataContext != null) { String identifierQuoteString = dataContext.getIdentifierQuoteString(); if (identifierQuoteString != null) { List<SelectItem> selectItems = query.getSelectClause().getItems(); for (SelectItem item : selectItems) { String alias = item.getAlias(); if (needsQuoting(alias, identifierQuoteString)) { item.setAlias(identifierQuoteString + alias + identifierQuoteString); } } List<FromItem> fromItems = query.getFromClause().getItems(); for (FromItem item : fromItems) { String alias = item.getAlias(); if (needsQuoting(alias, identifierQuoteString)) { item.setAlias(identifierQuoteString + alias + identifierQuoteString); } } } } return query; }
@Override public Query clone() { final Query q = new Query(); q.setMaxRows(_maxRows); q.setFirstRow(_firstRow); q.getSelectClause().setDistinct(_selectClause.isDistinct()); for (FromItem item : _fromClause.getItems()) { q.from(item.clone()); } for (SelectItem item : _selectClause.getItems()) { q.select(item.clone(q)); } for (FilterItem item : _whereClause.getItems()) { q.where(item.clone()); } for (GroupByItem item : _groupByClause.getItems()) { q.groupBy(item.clone()); } for (FilterItem item : _havingClause.getItems()) { q.having(item.clone()); } for (OrderByItem item : _orderByClause.getItems()) { q.orderBy(item.clone()); } return q; } }