Skip to content

Commit 27e132c

Browse files
committed
HSEARCH-3661 Use reducable results in range collectors
1 parent 488ca2b commit 27e132c

File tree

10 files changed

+191
-85
lines changed

10 files changed

+191
-85
lines changed

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/lowlevel/collector/impl/RangeCollector.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import org.apache.lucene.index.LeafReaderContext;
2424
import org.apache.lucene.search.Collector;
25-
import org.apache.lucene.search.CollectorManager;
2625
import org.apache.lucene.search.LeafCollector;
2726
import org.apache.lucene.search.ScoreMode;
2827
import org.apache.lucene.search.SimpleCollector;
@@ -36,16 +35,14 @@ public class RangeCollector extends SimpleCollector {
3635
private final Collector[][] collectors;
3736
private final CollectorKey<?, ?>[] keys;
3837
private final LeafCollector[][] leafCollectors;
39-
private final CollectorManager<Collector, ?>[] managers;
4038

4139
private LongMultiValues values;
4240

4341
public RangeCollector(LongMultiValuesSource valuesSource, EffectiveRange[] ranges, Collector[][] collectors,
44-
CollectorKey<?, ?>[] keys, CollectorManager<Collector, ?>[] managers) {
42+
CollectorKey<?, ?>[] keys) {
4543
this.valuesSource = valuesSource;
4644
this.collectors = collectors;
4745
this.keys = keys;
48-
this.managers = managers;
4946

5047
// Maps all range inclusive endpoints to int flags; 1
5148
// = start of interval, 2 = end of interval. We need to
@@ -194,14 +191,6 @@ public Collector[][] collectors() {
194191
return collectors;
195192
}
196193

197-
public CollectorKey<?, ?>[] collectorKeys() {
198-
return keys;
199-
}
200-
201-
public CollectorManager<Collector, ?>[] managers() {
202-
return managers;
203-
}
204-
205194
@Override
206195
public ScoreMode scoreMode() {
207196
return ScoreMode.COMPLETE_NO_SCORES;

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/lowlevel/collector/impl/RangeCollectorFactory.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@
1010
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.LongMultiValuesSource;
1111
import org.hibernate.search.backend.lucene.types.lowlevel.impl.EffectiveRange;
1212

13-
import org.apache.lucene.search.Collector;
1413
import org.apache.lucene.search.CollectorManager;
1514

1615
public class RangeCollectorFactory
17-
implements CollectorFactory<RangeCollector, RangeCollector, RangeCollectorManager> {
16+
implements CollectorFactory<RangeCollector, RangeResults, RangeCollectorManager> {
1817

19-
public static CollectorFactory<RangeCollector, RangeCollector, RangeCollectorManager> instance(
18+
public static CollectorFactory<RangeCollector, RangeResults, RangeCollectorManager> instance(
2019
LongMultiValuesSource valuesSource, EffectiveRange[] ranges, List<CollectorFactory<?, ?, ?>> collectorFactories) {
2120
return new RangeCollectorFactory( valuesSource, ranges, collectorFactories );
2221
}
2322

24-
public final CollectorKey<RangeCollector, RangeCollector> key = CollectorKey.create();
23+
public final CollectorKey<RangeCollector, RangeResults> key = CollectorKey.create();
2524
private final LongMultiValuesSource valuesSource;
2625
private final EffectiveRange[] ranges;
2726
private final List<CollectorFactory<?, ?, ?>> collectorFactories;
@@ -33,29 +32,23 @@ public RangeCollectorFactory(LongMultiValuesSource valuesSource, EffectiveRange[
3332
this.collectorFactories = collectorFactories;
3433
}
3534

36-
@SuppressWarnings({ "rawtypes", "unchecked" })
35+
@SuppressWarnings({ "unchecked" })
3736
@Override
3837
public RangeCollectorManager createCollectorManager(CollectorExecutionContext context) throws IOException {
39-
Collector[][] collectors = new Collector[collectorFactories.size()][];
4038
CollectorKey<?, ?>[] keys = new CollectorKey<?, ?>[collectorFactories.size()];
4139
var managers = new CollectorManager[collectorFactories.size()];
4240
int index = 0;
4341
for ( CollectorFactory<?, ?, ?> collectorFactory : collectorFactories ) {
4442
CollectorManager<?, ?> collectorManager = collectorFactory.createCollectorManager( context );
4543
keys[index] = collectorFactory.getCollectorKey();
4644
managers[index] = collectorManager;
47-
Collector[] c = new Collector[ranges.length];
48-
collectors[index] = c;
49-
for ( int i = 0; i < c.length; i++ ) {
50-
c[i] = collectorManager.newCollector();
51-
}
5245
index++;
5346
}
54-
return new RangeCollectorManager( valuesSource, ranges, collectors, keys, managers );
47+
return new RangeCollectorManager( valuesSource, ranges, keys, managers );
5548
}
5649

5750
@Override
58-
public CollectorKey<RangeCollector, RangeCollector> getCollectorKey() {
51+
public CollectorKey<RangeCollector, RangeResults> getCollectorKey() {
5952
return key;
6053
}
6154
}

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/lowlevel/collector/impl/RangeCollectorManager.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package org.hibernate.search.backend.lucene.lowlevel.collector.impl;
66

7+
import java.io.IOException;
78
import java.util.Collection;
89

910
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.LongMultiValuesSource;
@@ -12,31 +13,45 @@
1213
import org.apache.lucene.search.Collector;
1314
import org.apache.lucene.search.CollectorManager;
1415

15-
public class RangeCollectorManager implements CollectorManager<RangeCollector, RangeCollector> {
16+
public class RangeCollectorManager implements CollectorManager<RangeCollector, RangeResults> {
1617

1718
private final LongMultiValuesSource valuesSource;
1819
private final EffectiveRange[] ranges;
19-
private final Collector[][] collectors;
2020
private final CollectorKey<?, ?>[] keys;
2121
private final CollectorManager<Collector, ?>[] managers;
2222

23-
public RangeCollectorManager(LongMultiValuesSource valuesSource, EffectiveRange[] ranges, Collector[][] collectors,
23+
public RangeCollectorManager(LongMultiValuesSource valuesSource, EffectiveRange[] ranges,
2424
CollectorKey<?, ?>[] keys, CollectorManager<Collector, ?>[] managers) {
2525
this.valuesSource = valuesSource;
2626
this.ranges = ranges;
27-
this.collectors = collectors;
2827
this.keys = keys;
2928
this.managers = managers;
3029
}
3130

3231
@Override
33-
public RangeCollector newCollector() {
34-
return new RangeCollector( valuesSource, ranges, collectors, keys, managers );
32+
public RangeCollector newCollector() throws IOException {
33+
Collector[][] collectors = new Collector[keys.length][];
34+
int index = 0;
35+
for ( CollectorManager<Collector, ?> manager : managers ) {
36+
Collector[] c = new Collector[ranges.length];
37+
collectors[index] = c;
38+
for ( int j = 0; j < c.length; j++ ) {
39+
c[j] = manager.newCollector();
40+
}
41+
index++;
42+
}
43+
return new RangeCollector( valuesSource, ranges, collectors, keys );
3544
}
3645

3746
@Override
38-
public RangeCollector reduce(Collection<RangeCollector> collection) {
39-
// TODO: actually reduce:
40-
return collection.iterator().next();
47+
public RangeResults reduce(Collection<RangeCollector> collection) {
48+
if ( collection.isEmpty() ) {
49+
return RangeResults.EMPTY;
50+
}
51+
RangeResults results = new RangeResults( keys, managers, ranges.length );
52+
for ( RangeCollector collector : collection ) {
53+
results.add( collector.collectors() );
54+
}
55+
return results;
4156
}
4257
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.search.backend.lucene.lowlevel.collector.impl;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import org.apache.lucene.search.Collector;
11+
import org.apache.lucene.search.CollectorManager;
12+
13+
public class RangeResults {
14+
15+
@SuppressWarnings("unchecked")
16+
static final RangeResults EMPTY = new RangeResults( new CollectorKey[0], new CollectorManager[0], 0 );
17+
18+
private final CollectorKey<?, ?>[] collectorKeys;
19+
private final CollectorManager<Collector, ?>[] managers;
20+
21+
private final List<Collector>[][] buckets;
22+
23+
@SuppressWarnings("unchecked")
24+
RangeResults(CollectorKey<?, ?>[] collectorKeys, CollectorManager<Collector, ?>[] managers, int ranges) {
25+
this.collectorKeys = collectorKeys;
26+
this.managers = managers;
27+
this.buckets = new List[managers.length][];
28+
for ( int i = 0; i < buckets.length; i++ ) {
29+
buckets[i] = new List[ranges];
30+
for ( int j = 0; j < buckets[i].length; j++ ) {
31+
buckets[i][j] = new ArrayList<>();
32+
}
33+
}
34+
}
35+
36+
void add(Collector[][] collectors) {
37+
for ( int collectorIndex = 0; collectorIndex < collectors.length; collectorIndex++ ) {
38+
for ( int rangeIndex = 0; rangeIndex < collectors[collectorIndex].length; rangeIndex++ ) {
39+
buckets[collectorIndex][rangeIndex].add( collectors[collectorIndex][rangeIndex] );
40+
}
41+
}
42+
}
43+
44+
public List<Collector>[][] buckets() {
45+
return buckets;
46+
}
47+
48+
public CollectorKey<?, ?>[] collectorKeys() {
49+
return collectorKeys;
50+
}
51+
52+
public CollectorManager<Collector, ?>[] collectorManagers() {
53+
return managers;
54+
}
55+
}

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/types/aggregation/impl/LuceneNumericRangeAggregation.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hibernate.search.backend.lucene.lowlevel.collector.impl.CollectorKey;
1616
import org.hibernate.search.backend.lucene.lowlevel.collector.impl.RangeCollector;
1717
import org.hibernate.search.backend.lucene.lowlevel.collector.impl.RangeCollectorFactory;
18+
import org.hibernate.search.backend.lucene.lowlevel.collector.impl.RangeResults;
1819
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.JoiningLongMultiValuesSource;
1920
import org.hibernate.search.backend.lucene.lowlevel.join.impl.NestedDocsProvider;
2021
import org.hibernate.search.backend.lucene.search.aggregation.impl.AggregationExtractContext;
@@ -48,7 +49,7 @@ public class LuceneNumericRangeAggregation<F, E extends Number, K, V>
4849
private final List<Range<K>> rangesInOrder;
4950
private final List<Range<E>> encodedRangesInOrder;
5051

51-
private CollectorKey<RangeCollector, RangeCollector> collectorKey;
52+
private CollectorKey<RangeCollector, RangeResults> collectorKey;
5253

5354
private LuceneNumericRangeAggregation(Builder<F, E, K, V> builder) {
5455
super( builder );
@@ -102,26 +103,26 @@ public LuceneNumericRangeAggregationExtractor(Extractor<V> extractor) {
102103

103104
@Override
104105
public Map<Range<K>, V> extract(AggregationExtractContext context) throws IOException {
105-
RangeCollector rangeCollector = context.getCollectorResults( collectorKey );
106+
RangeResults rangeResults = context.getCollectorResults( collectorKey );
106107

107108
LocalAggregationExtractContext localContext = new LocalAggregationExtractContext( context );
108109

109110
Map<Range<K>, V> result = new LinkedHashMap<>();
110111
for ( int i = 0; i < rangesInOrder.size(); i++ ) {
111-
localContext.setResults( prepareResults( i, rangeCollector ) );
112+
localContext.setResults( prepareResults( i, rangeResults ) );
112113
result.put( rangesInOrder.get( i ), extractor.extract( localContext ) );
113114
}
114115

115116
return result;
116117
}
117118

118-
private Map<CollectorKey<?, ?>, Object> prepareResults(int index, RangeCollector rangeCollector) throws IOException {
119+
private Map<CollectorKey<?, ?>, Object> prepareResults(int index, RangeResults rangeResults) throws IOException {
119120
Map<CollectorKey<?, ?>, Object> result = new HashMap<>();
120-
Collector[][] collectors = rangeCollector.collectors();
121-
CollectorKey<?, ?>[] collectorKeys = rangeCollector.collectorKeys();
122-
CollectorManager<Collector, ?>[] managers = rangeCollector.managers();
121+
List<Collector>[][] collectors = rangeResults.buckets();
122+
CollectorKey<?, ?>[] collectorKeys = rangeResults.collectorKeys();
123+
CollectorManager<Collector, ?>[] managers = rangeResults.collectorManagers();
123124
for ( int i = 0; i < collectorKeys.length; i++ ) {
124-
result.put( collectorKeys[i], managers[i].reduce( List.of( collectors[i][index] ) ) );
125+
result.put( collectorKeys[i], managers[i].reduce( collectors[i][index] ) );
125126
}
126127
return result;
127128
}

lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/lowlevel/collector/impl/RangeCollector.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import org.apache.lucene.index.LeafReaderContext;
2424
import org.apache.lucene.search.Collector;
25-
import org.apache.lucene.search.CollectorManager;
2625
import org.apache.lucene.search.LeafCollector;
2726
import org.apache.lucene.search.ScoreMode;
2827
import org.apache.lucene.search.SimpleCollector;
@@ -36,16 +35,14 @@ public class RangeCollector extends SimpleCollector {
3635
private final Collector[][] collectors;
3736
private final CollectorKey<?, ?>[] keys;
3837
private final LeafCollector[][] leafCollectors;
39-
private final CollectorManager<Collector, ?>[] managers;
4038

4139
private LongMultiValues values;
4240

4341
public RangeCollector(LongMultiValuesSource valuesSource, EffectiveRange[] ranges, Collector[][] collectors,
44-
CollectorKey<?, ?>[] keys, CollectorManager<Collector, ?>[] managers) {
42+
CollectorKey<?, ?>[] keys) {
4543
this.valuesSource = valuesSource;
4644
this.collectors = collectors;
4745
this.keys = keys;
48-
this.managers = managers;
4946

5047
// Maps all range inclusive endpoints to int flags; 1
5148
// = start of interval, 2 = end of interval. We need to
@@ -194,14 +191,6 @@ public Collector[][] collectors() {
194191
return collectors;
195192
}
196193

197-
public CollectorKey<?, ?>[] collectorKeys() {
198-
return keys;
199-
}
200-
201-
public CollectorManager<Collector, ?>[] managers() {
202-
return managers;
203-
}
204-
205194
@Override
206195
public ScoreMode scoreMode() {
207196
return ScoreMode.COMPLETE_NO_SCORES;

lucene-next/backend/lucene/src/main/java/org/hibernate/search/backend/lucene/lowlevel/collector/impl/RangeCollectorFactory.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@
1010
import org.hibernate.search.backend.lucene.lowlevel.docvalues.impl.LongMultiValuesSource;
1111
import org.hibernate.search.backend.lucene.types.lowlevel.impl.EffectiveRange;
1212

13-
import org.apache.lucene.search.Collector;
1413
import org.apache.lucene.search.CollectorManager;
1514

1615
public class RangeCollectorFactory
17-
implements CollectorFactory<RangeCollector, RangeCollector, RangeCollectorManager> {
16+
implements CollectorFactory<RangeCollector, RangeResults, RangeCollectorManager> {
1817

19-
public static CollectorFactory<RangeCollector, RangeCollector, RangeCollectorManager> instance(
18+
public static CollectorFactory<RangeCollector, RangeResults, RangeCollectorManager> instance(
2019
LongMultiValuesSource valuesSource, EffectiveRange[] ranges, List<CollectorFactory<?, ?, ?>> collectorFactories) {
2120
return new RangeCollectorFactory( valuesSource, ranges, collectorFactories );
2221
}
2322

24-
public final CollectorKey<RangeCollector, RangeCollector> key = CollectorKey.create();
23+
public final CollectorKey<RangeCollector, RangeResults> key = CollectorKey.create();
2524
private final LongMultiValuesSource valuesSource;
2625
private final EffectiveRange[] ranges;
2726
private final List<CollectorFactory<?, ?, ?>> collectorFactories;
@@ -33,29 +32,23 @@ public RangeCollectorFactory(LongMultiValuesSource valuesSource, EffectiveRange[
3332
this.collectorFactories = collectorFactories;
3433
}
3534

36-
@SuppressWarnings({ "rawtypes", "unchecked" })
35+
@SuppressWarnings({ "unchecked" })
3736
@Override
3837
public RangeCollectorManager createCollectorManager(CollectorExecutionContext context) throws IOException {
39-
Collector[][] collectors = new Collector[collectorFactories.size()][];
4038
CollectorKey<?, ?>[] keys = new CollectorKey<?, ?>[collectorFactories.size()];
4139
var managers = new CollectorManager[collectorFactories.size()];
4240
int index = 0;
4341
for ( CollectorFactory<?, ?, ?> collectorFactory : collectorFactories ) {
4442
CollectorManager<?, ?> collectorManager = collectorFactory.createCollectorManager( context );
4543
keys[index] = collectorFactory.getCollectorKey();
4644
managers[index] = collectorManager;
47-
Collector[] c = new Collector[ranges.length];
48-
collectors[index] = c;
49-
for ( int i = 0; i < c.length; i++ ) {
50-
c[i] = collectorManager.newCollector();
51-
}
5245
index++;
5346
}
54-
return new RangeCollectorManager( valuesSource, ranges, collectors, keys, managers );
47+
return new RangeCollectorManager( valuesSource, ranges, keys, managers );
5548
}
5649

5750
@Override
58-
public CollectorKey<RangeCollector, RangeCollector> getCollectorKey() {
51+
public CollectorKey<RangeCollector, RangeResults> getCollectorKey() {
5952
return key;
6053
}
6154
}

0 commit comments

Comments
 (0)