for (AbstractColumn column : group.getColumns()) {
if (!column.getAllAggregationColumns().isEmpty()) {
String messageToLogAndUser = "Column [" + column.toQueryString() + "] connot be in"
+ " GROUP BY because it has an aggregation.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
if (hasPivot()) {
for (AbstractColumn column : pivot.getColumns()) {
if (!column.getAllAggregationColumns().isEmpty()) {
String messageToLogAndUser = "Column [" + column.toQueryString() + "] connot be in"
+ " PIVOT because it has an aggregation.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
if (hasFilter()) {
List<AggregationColumn> filterAggregations = filter.getAggregationColumns();
if (!filterAggregations.isEmpty()) {
String messageToLogAndUser = "Column [" + filterAggregations.get(0).toQueryString() + "] "
+ " cannot appear in WHERE because it has an aggregation.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
// A column cannot appear both as an aggregation column and as a regular
// column in the selection.
for (SimpleColumn column1 : selectionSimple) {
String id = column1.getColumnId();
for (AggregationColumn column2 : selectionAggregated) {
if (id.equals(column2.getAggregatedColumn().getId())) {
String messageToLogAndUser = "Column [" + id + "] cannot be "
+ "selected both with and without aggregation in SELECT.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
// When aggregation is used, check that all selected columns are valid
// (a column is valid if it is either grouped-by, or is a
// scalar function column whose arguments are all valid columns).
if (!selectionAggregated.isEmpty()) {
for (AbstractColumn col : selectionColumns) {
checkSelectedColumnWithGrouping(groupColumns, col);
}
}
// Cannot group by a column that appears in an aggregation.
if (hasSelection() && hasGroup()) {
for (AggregationColumn column : selectionAggregated) {
String id = column.getAggregatedColumn().getId();
if (groupColumnIds.contains(id)) {
String messageToLogAndUser = "Column [" + id + "] which is "
+ "aggregated in SELECT, cannot appear in GROUP BY.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
// Cannot use grouping or pivoting when no aggregations are defined in the
// selection.
if (hasGroup() && selectionAggregated.isEmpty()) {
String messageToLogAndUser = "Cannot use GROUP BY when no "
+ "aggregations are defined in SELECT.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
if (hasPivot() && selectionAggregated.isEmpty()) {
String messageToLogAndUser = "Cannot use PIVOT when no "
+ "aggregations are defined in SELECT.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
// Cannot order by a column that is not in the selection when aggregations
// are defined.
if (hasSort() && !selectionAggregated.isEmpty()) {
for (AbstractColumn column : sort.getColumns()) {
String messageToLogAndUser = "Column [" + column.toQueryString() + "] which "
+ "appears in ORDER BY, must be in SELECT as well, because SELECT"
+ " contains aggregated columns.";
checkColumnInList(selection.getColumns(), column,
messageToLogAndUser);
}
}
// Cannot pivot by a column that appears in an aggregation.
if (hasPivot()) {
for (AggregationColumn column : selectionAggregated) {
String id = column.getAggregatedColumn().getId();
if (pivotColumnIds.contains(id)) {
String messageToLogAndUser = "Column [" + id + "] which is "
+ "aggregated in SELECT, cannot appear in PIVOT.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
// Cannot have a column appear in both group by and pivot.
if (hasGroup() && hasPivot()) {
for (String id : groupColumnIds) {
if (pivotColumnIds.contains(id)) {
String messageToLogAndUser = "Column [" + id + "] cannot appear" +
" both in GROUP BY and in PIVOT.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
// Cannot order by aggregation column when pivoting is used.
if (hasPivot() && !sortAggregated.isEmpty()) {
AggregationColumn column = sortAggregated.get(0);
String messageToLogAndUser = "Column [" +
column.getAggregatedColumn().getId() + "] " + "cannot be aggregated "
+ "in ORDER BY when PIVOT is used.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
// Cannot order by aggregation columns that weren't defined in the
// selection.
for (AggregationColumn column : sortAggregated) {
String messageToLogAndUser = "Aggregation [" + column.toQueryString() + "] "
+ "found in ORDER BY but was not found in SELECT";
checkColumnInList(selectionAggregated, column, messageToLogAndUser);
}
Set<AbstractColumn> labelColumns = (hasLabels()
? labels.getColumns() : Sets.<AbstractColumn>newHashSet());
Set<AbstractColumn> formatColumns = (hasUserFormatOptions()
? userFormatOptions.getColumns() : Sets.<AbstractColumn>newHashSet());
if (hasSelection()) {
for (AbstractColumn col : labelColumns) {
if (!selectionColumns.contains(col)) {
String messageToLogAndUser = "Column [" + col.toQueryString() + "] which"
+ " is referenced in LABEL, is not part of SELECT clause.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
for (AbstractColumn col : formatColumns) {
if (!selectionColumns.contains(col)) {
String messageToLogAndUser = "Column [" + col.toQueryString() + "] which"
+ " is referenced in FORMAT, is not part of SELECT clause.";
log.error(messageToLogAndUser);
throw new InvalidQueryException(messageToLogAndUser);
}
}
}
}