&& queryBlock.getGroupBy().getItems().size() > 0) { return createCountUseSubQuery(select, dbType);
return; List<SQLExpr> items = groupBy.getItems();
if (current == groupBy.getHaving()) { column.setHaving(true); } else if (groupBy.getItems().contains(current)) { column.setGroupBy(true);
for (SQLExpr sqlExpr : groupBy.getItems()) { mySqlGroupBy.addItem(sqlExpr);
@Override public boolean visit(SQLSelectGroupByClause x) { result.getMergeContext().increGroupByCount(); List<String> groupByColumns = new ArrayList<String>(); List<SQLExpr> items = x.getItems(); for (SQLExpr expr : items) { groupByColumns.add(((SQLName) expr).getSimpleName()); } result.getMergeContext().setGroupByColumns(groupByColumns); return true; }
for (SQLExpr expr : groupBy.getItems()) { statExpr(expr);
&& queryBlock.getGroupBy().getItems().size() > 0) { return createCountUseSubQuery(select, dbType);
if (current == groupBy.getHaving()) { column.setHaving(true); } else if (groupBy.getItems().contains(current)) { column.setGroupBy(true);
private void parseGroupCommon(RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, TableConfig tc) { if (mysqlSelectQuery.getGroupBy() != null) { SQLSelectGroupByClause groupBy = mysqlSelectQuery.getGroupBy(); boolean hasPartitionColumn = false; for (SQLExpr groupByItem : groupBy.getItems()) { if (isNeedOptimizer(groupByItem)) { rrs.setNeedOptimizer(true); return; } else if (groupByItem instanceof SQLIdentifierExpr) { SQLIdentifierExpr item = (SQLIdentifierExpr) groupByItem; if (item.getSimpleName().equalsIgnoreCase(tc.getPartitionColumn())) { hasPartitionColumn = true; } } else if (groupByItem instanceof SQLPropertyExpr) { SQLPropertyExpr item = (SQLPropertyExpr) groupByItem; if (item.getSimpleName().equalsIgnoreCase(tc.getPartitionColumn())) { hasPartitionColumn = true; } } } if (groupBy.getItems().size() > 0 && !hasPartitionColumn) { rrs.setNeedOptimizer(true); return; } if (groupBy.getItems().size() == 0 && groupBy.getHaving() != null) { // only having filter need optimizer rrs.setNeedOptimizer(true); } } }
for (SQLExpr expr : groupBy.getItems()) { statExpr(expr);
return; List<SQLExpr> groupByItems = mysqlSelectQuery.getGroupBy().getItems(); if (groupByItems == null || groupByItems.size() == 0){ return;
return; List<SQLExpr> items = groupBy.getItems();
if (sqlGroupBy != null && CollectionUtils.isNotEmpty(sqlGroupBy.getItems())) { String queryAs = dslContext.getParseResult().getQueryAs(); for (SQLExpr groupByItem : sqlGroupBy.getItems()) { if (!(groupByItem instanceof SQLMethodInvokeExpr)) { throw new ElasticSql2DslException("[syntax error] group by item must be an agg method call");
private void parseAggGroupCommon(SchemaConfig schema, SQLStatement stmt, RouteResultset rrs, MySqlSelectQueryBlock mysqlSelectQuery, TableConfig tc) throws SQLException { Map<String, String> aliaColumns = new HashMap<>(); boolean isDistinct = (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCT) || (mysqlSelectQuery.getDistionOption() == SQLSetQuantifier.DISTINCTROW); parseAggExprCommon(schema, rrs, mysqlSelectQuery, aliaColumns, tc, isDistinct); if (rrs.isNeedOptimizer()) { tryAddLimit(schema, tc, mysqlSelectQuery); rrs.setSqlStatement(stmt); return; } // distinct change to group by if (isDistinct) { mysqlSelectQuery.setDistionOption(0); SQLSelectGroupByClause groupBy = new SQLSelectGroupByClause(); for (String fieldName : aliaColumns.keySet()) { groupBy.addItem(new SQLIdentifierExpr(fieldName)); } mysqlSelectQuery.setGroupBy(groupBy); } // setGroupByCols if (mysqlSelectQuery.getGroupBy() != null) { List<SQLExpr> groupByItems = mysqlSelectQuery.getGroupBy().getItems(); String[] groupByCols = buildGroupByCols(groupByItems, aliaColumns); rrs.setGroupByCols(groupByCols); } if (isDistinct) { rrs.changeNodeSqlAfterAddLimit(statementToString(stmt), 0, -1); } }
@Test public void testGroupby() { MySqlSelectQueryBlock query = getQuery("select col1,col2 from table1 group by col1,col2"); SQLSelectGroupByClause groupBy = query.getGroupBy(); int i = 0; for (SQLExpr p : groupBy.getItems()) { i++; String groupCol = "col" + i; MySQLItemVisitor v = new MySQLItemVisitor(this.currentDb, utf8Charset, null); p.accept(v); Item item = v.getItem(); Assert.assertEquals(true, groupCol.equals(item.getItemName())); } }
@Test public void testGroupbyOrder() { MySqlSelectQueryBlock query = getQuery("select col1,col2 from table1 group by col1 desc,col2 asc "); SQLSelectGroupByClause groupBy = query.getGroupBy(); int i = 0; for (SQLExpr p : groupBy.getItems()) { i++; String groupCol = "col" + i; MySqlOrderingExpr groupitem = (MySqlOrderingExpr) p; SQLExpr q = groupitem.getExpr(); MySQLItemVisitor v = new MySQLItemVisitor(this.currentDb, utf8Charset, null); q.accept(v); Item item = v.getItem(); Assert.assertEquals(true, groupCol.equals(item.getItemName())); } }
private void handleGroupBy(SQLSelectGroupByClause groupBy) { for (SQLExpr p : groupBy.getItems()) { if (p instanceof MySqlOrderingExpr) { MySqlOrderingExpr groupitem = (MySqlOrderingExpr) p; SQLExpr q = groupitem.getExpr(); MySQLItemVisitor v = new MySQLItemVisitor(this.currentDb, this.charsetIndex, this.metaManager); q.accept(v); this.tableNode = tableNode.groupBy(v.getItem(), groupitem.getType()); } else { MySQLItemVisitor v = new MySQLItemVisitor(this.currentDb, this.charsetIndex, this.metaManager); p.accept(v); this.tableNode = tableNode.groupBy(v.getItem(), SQLOrderingSpecification.ASC); } } if (groupBy.isWithRollUp()) { throw new MySQLOutPutException(ErrorCode.ER_OPTIMIZER, "", "with rollup is not supported yet!"); } if (groupBy.getHaving() != null) { handleHavingCondition(groupBy.getHaving()); } }
for (SQLExpr sqlExpr : groupBy.getItems()) { mySqlGroupBy.addItem(sqlExpr);