/** Returns the root relational expression, creating a {@link LogicalProject} * if necessary to remove fields that are not needed. */ public RelNode project() { return project(false); }
/** Creates a copy of this RelRoot, assigning a {@link RelNode}. */ public RelRoot withRel(RelNode rel) { if (rel == this.rel) { return this; } return new RelRoot(rel, validatedRowType, kind, fields, collation); }
@Override public Sequence<Object[]> get() { if (root.isRefTrivial()) { return druidRel.runQuery(); } else { // Add a mapping on top to accommodate root.fields. return Sequences.map( druidRel.runQuery(), new Function<Object[], Object[]>() { @Override public Object[] apply(final Object[] input) { final Object[] retVal = new Object[root.fields.size()]; for (int i = 0; i < root.fields.size(); i++) { retVal[i] = input[root.fields.get(i).getKey()]; } return retVal; } } ); } } };
private RelRoot expandView(RelOptTable.ToRelContext preparingStmt, RelDataType rowType, String queryString) { try { RelRoot root = preparingStmt.expandView(rowType, queryString, schemaPath, viewPath); root = root.withRel(RelOptUtil.createCastRel(root.rel, rowType, true)); return root; } catch (Exception e) { throw new RuntimeException("Error while parsing view definition: " + queryString, e); } } }
public RelRoot sqlToRel(SqlNode sqlNode) { assert sqlNode != null; RexBuilder rexBuilder = this.createRexBuilder(); RelOptCluster cluster = RelOptCluster.create(this.planner, rexBuilder); SqlToRelConverter sqlToRelConverter = new SqlToRelConverter( new ViewExpanderImpl(), this.validator, this.createCatalogReader(), cluster, this.convertletTable, SqlToRelConverter.Config.DEFAULT); RelRoot tempRoot = sqlToRelConverter.convertQuery(sqlNode, false, true); tempRoot = tempRoot.withRel(sqlToRelConverter.flattenTypes(tempRoot.project(), true)); tempRoot = tempRoot.withRel(RelDecorrelator.decorrelateQuery(tempRoot.project())); return tempRoot; }
return RelRoot.of(result, validatedRowType, query.getKind()) .withCollation(collation);
/** Creates a simple RelRoot. */ public static RelRoot of(RelNode rel, SqlKind kind) { return of(rel, rel.getRowType(), kind); }
private RelRoot expandView(RelOptTable.ToRelContext context, RelDataType rowType, String queryString) { try { final RelRoot root = context.expandView(rowType, queryString, schemaPath, viewPath); final RelNode rel = RelOptUtil.createCastRel(root.rel, rowType, true); // Expand any views final RelNode rel2 = rel.accept( new RelShuttleImpl() { @Override public RelNode visit(TableScan scan) { final RelOptTable table = scan.getTable(); final TranslatableTable translatableTable = table.unwrap(TranslatableTable.class); if (translatableTable != null) { return translatableTable.toRel(context, table); } return super.visit(scan); } }); return root.withRel(rel2); } catch (Exception e) { throw new RuntimeException("Error while parsing view definition: " + queryString, e); } } }
return RelRoot.of(result, validatedRowType, query.getKind()) .withCollation(collation);
/** Creates a simple RelRoot. */ public static RelRoot of(RelNode rel, SqlKind kind) { return of(rel, rel.getRowType(), kind); }
/** Returns the root relational expression, creating a {@link LogicalProject} * if necessary to remove fields that are not needed. */ public RelNode project() { return project(false); }
/** * Walks over a tree of relational expressions, replacing each * {@link org.apache.calcite.rel.RelNode} with a 'slimmed down' relational * expression that projects * only the columns required by its consumer. * * @param root Root of relational expression tree * @return Trimmed relational expression */ protected RelRoot trimUnusedFields(RelRoot root) { final SqlToRelConverter.Config config = SqlToRelConverter.configBuilder() .withTrimUnusedFields(shouldTrim(root.rel)) .withExpand(THREAD_EXPAND.get()) .build(); final SqlToRelConverter converter = getSqlToRelConverter(getSqlValidator(), catalogReader, config); final boolean ordered = !root.collation.getFieldCollations().isEmpty(); final boolean dml = SqlKind.DML.contains(root.kind); return root.withRel(converter.trimUnusedFields(dml || ordered, root.rel)); }
return RelRoot.of(result, validatedRowType, query.getKind()) .withCollation(collation);
/** Creates a copy of this RelRoot, assigning a {@link RelNode}. */ public RelRoot withRel(RelNode rel) { if (rel == this.rel) { return this; } return new RelRoot(rel, validatedRowType, kind, fields, collation); }
); if (!root.isRefTrivial()) {