/** * Creates a SelectItem that references another select item in a subquery * * @param subQuerySelectItem * @param subQueryFromItem the FromItem that holds the sub-query */ public SelectItem(SelectItem subQuerySelectItem, FromItem subQueryFromItem) { this(null, subQueryFromItem, null, null, null, subQuerySelectItem, null, false); if (subQueryFromItem.getSubQuery() == null) { throw new IllegalArgumentException("Only sub-query based FromItems allowed."); } if (subQuerySelectItem.getQuery() != null && !subQuerySelectItem.getQuery().equals(subQueryFromItem.getSubQuery())) { throw new IllegalArgumentException("The SelectItem must exist in the sub-query"); } }
/** * Creates a SelectItem that references another select item in a subquery * * @param subQuerySelectItem * @param subQueryFromItem the FromItem that holds the sub-query */ public SelectItem(SelectItem subQuerySelectItem, FromItem subQueryFromItem) { this(null, subQueryFromItem, null, null, null, subQuerySelectItem, null, false); if (subQueryFromItem.getSubQuery() == null) { throw new IllegalArgumentException("Only sub-query based FromItems allowed."); } if (subQuerySelectItem.getQuery() != null && !subQuerySelectItem.getQuery().equals(subQueryFromItem.getSubQuery())) { throw new IllegalArgumentException("The SelectItem must exist in the sub-query"); } }
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; }
public static List<FromItem> getTableFromItems(FromItem item) { List<FromItem> result = new ArrayList<FromItem>(); if (item.getTable() != null) { result.add(item); } else if (item.getSubQuery() != null) { FromItem[] sqItems = getTableFromItems(item.getSubQuery()); for (int i = 0; i < sqItems.length; i++) { result.add(sqItems[i]); } } else if (item.getJoin() != null) { FromItem leftSide = item.getLeftSide(); result.addAll(getTableFromItems(leftSide)); FromItem rightSide = item.getRightSide(); result.addAll(getTableFromItems(rightSide)); } else { throw new IllegalStateException("FromItem was neither of Table type, SubQuery type or Join type: " + item); } return result; }
public static List<FromItem> getTableFromItems(FromItem item) { List<FromItem> result = new ArrayList<FromItem>(); if (item.getTable() != null) { result.add(item); } else if (item.getSubQuery() != null) { FromItem[] sqItems = getTableFromItems(item.getSubQuery()); for (int i = 0; i < sqItems.length; i++) { result.add(sqItems[i]); } } else if (item.getJoin() != null) { FromItem leftSide = item.getLeftSide(); result.addAll(getTableFromItems(leftSide)); FromItem rightSide = item.getRightSide(); result.addAll(getTableFromItems(rightSide)); } else { throw new IllegalStateException("FromItem was neither of Table type, SubQuery type or Join type: " + item); } return result; }
private void appendJoinOnItem(StringBuilder sb, String sideAlias, SelectItem onItem) { final FromItem fromItem = onItem.getFromItem(); if (fromItem != null && fromItem.getSubQuery() != null && fromItem.getAlias() != null) { // there's a corner case scenario where an ON item references a // subquery being joined. In that case the getSuperQueryAlias() // method will include the subquery alias. final String superQueryAlias = onItem.getSuperQueryAlias(); sb.append(superQueryAlias); return; } if(_join != null && _leftSide.getJoin() != null) { sb.append(onItem.toSql()); return; } if (sideAlias != null) { sb.append(sideAlias); sb.append('.'); } final String superQueryAlias = onItem.getSuperQueryAlias(); sb.append(superQueryAlias); }
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 appendJoinOnItem(StringBuilder sb, String sideAlias, SelectItem onItem) { final FromItem fromItem = onItem.getFromItem(); if (fromItem != null && fromItem.getSubQuery() != null && fromItem.getAlias() != null) { // there's a corner case scenario where an ON item references a // subquery being joined. In that case the getSuperQueryAlias() // method will include the subquery alias. final String superQueryAlias = onItem.getSuperQueryAlias(); sb.append(superQueryAlias); return; } if(_join != null && _leftSide.getJoin() != null) { sb.append(onItem.toSql()); return; } if (sideAlias != null) { sb.append(sideAlias); sb.append('.'); } final String superQueryAlias = onItem.getSuperQueryAlias(); sb.append(superQueryAlias); }
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 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++; } }
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; }
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; }
public Query selectAll(final FromItem fromItem) { if (fromItem.getTable() != null) { final List<Column> columns = fromItem.getTable().getColumns(); for (final Column column : columns) { select(column, fromItem); } } else if (fromItem.getJoin() != null) { selectAll(fromItem.getLeftSide()); selectAll(fromItem.getRightSide()); } else if (fromItem.getSubQuery() != null) { final List<SelectItem> items = fromItem.getSubQuery().getSelectClause().getItems(); for (final SelectItem subQuerySelectItem : items) { select(new SelectItem(subQuerySelectItem, fromItem)); } } else { throw new MetaModelException("All select items ('*') not determinable with from item: " + fromItem); } return this; }
public Query selectAll(final FromItem fromItem) { if (fromItem.getTable() != null) { final List<Column> columns = fromItem.getTable().getColumns(); for (final Column column : columns) { select(column, fromItem); } } else if (fromItem.getJoin() != null) { selectAll(fromItem.getLeftSide()); selectAll(fromItem.getRightSide()); } else if (fromItem.getSubQuery() != null) { final List<SelectItem> items = fromItem.getSubQuery().getSelectClause().getItems(); for (final SelectItem subQuerySelectItem : items) { select(new SelectItem(subQuerySelectItem, fromItem)); } } else { throw new MetaModelException("All select items ('*') not determinable with from item: " + fromItem); } return this; }
for (FromItem fromItem : fromItems) { final Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { if (containsNonSelectScalaFunctions(subQuery)) {
for (FromItem fromItem : fromItems) { final Query subQuery = fromItem.getSubQuery(); if (subQuery != null) { if (containsNonSelectScalaFunctions(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 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; }