diff --git a/server/src/main/java/org/opensearch/index/compositeindex/CompositeIndexValidator.java b/server/src/main/java/org/opensearch/index/compositeindex/CompositeIndexValidator.java index 9547d2ac9cfce..995352e3ce6a5 100644 --- a/server/src/main/java/org/opensearch/index/compositeindex/CompositeIndexValidator.java +++ b/server/src/main/java/org/opensearch/index/compositeindex/CompositeIndexValidator.java @@ -10,19 +10,13 @@ import org.opensearch.common.annotation.ExperimentalApi; import org.opensearch.index.IndexSettings; -import org.opensearch.index.compositeindex.datacube.Dimension; -import org.opensearch.index.compositeindex.datacube.Metric; -import org.opensearch.index.compositeindex.datacube.startree.StarTreeIndexSettings; -import org.opensearch.index.mapper.CompositeMappedFieldType; -import org.opensearch.index.mapper.MappedFieldType; +import org.opensearch.index.compositeindex.datacube.startree.StarTreeValidator; import org.opensearch.index.mapper.MapperService; -import org.opensearch.index.mapper.StarTreeMapper; import java.util.Locale; -import java.util.Set; /** - * Validation for composite indices + * Validation for composite indices as part of mappings * * @opensearch.experimental */ @@ -30,7 +24,7 @@ public class CompositeIndexValidator { public static void validate(MapperService mapperService, CompositeIndexSettings compositeIndexSettings, IndexSettings indexSettings) { - validateStarTreeMappings(mapperService, compositeIndexSettings, indexSettings); + StarTreeValidator.validate(mapperService, compositeIndexSettings, indexSettings); } public static void validate( @@ -47,74 +41,6 @@ public static void validate( ) ); } - validateStarTreeMappings(mapperService, compositeIndexSettings, indexSettings); - } - - private static void validateStarTreeMappings( - MapperService mapperService, - CompositeIndexSettings compositeIndexSettings, - IndexSettings indexSettings - ) { - Set compositeFieldTypes = mapperService.getCompositeFieldTypes(); - if (compositeFieldTypes.size() > StarTreeIndexSettings.STAR_TREE_MAX_FIELDS_SETTING.get(indexSettings.getSettings())) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "Index cannot have more than [%s] star tree fields", - StarTreeIndexSettings.STAR_TREE_MAX_FIELDS_SETTING.get(indexSettings.getSettings()) - ) - ); - } - for (CompositeMappedFieldType compositeFieldType : compositeFieldTypes) { - if (!(compositeFieldType instanceof StarTreeMapper.StarTreeFieldType)) { - continue; - } - if (!compositeIndexSettings.isStarTreeIndexCreationEnabled()) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "star tree index cannot be created, enable it using [%s] setting", - CompositeIndexSettings.STAR_TREE_INDEX_ENABLED_SETTING.getKey() - ) - ); - } - StarTreeMapper.StarTreeFieldType dataCubeFieldType = (StarTreeMapper.StarTreeFieldType) compositeFieldType; - for (Dimension dim : dataCubeFieldType.getDimensions()) { - MappedFieldType ft = mapperService.fieldType(dim.getField()); - if (ft == null) { - throw new IllegalArgumentException( - String.format(Locale.ROOT, "unknown dimension field [%s] as part of star tree field", dim.getField()) - ); - } - if (ft.isAggregatable() == false) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "Aggregations not supported for the dimension field [%s] with field type [%s] as part of star tree field", - dim.getField(), - ft.typeName() - ) - ); - } - } - for (Metric metric : dataCubeFieldType.getMetrics()) { - MappedFieldType ft = mapperService.fieldType(metric.getField()); - if (ft == null) { - throw new IllegalArgumentException( - String.format(Locale.ROOT, "unknown metric field [%s] as part of star tree field", metric.getField()) - ); - } - if (ft.isAggregatable() == false) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "Aggregations not supported for the metrics field [%s] with field type [%s] as part of star tree field", - metric.getField(), - ft.typeName() - ) - ); - } - } - } + StarTreeValidator.validate(mapperService, compositeIndexSettings, indexSettings); } } diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/DateDimension.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/DateDimension.java index 14fcfc56f6354..627f033cd9e7f 100644 --- a/server/src/main/java/org/opensearch/index/compositeindex/datacube/DateDimension.java +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/DateDimension.java @@ -10,21 +10,12 @@ import org.opensearch.common.Rounding; import org.opensearch.common.annotation.ExperimentalApi; -import org.opensearch.common.xcontent.support.XContentMapValues; import org.opensearch.core.xcontent.XContentBuilder; -import org.opensearch.index.compositeindex.datacube.startree.StarTreeIndexSettings; -import org.opensearch.index.mapper.Mapper; -import org.opensearch.index.mapper.StarTreeMapper; +import org.opensearch.index.mapper.CompositeDataCubeFieldType; import java.io.IOException; -import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Locale; -import java.util.Map; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; /** * Date dimension class @@ -32,37 +23,15 @@ * @opensearch.experimental */ @ExperimentalApi -public class DateDimension extends Dimension { +public class DateDimension implements Dimension { private final List calendarIntervals; public static final String CALENDAR_INTERVALS = "calendar_intervals"; public static final String DATE = "date"; + private final String field; - public DateDimension(String name, Map dimensionMap, Mapper.TypeParser.ParserContext c) { - super(name); - List intervalStrings = XContentMapValues.extractRawValues(CALENDAR_INTERVALS, dimensionMap) - .stream() - .map(Object::toString) - .collect(Collectors.toList()); - if (intervalStrings == null || intervalStrings.isEmpty()) { - this.calendarIntervals = StarTreeIndexSettings.DEFAULT_DATE_INTERVALS.get(c.getSettings()); - } else { - if (intervalStrings.size() > StarTreeIndexSettings.STAR_TREE_MAX_DATE_INTERVALS_SETTING.get(c.getSettings())) { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "At most [%s] calendar intervals are allowed in dimension [%s]", - StarTreeIndexSettings.STAR_TREE_MAX_DATE_INTERVALS_SETTING.get(c.getSettings()), - name - ) - ); - } - Set calendarIntervals = new LinkedHashSet<>(); - for (String interval : intervalStrings) { - calendarIntervals.add(StarTreeIndexSettings.getTimeUnit(interval)); - } - this.calendarIntervals = new ArrayList<>(calendarIntervals); - } - dimensionMap.remove(CALENDAR_INTERVALS); + public DateDimension(String field, List calendarIntervals) { + this.field = field; + this.calendarIntervals = calendarIntervals; } public List getIntervals() { @@ -72,8 +41,8 @@ public List getIntervals() { @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field(StarTreeMapper.NAME, this.getField()); - builder.field(StarTreeMapper.TYPE, DATE); + builder.field(CompositeDataCubeFieldType.NAME, this.getField()); + builder.field(CompositeDataCubeFieldType.TYPE, DATE); builder.startArray(CALENDAR_INTERVALS); for (Rounding.DateTimeUnit interval : calendarIntervals) { builder.value(interval.shortName()); @@ -87,13 +56,17 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; DateDimension that = (DateDimension) o; - return Objects.equals(calendarIntervals, that.calendarIntervals); + return Objects.equals(field, that.getField()) && Objects.equals(calendarIntervals, that.calendarIntervals); } @Override public int hashCode() { return Objects.hash(super.hashCode(), calendarIntervals); } + + @Override + public String getField() { + return field; + } } diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/Dimension.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/Dimension.java index cc3ce3b88e757..0151a474579be 100644 --- a/server/src/main/java/org/opensearch/index/compositeindex/datacube/Dimension.java +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/Dimension.java @@ -10,49 +10,13 @@ import org.opensearch.common.annotation.ExperimentalApi; import org.opensearch.core.xcontent.ToXContent; -import org.opensearch.core.xcontent.XContentBuilder; -import org.opensearch.index.mapper.StarTreeMapper; - -import java.io.IOException; -import java.util.Objects; /** - * Composite index dimension base class + * Base interface for data-cube dimensions * * @opensearch.experimental */ @ExperimentalApi -public class Dimension implements ToXContent { - public static final String NUMERIC = "numeric"; - private final String field; - - public Dimension(String field) { - this.field = field; - } - - public String getField() { - return field; - } - - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - builder.field(StarTreeMapper.NAME, field); - builder.field(StarTreeMapper.TYPE, NUMERIC); - builder.endObject(); - return builder; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Dimension dimension = (Dimension) o; - return Objects.equals(field, dimension.field); - } - - @Override - public int hashCode() { - return Objects.hash(field); - } +public interface Dimension extends ToXContent { + String getField(); } diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/DimensionFactory.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/DimensionFactory.java new file mode 100644 index 0000000000000..6a09e947217f5 --- /dev/null +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/DimensionFactory.java @@ -0,0 +1,99 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.index.compositeindex.datacube; + +import org.opensearch.common.Rounding; +import org.opensearch.common.annotation.ExperimentalApi; +import org.opensearch.common.xcontent.support.XContentMapValues; +import org.opensearch.index.compositeindex.datacube.startree.StarTreeIndexSettings; +import org.opensearch.index.mapper.DateFieldMapper; +import org.opensearch.index.mapper.Mapper; +import org.opensearch.index.mapper.NumberFieldMapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.opensearch.index.compositeindex.datacube.DateDimension.CALENDAR_INTERVALS; + +/** + * Dimension factory class mainly used to parse and create dimension from the mappings + * + * @opensearch.experimental + */ +@ExperimentalApi +public class DimensionFactory { + public static Dimension parseAndCreateDimension( + String name, + String type, + Map dimensionMap, + Mapper.TypeParser.ParserContext c + ) { + switch (type) { + case DateDimension.DATE: + return parseAndCreateDateDimension(name, dimensionMap, c); + case NumericDimension.NUMERIC: + return new NumericDimension(name); + default: + throw new IllegalArgumentException( + String.format(Locale.ROOT, "unsupported field type associated with dimension [%s] as part of star tree field", name) + ); + } + } + + public static Dimension parseAndCreateDimension( + String name, + Mapper.Builder builder, + Map dimensionMap, + Mapper.TypeParser.ParserContext c + ) { + if (builder instanceof DateFieldMapper.Builder) { + return parseAndCreateDateDimension(name, dimensionMap, c); + } else if (builder instanceof NumberFieldMapper.Builder) { + return new NumericDimension(name); + } + throw new IllegalArgumentException( + String.format(Locale.ROOT, "unsupported field type associated with star tree dimension [%s]", name) + ); + } + + private static DateDimension parseAndCreateDateDimension( + String name, + Map dimensionMap, + Mapper.TypeParser.ParserContext c + ) { + List calendarIntervals = new ArrayList<>(); + List intervalStrings = XContentMapValues.extractRawValues(CALENDAR_INTERVALS, dimensionMap) + .stream() + .map(Object::toString) + .collect(Collectors.toList()); + if (intervalStrings == null || intervalStrings.isEmpty()) { + calendarIntervals = StarTreeIndexSettings.DEFAULT_DATE_INTERVALS.get(c.getSettings()); + } else { + if (intervalStrings.size() > StarTreeIndexSettings.STAR_TREE_MAX_DATE_INTERVALS_SETTING.get(c.getSettings())) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "At most [%s] calendar intervals are allowed in dimension [%s]", + StarTreeIndexSettings.STAR_TREE_MAX_DATE_INTERVALS_SETTING.get(c.getSettings()), + name + ) + ); + } + for (String interval : intervalStrings) { + calendarIntervals.add(StarTreeIndexSettings.getTimeUnit(interval)); + } + calendarIntervals = new ArrayList<>(calendarIntervals); + } + dimensionMap.remove(CALENDAR_INTERVALS); + return new DateDimension(name, calendarIntervals); + } +} diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/NumericDimension.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/NumericDimension.java new file mode 100644 index 0000000000000..9c25ef5b25503 --- /dev/null +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/NumericDimension.java @@ -0,0 +1,57 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.index.compositeindex.datacube; + +import org.opensearch.common.annotation.ExperimentalApi; +import org.opensearch.core.xcontent.XContentBuilder; +import org.opensearch.index.mapper.CompositeDataCubeFieldType; + +import java.io.IOException; +import java.util.Objects; + +/** + * Composite index numeric dimension class + * + * @opensearch.experimental + */ +@ExperimentalApi +public class NumericDimension implements Dimension { + public static final String NUMERIC = "numeric"; + private final String field; + + public NumericDimension(String field) { + this.field = field; + } + + public String getField() { + return field; + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field(CompositeDataCubeFieldType.NAME, field); + builder.field(CompositeDataCubeFieldType.TYPE, NUMERIC); + builder.endObject(); + return builder; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NumericDimension dimension = (NumericDimension) o; + return Objects.equals(field, dimension.getField()); + } + + @Override + public int hashCode() { + return Objects.hash(field); + } +} diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeFieldConfiguration.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeFieldConfiguration.java index 5dd066b34f108..755c064c2c60a 100644 --- a/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeFieldConfiguration.java +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeFieldConfiguration.java @@ -38,8 +38,8 @@ public StarTreeFieldConfiguration(int maxLeafDocs, Set skipStarNodeCreat @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + // build mode is internal and not part of user mappings config, hence not added as part of toXContent builder.field("max_leaf_docs", maxLeafDocs.get()); - builder.field("build_mode", buildMode.getTypeName()); builder.startArray("skip_star_node_creation_for_dimensions"); for (String dim : skipStarNodeCreationInDims) { builder.value(dim); diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeIndexSettings.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeIndexSettings.java index 191d4912d06a8..a2ac545be3cc9 100644 --- a/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeIndexSettings.java +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeIndexSettings.java @@ -23,6 +23,8 @@ * @opensearch.experimental */ public class StarTreeIndexSettings { + + public static int STAR_TREE_MAX_DIMENSIONS_DEFAULT = 10; /** * This setting determines the max number of star tree fields that can be part of composite index mapping. For each * star tree field, we will generate associated star tree index. @@ -42,7 +44,7 @@ public class StarTreeIndexSettings { */ public static final Setting STAR_TREE_MAX_DIMENSIONS_SETTING = Setting.intSetting( "index.composite_index.star_tree.field.max_dimensions", - 10, + STAR_TREE_MAX_DIMENSIONS_DEFAULT, 2, 10, Setting.Property.IndexScope, diff --git a/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeValidator.java b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeValidator.java new file mode 100644 index 0000000000000..cbed46604681d --- /dev/null +++ b/server/src/main/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeValidator.java @@ -0,0 +1,94 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * The OpenSearch Contributors require contributions made to + * this file be licensed under the Apache-2.0 license or a + * compatible open source license. + */ + +package org.opensearch.index.compositeindex.datacube.startree; + +import org.opensearch.common.annotation.ExperimentalApi; +import org.opensearch.index.IndexSettings; +import org.opensearch.index.compositeindex.CompositeIndexSettings; +import org.opensearch.index.compositeindex.datacube.Dimension; +import org.opensearch.index.compositeindex.datacube.Metric; +import org.opensearch.index.mapper.CompositeMappedFieldType; +import org.opensearch.index.mapper.MappedFieldType; +import org.opensearch.index.mapper.MapperService; +import org.opensearch.index.mapper.StarTreeMapper; + +import java.util.Locale; +import java.util.Set; + +/** + * Validations for star tree fields as part of mappings + * + * @opensearch.experimental + */ +@ExperimentalApi +public class StarTreeValidator { + public static void validate(MapperService mapperService, CompositeIndexSettings compositeIndexSettings, IndexSettings indexSettings) { + Set compositeFieldTypes = mapperService.getCompositeFieldTypes(); + if (compositeFieldTypes.size() > StarTreeIndexSettings.STAR_TREE_MAX_FIELDS_SETTING.get(indexSettings.getSettings())) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "Index cannot have more than [%s] star tree fields", + StarTreeIndexSettings.STAR_TREE_MAX_FIELDS_SETTING.get(indexSettings.getSettings()) + ) + ); + } + for (CompositeMappedFieldType compositeFieldType : compositeFieldTypes) { + if (!(compositeFieldType instanceof StarTreeMapper.StarTreeFieldType)) { + continue; + } + if (!compositeIndexSettings.isStarTreeIndexCreationEnabled()) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "star tree index cannot be created, enable it using [%s] setting", + CompositeIndexSettings.STAR_TREE_INDEX_ENABLED_SETTING.getKey() + ) + ); + } + StarTreeMapper.StarTreeFieldType dataCubeFieldType = (StarTreeMapper.StarTreeFieldType) compositeFieldType; + for (Dimension dim : dataCubeFieldType.getDimensions()) { + MappedFieldType ft = mapperService.fieldType(dim.getField()); + if (ft == null) { + throw new IllegalArgumentException( + String.format(Locale.ROOT, "unknown dimension field [%s] as part of star tree field", dim.getField()) + ); + } + if (ft.isAggregatable() == false) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "Aggregations not supported for the dimension field [%s] with field type [%s] as part of star tree field", + dim.getField(), + ft.typeName() + ) + ); + } + } + for (Metric metric : dataCubeFieldType.getMetrics()) { + MappedFieldType ft = mapperService.fieldType(metric.getField()); + if (ft == null) { + throw new IllegalArgumentException( + String.format(Locale.ROOT, "unknown metric field [%s] as part of star tree field", metric.getField()) + ); + } + if (ft.isAggregatable() == false) { + throw new IllegalArgumentException( + String.format( + Locale.ROOT, + "Aggregations not supported for the metrics field [%s] with field type [%s] as part of star tree field", + metric.getField(), + ft.typeName() + ) + ); + } + } + } + } +} diff --git a/server/src/main/java/org/opensearch/index/mapper/CompositeDataCubeFieldType.java b/server/src/main/java/org/opensearch/index/mapper/CompositeDataCubeFieldType.java index b01555260e760..baf6442f0c08c 100644 --- a/server/src/main/java/org/opensearch/index/mapper/CompositeDataCubeFieldType.java +++ b/server/src/main/java/org/opensearch/index/mapper/CompositeDataCubeFieldType.java @@ -24,6 +24,8 @@ */ @ExperimentalApi public abstract class CompositeDataCubeFieldType extends CompositeMappedFieldType { + public static final String NAME = "name"; + public static final String TYPE = "type"; private final List dimensions; private final List metrics; diff --git a/server/src/main/java/org/opensearch/index/mapper/StarTreeMapper.java b/server/src/main/java/org/opensearch/index/mapper/StarTreeMapper.java index fbd3fa6b8b1d3..4f5ed8544b726 100644 --- a/server/src/main/java/org/opensearch/index/mapper/StarTreeMapper.java +++ b/server/src/main/java/org/opensearch/index/mapper/StarTreeMapper.java @@ -11,8 +11,8 @@ import org.apache.lucene.search.Query; import org.opensearch.common.annotation.ExperimentalApi; import org.opensearch.common.xcontent.support.XContentMapValues; -import org.opensearch.index.compositeindex.datacube.DateDimension; import org.opensearch.index.compositeindex.datacube.Dimension; +import org.opensearch.index.compositeindex.datacube.DimensionFactory; import org.opensearch.index.compositeindex.datacube.Metric; import org.opensearch.index.compositeindex.datacube.MetricStat; import org.opensearch.index.compositeindex.datacube.startree.StarTreeField; @@ -45,8 +45,6 @@ public class StarTreeMapper extends ParametrizedFieldMapper { public static final String BUILD_MODE = "build_mode"; public static final String ORDERED_DIMENSIONS = "ordered_dimensions"; public static final String METRICS = "metrics"; - public static final String NAME = "name"; - public static final String TYPE = "type"; public static final String STATS = "stats"; @Override @@ -86,19 +84,15 @@ public static class Builder extends ParametrizedFieldMapper.Builder { List.of(XContentMapValues.nodeStringArrayValue(paramMap.getOrDefault(SKIP_STAR_NODE_IN_DIMS, new ArrayList()))) ); paramMap.remove(SKIP_STAR_NODE_IN_DIMS); - StarTreeFieldConfiguration.StarTreeBuildMode buildMode = StarTreeFieldConfiguration.StarTreeBuildMode.fromTypeName( - XContentMapValues.nodeStringValue( - paramMap.get(BUILD_MODE), - StarTreeFieldConfiguration.StarTreeBuildMode.OFF_HEAP.getTypeName() - ) - ); - paramMap.remove(BUILD_MODE); + // TODO : change this to off heap once off heap gets implemented + StarTreeFieldConfiguration.StarTreeBuildMode buildMode = StarTreeFieldConfiguration.StarTreeBuildMode.ON_HEAP; + List dimensions = buildDimensions(name, paramMap, context); paramMap.remove(ORDERED_DIMENSIONS); List metrics = buildMetrics(name, paramMap, context); paramMap.remove(METRICS); - if (paramMap.containsKey(NAME)) { - paramMap.remove(NAME); + if (paramMap.containsKey(CompositeDataCubeFieldType.NAME)) { + paramMap.remove(CompositeDataCubeFieldType.NAME); } for (String dim : skipStarInDims) { if (dimensions.stream().filter(d -> d.getField().equals(dim)).findAny().isEmpty()) { @@ -140,12 +134,20 @@ private List buildDimensions(String fieldName, Map ma List dimensions = new LinkedList<>(); if (dims instanceof List) { List dimList = (List) dims; - if (dimList.size() > context.getSettings().getAsInt(StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_SETTING.getKey(), 10)) { + if (dimList.size() > context.getSettings() + .getAsInt( + StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_SETTING.getKey(), + StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_DEFAULT + )) { throw new IllegalArgumentException( String.format( Locale.ROOT, "ordered_dimensions cannot have more than %s dimensions for star tree field [%s]", - context.getSettings().getAsInt(StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_SETTING.getKey(), 10), + context.getSettings() + .getAsInt( + StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_SETTING.getKey(), + StarTreeIndexSettings.STAR_TREE_MAX_DIMENSIONS_DEFAULT + ), fieldName ) ); @@ -173,31 +175,17 @@ private List buildDimensions(String fieldName, Map ma private Dimension getDimension(String fieldName, Object dimensionMapping, Mapper.TypeParser.ParserContext context) { Dimension dimension; Map dimensionMap = (Map) dimensionMapping; - String name = (String) XContentMapValues.extractValue(NAME, dimensionMap); - dimensionMap.remove(NAME); + String name = (String) XContentMapValues.extractValue(CompositeDataCubeFieldType.NAME, dimensionMap); + dimensionMap.remove(CompositeDataCubeFieldType.NAME); if (this.objbuilder == null || this.objbuilder.mappersBuilders == null) { - String type = (String) XContentMapValues.extractValue(TYPE, dimensionMap); - dimensionMap.remove(TYPE); + String type = (String) XContentMapValues.extractValue(CompositeDataCubeFieldType.TYPE, dimensionMap); + dimensionMap.remove(CompositeDataCubeFieldType.TYPE); if (type == null) { throw new MapperParsingException( String.format(Locale.ROOT, "unable to parse ordered_dimensions for star tree field [%s]", fieldName) ); } - if (type.equals(DateDimension.DATE)) { - dimension = new DateDimension(name, dimensionMap, context); - } else if (type.equals(Dimension.NUMERIC)) { - dimension = new Dimension(name); - } else { - throw new IllegalArgumentException( - String.format( - Locale.ROOT, - "unsupported field type associated with dimension [%s] as part of star tree field [%s]", - name, - fieldName - ) - ); - } - return dimension; + return DimensionFactory.parseAndCreateDimension(name, type, dimensionMap, context); } else { Optional dimBuilder = findMapperBuilderByName(name, this.objbuilder.mappersBuilders); if (dimBuilder.isEmpty()) { @@ -213,17 +201,7 @@ private Dimension getDimension(String fieldName, Object dimensionMapping, Mapper ) ); } - if (dimBuilder.get() instanceof DateFieldMapper.Builder) { - dimension = new DateDimension(name, dimensionMap, context); - } - // Numeric dimension - default - else if (dimBuilder.get() instanceof NumberFieldMapper.Builder) { - dimension = new Dimension(name); - } else { - throw new IllegalArgumentException( - String.format(Locale.ROOT, "unsupported field type associated with star tree dimension [%s]", name) - ); - } + dimension = DimensionFactory.parseAndCreateDimension(name, dimBuilder.get(), dimensionMap, context); } DocumentMapperParser.checkNoRemainingFields( dimensionMap, @@ -249,8 +227,8 @@ private List buildMetrics(String fieldName, Map map, Map List metricsList = (List) metricsFromInput; for (Object metric : metricsList) { Map metricMap = (Map) metric; - String name = (String) XContentMapValues.extractValue(NAME, metricMap); - metricMap.remove(NAME); + String name = (String) XContentMapValues.extractValue(CompositeDataCubeFieldType.NAME, metricMap); + metricMap.remove(CompositeDataCubeFieldType.NAME); if (objbuilder == null || objbuilder.mappersBuilders == null) { metrics.add(getMetric(name, metricMap, context)); } else { diff --git a/server/src/test/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeMappingIntegTests.java b/server/src/test/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeMappingIntegTests.java index 0097574a19b85..662d71946428b 100644 --- a/server/src/test/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeMappingIntegTests.java +++ b/server/src/test/java/org/opensearch/index/compositeindex/datacube/startree/StarTreeMappingIntegTests.java @@ -224,7 +224,7 @@ public void testValidCompositeIndex() { assertEquals(expectedMetrics, starTreeFieldType.getMetrics().get(0).getMetrics()); assertEquals(10000, starTreeFieldType.getStarTreeConfig().maxLeafDocs()); assertEquals( - StarTreeFieldConfiguration.StarTreeBuildMode.OFF_HEAP, + StarTreeFieldConfiguration.StarTreeBuildMode.ON_HEAP, starTreeFieldType.getStarTreeConfig().getBuildMode() ); assertEquals(Collections.emptySet(), starTreeFieldType.getStarTreeConfig().getSkipStarNodeCreationInDims()); @@ -308,7 +308,7 @@ public void testUpdateIndexWhenMappingIsSame() { assertEquals(expectedMetrics, starTreeFieldType.getMetrics().get(0).getMetrics()); assertEquals(10000, starTreeFieldType.getStarTreeConfig().maxLeafDocs()); assertEquals( - StarTreeFieldConfiguration.StarTreeBuildMode.OFF_HEAP, + StarTreeFieldConfiguration.StarTreeBuildMode.ON_HEAP, starTreeFieldType.getStarTreeConfig().getBuildMode() ); assertEquals(Collections.emptySet(), starTreeFieldType.getStarTreeConfig().getSkipStarNodeCreationInDims()); diff --git a/server/src/test/java/org/opensearch/index/mapper/StarTreeMapperTests.java b/server/src/test/java/org/opensearch/index/mapper/StarTreeMapperTests.java index e2fef4c360e19..af72a39f67000 100644 --- a/server/src/test/java/org/opensearch/index/mapper/StarTreeMapperTests.java +++ b/server/src/test/java/org/opensearch/index/mapper/StarTreeMapperTests.java @@ -93,7 +93,7 @@ public void testValidStarTreeDefaults() throws IOException { ); assertEquals(expectedMetrics, starTreeFieldType.getMetrics().get(0).getMetrics()); assertEquals(10000, starTreeFieldType.getStarTreeConfig().maxLeafDocs()); - assertEquals(StarTreeFieldConfiguration.StarTreeBuildMode.OFF_HEAP, starTreeFieldType.getStarTreeConfig().getBuildMode()); + assertEquals(StarTreeFieldConfiguration.StarTreeBuildMode.ON_HEAP, starTreeFieldType.getStarTreeConfig().getBuildMode()); assertEquals(Collections.emptySet(), starTreeFieldType.getStarTreeConfig().getSkipStarNodeCreationInDims()); } } @@ -213,7 +213,6 @@ private XContentBuilder getExpandedMapping(String dim, String metric) throws IOE b.startObject("startree"); b.field("type", "star_tree"); b.startObject("config"); - b.field("build_mode", "onheap"); b.field("max_leaf_docs", 100); b.startArray("skip_star_node_creation_for_dimensions"); {