Search in sources :

Example 16 with Filter

use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.core.Filter in project flink by apache.

the class PushFilterIntoTableSourceScanRule method matches.

@Override
public boolean matches(RelOptRuleCall call) {
    if (!super.matches(call)) {
        return false;
    }
    Filter filter = call.rel(0);
    if (filter.getCondition() == null) {
        return false;
    }
    LogicalTableScan scan = call.rel(1);
    TableSourceTable tableSourceTable = scan.getTable().unwrap(TableSourceTable.class);
    return canPushdownFilter(tableSourceTable);
}
Also used : Filter(org.apache.calcite.rel.core.Filter) TableSourceTable(org.apache.flink.table.planner.plan.schema.TableSourceTable) LogicalTableScan(org.apache.calcite.rel.logical.LogicalTableScan)

Example 17 with Filter

use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.core.Filter in project flink by apache.

the class PushFilterIntoTableSourceScanRule method onMatch.

@Override
public void onMatch(RelOptRuleCall call) {
    Filter filter = call.rel(0);
    LogicalTableScan scan = call.rel(1);
    TableSourceTable table = scan.getTable().unwrap(TableSourceTable.class);
    pushFilterIntoScan(call, filter, scan, table);
}
Also used : Filter(org.apache.calcite.rel.core.Filter) TableSourceTable(org.apache.flink.table.planner.plan.schema.TableSourceTable) LogicalTableScan(org.apache.calcite.rel.logical.LogicalTableScan)

Example 18 with Filter

use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.core.Filter in project flink by apache.

the class PushFilterIntoTableSourceScanRule method pushFilterIntoScan.

private void pushFilterIntoScan(RelOptRuleCall call, Filter filter, LogicalTableScan scan, FlinkPreparingTableBase relOptTable) {
    RelBuilder relBuilder = call.builder();
    Tuple2<RexNode[], RexNode[]> extractedPredicates = extractPredicates(filter.getInput().getRowType().getFieldNames().toArray(new String[0]), filter.getCondition(), scan, relBuilder.getRexBuilder());
    RexNode[] convertiblePredicates = extractedPredicates._1;
    RexNode[] unconvertedPredicates = extractedPredicates._2;
    if (convertiblePredicates.length == 0) {
        // no condition can be translated to expression
        return;
    }
    Tuple2<SupportsFilterPushDown.Result, TableSourceTable> scanAfterPushdownWithResult = resolveFiltersAndCreateTableSourceTable(convertiblePredicates, relOptTable.unwrap(TableSourceTable.class), scan, relBuilder);
    SupportsFilterPushDown.Result result = scanAfterPushdownWithResult._1;
    TableSourceTable tableSourceTable = scanAfterPushdownWithResult._2;
    LogicalTableScan newScan = LogicalTableScan.create(scan.getCluster(), tableSourceTable, scan.getHints());
    if (result.getRemainingFilters().isEmpty() && unconvertedPredicates.length == 0) {
        call.transformTo(newScan);
    } else {
        RexNode remainingCondition = createRemainingCondition(relBuilder, result.getRemainingFilters(), unconvertedPredicates);
        RexNode simplifiedRemainingCondition = FlinkRexUtil.simplify(relBuilder.getRexBuilder(), remainingCondition, filter.getCluster().getPlanner().getExecutor());
        Filter newFilter = filter.copy(filter.getTraitSet(), newScan, simplifiedRemainingCondition);
        call.transformTo(newFilter);
    }
}
Also used : RelBuilder(org.apache.calcite.tools.RelBuilder) Filter(org.apache.calcite.rel.core.Filter) SupportsFilterPushDown(org.apache.flink.table.connector.source.abilities.SupportsFilterPushDown) TableSourceTable(org.apache.flink.table.planner.plan.schema.TableSourceTable) LogicalTableScan(org.apache.calcite.rel.logical.LogicalTableScan) RexNode(org.apache.calcite.rex.RexNode)

Example 19 with Filter

use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.core.Filter in project flink by apache.

the class RelDecorrelator method decorrelateInputWithValueGenerator.

private Frame decorrelateInputWithValueGenerator(RelNode rel, Frame frame) {
    // currently only handles one input
    assert rel.getInputs().size() == 1;
    RelNode oldInput = frame.r;
    final SortedMap<CorDef, Integer> corDefOutputs = new TreeMap<>(frame.corDefOutputs);
    final Collection<CorRef> corVarList = cm.mapRefRelToCorRef.get(rel);
    // This means that we do not need a value generator.
    if (rel instanceof Filter) {
        SortedMap<CorDef, Integer> map = new TreeMap<>();
        List<RexNode> projects = new ArrayList<>();
        for (CorRef correlation : corVarList) {
            final CorDef def = correlation.def();
            if (corDefOutputs.containsKey(def) || map.containsKey(def)) {
                continue;
            }
            try {
                findCorrelationEquivalent(correlation, ((Filter) rel).getCondition());
            } catch (Util.FoundOne e) {
                if (e.getNode() instanceof RexInputRef) {
                    map.put(def, ((RexInputRef) e.getNode()).getIndex());
                } else {
                    map.put(def, frame.r.getRowType().getFieldCount() + projects.size());
                    projects.add((RexNode) e.getNode());
                }
            }
        }
        // generator.
        if (map.size() == corVarList.size()) {
            map.putAll(frame.corDefOutputs);
            final RelNode r;
            if (!projects.isEmpty()) {
                relBuilder.push(oldInput).project(Iterables.concat(relBuilder.fields(), projects));
                r = relBuilder.build();
            } else {
                r = oldInput;
            }
            return register(rel.getInput(0), r, frame.oldToNewOutputs, map);
        }
    }
    int leftInputOutputCount = frame.r.getRowType().getFieldCount();
    // can directly add positions into corDefOutputs since join
    // does not change the output ordering from the inputs.
    RelNode valueGen = createValueGenerator(corVarList, leftInputOutputCount, corDefOutputs);
    RelNode join = relBuilder.push(frame.r).push(valueGen).join(JoinRelType.INNER, relBuilder.literal(true), ImmutableSet.of()).build();
    // Filter) are in the output and in the same position.
    return register(rel.getInput(0), join, frame.oldToNewOutputs, corDefOutputs);
}
Also used : ArrayList(java.util.ArrayList) RelMdUtil(org.apache.calcite.rel.metadata.RelMdUtil) RexUtil(org.apache.calcite.rex.RexUtil) RelOptUtil(org.apache.calcite.plan.RelOptUtil) ReflectUtil(org.apache.calcite.util.ReflectUtil) Util(org.apache.calcite.util.Util) TreeMap(java.util.TreeMap) RelNode(org.apache.calcite.rel.RelNode) Filter(org.apache.calcite.rel.core.Filter) LogicalFilter(org.apache.calcite.rel.logical.LogicalFilter) RexInputRef(org.apache.calcite.rex.RexInputRef) RexNode(org.apache.calcite.rex.RexNode)

Example 20 with Filter

use of org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.core.Filter in project beam by apache.

the class ExpressionConverter method convertIntervalToRexIntervalLiteral.

private RexNode convertIntervalToRexIntervalLiteral(ResolvedLiteral resolvedLiteral) {
    if (resolvedLiteral.getType().getKind() != TYPE_STRING) {
        throw new ZetaSqlException(INTERVAL_FORMAT_MSG);
    }
    String valStr = resolvedLiteral.getValue().getStringValue();
    List<String> stringList = Arrays.stream(valStr.split(" ")).filter(s -> !s.isEmpty()).collect(Collectors.toList());
    if (stringList.size() != 3) {
        throw new ZetaSqlException(INTERVAL_FORMAT_MSG);
    }
    if (!Ascii.toUpperCase(stringList.get(0)).equals("INTERVAL")) {
        throw new ZetaSqlException(INTERVAL_FORMAT_MSG);
    }
    long intervalValue;
    try {
        intervalValue = Long.parseLong(stringList.get(1));
    } catch (NumberFormatException e) {
        throw new ZetaSqlException(Status.UNIMPLEMENTED.withDescription(INTERVAL_FORMAT_MSG).withCause(e).asRuntimeException());
    }
    String intervalDatepart = Ascii.toUpperCase(stringList.get(2));
    return createCalciteIntervalRexLiteral(intervalValue, intervalDatepart);
}
Also used : RelNode(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.RelNode) Arrays(java.util.Arrays) FixedOutputSchemaTVF(com.google.zetasql.TableValuedFunction.FixedOutputSchemaTVF) Type(com.google.zetasql.Type) TYPE_TIMESTAMP(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_TIMESTAMP) SqlParserPos(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.parser.SqlParserPos) Status(com.google.zetasql.io.grpc.Status) Value(com.google.zetasql.Value) SqlIntervalQualifier(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.SqlIntervalQualifier) USER_DEFINED_SQL_FUNCTIONS(org.apache.beam.sdk.extensions.sql.zetasql.BeamZetaSqlCatalog.USER_DEFINED_SQL_FUNCTIONS) BigDecimal(java.math.BigDecimal) TVFStreamingUtils(org.apache.beam.sdk.extensions.sql.impl.utils.TVFStreamingUtils) ResolvedColumn(com.google.zetasql.resolvedast.ResolvedColumn) Map(java.util.Map) RexLiteral(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexLiteral) RelDataTypeFieldImpl(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.type.RelDataTypeFieldImpl) Internal(org.apache.beam.sdk.annotations.Internal) ResolvedFunctionCall(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedFunctionCall) ZetaSqlUserDefinedSQLNativeTableValuedFunction(org.apache.beam.sdk.extensions.sql.impl.ZetaSqlUserDefinedSQLNativeTableValuedFunction) RexBuilder(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexBuilder) ImmutableSet(com.google.common.collect.ImmutableSet) ResolvedGetStructField(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedGetStructField) ImmutableMap(com.google.common.collect.ImmutableMap) ResolvedLiteral(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedLiteral) ResolvedOrderByScan(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedOrderByScan) ResolvedProjectScan(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedProjectScan) ZetaSqlException(org.apache.beam.sdk.extensions.sql.zetasql.ZetaSqlException) Collectors(java.util.stream.Collectors) ResolvedParameter(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedParameter) List(java.util.List) ResolvedExpr(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedExpr) TypeKind(com.google.zetasql.ZetaSQLType.TypeKind) TVFRelation(com.google.zetasql.TVFRelation) TYPE_BOOL(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_BOOL) TYPE_DOUBLE(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_DOUBLE) IntStream(java.util.stream.IntStream) ResolvedColumnRef(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedColumnRef) ZetaSqlCalciteTranslationUtils(org.apache.beam.sdk.extensions.sql.zetasql.ZetaSqlCalciteTranslationUtils) TableValuedFunction(com.google.zetasql.TableValuedFunction) ResolvedArgumentRef(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedArgumentRef) RexNode(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexNode) SqlIdentifier(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.SqlIdentifier) ZETASQL_FUNCTION_GROUP_NAME(org.apache.beam.sdk.extensions.sql.zetasql.BeamZetaSqlCatalog.ZETASQL_FUNCTION_GROUP_NAME) SqlKind(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.SqlKind) ResolvedAggregateScan(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedAggregateScan) TYPE_BYTES(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_BYTES) ArrayList(java.util.ArrayList) TYPE_STRING(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_STRING) SqlRowOperator(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.fun.SqlRowOperator) ImmutableList(com.google.common.collect.ImmutableList) PRE_DEFINED_WINDOW_FUNCTIONS(org.apache.beam.sdk.extensions.sql.zetasql.BeamZetaSqlCatalog.PRE_DEFINED_WINDOW_FUNCTIONS) Preconditions.checkArgument(org.apache.beam.vendor.guava.v26_0_jre.com.google.common.base.Preconditions.checkArgument) ResolvedNodes(com.google.zetasql.resolvedast.ResolvedNodes) RelDataTypeField(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.type.RelDataTypeField) RESOLVED_FUNCTION_CALL(com.google.zetasql.ZetaSQLResolvedNodeKind.ResolvedNodeKind.RESOLVED_FUNCTION_CALL) TYPE_NUMERIC(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_NUMERIC) Nullable(org.checkerframework.checker.nullness.qual.Nullable) ResolvedCast(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedCast) QueryParameters(org.apache.beam.sdk.extensions.sql.impl.QueryPlanner.QueryParameters) USER_DEFINED_JAVA_SCALAR_FUNCTIONS(org.apache.beam.sdk.extensions.sql.zetasql.BeamZetaSqlCatalog.USER_DEFINED_JAVA_SCALAR_FUNCTIONS) Ascii(com.google.common.base.Ascii) TYPE_INT64(com.google.zetasql.ZetaSQLType.TypeKind.TYPE_INT64) TimeUnit(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.avatica.util.TimeUnit) RexCall(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexCall) SqlOperator(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.sql.SqlOperator) RelOptCluster(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.plan.RelOptCluster) RelDataType(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.type.RelDataType) RexInputRef(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rex.RexInputRef) ResolvedComputedColumn(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedComputedColumn) Preconditions(com.google.common.base.Preconditions) ResolvedCreateFunctionStmt(com.google.zetasql.resolvedast.ResolvedNodes.ResolvedCreateFunctionStmt) RelRecordType(org.apache.beam.vendor.calcite.v1_28_0.org.apache.calcite.rel.type.RelRecordType) ZetaSqlException(org.apache.beam.sdk.extensions.sql.zetasql.ZetaSqlException)

Aggregations

Filter (org.apache.calcite.rel.core.Filter)67 RexNode (org.apache.calcite.rex.RexNode)38 RelNode (org.apache.calcite.rel.RelNode)35 Project (org.apache.calcite.rel.core.Project)23 ArrayList (java.util.ArrayList)20 RexBuilder (org.apache.calcite.rex.RexBuilder)17 Aggregate (org.apache.calcite.rel.core.Aggregate)15 RelBuilder (org.apache.calcite.tools.RelBuilder)15 Join (org.apache.calcite.rel.core.Join)13 TableScan (org.apache.calcite.rel.core.TableScan)11 List (java.util.List)10 Sort (org.apache.calcite.rel.core.Sort)10 RelOptUtil (org.apache.calcite.plan.RelOptUtil)8 ImmutableList (com.google.common.collect.ImmutableList)7 Collectors (java.util.stream.Collectors)7 LogicalFilter (org.apache.calcite.rel.logical.LogicalFilter)7 RelDataType (org.apache.calcite.rel.type.RelDataType)7 RexInputRef (org.apache.calcite.rex.RexInputRef)7 RexUtil (org.apache.calcite.rex.RexUtil)7 ImmutableBitSet (org.apache.calcite.util.ImmutableBitSet)7