Skip to content

Commit db1eb0d

Browse files
Star tree merge changes
Signed-off-by: Bharathwaj G <[email protected]>
1 parent 248191d commit db1eb0d

File tree

18 files changed

+715
-336
lines changed

18 files changed

+715
-336
lines changed

server/src/main/java/org/apache/lucene/index/BaseStarTreeBuilder.java

Lines changed: 135 additions & 122 deletions
Large diffs are not rendered by default.

server/src/main/java/org/opensearch/index/codec/composite/Composite90DocValuesReader.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import org.apache.lucene.index.SortedNumericDocValues;
1818
import org.apache.lucene.index.SortedSetDocValues;
1919
import org.opensearch.common.annotation.ExperimentalApi;
20-
import org.opensearch.index.mapper.CompositeMappedFieldType;
2120

2221
import java.io.IOException;
2322
import java.util.List;
@@ -74,15 +73,14 @@ public void close() throws IOException {
7473
}
7574

7675
@Override
77-
public List<String> getCompositeIndexFields() {
76+
public List<CompositeIndexFieldInfo> getCompositeIndexFields() {
7877
// todo : read from file formats and get the field names.
7978
throw new UnsupportedOperationException();
8079

8180
}
8281

8382
@Override
84-
public CompositeIndexValues getCompositeIndexValues(String field, CompositeMappedFieldType.CompositeFieldType fieldType)
85-
throws IOException {
83+
public CompositeIndexValues getCompositeIndexValues(CompositeIndexFieldInfo compositeIndexFieldInfo) throws IOException {
8684
// TODO : read compositeIndexValues [starTreeValues] from star tree files
8785
throw new UnsupportedOperationException();
8886
}

server/src/main/java/org/opensearch/index/codec/composite/Composite90DocValuesWriter.java

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,26 @@
88

99
package org.opensearch.index.codec.composite;
1010

11+
import org.apache.logging.log4j.LogManager;
12+
import org.apache.logging.log4j.Logger;
1113
import org.apache.lucene.codecs.DocValuesConsumer;
1214
import org.apache.lucene.codecs.DocValuesProducer;
1315
import org.apache.lucene.index.FieldInfo;
1416
import org.apache.lucene.index.MergeState;
1517
import org.apache.lucene.index.SegmentWriteState;
1618
import org.opensearch.common.annotation.ExperimentalApi;
19+
import org.opensearch.index.codec.composite.datacube.startree.StarTreeValues;
20+
import org.opensearch.index.compositeindex.datacube.startree.StarTreeField;
21+
import org.opensearch.index.compositeindex.datacube.startree.builder.StarTreesBuilder;
1722
import org.opensearch.index.mapper.CompositeMappedFieldType;
1823
import org.opensearch.index.mapper.MapperService;
1924
import org.opensearch.index.mapper.StarTreeMapper;
2025

2126
import java.io.IOException;
27+
import java.util.Collections;
2228
import java.util.HashMap;
2329
import java.util.HashSet;
30+
import java.util.List;
2431
import java.util.Map;
2532
import java.util.Set;
2633

@@ -40,6 +47,7 @@ public class Composite90DocValuesWriter extends DocValuesConsumer {
4047
private final Set<String> compositeFieldSet;
4148

4249
private final Map<String, DocValuesProducer> fieldProducerMap = new HashMap<>();
50+
private static final Logger logger = LogManager.getLogger(Composite90DocValuesWriter.class);
4351

4452
public Composite90DocValuesWriter(DocValuesConsumer delegate, SegmentWriteState segmentWriteState, MapperService mapperService)
4553
throws IOException {
@@ -101,6 +109,8 @@ private void createCompositeIndicesIfPossible(DocValuesProducer valuesProducer,
101109
// TODO : Call StarTree builder
102110
}
103111
}
112+
StarTreesBuilder starTreesBuilder = new StarTreesBuilder(state, mapperService);
113+
starTreesBuilder.build(fieldProducerMap);
104114
}
105115
}
106116

@@ -109,7 +119,48 @@ public void merge(MergeState mergeState) throws IOException {
109119
// TODO : check if class variable will cause concurrency issues
110120
this.mergeState = mergeState;
111121
super.merge(mergeState);
112-
// TODO : handle merge star tree
113-
// mergeStarTreeFields(mergeState);
122+
mergeCompositeFields(mergeState);
123+
}
124+
125+
/**
126+
* Merges composite fields from multiple segments
127+
* @param mergeState merge state
128+
*/
129+
private void mergeCompositeFields(MergeState mergeState) throws IOException {
130+
mergeStarTreeFields(mergeState);
131+
}
132+
133+
/**
134+
* Merges star tree data fields from multiple segments
135+
* @param mergeState merge state
136+
*/
137+
private void mergeStarTreeFields(MergeState mergeState) throws IOException {
138+
Map<String, List<StarTreeValues>> starTreeSubsPerField = new HashMap<>();
139+
Map<String, StarTreeField> starTreeFieldMap = new HashMap<>();
140+
for (int i = 0; i < mergeState.docValuesProducers.length; i++) {
141+
CompositeIndexReader reader = (CompositeIndexReader) mergeState.docValuesProducers[i];
142+
List<CompositeIndexFieldInfo> compositeFieldInfo = reader.getCompositeIndexFields();
143+
for (CompositeIndexFieldInfo fieldInfo : compositeFieldInfo) {
144+
if (fieldInfo.getType().equals(CompositeMappedFieldType.CompositeFieldType.STAR_TREE)) {
145+
CompositeIndexValues compositeIndexValues = reader.getCompositeIndexValues(fieldInfo);
146+
if (compositeIndexValues instanceof StarTreeValues) {
147+
List<StarTreeValues> fieldsList = starTreeSubsPerField.getOrDefault(fieldInfo.getField(), Collections.emptyList());
148+
if (!starTreeFieldMap.containsKey(fieldInfo.getField())) {
149+
starTreeFieldMap.put(fieldInfo.getField(), ((StarTreeValues) compositeIndexValues).getStarTreeField());
150+
}
151+
// assert star tree configuration is same across segments
152+
else {
153+
assert starTreeFieldMap.get(fieldInfo.getField())
154+
.equals(((StarTreeValues) compositeIndexValues).getStarTreeField());
155+
logger.error("Star tree configuration is not same for segments during merge");
156+
}
157+
fieldsList.add((StarTreeValues) compositeIndexValues);
158+
starTreeSubsPerField.put(fieldInfo.getField(), fieldsList);
159+
}
160+
}
161+
}
162+
}
163+
final StarTreesBuilder starTreesBuilder = new StarTreesBuilder(state, mapperService);
164+
starTreesBuilder.buildDuringMerge(starTreeFieldMap, starTreeSubsPerField);
114165
}
115166
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.index.codec.composite;
10+
11+
import org.opensearch.common.annotation.ExperimentalApi;
12+
import org.opensearch.index.mapper.CompositeMappedFieldType;
13+
14+
/**
15+
* Field info details of composite index fields
16+
*
17+
* @opensearch.experimental
18+
*/
19+
@ExperimentalApi
20+
public class CompositeIndexFieldInfo {
21+
private final String field;
22+
private final CompositeMappedFieldType.CompositeFieldType type;
23+
24+
public CompositeIndexFieldInfo(String field, CompositeMappedFieldType.CompositeFieldType type) {
25+
this.field = field;
26+
this.type = type;
27+
}
28+
29+
public String getField() {
30+
return field;
31+
}
32+
33+
public CompositeMappedFieldType.CompositeFieldType getType() {
34+
return type;
35+
}
36+
}

server/src/main/java/org/opensearch/index/codec/composite/CompositeIndexReader.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
package org.opensearch.index.codec.composite;
1010

1111
import org.opensearch.common.annotation.ExperimentalApi;
12-
import org.opensearch.index.mapper.CompositeMappedFieldType;
1312

1413
import java.io.IOException;
1514
import java.util.List;
@@ -25,10 +24,10 @@ public interface CompositeIndexReader {
2524
* Get list of composite index fields from the segment
2625
*
2726
*/
28-
List<String> getCompositeIndexFields();
27+
List<CompositeIndexFieldInfo> getCompositeIndexFields();
2928

3029
/**
3130
* Get composite index values based on the field name and the field type
3231
*/
33-
CompositeIndexValues getCompositeIndexValues(String field, CompositeMappedFieldType.CompositeFieldType fieldType) throws IOException;
32+
CompositeIndexValues getCompositeIndexValues(CompositeIndexFieldInfo fieldInfo) throws IOException;
3433
}

server/src/main/java/org/opensearch/index/codec/composite/datacube/startree/StarTreeValues.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@
88

99
package org.opensearch.index.codec.composite.datacube.startree;
1010

11+
import org.apache.lucene.search.DocIdSetIterator;
1112
import org.opensearch.common.annotation.ExperimentalApi;
1213
import org.opensearch.index.codec.composite.CompositeIndexValues;
14+
import org.opensearch.index.compositeindex.datacube.startree.StarTreeField;
15+
import org.opensearch.index.compositeindex.datacube.startree.node.StarTreeNode;
1316

14-
import java.util.List;
17+
import java.util.Map;
1518

1619
/**
1720
* Concrete class that holds the star tree associated values from the segment
@@ -20,16 +23,41 @@
2023
*/
2124
@ExperimentalApi
2225
public class StarTreeValues implements CompositeIndexValues {
23-
private final List<String> dimensionsOrder;
26+
private final StarTreeField starTreeField;
27+
private final StarTreeNode root;
28+
private final Map<String, DocIdSetIterator> dimensionDocValuesIteratorMap;
29+
private final Map<String, DocIdSetIterator> metricDocValuesIteratorMap;
2430

25-
// TODO : come up with full set of vales such as dimensions and metrics doc values + star tree
26-
public StarTreeValues(List<String> dimensionsOrder) {
27-
super();
28-
this.dimensionsOrder = dimensionsOrder;
31+
public StarTreeValues(
32+
StarTreeField starTreeField,
33+
StarTreeNode root,
34+
Map<String, DocIdSetIterator> dimensionDocValuesIteratorMap,
35+
Map<String, DocIdSetIterator> metricDocValuesIteratorMap
36+
) {
37+
this.starTreeField = starTreeField;
38+
this.root = root;
39+
this.dimensionDocValuesIteratorMap = dimensionDocValuesIteratorMap;
40+
this.metricDocValuesIteratorMap = metricDocValuesIteratorMap;
2941
}
3042

3143
@Override
3244
public CompositeIndexValues getValues() {
3345
return this;
3446
}
47+
48+
public StarTreeField getStarTreeField() {
49+
return starTreeField;
50+
}
51+
52+
public StarTreeNode getRoot() {
53+
return root;
54+
}
55+
56+
public Map<String, DocIdSetIterator> getDimensionDocValuesIteratorMap() {
57+
return dimensionDocValuesIteratorMap;
58+
}
59+
60+
public Map<String, DocIdSetIterator> getMetricDocValuesIteratorMap() {
61+
return metricDocValuesIteratorMap;
62+
}
3563
}

server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/aggregators/MetricAggregatorInfo.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import org.opensearch.index.compositeindex.datacube.MetricStat;
1111
import org.opensearch.index.compositeindex.datacube.startree.aggregators.numerictype.StarTreeNumericType;
12-
import org.opensearch.index.compositeindex.datacube.startree.utils.SequentialDocValuesIterator;
1312
import org.opensearch.index.fielddata.IndexNumericFieldData;
1413

1514
import java.util.Comparator;
@@ -28,22 +27,14 @@ public class MetricAggregatorInfo implements Comparable<MetricAggregatorInfo> {
2827
private final String field;
2928
private final ValueAggregator valueAggregators;
3029
private final StarTreeNumericType starTreeNumericType;
31-
private final SequentialDocValuesIterator metricStatReader;
3230

3331
/**
3432
* Constructor for MetricAggregatorInfo
3533
*/
36-
public MetricAggregatorInfo(
37-
MetricStat metricStat,
38-
String field,
39-
String starFieldName,
40-
IndexNumericFieldData.NumericType numericType,
41-
SequentialDocValuesIterator metricStatReader
42-
) {
34+
public MetricAggregatorInfo(MetricStat metricStat, String field, String starFieldName, IndexNumericFieldData.NumericType numericType) {
4335
this.metricStat = metricStat;
4436
this.valueAggregators = ValueAggregatorFactory.getValueAggregator(metricStat);
4537
this.starTreeNumericType = StarTreeNumericType.fromNumericType(numericType);
46-
this.metricStatReader = metricStatReader;
4738
this.field = field;
4839
this.starFieldName = starFieldName;
4940
this.metric = toFieldName();
@@ -84,13 +75,6 @@ public StarTreeNumericType getAggregatedValueType() {
8475
return starTreeNumericType;
8576
}
8677

87-
/**
88-
* @return metric value reader iterator
89-
*/
90-
public SequentialDocValuesIterator getMetricStatReader() {
91-
return metricStatReader;
92-
}
93-
9478
/**
9579
* @return field name with metric type and field
9680
*/

0 commit comments

Comments
 (0)