@Override public ActualProperties visitAggregation(AggregationNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); ActualProperties translated = properties.translate(symbol -> node.getGroupingKeys().contains(symbol) ? Optional.of(symbol) : Optional.empty()); return ActualProperties.builderFrom(translated) .local(LocalProperties.grouped(node.getGroupingKeys())) .build(); }
@Override public ActualProperties visitAssignUniqueId(AssignUniqueId node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); ImmutableList.Builder<LocalProperty<Symbol>> newLocalProperties = ImmutableList.builder(); newLocalProperties.addAll(properties.getLocalProperties()); newLocalProperties.add(new GroupingProperty<>(ImmutableList.of(node.getIdColumn()))); node.getSource().getOutputSymbols().stream() .forEach(column -> newLocalProperties.add(new ConstantProperty<>(column))); if (properties.getNodePartitioning().isPresent()) { // preserve input (possibly preferred) partitioning return ActualProperties.builderFrom(properties) .local(newLocalProperties.build()) .build(); } return ActualProperties.builderFrom(properties) .global(partitionedOn(ARBITRARY_DISTRIBUTION, ImmutableList.of(node.getIdColumn()), Optional.empty())) .local(newLocalProperties.build()) .build(); }
@Override public ActualProperties visitFilter(FilterNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); DomainTranslator.ExtractionResult decomposedPredicate = DomainTranslator.fromPredicate( metadata, session, node.getPredicate(), types); Map<Symbol, NullableValue> constants = new HashMap<>(properties.getConstants()); constants.putAll(extractFixedValues(decomposedPredicate.getTupleDomain()).orElse(ImmutableMap.of())); return ActualProperties.builderFrom(properties) .constants(constants) .build(); }
@Override public ActualProperties visitIndexJoin(IndexJoinNode node, List<ActualProperties> inputProperties) { // TODO: include all equivalent columns in partitioning properties ActualProperties probeProperties = inputProperties.get(0); ActualProperties indexProperties = inputProperties.get(1); switch (node.getType()) { case INNER: return ActualProperties.builderFrom(probeProperties) .constants(ImmutableMap.<Symbol, NullableValue>builder() .putAll(probeProperties.getConstants()) .putAll(indexProperties.getConstants()) .build()) .build(); case SOURCE_OUTER: return ActualProperties.builderFrom(probeProperties) .constants(probeProperties.getConstants()) .build(); default: throw new UnsupportedOperationException("Unsupported join type: " + node.getType()); } }
private StreamProperties unordered(boolean unordered) { if (unordered) { ActualProperties updatedProperies = null; if (otherActualProperties != null) { updatedProperies = ActualProperties.builderFrom(otherActualProperties) .unordered(true) .build(); } return new StreamProperties( distribution, partitioningColumns, false, updatedProperies); } return this; }
@Override public ActualProperties visitTopNRowNumber(TopNRowNumberNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); ImmutableList.Builder<LocalProperty<Symbol>> localProperties = ImmutableList.builder(); localProperties.add(new GroupingProperty<>(node.getPartitionBy())); for (Symbol column : node.getOrderingScheme().getOrderBy()) { localProperties.add(new SortingProperty<>(column, node.getOrderingScheme().getOrdering(column))); } return ActualProperties.builderFrom(properties) .local(localProperties.build()) .build(); }
public PlanWithProperties(PlanNode node) { this(node, ActualProperties.builder().build()); }
@Override public ActualProperties visitValues(ValuesNode node, List<ActualProperties> context) { return ActualProperties.builder() .global(singleStreamPartition()) .build(); }
@Override public ActualProperties visitTableFinish(TableFinishNode node, List<ActualProperties> inputProperties) { return ActualProperties.builder() .global(coordinatorSingleStreamPartition()) .build(); }
@Override public ActualProperties visitSort(SortNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); List<SortingProperty<Symbol>> localProperties = node.getOrderingScheme().getOrderBy().stream() .map(column -> new SortingProperty<>(column, node.getOrderingScheme().getOrdering(column))) .collect(toImmutableList()); return ActualProperties.builderFrom(properties) .local(localProperties) .build(); }
@Override public ActualProperties visitTopN(TopNNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); List<SortingProperty<Symbol>> localProperties = node.getOrderingScheme().getOrderBy().stream() .map(column -> new SortingProperty<>(column, node.getOrderingScheme().getOrdering(column))) .collect(toImmutableList()); return ActualProperties.builderFrom(properties) .local(localProperties) .build(); }
public ActualProperties withReplicatedNulls(boolean replicatedNulls) { return builderFrom(this) .global(global.withReplicatedNulls(replicatedNulls)) .build(); }
public ActualProperties translate( Function<Symbol, Optional<Symbol>> translator, Function<Expression, Optional<Symbol>> expressionTranslator) { return builder() .global(global.translate(new Partitioning.Translator(translator, symbol -> Optional.ofNullable(constants.get(symbol)), expressionTranslator))) .local(LocalProperties.translate(localProperties, translator)) .constants(translateConstants(translator)) .build(); }
@Override public PlanWithProperties visitIndexSource(IndexSourceNode node, PreferredProperties preferredProperties) { return new PlanWithProperties( node, ActualProperties.builder() .global(singleStreamPartition()) .build()); }
@Override public ActualProperties visitDistinctLimit(DistinctLimitNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); return ActualProperties.builderFrom(properties) .local(LocalProperties.grouped(node.getDistinctSymbols())) .build(); }
@Override public ActualProperties visitExplainAnalyze(ExplainAnalyzeNode node, List<ActualProperties> inputProperties) { return ActualProperties.builder() .global(coordinatorSingleStreamPartition()) .build(); }
@Override public ActualProperties visitTableWriter(TableWriterNode node, List<ActualProperties> inputProperties) { ActualProperties properties = Iterables.getOnlyElement(inputProperties); if (properties.isCoordinatorOnly()) { return ActualProperties.builder() .global(coordinatorSingleStreamPartition()) .build(); } return ActualProperties.builder() .global(properties.isSingleNode() ? singleStreamPartition() : arbitraryPartition()) .build(); }
@Override public PlanWithProperties visitValues(ValuesNode node, PreferredProperties preferredProperties) { return new PlanWithProperties( node, ActualProperties.builder() .global(singleStreamPartition()) .build()); }
@Override public ActualProperties visitIndexSource(IndexSourceNode node, List<ActualProperties> context) { return ActualProperties.builder() .global(singleStreamPartition()) .build(); }
public ActualProperties translate(Function<Symbol, Optional<Symbol>> translator) { return builder() .global(global.translate(new Partitioning.Translator(translator, symbol -> Optional.ofNullable(constants.get(symbol)), expression -> Optional.empty()))) .local(LocalProperties.translate(localProperties, translator)) .constants(translateConstants(translator)) .build(); }