Skip to content

Commit 6f5befd

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

File tree

18 files changed

+694
-334
lines changed

18 files changed

+694
-334
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: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@
1414
import org.apache.lucene.index.MergeState;
1515
import org.apache.lucene.index.SegmentWriteState;
1616
import org.opensearch.common.annotation.ExperimentalApi;
17+
import org.opensearch.index.codec.composite.datacube.startree.StarTreeValues;
18+
import org.opensearch.index.compositeindex.datacube.startree.StarTreeField;
19+
import org.opensearch.index.compositeindex.datacube.startree.builder.StarTreesBuilder;
1720
import org.opensearch.index.mapper.CompositeMappedFieldType;
1821
import org.opensearch.index.mapper.MapperService;
1922
import org.opensearch.index.mapper.StarTreeMapper;
2023

2124
import java.io.IOException;
25+
import java.util.Collections;
2226
import java.util.HashMap;
2327
import java.util.HashSet;
28+
import java.util.List;
2429
import java.util.Map;
2530
import java.util.Set;
2631

@@ -101,6 +106,8 @@ private void createCompositeIndicesIfPossible(DocValuesProducer valuesProducer,
101106
// TODO : Call StarTree builder
102107
}
103108
}
109+
StarTreesBuilder starTreesBuilder = new StarTreesBuilder(state, mapperService);
110+
starTreesBuilder.build(fieldProducerMap);
104111
}
105112
}
106113

@@ -110,6 +117,40 @@ public void merge(MergeState mergeState) throws IOException {
110117
this.mergeState = mergeState;
111118
super.merge(mergeState);
112119
// TODO : handle merge star tree
113-
// mergeStarTreeFields(mergeState);
120+
mergeCompositeFields(mergeState);
121+
}
122+
123+
private void mergeCompositeFields(MergeState mergeState) throws IOException {
124+
mergeStarTreeFields(mergeState);
125+
}
126+
127+
private void mergeStarTreeFields(MergeState mergeState) throws IOException {
128+
Map<String, List<StarTreeValues>> starTreeValuesPerField = new HashMap<>();
129+
Map<String, StarTreeField> starTreeFieldMap = new HashMap<>();
130+
for (int i = 0; i < mergeState.docValuesProducers.length; i++) {
131+
CompositeIndexReader reader = (CompositeIndexReader) mergeState.docValuesProducers[i];
132+
List<CompositeIndexFieldInfo> compositeFieldInfo = reader.getCompositeIndexFields();
133+
for (CompositeIndexFieldInfo fieldInfo : compositeFieldInfo) {
134+
if (fieldInfo.getType().equals(CompositeMappedFieldType.CompositeFieldType.STAR_TREE)) {
135+
CompositeIndexValues compositeIndexValues = reader.getCompositeIndexValues(fieldInfo);
136+
if (compositeIndexValues instanceof StarTreeValues) {
137+
List<StarTreeValues> fieldsList = starTreeValuesPerField.getOrDefault(
138+
fieldInfo.getField(),
139+
Collections.emptyList()
140+
);
141+
if (!starTreeFieldMap.containsKey(fieldInfo.getField())) {
142+
starTreeFieldMap.put(fieldInfo.getField(), ((StarTreeValues) compositeIndexValues).getStarTreeField());
143+
} else {
144+
assert starTreeFieldMap.get(fieldInfo.getField())
145+
.equals(((StarTreeValues) compositeIndexValues).getStarTreeField());
146+
}
147+
fieldsList.add((StarTreeValues) compositeIndexValues);
148+
starTreeValuesPerField.put(fieldInfo.getField(), fieldsList);
149+
}
150+
}
151+
}
152+
}
153+
StarTreesBuilder starTreesBuilder = new StarTreesBuilder(state, mapperService);
154+
starTreesBuilder.buildDuringMerge(starTreeFieldMap, starTreeValuesPerField);
114155
}
115156
}
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)