| 1 | /* | |
| 2 | * Copyright 2014-2026 Grzegorz Piwowarek, https://4comprehension.com/ | |
| 3 | * | |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 5 | * you may not use this file except in compliance with the License. | |
| 6 | * You may obtain a copy of the License at | |
| 7 | * | |
| 8 | * https://www.apache.org/licenses/LICENSE-2.0 | |
| 9 | * | |
| 10 | * Unless required by applicable law or agreed to in writing, software | |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 13 | * See the License for the specific language governing permissions and | |
| 14 | * limitations under the License. | |
| 15 | */ | |
| 16 | package com.pivovarit.collectors; | |
| 17 | ||
| 18 | import java.util.LinkedHashMap; | |
| 19 | import java.util.Objects; | |
| 20 | import java.util.concurrent.CompletableFuture; | |
| 21 | import java.util.concurrent.Executor; | |
| 22 | import java.util.function.Function; | |
| 23 | import java.util.stream.Collector; | |
| 24 | import java.util.stream.Collectors; | |
| 25 | import java.util.stream.Stream; | |
| 26 | ||
| 27 | import static java.util.Objects.requireNonNull; | |
| 28 | ||
| 29 | final class Factory { | |
| 30 | ||
| 31 | private Factory() { | |
| 32 | } | |
| 33 | ||
| 34 | static <T, K, R> Collector<T, ?, CompletableFuture<Stream<Grouped<K, R>>>> collectingBy( | |
| 35 | Function<? super T, ? extends K> classifier, | |
| 36 | Function<? super T, ? extends R> mapper, | |
| 37 | Configurer.Collecting configurer) { | |
| 38 |
2
1. collectingBy : replaced return value with null for com/pivovarit/collectors/Factory::collectingBy → KILLED 2. lambda$collectingBy$0 : replaced return value with Stream.empty for com/pivovarit/collectors/Factory::lambda$collectingBy$0 → KILLED |
return Factory.collectingBy(classifier, (Function<Stream<Grouped<K, R>>, Stream<Grouped<K, R>>>) i -> i, mapper, configurer); |
| 39 | } | |
| 40 | ||
| 41 | static <T, K, R, C> Collector<T, ?, CompletableFuture<C>> collectingBy( | |
| 42 | Function<? super T, ? extends K> classifier, | |
| 43 | Function<Stream<Grouped<K, R>>, C> finalizer, | |
| 44 | Function<? super T, ? extends R> mapper, | |
| 45 | Configurer.Collecting configurer) { | |
| 46 | Objects.requireNonNull(classifier, "classifier cannot be null"); | |
| 47 | Objects.requireNonNull(finalizer, "finalizer cannot be null"); | |
| 48 | Objects.requireNonNull(mapper, "mapper cannot be null"); | |
| 49 | Objects.requireNonNull(configurer, "configurer cannot be null"); | |
| 50 | ||
| 51 |
1
1. collectingBy : replaced return value with null for com/pivovarit/collectors/Factory::collectingBy → KILLED |
return Collectors.collectingAndThen( |
| 52 | Collectors.groupingBy(classifier, LinkedHashMap::new, Collectors.toList()), | |
| 53 | groups -> groups.entrySet() | |
| 54 | .stream() | |
| 55 |
1
1. lambda$collectingBy$1 : replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$1 → KILLED |
.collect(collecting(finalizer, |
| 56 |
1
1. lambda$collectingBy$2 : replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$2 → KILLED |
e -> new Grouped<>(e.getKey(), e.getValue().stream() |
| 57 |
1
1. lambda$collectingBy$3 : replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$3 → KILLED |
.map(mapper.andThen(a -> (R) a)) |
| 58 | .toList()), configurer)) | |
| 59 | ); | |
| 60 | } | |
| 61 | ||
| 62 | static <T, R, C> Collector<T, ?, CompletableFuture<C>> collecting( | |
| 63 | Function<Stream<R>, C> finalizer, | |
| 64 | Function<? super T, ? extends R> mapper, | |
| 65 | Configurer configurer | |
| 66 | ) { | |
| 67 | requireNonNull(mapper, "mapper can't be null"); | |
| 68 | ||
| 69 | var config = ConfigProcessor.process(configurer.getConfig()); | |
| 70 | ||
| 71 |
1
1. collecting : replaced return value with null for com/pivovarit/collectors/Factory::collecting → KILLED |
return select(mapper, config, new ModeFactory<T, R, CompletableFuture<C>>() { |
| 72 | @Override | |
| 73 | public Collector<T, ?, CompletableFuture<C>> async(Function<? super T, ? extends R> mapper, Executor executor) { | |
| 74 |
1
1. async : replaced return value with null for com/pivovarit/collectors/Factory$1::async → KILLED |
return new AsyncCollector<>(mapper, finalizer, executor); |
| 75 | } | |
| 76 | ||
| 77 | @Override | |
| 78 | public Collector<T, ?, CompletableFuture<C>> batching(Function<? super T, ? extends R> mapper, Executor executor, int parallelism) { | |
| 79 |
1
1. batching : replaced return value with null for com/pivovarit/collectors/Factory$1::batching → KILLED |
return new AsyncParallelCollector.BatchingCollector<>(mapper, finalizer, executor, parallelism); |
| 80 | } | |
| 81 | ||
| 82 | @Override | |
| 83 | public Collector<T, ?, CompletableFuture<C>> parallel(Function<? super T, ? extends R> mapper, Dispatcher<R> dispatcher) { | |
| 84 |
1
1. parallel : replaced return value with null for com/pivovarit/collectors/Factory$1::parallel → KILLED |
return new AsyncParallelCollector<>(mapper, dispatcher, finalizer); |
| 85 | } | |
| 86 | }); | |
| 87 | } | |
| 88 | ||
| 89 | static <T, K, R> Collector<T, ?, Stream<Grouped<K, R>>> streamingBy( | |
| 90 | Function<? super T, ? extends K> classifier, | |
| 91 | Function<? super T, ? extends R> mapper, | |
| 92 | Configurer.Streaming configurer) { | |
| 93 | Objects.requireNonNull(classifier, "classifier cannot be null"); | |
| 94 | Objects.requireNonNull(mapper, "mapper cannot be null"); | |
| 95 | Objects.requireNonNull(configurer, "configurer cannot be null"); | |
| 96 | ||
| 97 |
1
1. streamingBy : replaced return value with null for com/pivovarit/collectors/Factory::streamingBy → KILLED |
return Collectors.collectingAndThen( |
| 98 | Collectors.groupingBy(classifier, LinkedHashMap::new, Collectors.toList()), | |
| 99 | groups -> groups.entrySet() | |
| 100 | .stream() | |
| 101 |
2
1. lambda$streamingBy$0 : replaced return value with Stream.empty for com/pivovarit/collectors/Factory::lambda$streamingBy$0 → KILLED 2. lambda$streamingBy$1 : replaced return value with null for com/pivovarit/collectors/Factory::lambda$streamingBy$1 → KILLED |
.collect(streaming(e -> new Grouped<>(e.getKey(), e.getValue().stream() |
| 102 |
1
1. lambda$streamingBy$2 : replaced return value with null for com/pivovarit/collectors/Factory::lambda$streamingBy$2 → KILLED |
.map(mapper.andThen(a -> (R) a)) |
| 103 | .toList()), configurer)) | |
| 104 | ); | |
| 105 | } | |
| 106 | ||
| 107 | static <T, R> Collector<T, ?, Stream<R>> streaming( | |
| 108 | Function<? super T, ? extends R> mapper, | |
| 109 | Configurer.Streaming configurer) { | |
| 110 | requireNonNull(mapper, "mapper can't be null"); | |
| 111 | ||
| 112 | var config = ConfigProcessor.process(configurer.getConfig()); | |
| 113 | ||
| 114 |
1
1. streaming : replaced return value with null for com/pivovarit/collectors/Factory::streaming → KILLED |
return select(mapper, config, new ModeFactory<T, R, Stream<R>>() { |
| 115 | @Override | |
| 116 | public Collector<T, ?, Stream<R>> async(Function<? super T, ? extends R> m, Executor ex) { | |
| 117 |
1
1. async : replaced return value with null for com/pivovarit/collectors/Factory$2::async → KILLED |
return new SyncCollector<>(m); |
| 118 | } | |
| 119 | ||
| 120 | @Override | |
| 121 | public Collector<T, ?, Stream<R>> batching(Function<? super T, ? extends R> m, Executor ex, int p) { | |
| 122 |
1
1. batching : replaced return value with null for com/pivovarit/collectors/Factory$2::batching → KILLED |
return new AsyncParallelStreamingCollector.BatchingCollector<>(m, ex, p, config.ordered()); |
| 123 | } | |
| 124 | ||
| 125 | @Override | |
| 126 | public Collector<T, ?, Stream<R>> parallel(Function<? super T, ? extends R> m, Dispatcher<R> d) { | |
| 127 |
1
1. parallel : replaced return value with null for com/pivovarit/collectors/Factory$2::parallel → KILLED |
return new AsyncParallelStreamingCollector<>(m, d, config.ordered()); |
| 128 | } | |
| 129 | }); | |
| 130 | } | |
| 131 | ||
| 132 | private static <T, R, C> Collector<T, ?, C> select( | |
| 133 | Function<? super T, ? extends R> mapper, | |
| 134 | ConfigProcessor.Config config, | |
| 135 | ModeFactory<T, R, C> factory | |
| 136 | ) { | |
| 137 |
1
1. select : negated conditional → KILLED |
if (config.parallelism() == 1) { |
| 138 |
1
1. select : replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED |
return factory.async(mapper, config.executor()); |
| 139 | } | |
| 140 | ||
| 141 |
1
1. select : negated conditional → KILLED |
if (config.batching()) { |
| 142 |
1
1. select : negated conditional → KILLED |
if (config.parallelism() == 0) { |
| 143 | throw new IllegalArgumentException("it's obligatory to provide parallelism when using batching"); | |
| 144 | } | |
| 145 |
1
1. select : replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED |
return factory.batching(mapper, config.executor(), config.parallelism()); |
| 146 | } | |
| 147 | ||
| 148 |
2
1. select : changed conditional boundary → TIMED_OUT 2. select : negated conditional → TIMED_OUT |
var dispatcher = (config.parallelism() > 0) |
| 149 | ? new Dispatcher<R>(config.executor(), config.parallelism()) | |
| 150 | : new Dispatcher<R>(config.executor()); | |
| 151 | ||
| 152 |
1
1. select : replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED |
return factory.parallel(mapper, dispatcher); |
| 153 | } | |
| 154 | ||
| 155 | interface ModeFactory<T, R, C> { | |
| 156 | Collector<T, ?, C> async(Function<? super T, ? extends R> mapper, Executor executor); | |
| 157 | ||
| 158 | Collector<T, ?, C> batching(Function<? super T, ? extends R> mapper, Executor executor, int parallelism); | |
| 159 | ||
| 160 | Collector<T, ?, C> parallel(Function<? super T, ? extends R> mapper, Dispatcher<R> dispatcher); | |
| 161 | } | |
| 162 | } | |
Mutations | ||
| 38 |
1.1 2.2 |
|
| 51 |
1.1 |
|
| 55 |
1.1 |
|
| 56 |
1.1 |
|
| 57 |
1.1 |
|
| 71 |
1.1 |
|
| 74 |
1.1 |
|
| 79 |
1.1 |
|
| 84 |
1.1 |
|
| 97 |
1.1 |
|
| 101 |
1.1 2.2 |
|
| 102 |
1.1 |
|
| 114 |
1.1 |
|
| 117 |
1.1 |
|
| 122 |
1.1 |
|
| 127 |
1.1 |
|
| 137 |
1.1 |
|
| 138 |
1.1 |
|
| 141 |
1.1 |
|
| 142 |
1.1 |
|
| 145 |
1.1 |
|
| 148 |
1.1 2.2 |
|
| 152 |
1.1 |