use of org.apache.flink.table.planner.plan.nodes.logical.FlinkLogicalWindowAggregate in project flink by apache.
the class StreamPhysicalPythonGroupWindowAggregateRule method matches.
@Override
public boolean matches(RelOptRuleCall call) {
FlinkLogicalWindowAggregate agg = call.rel(0);
List<AggregateCall> aggCalls = agg.getAggCallList();
// check if we have grouping sets
if (agg.getGroupType() != Aggregate.Group.SIMPLE || agg.indicator) {
throw new TableException("GROUPING SETS are currently not supported.");
}
boolean existGeneralPythonFunction = aggCalls.stream().anyMatch(x -> PythonUtil.isPythonAggregate(x, PythonFunctionKind.GENERAL));
boolean existPandasFunction = aggCalls.stream().anyMatch(x -> PythonUtil.isPythonAggregate(x, PythonFunctionKind.PANDAS));
boolean existJavaFunction = aggCalls.stream().anyMatch(x -> !PythonUtil.isPythonAggregate(x, null) && !PythonUtil.isBuiltInAggregate(x));
if (existPandasFunction && existGeneralPythonFunction) {
throw new TableException("Pandas UDAFs and General Python UDAFs are not supported in used together currently.");
}
if (existPandasFunction || existGeneralPythonFunction) {
if (existJavaFunction) {
throw new TableException("Python UDAF and Java/Scala UDAF cannot be used together.");
}
return true;
} else {
return false;
}
}
use of org.apache.flink.table.planner.plan.nodes.logical.FlinkLogicalWindowAggregate in project flink by apache.
the class StreamPhysicalPythonGroupWindowAggregateRule method convert.
@Override
public RelNode convert(RelNode rel) {
FlinkLogicalWindowAggregate agg = (FlinkLogicalWindowAggregate) rel;
LogicalWindow window = agg.getWindow();
List<AggregateCall> aggCalls = agg.getAggCallList();
boolean isPandasPythonUDAF = aggCalls.stream().anyMatch(x -> PythonUtil.isPythonAggregate(x, PythonFunctionKind.PANDAS));
if (isPandasPythonUDAF && window instanceof SessionGroupWindow) {
throw new TableException("Session Group Window is currently not supported for Pandas UDAF.");
}
RelNode input = agg.getInput();
RelOptCluster cluster = rel.getCluster();
FlinkRelDistribution requiredDistribution;
if (agg.getGroupCount() != 0) {
requiredDistribution = FlinkRelDistribution.hash(agg.getGroupSet().asList(), true);
} else {
requiredDistribution = FlinkRelDistribution.SINGLETON();
}
RelTraitSet requiredTraitSet = input.getTraitSet().replace(FlinkConventions.STREAM_PHYSICAL()).replace(requiredDistribution);
RelTraitSet providedTraitSet = rel.getTraitSet().replace(FlinkConventions.STREAM_PHYSICAL());
RelNode newInput = RelOptRule.convert(input, requiredTraitSet);
ReadableConfig config = ShortcutUtils.unwrapTableConfig(rel);
WindowEmitStrategy emitStrategy = WindowEmitStrategy.apply(config, agg.getWindow());
if (emitStrategy.produceUpdates()) {
throw new TableException("Python Group Window Aggregate Function is currently not supported for early fired or lately fired.");
}
return new StreamPhysicalPythonGroupWindowAggregate(cluster, providedTraitSet, newInput, rel.getRowType(), agg.getGroupSet().toArray(), JavaScalaConversionUtil.toScala(aggCalls), agg.getWindow(), agg.getNamedProperties(), emitStrategy);
}
use of org.apache.flink.table.planner.plan.nodes.logical.FlinkLogicalWindowAggregate in project flink by apache.
the class BatchPhysicalPythonWindowAggregateRule method matches.
@Override
public boolean matches(RelOptRuleCall call) {
FlinkLogicalWindowAggregate agg = call.rel(0);
List<AggregateCall> aggCalls = agg.getAggCallList();
boolean existGeneralPythonFunction = aggCalls.stream().anyMatch(x -> PythonUtil.isPythonAggregate(x, PythonFunctionKind.GENERAL));
boolean existPandasFunction = aggCalls.stream().anyMatch(x -> PythonUtil.isPythonAggregate(x, PythonFunctionKind.PANDAS));
boolean existJavaFunction = aggCalls.stream().anyMatch(x -> !PythonUtil.isPythonAggregate(x, null));
if (existPandasFunction || existGeneralPythonFunction) {
if (existGeneralPythonFunction) {
throw new TableException("non-Pandas UDAFs are not supported in batch mode currently.");
}
if (existJavaFunction) {
throw new TableException("Python UDAF and Java/Scala UDAF cannot be used together.");
}
return true;
} else {
return false;
}
}
use of org.apache.flink.table.planner.plan.nodes.logical.FlinkLogicalWindowAggregate in project flink by apache.
the class RelTimeIndicatorConverter method visitWindowAggregate.
private FlinkLogicalWindowAggregate visitWindowAggregate(FlinkLogicalWindowAggregate agg) {
RelNode newInput = convertAggInput(agg);
List<AggregateCall> updatedAggCalls = convertAggregateCalls(agg);
return new FlinkLogicalWindowAggregate(agg.getCluster(), agg.getTraitSet(), newInput, agg.getGroupSet(), updatedAggCalls, agg.getWindow(), agg.getNamedProperties());
}
use of org.apache.flink.table.planner.plan.nodes.logical.FlinkLogicalWindowAggregate in project flink by apache.
the class RelTimeIndicatorConverter method visitWindowTableAggregate.
private RelNode visitWindowTableAggregate(FlinkLogicalWindowTableAggregate tableAgg) {
FlinkLogicalWindowAggregate correspondingAgg = new FlinkLogicalWindowAggregate(tableAgg.getCluster(), tableAgg.getTraitSet(), tableAgg.getInput(), tableAgg.getGroupSet(), tableAgg.getAggCallList(), tableAgg.getWindow(), tableAgg.getNamedProperties());
FlinkLogicalWindowAggregate convertedWindowAgg = visitWindowAggregate(correspondingAgg);
return new FlinkLogicalWindowTableAggregate(tableAgg.getCluster(), tableAgg.getTraitSet(), convertedWindowAgg.getInput(), tableAgg.getGroupSet(), tableAgg.getGroupSets(), convertedWindowAgg.getAggCallList(), tableAgg.getWindow(), tableAgg.getNamedProperties());
}
Aggregations