private RexNode buildRexForField(LogicalExpression expr, RelDataType newRowType) { ExprToRex toRex = new ExprToRex(origRel, newRowType, builder); return expr.accept(toRex, null); }
private RexNode makeItemOperator(String[] paths, int index, RelDataType rowType) { if (index == 0) { //last one, return ITEM([0]-inputRef, [1] Literal) final RelDataTypeField field = findField(paths[0], rowType); return field == null ? null : builder.makeInputRef(field.getType(), field.getIndex()); } return builder.makeCall(SqlStdOperatorTable.ITEM, makeItemOperator(paths, index - 1, rowType), builder.makeLiteral(paths[index])); }
@Override public RexNode visitSchemaPath(SchemaPath path, Void value) throws RuntimeException { PathSegment.NameSegment rootSegment = path.getRootSegment(); if (rootSegment.isLastPath()) { final RelDataTypeField field = findField(rootSegment.getPath(), newRowType); return field == null ? null : builder.makeInputRef(field.getType(), field.getIndex()); } List<String> paths = Lists.newArrayList(); while (rootSegment != null) { paths.add(rootSegment.getPath()); rootSegment = (PathSegment.NameSegment) rootSegment.getChild(); } return makeItemOperator(paths.toArray(new String[0]), paths.size() - 1, newRowType); }