@Override protected Void visitDereferenceExpression(DereferenceExpression node, ImmutableSet.Builder<QualifiedName> builder) { if (columnReferences.contains(NodeRef.<Expression>of(node))) { builder.add(DereferenceExpression.getQualifiedName(node)); } else { process(node.getBase(), builder); } return null; }
/** * If this DereferenceExpression looks like a QualifiedName, return QualifiedName. * Otherwise return null */ public static QualifiedName getQualifiedName(DereferenceExpression expression) { List<String> parts = tryParseParts(expression.base, expression.field.getValue().toLowerCase(Locale.ENGLISH)); return parts == null ? null : QualifiedName.of(parts); }
@Override public Node visitDereference(SqlBaseParser.DereferenceContext context) { return new DereferenceExpression( getLocation(context), (Expression) visit(context.base), (Identifier) visit(context.fieldName)); }
@Override protected Object visitDereferenceExpression(DereferenceExpression node, Object context) Type type = type(node.getBase()); Object base = process(node.getBase(), context); return new DereferenceExpression(toExpression(base, type), node.getField()); Block row = (Block) base; Type returnType = type(node); String fieldName = node.getField().getValue(); List<Field> fields = rowType.getFields(); int index = -1; checkState(index >= 0, "could not find field name: %s", node.getField()); if (row.isNull(index)) { return null;
@Override protected Type visitDereferenceExpression(DereferenceExpression node, StackableAstVisitorContext<Context> context) QualifiedName qualifiedName = DereferenceExpression.getQualifiedName(node); Type baseType = process(node.getBase(), context); if (!(baseType instanceof RowType)) { throw new SemanticException(TYPE_MISMATCH, node.getBase(), "Expression %s is not of type ROW", node.getBase()); String fieldName = node.getField().getValue();
@Override protected R visitDereferenceExpression(DereferenceExpression node, C context) { process(node.getBase(), context); return null; }
private static List<String> tryParseParts(Expression base, String fieldName) { if (base instanceof Identifier) { return ImmutableList.of(((Identifier) base).getValue(), fieldName); } else if (base instanceof DereferenceExpression) { QualifiedName baseQualifiedName = getQualifiedName((DereferenceExpression) base); if (baseQualifiedName != null) { List<String> newList = new ArrayList<>(baseQualifiedName.getParts()); newList.add(fieldName); return newList; } } return null; }
private static Expression name(String first, String... parts) { return DereferenceExpression.from(QualifiedName.of(first, parts)); } }
@Override public Node visitDereference(SqlBaseParser.DereferenceContext context) { return new DereferenceExpression( getLocation(context), (Expression) visit(context.base), (Identifier) visit(context.fieldName)); }
@Override protected Object visitDereferenceExpression(DereferenceExpression node, Object context) Type type = type(node.getBase()); Object base = process(node.getBase(), context); return new DereferenceExpression(toExpression(base, type), node.getField()); Block row = (Block) base; Type returnType = type(node); String fieldName = node.getField().getValue(); List<Field> fields = rowType.getFields(); int index = -1; checkState(index >= 0, "could not find field name: %s", node.getField()); if (row.isNull(index)) { return null;
@Override protected Type visitDereferenceExpression(DereferenceExpression node, StackableAstVisitorContext<Context> context) QualifiedName qualifiedName = DereferenceExpression.getQualifiedName(node); Type baseType = process(node.getBase(), context); if (!(baseType instanceof RowType)) { throw new SemanticException(TYPE_MISMATCH, node.getBase(), "Expression %s is not of type ROW", node.getBase()); String fieldName = node.getField().getValue();
@Override protected R visitDereferenceExpression(DereferenceExpression node, C context) { process(node.getBase(), context); return null; }
/** * If this DereferenceExpression looks like a QualifiedName, return QualifiedName. * Otherwise return null */ public static QualifiedName getQualifiedName(DereferenceExpression expression) { List<Identifier> parts = null; if (expression.base instanceof Identifier) { parts = ImmutableList.of((Identifier) expression.base, expression.field); } else if (expression.base instanceof DereferenceExpression) { QualifiedName baseQualifiedName = getQualifiedName((DereferenceExpression) expression.base); if (baseQualifiedName != null) { ImmutableList.Builder<Identifier> builder = ImmutableList.builder(); builder.addAll(baseQualifiedName.getOriginalParts()); builder.add(expression.field); parts = builder.build(); } } return parts == null ? null : QualifiedName.of(parts); }
private static Expression name(String first, String... parts) { return DereferenceExpression.from(QualifiedName.of(first, parts)); } }
public static Expression from(QualifiedName name) { Expression result = null; for (String part : name.getParts()) { if (result == null) { result = new Identifier(part); } else { result = new DereferenceExpression(result, new Identifier(part)); } } return result; }
@Override protected Void visitDereferenceExpression(DereferenceExpression node, ImmutableSet.Builder<Expression> builder) { if (columnReferences.contains(NodeRef.<Expression>of(node))) { builder.add(node); } else { process(node.getBase(), builder); } return null; }
@Override protected Void visitDereferenceExpression(DereferenceExpression node, ImmutableSet.Builder<QualifiedName> builder) { if (columnReferences.contains(NodeRef.<Expression>of(node))) { builder.add(DereferenceExpression.getQualifiedName(node)); } else { process(node.getBase(), builder); } return null; }
private static QualifiedName asQualifiedName(Expression expression) { QualifiedName name = null; if (expression instanceof Identifier) { name = QualifiedName.of(((Identifier) expression).getValue()); } else if (expression instanceof DereferenceExpression) { name = DereferenceExpression.getQualifiedName((DereferenceExpression) expression); } return name; }