@Override public PathSegment visitCall(RexCall call) { String itemStarFieldName = FieldsReWriterUtil.getFieldNameFromItemStarField(call, fieldNames); if (itemStarFieldName != null) { addDesiredField(itemStarFieldName, call.getType(), call); return new PathSegment.NameSegment(itemStarFieldName); } if (SqlStdOperatorTable.ITEM.equals(call.getOperator())) { PathSegment mapOrArray = call.operands.get(0).accept(this); if (mapOrArray != null) { if (call.operands.get(1) instanceof RexLiteral) { return mapOrArray.cloneWithNewChild(Utilities.convertLiteral((RexLiteral) call.operands.get(1))); } return mapOrArray; } } else { for (RexNode operand : call.operands) { addField(operand.accept(this)); } } return null; }
@Override public PathSegment visitInputRef(RexInputRef inputRef) { int index = inputRef.getIndex(); String name = fieldNames.get(index); RelDataTypeField field = fields.get(index); addDesiredField(name, field.getType(), inputRef); return new PathSegment.NameSegment(name); }
public static ProjectPushInfo getFieldsInformation(RelDataType rowType, List<RexNode> projects) { ProjectFieldsVisitor fieldsVisitor = new ProjectFieldsVisitor(rowType); for (RexNode exp : projects) { PathSegment segment = exp.accept(fieldsVisitor); fieldsVisitor.addField(segment); } return fieldsVisitor.getInfo(); }