Factory.java

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
Location : collectingBy
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with null for com/pivovarit/collectors/Factory::collectingBy → KILLED

2.2
Location : lambda$collectingBy$0
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with Stream.empty for com/pivovarit/collectors/Factory::lambda$collectingBy$0 → KILLED

51

1.1
Location : collectingBy
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with null for com/pivovarit/collectors/Factory::collectingBy → KILLED

55

1.1
Location : lambda$collectingBy$1
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$1 → KILLED

56

1.1
Location : lambda$collectingBy$2
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$2 → KILLED

57

1.1
Location : lambda$collectingBy$3
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#6]
replaced return value with null for com/pivovarit/collectors/Factory::lambda$collectingBy$3 → KILLED

71

1.1
Location : collecting
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/Factory::collecting → KILLED

74

1.1
Location : async
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/Factory$1::async → KILLED

79

1.1
Location : batching
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#138]
replaced return value with null for com/pivovarit/collectors/Factory$1::batching → KILLED

84

1.1
Location : parallel
Killed by : com.pivovarit.collectors.test.BasicProcessingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicProcessingTest]/[test-factory:shouldProcessEmpty()]/[dynamic-test:#14]
replaced return value with null for com/pivovarit/collectors/Factory$1::parallel → KILLED

97

1.1
Location : streamingBy
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#13]
replaced return value with null for com/pivovarit/collectors/Factory::streamingBy → KILLED

101

1.1
Location : lambda$streamingBy$0
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#13]
replaced return value with Stream.empty for com/pivovarit/collectors/Factory::lambda$streamingBy$0 → KILLED

2.2
Location : lambda$streamingBy$1
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#13]
replaced return value with null for com/pivovarit/collectors/Factory::lambda$streamingBy$1 → KILLED

102

1.1
Location : lambda$streamingBy$2
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#13]
replaced return value with null for com/pivovarit/collectors/Factory::lambda$streamingBy$2 → KILLED

114

1.1
Location : streaming
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#10]
replaced return value with null for com/pivovarit/collectors/Factory::streaming → KILLED

117

1.1
Location : async
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#10]
replaced return value with null for com/pivovarit/collectors/Factory$2::async → KILLED

122

1.1
Location : batching
Killed by : com.pivovarit.collectors.test.ParallelismValidationTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.ParallelismValidationTest]/[test-factory:shouldThrowOnParallelStream()]/[dynamic-test:#19]
replaced return value with null for com/pivovarit/collectors/Factory$2::batching → KILLED

127

1.1
Location : parallel
Killed by : com.pivovarit.collectors.test.BasicProcessingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicProcessingTest]/[test-factory:shouldProcessEmpty()]/[dynamic-test:#18]
replaced return value with null for com/pivovarit/collectors/Factory$2::parallel → KILLED

137

1.1
Location : select
Killed by : com.pivovarit.collectors.test.StreamingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.StreamingTest]/[method:shouldUseSyncFallback()]
negated conditional → KILLED

138

1.1
Location : select
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#15]
replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED

141

1.1
Location : select
Killed by : com.pivovarit.collectors.test.BasicProcessingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicProcessingTest]/[test-factory:shouldProcessEmpty()]/[dynamic-test:#18]
negated conditional → KILLED

142

1.1
Location : select
Killed by : com.pivovarit.collectors.test.ParallelismValidationTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.ParallelismValidationTest]/[test-factory:shouldThrowOnParallelStream()]/[dynamic-test:#19]
negated conditional → KILLED

145

1.1
Location : select
Killed by : com.pivovarit.collectors.test.ParallelismValidationTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.ParallelismValidationTest]/[test-factory:shouldThrowOnParallelStream()]/[dynamic-test:#19]
replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED

148

1.1
Location : select
Killed by : none
changed conditional boundary → TIMED_OUT

2.2
Location : select
Killed by : none
negated conditional → TIMED_OUT

152

1.1
Location : select
Killed by : com.pivovarit.collectors.test.BasicProcessingTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicProcessingTest]/[test-factory:shouldProcessEmpty()]/[dynamic-test:#18]
replaced return value with null for com/pivovarit/collectors/Factory::select → KILLED

Active mutators

Tests examined


Report generated by PIT 1.22.0