in core/src/main/java/org/apache/calcite/materialize/Lattice.java [262:378]
public String sql(ImmutableBitSet groupSet, boolean group,
List<Measure> aggCallList, SqlDialect dialect) {
final List<LatticeNode> usedNodes = new ArrayList<>();
if (group) {
final ImmutableBitSet.Builder columnSetBuilder = groupSet.rebuild();
for (Measure call : aggCallList) {
for (Column arg : call.args) {
columnSetBuilder.set(arg.ordinal);
}
}
final ImmutableBitSet columnSet = columnSetBuilder.build();
// Figure out which nodes are needed. Use a node if its columns are used
// or if has a child whose columns are used.
for (LatticeNode node : rootNode.descendants) {
if (ImmutableBitSet.range(node.startCol, node.endCol)
.intersects(columnSet)) {
node.use(usedNodes);
}
if (usedNodes.isEmpty()) {
usedNodes.add(rootNode);
}
}
} else {
usedNodes.addAll(rootNode.descendants);
}
final StringBuilder buf = new StringBuilder("SELECT ");
final StringBuilder groupBuf = new StringBuilder("\nGROUP BY ");
int k = 0;
final Set<String> columnNames = new HashSet<>();
final SqlWriter w = createSqlWriter(dialect, buf, resolveField(dialect));
if (groupSet != null) {
for (int i : groupSet) {
if (k++ > 0) {
buf.append(", ");
groupBuf.append(", ");
}
final Column column = columns.get(i);
column.toSql(w);
column.toSql(w.with(groupBuf));
if (column instanceof BaseColumn) {
columnNames.add(((BaseColumn) column).column);
}
if (!column.alias.equals(column.defaultAlias())) {
buf.append(" AS ");
dialect.quoteIdentifier(buf, column.alias);
}
}
int m = 0;
for (Measure measure : aggCallList) {
if (k++ > 0) {
buf.append(", ");
}
buf.append(measure.agg.getName())
.append("(");
if (measure.args.isEmpty()) {
buf.append("*");
} else {
int z = 0;
for (Column arg : measure.args) {
if (z++ > 0) {
buf.append(", ");
}
arg.toSql(w);
}
}
buf.append(") AS ");
String measureName;
while (!columnNames.add(measureName = "m" + m)) {
++m;
}
dialect.quoteIdentifier(buf, measureName);
}
} else {
buf.append("*");
}
buf.append("\nFROM ");
for (LatticeNode node : usedNodes) {
if (node instanceof LatticeChildNode) {
buf.append("\nJOIN ");
}
dialect.quoteIdentifier(buf, node.table.t.getQualifiedName());
String alias = node.alias;
if (alias != null) {
buf.append(" AS ");
dialect.quoteIdentifier(buf, alias);
}
if (node instanceof LatticeChildNode) {
final LatticeChildNode node1 = (LatticeChildNode) node;
buf.append(" ON ");
k = 0;
for (IntPair pair : node1.link) {
if (k++ > 0) {
buf.append(" AND ");
}
final Column left = columns.get(node1.parent.startCol + pair.source);
left.toSql(w);
buf.append(" = ");
final Column right = columns.get(node.startCol + pair.target);
right.toSql(w);
}
}
}
if (CalciteSystemProperty.DEBUG.value()) {
System.out.println("Lattice SQL:\n"
+ buf);
}
if (group) {
if (groupSet.isEmpty()) {
groupBuf.append("()");
}
buf.append(groupBuf);
}
return buf.toString();
}