private <A, R> PairStream<K, R> combineByKey(CombinerAggregator<? super V, A, ? extends R> aggregator) { if (shouldPartitionByKey()) { if (node instanceof ProcessorNode) { if (node.isWindowed()) { return combinePartition(aggregator).partitionBy(KEY).merge(aggregator); } } else if (node instanceof WindowNode) { Set<Node> parents = node.getParents(); Optional<Node> nonWindowed = parents.stream().filter(p -> !p.isWindowed()).findAny(); if (!nonWindowed.isPresent()) { parents.forEach(p -> { Node localAggregateNode = makeProcessorNode( new AggregateByKeyProcessor<>(aggregator, true), KEY_VALUE, true); streamBuilder.insert(p, localAggregateNode); }); return ((PairStream<K, A>) partitionBy(KEY)).merge(aggregator); } } return partitionBy(KEY).aggregatePartition(aggregator); } else { return aggregatePartition(aggregator); } }
private <A, R> Stream<R> combine(CombinerAggregator<? super T, A, ? extends R> aggregator) { if (shouldPartition()) { if (node instanceof ProcessorNode) { if (node.isWindowed()) { return combinePartition(aggregator).global().merge(aggregator); } } else if (node instanceof WindowNode) { Set<Node> parents = node.getParents(); Optional<Node> nonWindowed = parents.stream().filter(p -> !p.isWindowed()).findAny(); if (!nonWindowed.isPresent()) { parents.forEach(p -> { Node localAggregateNode = makeProcessorNode( new AggregateProcessor<>(aggregator, true), VALUE, true); streamBuilder.insert(p, localAggregateNode); }); return ((Stream<A>) global()).merge(aggregator); } } return global().aggregatePartition(aggregator); } else { return aggregatePartition(aggregator); } }
private PairStream<K, V> combineByKey(Reducer<V> reducer) { if (shouldPartitionByKey()) { if (node instanceof ProcessorNode) { if (node.isWindowed()) { return reducePartition(reducer).partitionBy(KEY).reducePartition(reducer); } } else if (node instanceof WindowNode) { for (Node p : node.getParents()) { if (p.isWindowed()) { Node localReduceNode = makeProcessorNode(new ReduceByKeyProcessor<>(reducer), KEY_VALUE, true); streamBuilder.insert(p, localReduceNode); } } } return partitionBy(KEY).reducePartition(reducer); } else { return reducePartition(reducer); } }
private Stream<T> combine(Reducer<T> reducer) { if (shouldPartition()) { if (node instanceof ProcessorNode) { if (node.isWindowed()) { return reducePartition(reducer).global().reducePartition(reducer); } } else if (node instanceof WindowNode) { for (Node p : node.getParents()) { if (p.isWindowed()) { Node localReduceNode = makeProcessorNode(new ReduceProcessor<>(reducer), VALUE); streamBuilder.insert(p, localReduceNode); } } } return global().reducePartition(reducer); } else { return reducePartition(reducer); } }