public R process(Node node) { return process(node, null); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitComparisonExpression(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitInPredicate(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitIsNullPredicate(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitIsNotNullPredicate(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAddColumn(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitArithmeticUnary(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAliasedRelation(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAllColumns(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitArithmeticBinary(this, context); }
@Override protected ExtractionResult visitIsNullPredicate(IsNullPredicate node, Boolean complement) { if (!(node.getValue() instanceof SymbolReference)) { return super.visitIsNullPredicate(node, complement); } Symbol symbol = Symbol.from(node.getValue()); Type columnType = checkedTypeLookup(symbol); Domain domain = complementIfNecessary(Domain.onlyNull(columnType), complement); return new ExtractionResult( TupleDomain.withColumnDomains(ImmutableMap.of(symbol, domain)), TRUE_LITERAL); }
@Override protected ExtractionResult visitIsNotNullPredicate(IsNotNullPredicate node, Boolean complement) { if (!(node.getValue() instanceof SymbolReference)) { return super.visitIsNotNullPredicate(node, complement); } Symbol symbol = Symbol.from(node.getValue()); Type columnType = checkedTypeLookup(symbol); Domain domain = complementIfNecessary(Domain.notNull(columnType), complement); return new ExtractionResult( TupleDomain.withColumnDomains(ImmutableMap.of(symbol, domain)), TRUE_LITERAL); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAddColumn(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitArithmeticUnary(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAliasedRelation(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitAllColumns(this, context); }
@Override public <R, C> R accept(AstVisitor<R, C> visitor, C context) { return visitor.visitArithmeticBinary(this, context); }
@SuppressWarnings("unchecked") public <T extends Expression> T rewrite(T node, C context) { return (T) visitor.process(node, new Context<>(context, false)); }
@Override protected ExtractionResult visitInPredicate(InPredicate node, Boolean complement) { if (!(node.getValueList() instanceof InListExpression)) { return super.visitInPredicate(node, complement); } InListExpression valueList = (InListExpression) node.getValueList(); checkState(!valueList.getValues().isEmpty(), "InListExpression should never be empty"); ImmutableList.Builder<Expression> disjuncts = ImmutableList.builder(); for (Expression expression : valueList.getValues()) { disjuncts.add(new ComparisonExpression(EQUAL, node.getValue(), expression)); } ExtractionResult extractionResult = process(or(disjuncts.build()), complement); // preserve original IN predicate as remaining predicate if (extractionResult.tupleDomain.isAll()) { Expression originalPredicate = node; if (complement) { originalPredicate = new NotExpression(originalPredicate); } return new ExtractionResult(extractionResult.tupleDomain, originalPredicate); } return extractionResult; }
return super.visitComparisonExpression(node, complement); return super.visitComparisonExpression(node, complement); return super.visitComparisonExpression(node, complement); return super.visitComparisonExpression(node, complement);