From cecba8aaf4eb9294afd9983cc6568d2cefce724b Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Fri, 11 Aug 2023 12:32:30 -0700 Subject: [PATCH 01/11] spotless apply for OpenSearch P1. Signed-off-by: Mitchell Gale --- .../sql/opensearch/client/MLClient.java | 6 +- .../opensearch/client/OpenSearchClient.java | 10 +- .../data/type/OpenSearchBinaryType.java | 5 +- .../data/type/OpenSearchDataType.java | 139 +- .../data/type/OpenSearchDateType.java | 285 +-- .../sql/opensearch/data/utils/Content.java | 88 +- .../opensearch/data/utils/ObjectContent.java | 26 +- .../data/value/OpenSearchExprBinaryValue.java | 6 +- .../value/OpenSearchExprGeoPointValue.java | 8 +- .../executor/OpenSearchExecutionEngine.java | 48 +- .../protector/ExecutionProtector.java | 9 +- .../protector/NoopExecutionProtector.java | 5 +- .../OpenSearchExecutionProtector.java | 91 +- .../sql/opensearch/mapping/IndexMapping.java | 15 +- .../planner/physical/ADOperator.java | 179 +- .../planner/physical/MLCommonsOperator.java | 84 +- .../physical/MLCommonsOperatorActions.java | 140 +- .../planner/physical/MLOperator.java | 70 +- .../system/OpenSearchCatIndicesRequest.java | 5 +- .../OpenSearchDescribeIndexRequest.java | 42 +- .../agg/CompositeAggregationParser.java | 4 +- .../opensearch/response/agg/FilterParser.java | 5 +- .../opensearch/response/agg/MetricParser.java | 8 +- .../response/agg/MetricParserHelper.java | 9 +- .../agg/NoBucketAggregationParser.java | 4 +- .../OpenSearchAggregationResponseParser.java | 5 +- .../response/error/ErrorMessage.java | 18 +- .../response/error/ErrorMessageFactory.java | 9 +- .../error/OpenSearchErrorMessage.java | 23 +- .../setting/LegacyOpenDistroSettings.java | 194 ++- .../storage/OpenSearchDataSourceFactory.java | 4 +- .../script/ExpressionScriptEngine.java | 31 +- .../aggregation/AggregationQueryBuilder.java | 98 +- .../ExpressionAggregationScript.java | 19 +- .../ExpressionAggregationScriptFactory.java | 5 +- ...xpressionAggregationScriptLeafFactory.java | 21 +- .../dsl/AggregationBuilderHelper.java | 24 +- .../dsl/BucketAggregationBuilder.java | 15 +- .../dsl/MetricAggregationBuilder.java | 50 +- .../storage/script/core/ExpressionScript.java | 108 +- .../script/filter/ExpressionFilterScript.java | 31 +- .../filter/ExpressionFilterScriptFactory.java | 10 +- .../ExpressionFilterScriptLeafFactory.java | 23 +- .../script/filter/FilterQueryBuilder.java | 54 +- .../script/filter/lucene/LikeQuery.java | 7 +- .../script/filter/lucene/LuceneQuery.java | 288 ++-- .../script/filter/lucene/NestedQuery.java | 35 +- .../FunctionParameterRepository.java | 389 +++-- .../relevance/MatchBoolPrefixQuery.java | 18 +- .../relevance/MatchPhrasePrefixQuery.java | 6 +- .../lucene/relevance/MatchPhraseQuery.java | 8 +- .../filter/lucene/relevance/MatchQuery.java | 8 +- .../lucene/relevance/MultiFieldQuery.java | 37 +- .../lucene/relevance/MultiMatchQuery.java | 4 +- .../filter/lucene/relevance/NoFieldQuery.java | 27 +- .../DefaultExpressionSerializer.java | 6 +- .../serialization/ExpressionSerializer.java | 16 +- .../OpenSearchDataTypeRecognitionTest.java | 7 +- .../data/type/OpenSearchDataTypeTest.java | 240 +-- .../data/type/OpenSearchDateTypeTest.java | 78 +- .../value/OpenSearchExprBinaryValueTest.java | 10 +- .../OpenSearchExecutionEngineTest.java | 171 +- .../protector/NoopExecutionProtectorTest.java | 4 +- .../OpenSearchExecutionProtectorTest.java | 173 +- .../physical/MLCommonsOperatorTest.java | 78 +- .../planner/physical/MLOperatorTest.java | 74 +- .../OpenSearchCatIndicesRequestTest.java | 12 +- .../OpenSearchDescribeIndexRequestTest.java | 40 +- .../response/AggregationResponseUtils.java | 80 +- ...enSearchAggregationResponseParserTest.java | 437 +++-- .../error/ErrorMessageFactoryTest.java | 1 - .../response/error/ErrorMessageTest.java | 65 +- .../error/OpenSearchErrorMessageTest.java | 19 +- .../OpenSearchDefaultImplementorTest.java | 15 +- .../script/ExpressionScriptEngineTest.java | 17 +- .../AggregationQueryBuilderTest.java | 864 +++++----- ...xpressionAggregationScriptFactoryTest.java | 13 +- .../ExpressionAggregationScriptTest.java | 79 +- .../aggregation/GroupSortOrderTest.java | 11 +- .../dsl/BucketAggregationBuilderTest.java | 36 +- .../dsl/MetricAggregationBuilderTest.java | 471 ++--- .../ExpressionFilterScriptFactoryTest.java | 14 +- .../filter/ExpressionFilterScriptTest.java | 75 +- .../script/filter/FilterQueryBuilderTest.java | 1536 +++++++++-------- .../script/filter/lucene/LuceneQueryTest.java | 8 +- .../lucene/MatchBoolPrefixQueryTest.java | 48 +- .../lucene/MatchPhrasePrefixQueryTest.java | 90 +- .../filter/lucene/MatchPhraseQueryTest.java | 300 ++-- .../script/filter/lucene/MatchQueryTest.java | 211 ++- .../script/filter/lucene/MultiMatchTest.java | 139 +- .../lucene/relevance/MultiFieldQueryTest.java | 42 +- .../lucene/relevance/NoFieldQueryTest.java | 20 +- .../DefaultExpressionSerializerTest.java | 34 +- 93 files changed, 4272 insertions(+), 4122 deletions(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/client/MLClient.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/client/MLClient.java index 19f49d0e5f..4bc6009875 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/client/MLClient.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/client/MLClient.java @@ -3,16 +3,14 @@ import org.opensearch.client.node.NodeClient; import org.opensearch.ml.client.MachineLearningNodeClient; - public class MLClient { private static MachineLearningNodeClient INSTANCE; - private MLClient() { - - } + private MLClient() {} /** * get machine learning client. + * * @param nodeClient node client * @return machine learning client */ diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/client/OpenSearchClient.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/client/OpenSearchClient.java index dc6e72bd91..0a9cc67993 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/client/OpenSearchClient.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/client/OpenSearchClient.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.client; import java.util.List; @@ -14,9 +13,8 @@ import org.opensearch.sql.opensearch.response.OpenSearchResponse; /** - * OpenSearch client abstraction to wrap different OpenSearch client implementation. For - * example, implementation by node client for OpenSearch plugin or by REST client for - * standalone mode. + * OpenSearch client abstraction to wrap different OpenSearch client implementation. For example, + * implementation by node client for OpenSearch plugin or by REST client for standalone mode. */ public interface OpenSearchClient { @@ -24,6 +22,7 @@ public interface OpenSearchClient { /** * Check if the given index exists. + * * @param indexName index name * @return true if exists, otherwise false */ @@ -31,8 +30,9 @@ public interface OpenSearchClient { /** * Create OpenSearch index based on the given mappings. + * * @param indexName index name - * @param mappings index mappings + * @param mappings index mappings */ void createIndex(String indexName, Map mappings); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java index cd58d4bc9f..ddd7ab8eb9 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.type; import static org.opensearch.sql.data.type.ExprCoreType.UNKNOWN; @@ -11,8 +10,8 @@ import lombok.EqualsAndHashCode; /** - * The type of a binary value. See - * doc + * The type of a binary value. See doc */ @EqualsAndHashCode(callSuper = false) public class OpenSearchBinaryType extends OpenSearchDataType { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataType.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataType.java index 273b980d2a..d276374539 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataType.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataType.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.type; import com.google.common.collect.ImmutableMap; @@ -18,15 +17,11 @@ import org.opensearch.sql.data.type.ExprCoreType; import org.opensearch.sql.data.type.ExprType; -/** - * The extension of ExprType in OpenSearch. - */ +/** The extension of ExprType in OpenSearch. */ @EqualsAndHashCode public class OpenSearchDataType implements ExprType, Serializable { - /** - * The mapping (OpenSearch engine) type. - */ + /** The mapping (OpenSearch engine) type. */ public enum MappingType { Invalid(null, ExprCoreType.UNKNOWN), Text("text", ExprCoreType.UNKNOWN), @@ -51,8 +46,7 @@ public enum MappingType { private final String name; // Associated `ExprCoreType` - @Getter - private final ExprCoreType exprCoreType; + @Getter private final ExprCoreType exprCoreType; MappingType(String name, ExprCoreType exprCoreType) { this.name = name; @@ -64,16 +58,15 @@ public String toString() { } } - @EqualsAndHashCode.Exclude - @Getter - protected MappingType mappingType; + @EqualsAndHashCode.Exclude @Getter protected MappingType mappingType; // resolved ExprCoreType protected ExprCoreType exprCoreType; /** - * Get a simplified type {@link ExprCoreType} if possible. - * To avoid returning `UNKNOWN` for `OpenSearch*Type`s, e.g. for IP, returns itself. + * Get a simplified type {@link ExprCoreType} if possible. To avoid returning `UNKNOWN` for + * `OpenSearch*Type`s, e.g. for IP, returns itself. + * * @return An {@link ExprType}. */ public ExprType getExprType() { @@ -84,22 +77,23 @@ public ExprType getExprType() { } /** - * Simple instances of OpenSearchDataType are created once during entire SQL engine lifetime - * and cached there. This reduces memory usage and increases type comparison. - * Note: Types with non-empty fields and properties are not cached. + * Simple instances of OpenSearchDataType are created once during entire SQL engine lifetime and + * cached there. This reduces memory usage and increases type comparison. Note: Types with + * non-empty fields and properties are not cached. */ private static final Map instances = new HashMap<>(); static { EnumUtils.getEnumList(MappingType.class).stream() - .filter(t -> t != MappingType.Invalid).forEach(t -> - instances.put(t.toString(), OpenSearchDataType.of(t))); - EnumUtils.getEnumList(ExprCoreType.class).forEach(t -> - instances.put(t.toString(), OpenSearchDataType.of(t))); + .filter(t -> t != MappingType.Invalid) + .forEach(t -> instances.put(t.toString(), OpenSearchDataType.of(t))); + EnumUtils.getEnumList(ExprCoreType.class) + .forEach(t -> instances.put(t.toString(), OpenSearchDataType.of(t))); } /** * Parses index mapping and maps it to a Data type in the SQL plugin. + * * @param indexMapping An input with keys and objects that need to be mapped to a data type. * @return The mapping. */ @@ -110,37 +104,35 @@ public static Map parseMapping(Map i return result; } - indexMapping.forEach((k, v) -> { - var innerMap = (Map)v; - // by default, the type is treated as an Object if "type" is not provided - var type = ((String) innerMap - .getOrDefault( - "type", - "object")) - .replace("_", ""); - if (!EnumUtils.isValidEnumIgnoreCase(OpenSearchDataType.MappingType.class, type)) { - // unknown type, e.g. `alias` - // TODO resolve alias reference - return; - } - // create OpenSearchDataType - result.put(k, OpenSearchDataType.of( - EnumUtils.getEnumIgnoreCase(OpenSearchDataType.MappingType.class, type), - innerMap) - ); - }); + indexMapping.forEach( + (k, v) -> { + var innerMap = (Map) v; + // by default, the type is treated as an Object if "type" is not provided + var type = ((String) innerMap.getOrDefault("type", "object")).replace("_", ""); + if (!EnumUtils.isValidEnumIgnoreCase(OpenSearchDataType.MappingType.class, type)) { + // unknown type, e.g. `alias` + // TODO resolve alias reference + return; + } + // create OpenSearchDataType + result.put( + k, + OpenSearchDataType.of( + EnumUtils.getEnumIgnoreCase(OpenSearchDataType.MappingType.class, type), + innerMap)); + }); return result; } /** * A constructor function which builds proper `OpenSearchDataType` for given mapping `Type`. + * * @param mappingType A mapping type. * @return An instance or inheritor of `OpenSearchDataType`. */ public static OpenSearchDataType of(MappingType mappingType, Map innerMap) { - OpenSearchDataType res = instances.getOrDefault(mappingType.toString(), - new OpenSearchDataType(mappingType) - ); + OpenSearchDataType res = + instances.getOrDefault(mappingType.toString(), new OpenSearchDataType(mappingType)); switch (mappingType) { case Object: // TODO: use Object type once it has been added @@ -158,9 +150,12 @@ public static OpenSearchDataType of(MappingType mappingType, Map Map fields = parseMapping((Map) innerMap.getOrDefault("fields", Map.of())); return (!fields.isEmpty()) ? OpenSearchTextType.of(fields) : OpenSearchTextType.of(); - case GeoPoint: return OpenSearchGeoPointType.of(); - case Binary: return OpenSearchBinaryType.of(); - case Ip: return OpenSearchIpType.of(); + case GeoPoint: + return OpenSearchGeoPointType.of(); + case Binary: + return OpenSearchBinaryType.of(); + case Ip: + return OpenSearchIpType.of(); case Date: // Default date formatter is used when "" is passed as the second parameter String format = (String) innerMap.getOrDefault("format", ""); @@ -173,6 +168,7 @@ public static OpenSearchDataType of(MappingType mappingType, Map /** * A constructor function which builds proper `OpenSearchDataType` for given mapping `Type`. * Designed to be called by the mapping parser only (and tests). + * * @param mappingType A mapping type. * @return An instance or inheritor of `OpenSearchDataType`. */ @@ -182,6 +178,7 @@ public static OpenSearchDataType of(MappingType mappingType) { /** * A constructor function which builds proper `OpenSearchDataType` for given {@link ExprType}. + * * @param type A type. * @return An instance of `OpenSearchDataType`. */ @@ -211,9 +208,7 @@ protected OpenSearchDataType(ExprCoreType type) { // For datatypes with properties (example: object and nested types) // a read-only collection - @Getter - @EqualsAndHashCode.Exclude - Map properties = ImmutableMap.of(); + @Getter @EqualsAndHashCode.Exclude Map properties = ImmutableMap.of(); @Override // Called when building TypeEnvironment and when serializing PPL response @@ -236,46 +231,52 @@ public String legacyTypeName() { } /** - * Clone type object without {@link #properties} - without info about nested object types. - * Note: Should be overriden by all derived classes for proper work. + * Clone type object without {@link #properties} - without info about nested object types. Note: + * Should be overriden by all derived classes for proper work. + * * @return A cloned object. */ protected OpenSearchDataType cloneEmpty() { return this.mappingType == null - ? new OpenSearchDataType(this.exprCoreType) : new OpenSearchDataType(this.mappingType); + ? new OpenSearchDataType(this.exprCoreType) + : new OpenSearchDataType(this.mappingType); } /** - * Flattens mapping tree into a single layer list of objects (pairs of name-types actually), - * which don't have nested types. - * See {@link OpenSearchDataTypeTest#traverseAndFlatten() test} for example. + * Flattens mapping tree into a single layer list of objects (pairs of name-types actually), which + * don't have nested types. See {@link OpenSearchDataTypeTest#traverseAndFlatten() test} for + * example. + * * @param tree A list of `OpenSearchDataType`s - map between field name and its type. * @return A list of all `OpenSearchDataType`s from given map on the same nesting level (1). - * Nested object names are prefixed by names of their host. + * Nested object names are prefixed by names of their host. */ public static Map traverseAndFlatten( Map tree) { final Map result = new LinkedHashMap<>(); - BiConsumer, String> visitLevel = new BiConsumer<>() { - @Override - public void accept(Map subtree, String prefix) { - for (var entry : subtree.entrySet()) { - String entryKey = entry.getKey(); - var nextPrefix = prefix.isEmpty() ? entryKey : String.format("%s.%s", prefix, entryKey); - result.put(nextPrefix, entry.getValue().cloneEmpty()); - var nextSubtree = entry.getValue().getProperties(); - if (!nextSubtree.isEmpty()) { - accept(nextSubtree, nextPrefix); + BiConsumer, String> visitLevel = + new BiConsumer<>() { + @Override + public void accept(Map subtree, String prefix) { + for (var entry : subtree.entrySet()) { + String entryKey = entry.getKey(); + var nextPrefix = + prefix.isEmpty() ? entryKey : String.format("%s.%s", prefix, entryKey); + result.put(nextPrefix, entry.getValue().cloneEmpty()); + var nextSubtree = entry.getValue().getProperties(); + if (!nextSubtree.isEmpty()) { + accept(nextSubtree, nextPrefix); + } + } } - } - } - }; + }; visitLevel.accept(tree, ""); return result; } /** * Resolve type of identified from parsed mapping tree. + * * @param tree Parsed mapping tree (not flattened). * @param id An identifier. * @return Resolved OpenSearchDataType or null if not found. diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateType.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateType.java index 76947bf720..d0a924c494 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateType.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateType.java @@ -20,124 +20,124 @@ import org.opensearch.sql.data.type.ExprCoreType; import org.opensearch.sql.data.type.ExprType; -/** - * Date type with support for predefined and custom formats read from the index mapping. - */ +/** Date type with support for predefined and custom formats read from the index mapping. */ @EqualsAndHashCode(callSuper = true) public class OpenSearchDateType extends OpenSearchDataType { private static final OpenSearchDateType instance = new OpenSearchDateType(); /** Numeric formats which support full datetime. */ - public static final List SUPPORTED_NAMED_NUMERIC_FORMATS = List.of( - FormatNames.EPOCH_MILLIS, - FormatNames.EPOCH_SECOND - ); + public static final List SUPPORTED_NAMED_NUMERIC_FORMATS = + List.of(FormatNames.EPOCH_MILLIS, FormatNames.EPOCH_SECOND); /** List of named formats which support full datetime. */ - public static final List SUPPORTED_NAMED_DATETIME_FORMATS = List.of( - FormatNames.ISO8601, - FormatNames.BASIC_DATE_TIME, - FormatNames.BASIC_DATE_TIME_NO_MILLIS, - FormatNames.BASIC_ORDINAL_DATE_TIME, - FormatNames.BASIC_ORDINAL_DATE_TIME_NO_MILLIS, - FormatNames.BASIC_WEEK_DATE_TIME, - FormatNames.STRICT_BASIC_WEEK_DATE_TIME, - FormatNames.BASIC_WEEK_DATE_TIME_NO_MILLIS, - FormatNames.STRICT_BASIC_WEEK_DATE_TIME_NO_MILLIS, - FormatNames.BASIC_WEEK_DATE, - FormatNames.STRICT_BASIC_WEEK_DATE, - FormatNames.DATE_OPTIONAL_TIME, - FormatNames.STRICT_DATE_OPTIONAL_TIME, - FormatNames.STRICT_DATE_OPTIONAL_TIME_NANOS, - FormatNames.DATE_TIME, - FormatNames.STRICT_DATE_TIME, - FormatNames.DATE_TIME_NO_MILLIS, - FormatNames.STRICT_DATE_TIME_NO_MILLIS, - FormatNames.DATE_HOUR_MINUTE_SECOND_FRACTION, - FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND_FRACTION, - FormatNames.DATE_HOUR_MINUTE_SECOND_FRACTION, - FormatNames.DATE_HOUR_MINUTE_SECOND_MILLIS, - FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND_MILLIS, - FormatNames.DATE_HOUR_MINUTE_SECOND, - FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND, - FormatNames.DATE_HOUR_MINUTE, - FormatNames.STRICT_DATE_HOUR_MINUTE, - FormatNames.DATE_HOUR, - FormatNames.STRICT_DATE_HOUR, - FormatNames.ORDINAL_DATE_TIME, - FormatNames.STRICT_ORDINAL_DATE_TIME, - FormatNames.ORDINAL_DATE_TIME_NO_MILLIS, - FormatNames.STRICT_ORDINAL_DATE_TIME_NO_MILLIS, - FormatNames.WEEK_DATE_TIME, - FormatNames.STRICT_WEEK_DATE_TIME, - FormatNames.WEEK_DATE_TIME_NO_MILLIS, - FormatNames.STRICT_WEEK_DATE_TIME_NO_MILLIS - ); + public static final List SUPPORTED_NAMED_DATETIME_FORMATS = + List.of( + FormatNames.ISO8601, + FormatNames.BASIC_DATE_TIME, + FormatNames.BASIC_DATE_TIME_NO_MILLIS, + FormatNames.BASIC_ORDINAL_DATE_TIME, + FormatNames.BASIC_ORDINAL_DATE_TIME_NO_MILLIS, + FormatNames.BASIC_WEEK_DATE_TIME, + FormatNames.STRICT_BASIC_WEEK_DATE_TIME, + FormatNames.BASIC_WEEK_DATE_TIME_NO_MILLIS, + FormatNames.STRICT_BASIC_WEEK_DATE_TIME_NO_MILLIS, + FormatNames.BASIC_WEEK_DATE, + FormatNames.STRICT_BASIC_WEEK_DATE, + FormatNames.DATE_OPTIONAL_TIME, + FormatNames.STRICT_DATE_OPTIONAL_TIME, + FormatNames.STRICT_DATE_OPTIONAL_TIME_NANOS, + FormatNames.DATE_TIME, + FormatNames.STRICT_DATE_TIME, + FormatNames.DATE_TIME_NO_MILLIS, + FormatNames.STRICT_DATE_TIME_NO_MILLIS, + FormatNames.DATE_HOUR_MINUTE_SECOND_FRACTION, + FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND_FRACTION, + FormatNames.DATE_HOUR_MINUTE_SECOND_FRACTION, + FormatNames.DATE_HOUR_MINUTE_SECOND_MILLIS, + FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND_MILLIS, + FormatNames.DATE_HOUR_MINUTE_SECOND, + FormatNames.STRICT_DATE_HOUR_MINUTE_SECOND, + FormatNames.DATE_HOUR_MINUTE, + FormatNames.STRICT_DATE_HOUR_MINUTE, + FormatNames.DATE_HOUR, + FormatNames.STRICT_DATE_HOUR, + FormatNames.ORDINAL_DATE_TIME, + FormatNames.STRICT_ORDINAL_DATE_TIME, + FormatNames.ORDINAL_DATE_TIME_NO_MILLIS, + FormatNames.STRICT_ORDINAL_DATE_TIME_NO_MILLIS, + FormatNames.WEEK_DATE_TIME, + FormatNames.STRICT_WEEK_DATE_TIME, + FormatNames.WEEK_DATE_TIME_NO_MILLIS, + FormatNames.STRICT_WEEK_DATE_TIME_NO_MILLIS); /** List of named formats that only support year/month/day. */ - public static final List SUPPORTED_NAMED_DATE_FORMATS = List.of( - FormatNames.BASIC_DATE, - FormatNames.BASIC_ORDINAL_DATE, - FormatNames.DATE, - FormatNames.STRICT_DATE, - FormatNames.YEAR_MONTH_DAY, - FormatNames.STRICT_YEAR_MONTH_DAY, - FormatNames.ORDINAL_DATE, - FormatNames.STRICT_ORDINAL_DATE, - FormatNames.WEEK_DATE, - FormatNames.STRICT_WEEK_DATE, - FormatNames.WEEKYEAR_WEEK_DAY, - FormatNames.STRICT_WEEKYEAR_WEEK_DAY - ); - - /** list of named formats which produce incomplete date, - * e.g. 1 or 2 are missing from tuple year/month/day. */ - public static final List SUPPORTED_NAMED_INCOMPLETE_DATE_FORMATS = List.of( - FormatNames.YEAR_MONTH, - FormatNames.STRICT_YEAR_MONTH, - FormatNames.YEAR, - FormatNames.STRICT_YEAR, - FormatNames.WEEK_YEAR, - FormatNames.WEEK_YEAR_WEEK, - FormatNames.STRICT_WEEKYEAR_WEEK, - FormatNames.WEEKYEAR, - FormatNames.STRICT_WEEKYEAR - ); + public static final List SUPPORTED_NAMED_DATE_FORMATS = + List.of( + FormatNames.BASIC_DATE, + FormatNames.BASIC_ORDINAL_DATE, + FormatNames.DATE, + FormatNames.STRICT_DATE, + FormatNames.YEAR_MONTH_DAY, + FormatNames.STRICT_YEAR_MONTH_DAY, + FormatNames.ORDINAL_DATE, + FormatNames.STRICT_ORDINAL_DATE, + FormatNames.WEEK_DATE, + FormatNames.STRICT_WEEK_DATE, + FormatNames.WEEKYEAR_WEEK_DAY, + FormatNames.STRICT_WEEKYEAR_WEEK_DAY); + + /** + * list of named formats which produce incomplete date, e.g. 1 or 2 are missing from tuple + * year/month/day. + */ + public static final List SUPPORTED_NAMED_INCOMPLETE_DATE_FORMATS = + List.of( + FormatNames.YEAR_MONTH, + FormatNames.STRICT_YEAR_MONTH, + FormatNames.YEAR, + FormatNames.STRICT_YEAR, + FormatNames.WEEK_YEAR, + FormatNames.WEEK_YEAR_WEEK, + FormatNames.STRICT_WEEKYEAR_WEEK, + FormatNames.WEEKYEAR, + FormatNames.STRICT_WEEKYEAR); /** List of named formats that only support hour/minute/second. */ - public static final List SUPPORTED_NAMED_TIME_FORMATS = List.of( - FormatNames.BASIC_TIME, - FormatNames.BASIC_TIME_NO_MILLIS, - FormatNames.BASIC_T_TIME, - FormatNames.BASIC_T_TIME_NO_MILLIS, - FormatNames.TIME, - FormatNames.STRICT_TIME, - FormatNames.TIME_NO_MILLIS, - FormatNames.STRICT_TIME_NO_MILLIS, - FormatNames.HOUR_MINUTE_SECOND_FRACTION, - FormatNames.STRICT_HOUR_MINUTE_SECOND_FRACTION, - FormatNames.HOUR_MINUTE_SECOND_MILLIS, - FormatNames.STRICT_HOUR_MINUTE_SECOND_MILLIS, - FormatNames.HOUR_MINUTE_SECOND, - FormatNames.STRICT_HOUR_MINUTE_SECOND, - FormatNames.HOUR_MINUTE, - FormatNames.STRICT_HOUR_MINUTE, - FormatNames.HOUR, - FormatNames.STRICT_HOUR, - FormatNames.T_TIME, - FormatNames.STRICT_T_TIME, - FormatNames.T_TIME_NO_MILLIS, - FormatNames.STRICT_T_TIME_NO_MILLIS - ); - - /** Formatter symbols which used to format time or date correspondingly. - * {@link java.time.format.DateTimeFormatter}. */ + public static final List SUPPORTED_NAMED_TIME_FORMATS = + List.of( + FormatNames.BASIC_TIME, + FormatNames.BASIC_TIME_NO_MILLIS, + FormatNames.BASIC_T_TIME, + FormatNames.BASIC_T_TIME_NO_MILLIS, + FormatNames.TIME, + FormatNames.STRICT_TIME, + FormatNames.TIME_NO_MILLIS, + FormatNames.STRICT_TIME_NO_MILLIS, + FormatNames.HOUR_MINUTE_SECOND_FRACTION, + FormatNames.STRICT_HOUR_MINUTE_SECOND_FRACTION, + FormatNames.HOUR_MINUTE_SECOND_MILLIS, + FormatNames.STRICT_HOUR_MINUTE_SECOND_MILLIS, + FormatNames.HOUR_MINUTE_SECOND, + FormatNames.STRICT_HOUR_MINUTE_SECOND, + FormatNames.HOUR_MINUTE, + FormatNames.STRICT_HOUR_MINUTE, + FormatNames.HOUR, + FormatNames.STRICT_HOUR, + FormatNames.T_TIME, + FormatNames.STRICT_T_TIME, + FormatNames.T_TIME_NO_MILLIS, + FormatNames.STRICT_T_TIME_NO_MILLIS); + + /** + * Formatter symbols which used to format time or date correspondingly. {@link + * java.time.format.DateTimeFormatter}. + */ private static final String CUSTOM_FORMAT_TIME_SYMBOLS = "nNASsmHkKha"; + private static final String CUSTOM_FORMAT_DATE_SYMBOLS = "FecEWwYqQgdMLDyuG"; - @EqualsAndHashCode.Exclude - private final List formats; + @EqualsAndHashCode.Exclude private final List formats; private OpenSearchDateType() { super(MappingType.Date); @@ -166,6 +166,7 @@ public boolean hasFormats() { /** * Retrieves and splits a user defined format string from the mapping into a list of formats. + * * @return A list of format names and user defined formats. */ private List getFormatList(String format) { @@ -175,49 +176,57 @@ private List getFormatList(String format) { /** * Retrieves a list of named OpenSearch formatters given by user mapping. + * * @return a list of DateFormatters that can be used to parse a Date/Time/Timestamp. */ public List getAllNamedFormatters() { return formats.stream() .filter(formatString -> FormatNames.forName(formatString) != null) - .map(DateFormatter::forPattern).collect(Collectors.toList()); + .map(DateFormatter::forPattern) + .collect(Collectors.toList()); } /** * Retrieves a list of numeric formatters that format for dates. + * * @return a list of DateFormatters that can be used to parse a Date. */ public List getNumericNamedFormatters() { return formats.stream() - .filter(formatString -> { - FormatNames namedFormat = FormatNames.forName(formatString); - return namedFormat != null && SUPPORTED_NAMED_NUMERIC_FORMATS.contains(namedFormat); - }) - .map(DateFormatter::forPattern).collect(Collectors.toList()); + .filter( + formatString -> { + FormatNames namedFormat = FormatNames.forName(formatString); + return namedFormat != null && SUPPORTED_NAMED_NUMERIC_FORMATS.contains(namedFormat); + }) + .map(DateFormatter::forPattern) + .collect(Collectors.toList()); } /** * Retrieves a list of custom formats defined by the user. + * * @return a list of formats as strings that can be used to parse a Date/Time/Timestamp. */ public List getAllCustomFormats() { return formats.stream() .filter(format -> FormatNames.forName(format) == null) - .map(format -> { - try { - DateFormatter.forPattern(format); - return format; - } catch (Exception ignored) { - // parsing failed - return null; - } - }) + .map( + format -> { + try { + DateFormatter.forPattern(format); + return format; + } catch (Exception ignored) { + // parsing failed + return null; + } + }) .filter(Objects::nonNull) .collect(Collectors.toList()); } /** * Retrieves a list of custom formatters defined by the user. + * * @return a list of DateFormatters that can be used to parse a Date/Time/Timestamp. */ public List getAllCustomFormatters() { @@ -228,41 +237,50 @@ public List getAllCustomFormatters() { /** * Retrieves a list of named formatters that format for dates. + * * @return a list of DateFormatters that can be used to parse a Date. */ public List getDateNamedFormatters() { return formats.stream() - .filter(formatString -> { - FormatNames namedFormat = FormatNames.forName(formatString); - return namedFormat != null && SUPPORTED_NAMED_DATE_FORMATS.contains(namedFormat); - }) - .map(DateFormatter::forPattern).collect(Collectors.toList()); + .filter( + formatString -> { + FormatNames namedFormat = FormatNames.forName(formatString); + return namedFormat != null && SUPPORTED_NAMED_DATE_FORMATS.contains(namedFormat); + }) + .map(DateFormatter::forPattern) + .collect(Collectors.toList()); } /** * Retrieves a list of named formatters that format for Times. + * * @return a list of DateFormatters that can be used to parse a Time. */ public List getTimeNamedFormatters() { return formats.stream() - .filter(formatString -> { - FormatNames namedFormat = FormatNames.forName(formatString); - return namedFormat != null && SUPPORTED_NAMED_TIME_FORMATS.contains(namedFormat); - }) - .map(DateFormatter::forPattern).collect(Collectors.toList()); + .filter( + formatString -> { + FormatNames namedFormat = FormatNames.forName(formatString); + return namedFormat != null && SUPPORTED_NAMED_TIME_FORMATS.contains(namedFormat); + }) + .map(DateFormatter::forPattern) + .collect(Collectors.toList()); } /** * Retrieves a list of named formatters that format for DateTimes. + * * @return a list of DateFormatters that can be used to parse a DateTime. */ public List getDateTimeNamedFormatters() { return formats.stream() - .filter(formatString -> { - FormatNames namedFormat = FormatNames.forName(formatString); - return namedFormat != null && SUPPORTED_NAMED_DATETIME_FORMATS.contains(namedFormat); - }) - .map(DateFormatter::forPattern).collect(Collectors.toList()); + .filter( + formatString -> { + FormatNames namedFormat = FormatNames.forName(formatString); + return namedFormat != null && SUPPORTED_NAMED_DATETIME_FORMATS.contains(namedFormat); + }) + .map(DateFormatter::forPattern) + .collect(Collectors.toList()); } private ExprCoreType getExprTypeFromCustomFormats(List formats) { @@ -368,6 +386,7 @@ public static boolean isDateTypeCompatible(ExprType exprType) { /** * Create a Date type which has a LinkedHashMap defining all formats. + * * @return A new type object. */ public static OpenSearchDateType of(String format) { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java index 992689a186..21070fa3d6 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.utils; import java.util.Iterator; @@ -12,110 +11,69 @@ /** * Regardless the underling data format, the {@link Content} define the data in abstract manner. - * which could be parsed by ElasticsearchExprValueFactory. - * There are two major use cases: - * 1. Represent the JSON data retrieve from OpenSearch search response. - * 2. Represent the Object data extract from the OpenSearch aggregation response. + * which could be parsed by ElasticsearchExprValueFactory. There are two major use cases: 1. + * Represent the JSON data retrieve from OpenSearch search response. 2. Represent the Object data + * extract from the OpenSearch aggregation response. */ public interface Content { - /** - * Is null value. - */ + /** Is null value. */ boolean isNull(); - /** - * Is number value. - */ + /** Is number value. */ boolean isNumber(); - /** - * Is float value. - */ + /** Is float value. */ boolean isFloat(); - /** - * Is double value. - */ + /** Is double value. */ boolean isDouble(); - /** - * Is long value. - */ + /** Is long value. */ boolean isLong(); - /** - * Is boolean value. - */ + /** Is boolean value. */ boolean isBoolean(); - /** - * Is string value. - */ + /** Is string value. */ boolean isString(); - /** - * Is array value. - */ + /** Is array value. */ boolean isArray(); - /** - * Get integer value. - */ + /** Get integer value. */ Integer intValue(); - /** - * Get long value. - */ + /** Get long value. */ Long longValue(); - /** - * Get short value. - */ + /** Get short value. */ Short shortValue(); - /** - * Get byte value. - */ + /** Get byte value. */ Byte byteValue(); - /** - * Get float value. - */ + /** Get float value. */ Float floatValue(); - /** - * Get double value. - */ + /** Get double value. */ Double doubleValue(); - /** - * Get string value. - */ + /** Get string value. */ String stringValue(); - /** - * Get boolean value. - */ + /** Get boolean value. */ Boolean booleanValue(); - /** - * Get map of {@link Content} value. - */ + /** Get map of {@link Content} value. */ Iterator> map(); - /** - * Get array of {@link Content} value. - */ + /** Get array of {@link Content} value. */ Iterator array(); - /** - * Get geo point value. - */ + /** Get geo point value. */ Pair geoValue(); - /** - * Get {@link Object} value. - */ + /** Get {@link Object} value. */ Object objectValue(); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java index e8875d19ba..fd45ca0d51 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/ObjectContent.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.utils; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -15,17 +14,15 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.tuple.Pair; -/** - * The Implementation of Content to represent {@link Object}. - */ +/** The Implementation of Content to represent {@link Object}. */ @RequiredArgsConstructor public class ObjectContent implements Content { private final Object value; /** - * The parse method parses the value as double value, - * since the key values histogram buckets are defaulted to double. + * The parse method parses the value as double value, since the key values histogram buckets are + * defaulted to double. */ @Override public Integer intValue() { @@ -81,11 +78,14 @@ public Object objectValue() { @SuppressWarnings("unchecked") @Override public Iterator> map() { - return ((Map) value).entrySet().stream() - .map(entry -> (Map.Entry) new AbstractMap.SimpleEntry( - entry.getKey(), - new ObjectContent(entry.getValue()))) - .iterator(); + return ((Map) value) + .entrySet().stream() + .map( + entry -> + (Map.Entry) + new AbstractMap.SimpleEntry( + entry.getKey(), new ObjectContent(entry.getValue()))) + .iterator(); } @SuppressWarnings("unchecked") @@ -140,8 +140,8 @@ public Pair geoValue() { return Pair.of(Double.valueOf(split[0]), Double.valueOf(split[1])); } - private T parseNumberValue(Object value, Function stringTFunction, - Function numberTFunction) { + private T parseNumberValue( + Object value, Function stringTFunction, Function numberTFunction) { if (value instanceof String) { return stringTFunction.apply((String) value); } else { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java index e418832117..1043c1acdc 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.value; import lombok.EqualsAndHashCode; @@ -12,10 +11,9 @@ import org.opensearch.sql.data.type.ExprType; import org.opensearch.sql.opensearch.data.type.OpenSearchBinaryType; - /** - * OpenSearch BinaryValue. - * Todo, add this to avoid the unknown value type exception, the implementation will be changed. + * OpenSearch BinaryValue. Todo, add this to avoid the unknown value type exception, the + * implementation will be changed. */ @EqualsAndHashCode(callSuper = false) public class OpenSearchExprBinaryValue extends AbstractExprValue { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java index 72f7f4a4f2..0de9c898e8 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.value; import java.util.Objects; @@ -14,8 +13,8 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchGeoPointType; /** - * OpenSearch GeoPointValue. - * Todo, add this to avoid the unknown value type exception, the implementation will be changed. + * OpenSearch GeoPointValue. Todo, add this to avoid the unknown value type exception, the + * implementation will be changed. */ public class OpenSearchExprGeoPointValue extends AbstractExprValue { @@ -37,7 +36,8 @@ public ExprType type() { @Override public int compare(ExprValue other) { - return geoPoint.toString() + return geoPoint + .toString() .compareTo((((OpenSearchExprGeoPointValue) other).geoPoint).toString()); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java index 31e5c7f957..21046956d0 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngine.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor; import java.util.ArrayList; @@ -36,8 +35,10 @@ public void execute(PhysicalPlan physicalPlan, ResponseListener l } @Override - public void execute(PhysicalPlan physicalPlan, ExecutionContext context, - ResponseListener listener) { + public void execute( + PhysicalPlan physicalPlan, + ExecutionContext context, + ResponseListener listener) { PhysicalPlan plan = executionProtector.protect(physicalPlan); client.schedule( () -> { @@ -51,8 +52,9 @@ public void execute(PhysicalPlan physicalPlan, ExecutionContext context, result.add(plan.next()); } - QueryResponse response = new QueryResponse(physicalPlan.schema(), result, - planSerializer.convertToCursor(plan)); + QueryResponse response = + new QueryResponse( + physicalPlan.schema(), result, planSerializer.convertToCursor(plan)); listener.onResponse(response); } catch (Exception e) { listener.onFailure(e); @@ -64,21 +66,27 @@ public void execute(PhysicalPlan physicalPlan, ExecutionContext context, @Override public void explain(PhysicalPlan plan, ResponseListener listener) { - client.schedule(() -> { - try { - Explain openSearchExplain = new Explain() { - @Override - public ExplainResponseNode visitTableScan(TableScanOperator node, Object context) { - return explain(node, context, explainNode -> { - explainNode.setDescription(Map.of("request", node.explain())); - }); - } - }; + client.schedule( + () -> { + try { + Explain openSearchExplain = + new Explain() { + @Override + public ExplainResponseNode visitTableScan( + TableScanOperator node, Object context) { + return explain( + node, + context, + explainNode -> { + explainNode.setDescription(Map.of("request", node.explain())); + }); + } + }; - listener.onResponse(openSearchExplain.apply(plan)); - } catch (Exception e) { - listener.onFailure(e); - } - }); + listener.onResponse(openSearchExplain.apply(plan)); + } catch (Exception e) { + listener.onFailure(e); + } + }); } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/ExecutionProtector.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/ExecutionProtector.java index 42c49b44d8..3a11ee99d7 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/ExecutionProtector.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/ExecutionProtector.java @@ -3,19 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor.protector; import org.opensearch.sql.planner.physical.PhysicalPlan; import org.opensearch.sql.planner.physical.PhysicalPlanNodeVisitor; -/** - * Execution Plan Protector. - */ +/** Execution Plan Protector. */ public abstract class ExecutionProtector extends PhysicalPlanNodeVisitor { - /** - * Decorated the PhysicalPlan to run in resource sensitive mode. - */ + /** Decorated the PhysicalPlan to run in resource sensitive mode. */ public abstract PhysicalPlan protect(PhysicalPlan physicalPlan); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtector.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtector.java index 03e2f0c61c..88a5108159 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtector.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtector.java @@ -3,14 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor.protector; import org.opensearch.sql.planner.physical.PhysicalPlan; -/** - * No operation execution protector. - */ +/** No operation execution protector. */ public class NoopExecutionProtector extends ExecutionProtector { @Override diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtector.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtector.java index dff5545785..0905c2f4b4 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtector.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtector.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor.protector; import lombok.RequiredArgsConstructor; @@ -28,15 +27,11 @@ import org.opensearch.sql.planner.physical.WindowOperator; import org.opensearch.sql.storage.TableScanOperator; -/** - * OpenSearch Execution Protector. - */ +/** OpenSearch Execution Protector. */ @RequiredArgsConstructor public class OpenSearchExecutionProtector extends ExecutionProtector { - /** - * OpenSearch resource monitor. - */ + /** OpenSearch resource monitor. */ private final ResourceMonitor resourceMonitor; public PhysicalPlan protect(PhysicalPlan physicalPlan) { @@ -44,8 +39,8 @@ public PhysicalPlan protect(PhysicalPlan physicalPlan) { } /** - * Don't protect {@link CursorCloseOperator} and entire nested tree, because - * {@link CursorCloseOperator} as designed as no-op. + * Don't protect {@link CursorCloseOperator} and entire nested tree, because {@link + * CursorCloseOperator} as designed as no-op. */ @Override public PhysicalPlan visitCursorClose(CursorCloseOperator node, Object context) { @@ -59,14 +54,18 @@ public PhysicalPlan visitFilter(FilterOperator node, Object context) { @Override public PhysicalPlan visitAggregation(AggregationOperator node, Object context) { - return new AggregationOperator(visitInput(node.getInput(), context), node.getAggregatorList(), - node.getGroupByExprList()); + return new AggregationOperator( + visitInput(node.getInput(), context), node.getAggregatorList(), node.getGroupByExprList()); } @Override public PhysicalPlan visitRareTopN(RareTopNOperator node, Object context) { - return new RareTopNOperator(visitInput(node.getInput(), context), node.getCommandType(), - node.getNoOfResults(), node.getFieldExprList(), node.getGroupByExprList()); + return new RareTopNOperator( + visitInput(node.getInput(), context), + node.getCommandType(), + node.getNoOfResults(), + node.getFieldExprList(), + node.getGroupByExprList()); } @Override @@ -74,9 +73,7 @@ public PhysicalPlan visitRename(RenameOperator node, Object context) { return new RenameOperator(visitInput(node.getInput(), context), node.getMapping()); } - /** - * Decorate with {@link ResourceMonitorPlan}. - */ + /** Decorate with {@link ResourceMonitorPlan}. */ @Override public PhysicalPlan visitTableScan(TableScanOperator node, Object context) { return doProtect(node); @@ -84,7 +81,9 @@ public PhysicalPlan visitTableScan(TableScanOperator node, Object context) { @Override public PhysicalPlan visitProject(ProjectOperator node, Object context) { - return new ProjectOperator(visitInput(node.getInput(), context), node.getProjectList(), + return new ProjectOperator( + visitInput(node.getInput(), context), + node.getProjectList(), node.getNamedParseExpressions()); } @@ -102,15 +101,19 @@ public PhysicalPlan visitEval(EvalOperator node, Object context) { public PhysicalPlan visitNested(NestedOperator node, Object context) { return doProtect( new NestedOperator( - visitInput(node.getInput(), context), node.getFields(), node.getGroupedPathsAndFields() - ) - ); + visitInput(node.getInput(), context), + node.getFields(), + node.getGroupedPathsAndFields())); } @Override public PhysicalPlan visitDedupe(DedupeOperator node, Object context) { - return new DedupeOperator(visitInput(node.getInput(), context), node.getDedupeList(), - node.getAllowedDuplication(), node.getKeepEmpty(), node.getConsecutive()); + return new DedupeOperator( + visitInput(node.getInput(), context), + node.getDedupeList(), + node.getAllowedDuplication(), + node.getKeepEmpty(), + node.getConsecutive()); } @Override @@ -121,20 +124,14 @@ public PhysicalPlan visitWindow(WindowOperator node, Object context) { node.getWindowDefinition()); } - /** - * Decorate with {@link ResourceMonitorPlan}. - */ + /** Decorate with {@link ResourceMonitorPlan}. */ @Override public PhysicalPlan visitSort(SortOperator node, Object context) { - return doProtect( - new SortOperator( - visitInput(node.getInput(), context), - node.getSortList())); + return doProtect(new SortOperator(visitInput(node.getInput(), context), node.getSortList())); } /** - * Values are a sequence of rows of literal value in memory - * which doesn't need memory protection. + * Values are a sequence of rows of literal value in memory which doesn't need memory protection. */ @Override public PhysicalPlan visitValues(ValuesOperator node, Object context) { @@ -144,41 +141,38 @@ public PhysicalPlan visitValues(ValuesOperator node, Object context) { @Override public PhysicalPlan visitLimit(LimitOperator node, Object context) { return new LimitOperator( - visitInput(node.getInput(), context), - node.getLimit(), - node.getOffset()); + visitInput(node.getInput(), context), node.getLimit(), node.getOffset()); } @Override public PhysicalPlan visitMLCommons(PhysicalPlan node, Object context) { MLCommonsOperator mlCommonsOperator = (MLCommonsOperator) node; return doProtect( - new MLCommonsOperator(visitInput(mlCommonsOperator.getInput(), context), - mlCommonsOperator.getAlgorithm(), - mlCommonsOperator.getArguments(), - mlCommonsOperator.getNodeClient()) - ); + new MLCommonsOperator( + visitInput(mlCommonsOperator.getInput(), context), + mlCommonsOperator.getAlgorithm(), + mlCommonsOperator.getArguments(), + mlCommonsOperator.getNodeClient())); } @Override public PhysicalPlan visitAD(PhysicalPlan node, Object context) { ADOperator adOperator = (ADOperator) node; return doProtect( - new ADOperator(visitInput(adOperator.getInput(), context), - adOperator.getArguments(), - adOperator.getNodeClient() - ) - ); + new ADOperator( + visitInput(adOperator.getInput(), context), + adOperator.getArguments(), + adOperator.getNodeClient())); } @Override public PhysicalPlan visitML(PhysicalPlan node, Object context) { MLOperator mlOperator = (MLOperator) node; return doProtect( - new MLOperator(visitInput(mlOperator.getInput(), context), - mlOperator.getArguments(), - mlOperator.getNodeClient()) - ); + new MLOperator( + visitInput(mlOperator.getInput(), context), + mlOperator.getArguments(), + mlOperator.getNodeClient())); } PhysicalPlan visitInput(PhysicalPlan node, Object context) { @@ -199,5 +193,4 @@ protected PhysicalPlan doProtect(PhysicalPlan node) { private boolean isProtected(PhysicalPlan node) { return (node instanceof ResourceMonitorPlan); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/mapping/IndexMapping.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/mapping/IndexMapping.java index 2fefd0316f..87aa9d93dd 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/mapping/IndexMapping.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/mapping/IndexMapping.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.mapping; import java.util.Map; @@ -13,25 +12,25 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchDataType; /** - * OpenSearch index mapping. Because there is no specific behavior for different field types, - * string is used to represent field types. + * OpenSearch index mapping. Because there is no specific behavior for different field types, string + * is used to represent field types. */ @ToString public class IndexMapping { /** Field mappings from field name to field type in OpenSearch date type system. */ - @Getter - private final Map fieldMappings; + @Getter private final Map fieldMappings; /** * Maps each column in the index definition to an OpenSearchSQL datatype. + * * @param metaData The metadata retrieved from the index mapping defined by the user. */ @SuppressWarnings("unchecked") public IndexMapping(MappingMetadata metaData) { - this.fieldMappings = OpenSearchDataType.parseMapping( - (Map) metaData.getSourceAsMap().getOrDefault("properties", null) - ); + this.fieldMappings = + OpenSearchDataType.parseMapping( + (Map) metaData.getSourceAsMap().getOrDefault("properties", null)); } /** diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/ADOperator.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/ADOperator.java index 7a0ae7c960..f9c32b7424 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/ADOperator.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/ADOperator.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.planner.physical; import static org.opensearch.sql.utils.MLCommonsConstants.ANOMALY_RATE; @@ -41,65 +40,62 @@ import org.opensearch.sql.planner.physical.PhysicalPlan; import org.opensearch.sql.planner.physical.PhysicalPlanNodeVisitor; -/** - * AD Physical operator to call AD interface to get results for - * algorithm execution. - */ +/** AD Physical operator to call AD interface to get results for algorithm execution. */ @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) public class ADOperator extends MLCommonsOperatorActions { - @Getter - private final PhysicalPlan input; + @Getter private final PhysicalPlan input; - @Getter - private final Map arguments; + @Getter private final Map arguments; - @Getter - private final NodeClient nodeClient; + @Getter private final NodeClient nodeClient; - @EqualsAndHashCode.Exclude - private Iterator iterator; + @EqualsAndHashCode.Exclude private Iterator iterator; private FunctionName rcfType; @Override public void open() { super.open(); - String categoryField = arguments.containsKey(CATEGORY_FIELD) - ? (String) arguments.get(CATEGORY_FIELD).getValue() : null; - List> - inputDataFrames = generateCategorizedInputDataset(input, categoryField); + String categoryField = + arguments.containsKey(CATEGORY_FIELD) + ? (String) arguments.get(CATEGORY_FIELD).getValue() + : null; + List> inputDataFrames = + generateCategorizedInputDataset(input, categoryField); MLAlgoParams mlAlgoParams = convertArgumentToMLParameter(arguments); - List predictionResults = inputDataFrames.stream() - .map(pair -> getMLPredictionResult(rcfType, mlAlgoParams, pair.getRight(), nodeClient)) - .collect(Collectors.toList()); + List predictionResults = + inputDataFrames.stream() + .map(pair -> getMLPredictionResult(rcfType, mlAlgoParams, pair.getRight(), nodeClient)) + .collect(Collectors.toList()); Iterator> inputDataFramesIter = inputDataFrames.iterator(); Iterator predictionResultIter = predictionResults.iterator(); - iterator = new Iterator() { - private DataFrame inputDataFrame = null; - private Iterator inputRowIter = null; - private MLPredictionOutput predictionResult = null; - private Iterator resultRowIter = null; - - @Override - public boolean hasNext() { - return inputRowIter != null && inputRowIter.hasNext() || inputDataFramesIter.hasNext(); - } - - @Override - public ExprValue next() { - if (inputRowIter == null || !inputRowIter.hasNext()) { - inputDataFrame = inputDataFramesIter.next().getLeft(); - inputRowIter = inputDataFrame.iterator(); - predictionResult = predictionResultIter.next(); - resultRowIter = predictionResult.getPredictionResult().iterator(); - } - return buildResult(inputRowIter, inputDataFrame, predictionResult, resultRowIter); - } - }; + iterator = + new Iterator() { + private DataFrame inputDataFrame = null; + private Iterator inputRowIter = null; + private MLPredictionOutput predictionResult = null; + private Iterator resultRowIter = null; + + @Override + public boolean hasNext() { + return inputRowIter != null && inputRowIter.hasNext() || inputDataFramesIter.hasNext(); + } + + @Override + public ExprValue next() { + if (inputRowIter == null || !inputRowIter.hasNext()) { + inputDataFrame = inputDataFramesIter.next().getLeft(); + inputRowIter = inputDataFrame.iterator(); + predictionResult = predictionResultIter.next(); + resultRowIter = predictionResult.getPredictionResult().iterator(); + } + return buildResult(inputRowIter, inputDataFrame, predictionResult, resultRowIter); + } + }; } @Override @@ -126,53 +122,66 @@ protected MLAlgoParams convertArgumentToMLParameter(Map argumen if (arguments.get(TIME_FIELD) == null) { rcfType = FunctionName.BATCH_RCF; return BatchRCFParams.builder() - .numberOfTrees(arguments.containsKey(NUMBER_OF_TREES) - ? ((Integer) arguments.get(NUMBER_OF_TREES).getValue()) - : null) - .sampleSize(arguments.containsKey(SAMPLE_SIZE) - ? ((Integer) arguments.get(SAMPLE_SIZE).getValue()) - : null) - .outputAfter(arguments.containsKey(OUTPUT_AFTER) - ? ((Integer) arguments.get(OUTPUT_AFTER).getValue()) - : null) - .trainingDataSize(arguments.containsKey(TRAINING_DATA_SIZE) - ? ((Integer) arguments.get(TRAINING_DATA_SIZE).getValue()) - : null) - .anomalyScoreThreshold(arguments.containsKey(ANOMALY_SCORE_THRESHOLD) - ? ((Double) arguments.get(ANOMALY_SCORE_THRESHOLD).getValue()) - : null) + .numberOfTrees( + arguments.containsKey(NUMBER_OF_TREES) + ? ((Integer) arguments.get(NUMBER_OF_TREES).getValue()) + : null) + .sampleSize( + arguments.containsKey(SAMPLE_SIZE) + ? ((Integer) arguments.get(SAMPLE_SIZE).getValue()) + : null) + .outputAfter( + arguments.containsKey(OUTPUT_AFTER) + ? ((Integer) arguments.get(OUTPUT_AFTER).getValue()) + : null) + .trainingDataSize( + arguments.containsKey(TRAINING_DATA_SIZE) + ? ((Integer) arguments.get(TRAINING_DATA_SIZE).getValue()) + : null) + .anomalyScoreThreshold( + arguments.containsKey(ANOMALY_SCORE_THRESHOLD) + ? ((Double) arguments.get(ANOMALY_SCORE_THRESHOLD).getValue()) + : null) .build(); } rcfType = FunctionName.FIT_RCF; return FitRCFParams.builder() - .numberOfTrees(arguments.containsKey(NUMBER_OF_TREES) - ? ((Integer) arguments.get(NUMBER_OF_TREES).getValue()) - : null) - .shingleSize(arguments.containsKey(SHINGLE_SIZE) - ? ((Integer) arguments.get(SHINGLE_SIZE).getValue()) - : null) - .sampleSize(arguments.containsKey(SAMPLE_SIZE) - ? ((Integer) arguments.get(SAMPLE_SIZE).getValue()) - : null) - .outputAfter(arguments.containsKey(OUTPUT_AFTER) - ? ((Integer) arguments.get(OUTPUT_AFTER).getValue()) - : null) - .timeDecay(arguments.containsKey(TIME_DECAY) - ? ((Double) arguments.get(TIME_DECAY).getValue()) - : null) - .anomalyRate(arguments.containsKey(ANOMALY_RATE) - ? ((Double) arguments.get(ANOMALY_RATE).getValue()) - : null) - .timeField(arguments.containsKey(TIME_FIELD) - ? ((String) arguments.get(TIME_FIELD).getValue()) - : null) - .dateFormat(arguments.containsKey(DATE_FORMAT) - ? ((String) arguments.get(DATE_FORMAT).getValue()) - : "yyyy-MM-dd HH:mm:ss") - .timeZone(arguments.containsKey(TIME_ZONE) - ? ((String) arguments.get(TIME_ZONE).getValue()) - : null) + .numberOfTrees( + arguments.containsKey(NUMBER_OF_TREES) + ? ((Integer) arguments.get(NUMBER_OF_TREES).getValue()) + : null) + .shingleSize( + arguments.containsKey(SHINGLE_SIZE) + ? ((Integer) arguments.get(SHINGLE_SIZE).getValue()) + : null) + .sampleSize( + arguments.containsKey(SAMPLE_SIZE) + ? ((Integer) arguments.get(SAMPLE_SIZE).getValue()) + : null) + .outputAfter( + arguments.containsKey(OUTPUT_AFTER) + ? ((Integer) arguments.get(OUTPUT_AFTER).getValue()) + : null) + .timeDecay( + arguments.containsKey(TIME_DECAY) + ? ((Double) arguments.get(TIME_DECAY).getValue()) + : null) + .anomalyRate( + arguments.containsKey(ANOMALY_RATE) + ? ((Double) arguments.get(ANOMALY_RATE).getValue()) + : null) + .timeField( + arguments.containsKey(TIME_FIELD) + ? ((String) arguments.get(TIME_FIELD).getValue()) + : null) + .dateFormat( + arguments.containsKey(DATE_FORMAT) + ? ((String) arguments.get(DATE_FORMAT).getValue()) + : "yyyy-MM-dd HH:mm:ss") + .timeZone( + arguments.containsKey(TIME_ZONE) + ? ((String) arguments.get(TIME_ZONE).getValue()) + : null) .build(); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperator.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperator.java index de0c23c4e9..ef60782a24 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperator.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperator.java @@ -30,26 +30,21 @@ import org.opensearch.sql.planner.physical.PhysicalPlanNodeVisitor; /** - * ml-commons Physical operator to call machine learning interface to get results for - * algorithm execution. + * ml-commons Physical operator to call machine learning interface to get results for algorithm + * execution. */ @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) public class MLCommonsOperator extends MLCommonsOperatorActions { - @Getter - private final PhysicalPlan input; + @Getter private final PhysicalPlan input; - @Getter - private final String algorithm; + @Getter private final String algorithm; - @Getter - private final Map arguments; + @Getter private final Map arguments; - @Getter - private final NodeClient nodeClient; + @Getter private final NodeClient nodeClient; - @EqualsAndHashCode.Exclude - private Iterator iterator; + @EqualsAndHashCode.Exclude private Iterator iterator; @Override public void open() { @@ -57,22 +52,26 @@ public void open() { DataFrame inputDataFrame = generateInputDataset(input); MLAlgoParams mlAlgoParams = convertArgumentToMLParameter(arguments, algorithm); MLPredictionOutput predictionResult = - getMLPredictionResult(FunctionName.valueOf(algorithm.toUpperCase()), - mlAlgoParams, inputDataFrame, nodeClient); + getMLPredictionResult( + FunctionName.valueOf(algorithm.toUpperCase()), + mlAlgoParams, + inputDataFrame, + nodeClient); Iterator inputRowIter = inputDataFrame.iterator(); Iterator resultRowIter = predictionResult.getPredictionResult().iterator(); - iterator = new Iterator() { - @Override - public boolean hasNext() { - return inputRowIter.hasNext(); - } - - @Override - public ExprValue next() { - return buildResult(inputRowIter, inputDataFrame, predictionResult, resultRowIter); - } - }; + iterator = + new Iterator() { + @Override + public boolean hasNext() { + return inputRowIter.hasNext(); + } + + @Override + public ExprValue next() { + return buildResult(inputRowIter, inputDataFrame, predictionResult, resultRowIter); + } + }; } @Override @@ -95,30 +94,33 @@ public List getChild() { return Collections.singletonList(input); } - protected MLAlgoParams convertArgumentToMLParameter(Map arguments, - String algorithm) { + protected MLAlgoParams convertArgumentToMLParameter( + Map arguments, String algorithm) { switch (FunctionName.valueOf(algorithm.toUpperCase())) { case KMEANS: return KMeansParams.builder() - .centroids(arguments.containsKey(CENTROIDS) - ? ((Integer) arguments.get(CENTROIDS).getValue()) + .centroids( + arguments.containsKey(CENTROIDS) + ? ((Integer) arguments.get(CENTROIDS).getValue()) + : null) + .iterations( + arguments.containsKey(ITERATIONS) + ? ((Integer) arguments.get(ITERATIONS).getValue()) + : null) + .distanceType( + arguments.containsKey(DISTANCE_TYPE) + ? (arguments.get(DISTANCE_TYPE).getValue() != null + ? KMeansParams.DistanceType.valueOf( + ((String) arguments.get(DISTANCE_TYPE).getValue()).toUpperCase()) : null) - .iterations(arguments.containsKey(ITERATIONS) - ? ((Integer) arguments.get(ITERATIONS).getValue()) - : null) - .distanceType(arguments.containsKey(DISTANCE_TYPE) - ? (arguments.get(DISTANCE_TYPE).getValue() != null - ? KMeansParams.DistanceType.valueOf(( - (String) arguments.get(DISTANCE_TYPE).getValue()).toUpperCase()) - : null) - : null) - .build(); + : null) + .build(); default: // TODO: update available algorithms in the message when adding a new case throw new IllegalArgumentException( - String.format("unsupported algorithm: %s, available algorithms: %s.", + String.format( + "unsupported algorithm: %s, available algorithms: %s.", FunctionName.valueOf(algorithm.toUpperCase()), KMEANS)); } } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorActions.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorActions.java index e1f12fb8a7..ddb0e2d5f4 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorActions.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorActions.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.planner.physical; import static org.opensearch.sql.utils.MLCommonsConstants.MODELID; @@ -48,13 +47,12 @@ import org.opensearch.sql.opensearch.client.MLClient; import org.opensearch.sql.planner.physical.PhysicalPlan; -/** - * Common method actions for ml-commons related operators. - */ +/** Common method actions for ml-commons related operators. */ public abstract class MLCommonsOperatorActions extends PhysicalPlan { /** * generate ml-commons request input dataset. + * * @param input physical input * @return ml-commons dataframe */ @@ -70,33 +68,37 @@ protected DataFrame generateInputDataset(PhysicalPlan input) { /** * Generate ml-commons request input dataset per each category based on a given category field. * Each category value will be a {@link DataFrame} pair, where the left one contains all fields - * for building response, and the right one contains all fields except the aggregated field for - * ml prediction. This is a temporary solution before ml-commons supports 2 dimensional input. + * for building response, and the right one contains all fields except the aggregated field for ml + * prediction. This is a temporary solution before ml-commons supports 2 dimensional input. * * @param input physical input * @param categoryField String, the field should be aggregated on * @return list of ml-commons dataframe pairs */ - protected List> generateCategorizedInputDataset(PhysicalPlan input, - String categoryField) { + protected List> generateCategorizedInputDataset( + PhysicalPlan input, String categoryField) { Map inputMap = new HashMap<>(); while (input.hasNext()) { Map tupleValue = input.next().tupleValue(); ExprValue categoryValue = categoryField == null ? null : tupleValue.get(categoryField); - MLInputRows inputData = - inputMap.computeIfAbsent(categoryValue, k -> new MLInputRows()); + MLInputRows inputData = inputMap.computeIfAbsent(categoryValue, k -> new MLInputRows()); inputData.addTupleValue(tupleValue); } // categoryField should be excluded for ml-commons predictions - return inputMap.values().stream().filter(inputData -> inputData.size() > 0).map( - inputData -> new ImmutablePair<>(inputData.toDataFrame(), - inputData.toFilteredDataFrame(e -> !e.getKey().equals(categoryField)))) + return inputMap.values().stream() + .filter(inputData -> inputData.size() > 0) + .map( + inputData -> + new ImmutablePair<>( + inputData.toDataFrame(), + inputData.toFilteredDataFrame(e -> !e.getKey().equals(categoryField)))) .collect(Collectors.toList()); } /** * covert result schema into ExprValue. + * * @param columnMetas column metas * @param row row * @return a map of result schema in ExprValue format @@ -113,13 +115,15 @@ protected Map convertRowIntoExprValue(ColumnMeta[] columnMeta /** * populate result map by ml-commons supported data type. + * * @param columnValue column value * @param resultKeyName result kay name * @param resultBuilder result builder */ - protected void populateResultBuilder(ColumnValue columnValue, - String resultKeyName, - ImmutableMap.Builder resultBuilder) { + protected void populateResultBuilder( + ColumnValue columnValue, + String resultKeyName, + ImmutableMap.Builder resultBuilder) { switch (columnValue.columnType()) { case INTEGER: resultBuilder.put(resultKeyName, new ExprIntegerValue(columnValue.intValue())); @@ -149,14 +153,14 @@ protected void populateResultBuilder(ColumnValue columnValue, /** * concert result into ExprValue. + * * @param columnMetas column metas * @param row row * @param schema schema * @return a map of result in ExprValue format */ - protected Map convertResultRowIntoExprValue(ColumnMeta[] columnMetas, - Row row, - Map schema) { + protected Map convertResultRowIntoExprValue( + ColumnMeta[] columnMetas, Row row, Map schema) { ImmutableMap.Builder resultBuilder = new ImmutableMap.Builder<>(); for (int i = 0; i < columnMetas.length; i++) { ColumnValue columnValue = row.getValue(i); @@ -167,29 +171,31 @@ protected Map convertResultRowIntoExprValue(ColumnMeta[] colu resultKeyName = resultKeyName + "1"; } populateResultBuilder(columnValue, resultKeyName, resultBuilder); - } return resultBuilder.build(); } /** * iterate result and built it into ExprTupleValue. + * * @param inputRowIter input row iterator * @param inputDataFrame input data frame * @param predictionResult prediction result * @param resultRowIter result row iterator * @return result in ExprTupleValue format */ - protected ExprTupleValue buildResult(Iterator inputRowIter, - DataFrame inputDataFrame, - MLPredictionOutput predictionResult, - Iterator resultRowIter) { + protected ExprTupleValue buildResult( + Iterator inputRowIter, + DataFrame inputDataFrame, + MLPredictionOutput predictionResult, + Iterator resultRowIter) { ImmutableMap.Builder resultSchemaBuilder = new ImmutableMap.Builder<>(); - resultSchemaBuilder.putAll(convertRowIntoExprValue(inputDataFrame.columnMetas(), - inputRowIter.next())); + resultSchemaBuilder.putAll( + convertRowIntoExprValue(inputDataFrame.columnMetas(), inputRowIter.next())); Map resultSchema = resultSchemaBuilder.build(); ImmutableMap.Builder resultBuilder = new ImmutableMap.Builder<>(); - resultBuilder.putAll(convertResultRowIntoExprValue( + resultBuilder.putAll( + convertResultRowIntoExprValue( predictionResult.getPredictionResult().columnMetas(), resultRowIter.next(), resultSchema)); @@ -199,74 +205,73 @@ protected ExprTupleValue buildResult(Iterator inputRowIter, /** * get ml-commons train and predict result. + * * @param functionName ml-commons algorithm name * @param mlAlgoParams ml-commons algorithm parameters * @param inputDataFrame input data frame * @param nodeClient node client * @return ml-commons train and predict result */ - protected MLPredictionOutput getMLPredictionResult(FunctionName functionName, - MLAlgoParams mlAlgoParams, - DataFrame inputDataFrame, - NodeClient nodeClient) { - MLInput mlinput = MLInput.builder() + protected MLPredictionOutput getMLPredictionResult( + FunctionName functionName, + MLAlgoParams mlAlgoParams, + DataFrame inputDataFrame, + NodeClient nodeClient) { + MLInput mlinput = + MLInput.builder() .algorithm(functionName) .parameters(mlAlgoParams) .inputDataset(new DataFrameInputDataset(inputDataFrame)) .build(); - MachineLearningNodeClient machineLearningClient = - MLClient.getMLClient(nodeClient); + MachineLearningNodeClient machineLearningClient = MLClient.getMLClient(nodeClient); - return (MLPredictionOutput) machineLearningClient - .trainAndPredict(mlinput) - .actionGet(30, TimeUnit.SECONDS); + return (MLPredictionOutput) + machineLearningClient.trainAndPredict(mlinput).actionGet(30, TimeUnit.SECONDS); } /** * get ml-commons train, predict and trainandpredict result. + * * @param inputDataFrame input data frame * @param arguments ml parameters * @param nodeClient node client * @return ml-commons result */ - protected MLOutput getMLOutput(DataFrame inputDataFrame, - Map arguments, - NodeClient nodeClient) { - MLInput mlinput = MLInput.builder() + protected MLOutput getMLOutput( + DataFrame inputDataFrame, Map arguments, NodeClient nodeClient) { + MLInput mlinput = + MLInput.builder() .inputDataset(new DataFrameInputDataset(inputDataFrame)) - //Just the placeholders for algorithm and parameters which must be initialized. - //They will be overridden in ml client. + // Just the placeholders for algorithm and parameters which must be initialized. + // They will be overridden in ml client. .algorithm(FunctionName.SAMPLE_ALGO) .parameters(new SampleAlgoParams(0)) .build(); - MachineLearningNodeClient machineLearningClient = - MLClient.getMLClient(nodeClient); + MachineLearningNodeClient machineLearningClient = MLClient.getMLClient(nodeClient); - return machineLearningClient - .run(mlinput, arguments) - .actionGet(30, TimeUnit.SECONDS); + return machineLearningClient.run(mlinput, arguments).actionGet(30, TimeUnit.SECONDS); } /** * iterate result and built it into ExprTupleValue. + * * @param inputRowIter input row iterator * @param inputDataFrame input data frame * @param mlResult train/predict result * @param resultRowIter predict result iterator * @return result in ExprTupleValue format */ - protected ExprTupleValue buildPPLResult(boolean isPredict, - Iterator inputRowIter, - DataFrame inputDataFrame, - MLOutput mlResult, - Iterator resultRowIter) { + protected ExprTupleValue buildPPLResult( + boolean isPredict, + Iterator inputRowIter, + DataFrame inputDataFrame, + MLOutput mlResult, + Iterator resultRowIter) { if (isPredict) { - return buildResult(inputRowIter, - inputDataFrame, - (MLPredictionOutput) mlResult, - resultRowIter); + return buildResult( + inputRowIter, inputDataFrame, (MLPredictionOutput) mlResult, resultRowIter); } else { return buildTrainResult((MLTrainingOutput) mlResult); } @@ -284,18 +289,21 @@ protected ExprTupleValue buildTrainResult(MLTrainingOutput trainResult) { private static class MLInputRows extends LinkedList> { /** * Add tuple value to input map, skip if any value is null. + * * @param tupleValue a row in input data. */ public void addTupleValue(Map tupleValue) { if (tupleValue.values().stream().anyMatch(e -> e.isNull() || e.isMissing())) { return; } - this.add(tupleValue.entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().value()))); + this.add( + tupleValue.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().value()))); } /** * Convert to DataFrame. + * * @return DataFrame */ public DataFrame toDataFrame() { @@ -304,15 +312,19 @@ public DataFrame toDataFrame() { /** * Filter each row and convert to DataFrame. + * * @param filter used to filter fields in each row * @return DataFrame */ public DataFrame toFilteredDataFrame(Predicate> filter) { - return DataFrameBuilder.load(this.stream().map( - row -> row.entrySet().stream().filter(filter) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))) - .collect(Collectors.toList())); + return DataFrameBuilder.load( + this.stream() + .map( + row -> + row.entrySet().stream() + .filter(filter) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))) + .collect(Collectors.toList())); } } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLOperator.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLOperator.java index 36834bc23a..6dc7078a0d 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLOperator.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/planner/physical/MLOperator.java @@ -25,23 +25,19 @@ import org.opensearch.sql.planner.physical.PhysicalPlanNodeVisitor; /** - * ml-commons Physical operator to call machine learning interface to get results for - * algorithm execution. + * ml-commons Physical operator to call machine learning interface to get results for algorithm + * execution. */ @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) public class MLOperator extends MLCommonsOperatorActions { - @Getter - private final PhysicalPlan input; + @Getter private final PhysicalPlan input; - @Getter - private final Map arguments; + @Getter private final Map arguments; - @Getter - private final NodeClient nodeClient; + @Getter private final NodeClient nodeClient; - @EqualsAndHashCode.Exclude - private Iterator iterator; + @EqualsAndHashCode.Exclude private Iterator iterator; @Override public void open() { @@ -53,34 +49,36 @@ public void open() { final Iterator inputRowIter = inputDataFrame.iterator(); // Only need to check train here, as action should be already checked in ml client. final boolean isPrediction = ((String) args.get("action")).equals("train") ? false : true; - //For train, only one row to return. - final Iterator trainIter = new ArrayList() { - { - add("train"); - } - }.iterator(); - final Iterator resultRowIter = isPrediction - ? ((MLPredictionOutput) mlOutput).getPredictionResult().iterator() - : null; - iterator = new Iterator() { - @Override - public boolean hasNext() { - if (isPrediction) { - return inputRowIter.hasNext(); - } else { - boolean res = trainIter.hasNext(); - if (res) { - trainIter.next(); + // For train, only one row to return. + final Iterator trainIter = + new ArrayList() { + { + add("train"); + } + }.iterator(); + final Iterator resultRowIter = + isPrediction ? ((MLPredictionOutput) mlOutput).getPredictionResult().iterator() : null; + iterator = + new Iterator() { + @Override + public boolean hasNext() { + if (isPrediction) { + return inputRowIter.hasNext(); + } else { + boolean res = trainIter.hasNext(); + if (res) { + trainIter.next(); + } + return res; + } } - return res; - } - } - @Override - public ExprValue next() { - return buildPPLResult(isPrediction, inputRowIter, inputDataFrame, mlOutput, resultRowIter); - } - }; + @Override + public ExprValue next() { + return buildPPLResult( + isPrediction, inputRowIter, inputDataFrame, mlOutput, resultRowIter); + } + }; } @Override diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequest.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequest.java index 6e85dc00cc..e7685394f4 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequest.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.request.system; import static org.opensearch.sql.data.model.ExprValueUtils.stringValue; @@ -18,9 +17,7 @@ import org.opensearch.sql.data.model.ExprValue; import org.opensearch.sql.opensearch.client.OpenSearchClient; -/** - * Cat indices request. - */ +/** Cat indices request. */ @RequiredArgsConstructor public class OpenSearchCatIndicesRequest implements OpenSearchSystemRequest { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java index f4fd7b98d3..c4ac270547 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.request.system; import static org.opensearch.sql.data.model.ExprValueUtils.integerValue; @@ -23,9 +22,7 @@ import org.opensearch.sql.opensearch.mapping.IndexMapping; import org.opensearch.sql.opensearch.request.OpenSearchRequest; -/** - * Describe index meta data request. - */ +/** Describe index meta data request. */ public class OpenSearchDescribeIndexRequest implements OpenSearchSystemRequest { private static final String DEFAULT_TABLE_CAT = "opensearch"; @@ -36,22 +33,18 @@ public class OpenSearchDescribeIndexRequest implements OpenSearchSystemRequest { private static final String DEFAULT_IS_AUTOINCREMENT = "NO"; - /** - * OpenSearch client connection. - */ + /** OpenSearch client connection. */ private final OpenSearchClient client; - /** - * {@link OpenSearchRequest.IndexName}. - */ + /** {@link OpenSearchRequest.IndexName}. */ private final OpenSearchRequest.IndexName indexName; public OpenSearchDescribeIndexRequest(OpenSearchClient client, String indexName) { this(client, new OpenSearchRequest.IndexName(indexName)); } - public OpenSearchDescribeIndexRequest(OpenSearchClient client, - OpenSearchRequest.IndexName indexName) { + public OpenSearchDescribeIndexRequest( + OpenSearchClient client, OpenSearchRequest.IndexName indexName) { this.client = client; this.indexName = indexName; } @@ -66,10 +59,13 @@ public List search() { List results = new ArrayList<>(); Map meta = client.meta(); int pos = 0; - for (Map.Entry entry - : OpenSearchDataType.traverseAndFlatten(getFieldTypes()).entrySet()) { + for (Map.Entry entry : + OpenSearchDataType.traverseAndFlatten(getFieldTypes()).entrySet()) { results.add( - row(entry.getKey(), entry.getValue().legacyTypeName().toLowerCase(), pos++, + row( + entry.getKey(), + entry.getValue().legacyTypeName().toLowerCase(), + pos++, clusterName(meta))); } return results; @@ -97,8 +93,12 @@ public Map getFieldTypes() { * @return max result window */ public Integer getMaxResultWindow() { - return client.getIndexMaxResultWindows(getLocalIndexNames(indexName.getIndexNames())) - .values().stream().min(Integer::compare).get(); + return client + .getIndexMaxResultWindows(getLocalIndexNames(indexName.getIndexNames())) + .values() + .stream() + .min(Integer::compare) + .get(); } private ExprTupleValue row(String fieldName, String fieldType, int position, String clusterName) { @@ -122,8 +122,8 @@ private ExprTupleValue row(String fieldName, String fieldType, int position, Str } /** - * Return index names without "{cluster}:" prefix. - * Without the prefix, they refer to the indices at the local cluster. + * Return index names without "{cluster}:" prefix. Without the prefix, they refer to the indices + * at the local cluster. * * @param indexNames a string array of index names * @return local cluster index names @@ -140,8 +140,6 @@ private String clusterName(Map meta) { @Override public String toString() { - return "OpenSearchDescribeIndexRequest{" - + "indexName='" + indexName + '\'' - + '}'; + return "OpenSearchDescribeIndexRequest{" + "indexName='" + indexName + '\'' + '}'; } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/CompositeAggregationParser.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/CompositeAggregationParser.java index 7459300caa..581f708f22 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/CompositeAggregationParser.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/CompositeAggregationParser.java @@ -22,9 +22,7 @@ import org.opensearch.search.aggregations.Aggregations; import org.opensearch.search.aggregations.bucket.composite.CompositeAggregation; -/** - * Composite Aggregation Parser which include composite aggregation and metric parsers. - */ +/** Composite Aggregation Parser which include composite aggregation and metric parsers. */ @EqualsAndHashCode public class CompositeAggregationParser implements OpenSearchAggregationResponseParser { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/FilterParser.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/FilterParser.java index 8358379be0..406f279784 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/FilterParser.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/FilterParser.java @@ -21,9 +21,8 @@ import org.opensearch.search.aggregations.bucket.filter.Filter; /** - * {@link Filter} Parser. - * The current use case is filter aggregation, e.g. avg(age) filter(balance>0). The filter parser - * do nothing and return the result from metricsParser. + * {@link Filter} Parser. The current use case is filter aggregation, e.g. avg(age) + * filter(balance>0). The filter parser do nothing and return the result from metricsParser. */ @Builder @EqualsAndHashCode diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParser.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParser.java index 15f05e5b05..0f8f8e284b 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParser.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParser.java @@ -16,14 +16,10 @@ import java.util.Map; import org.opensearch.search.aggregations.Aggregation; -/** - * Metric Aggregation Parser. - */ +/** Metric Aggregation Parser. */ public interface MetricParser { - /** - * Get the name of metric parser. - */ + /** Get the name of metric parser. */ String getName(); /** diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java index d5c0141ad2..0d1f770470 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java @@ -23,9 +23,7 @@ import org.opensearch.search.aggregations.Aggregations; import org.opensearch.sql.common.utils.StringUtils; -/** - * Parse multiple metrics in one bucket. - */ +/** Parse multiple metrics in one bucket. */ @EqualsAndHashCode @RequiredArgsConstructor public class MetricParserHelper { @@ -49,8 +47,9 @@ public Map parse(Aggregations aggregations) { if (metricParserMap.containsKey(aggregation.getName())) { resultMap.putAll(metricParserMap.get(aggregation.getName()).parse(aggregation)); } else { - throw new RuntimeException(StringUtils.format("couldn't parse field %s in aggregation " - + "response", aggregation.getName())); + throw new RuntimeException( + StringUtils.format( + "couldn't parse field %s in aggregation " + "response", aggregation.getName())); } } return resultMap; diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/NoBucketAggregationParser.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/NoBucketAggregationParser.java index 5756003523..de0ee5883c 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/NoBucketAggregationParser.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/NoBucketAggregationParser.java @@ -19,9 +19,7 @@ import java.util.Map; import org.opensearch.search.aggregations.Aggregations; -/** - * No Bucket Aggregation Parser which include only metric parsers. - */ +/** No Bucket Aggregation Parser which include only metric parsers. */ public class NoBucketAggregationParser implements OpenSearchAggregationResponseParser { private final MetricParserHelper metricsParser; diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/OpenSearchAggregationResponseParser.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/OpenSearchAggregationResponseParser.java index 3a19747ef3..0c15d72eb6 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/OpenSearchAggregationResponseParser.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/OpenSearchAggregationResponseParser.java @@ -17,13 +17,12 @@ import java.util.Map; import org.opensearch.search.aggregations.Aggregations; -/** - * OpenSearch Aggregation Response Parser. - */ +/** OpenSearch Aggregation Response Parser. */ public interface OpenSearchAggregationResponseParser { /** * Parse the OpenSearch Aggregation Response. + * * @param aggregations Aggregations. * @return aggregation result. */ diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessage.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessage.java index f828c2c485..bbcacc1d2c 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessage.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessage.java @@ -3,34 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import lombok.Getter; import org.json.JSONObject; import org.opensearch.core.rest.RestStatus; -/** - * Error Message. - */ +/** Error Message. */ public class ErrorMessage { protected Throwable exception; private final int status; - @Getter - private final String type; + @Getter private final String type; - @Getter - private final String reason; + @Getter private final String reason; - @Getter - private final String details; + @Getter private final String details; - /** - * Error Message Constructor. - */ + /** Error Message Constructor. */ public ErrorMessage(Throwable exception, int status) { this.exception = exception; this.status = status; diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactory.java index 204c6a8b93..901bfc30c8 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactory.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import lombok.experimental.UtilityClass; @@ -12,11 +11,11 @@ @UtilityClass public class ErrorMessageFactory { /** - * Create error message based on the exception type. - * Exceptions of OpenSearch exception type and exceptions with wrapped OpenSearch exception causes - * should create {@link OpenSearchErrorMessage} + * Create error message based on the exception type. Exceptions of OpenSearch exception type and + * exceptions with wrapped OpenSearch exception causes should create {@link + * OpenSearchErrorMessage} * - * @param e exception to create error message + * @param e exception to create error message * @param status exception status code * @return error message */ diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessage.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessage.java index a90c52922e..87a374d353 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessage.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessage.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import java.util.Locale; @@ -11,9 +10,7 @@ import org.opensearch.action.search.SearchPhaseExecutionException; import org.opensearch.action.search.ShardSearchFailure; -/** - * OpenSearch Error Message. - */ +/** OpenSearch Error Message. */ public class OpenSearchErrorMessage extends ErrorMessage { OpenSearchErrorMessage(OpenSearchException exception, int status) { @@ -45,21 +42,21 @@ protected String fetchDetails() { } /** - * Could not deliver the exactly same error messages due to the limit of JDBC types. - * Currently our cases occurred only SearchPhaseExecutionException instances - * among all types of OpenSearch exceptions - * according to the survey, see all types: OpenSearchException.OpenSearchExceptionHandle. - * Either add methods of fetching details for different types, or re-make a consistent - * message by not giving - * detailed messages/root causes but only a suggestion message. + * Could not deliver the exactly same error messages due to the limit of JDBC types. Currently our + * cases occurred only SearchPhaseExecutionException instances among all types of OpenSearch + * exceptions according to the survey, see all types: + * OpenSearchException.OpenSearchExceptionHandle. Either add methods of fetching details for + * different types, or re-make a consistent message by not giving detailed messages/root causes + * but only a suggestion message. */ private String fetchSearchPhaseExecutionExceptionDetails( SearchPhaseExecutionException exception) { StringBuilder details = new StringBuilder(); ShardSearchFailure[] shardFailures = exception.shardFailures(); for (ShardSearchFailure failure : shardFailures) { - details.append(String.format(Locale.ROOT, "Shard[%d]: %s\n", failure.shardId(), - failure.getCause().toString())); + details.append( + String.format( + Locale.ROOT, "Shard[%d]: %s\n", failure.shardId(), failure.getCause().toString())); } return details.toString(); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/setting/LegacyOpenDistroSettings.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/setting/LegacyOpenDistroSettings.java index 3eadea482b..f20551b89d 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/setting/LegacyOpenDistroSettings.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/setting/LegacyOpenDistroSettings.java @@ -18,102 +18,108 @@ @UtilityClass public class LegacyOpenDistroSettings { - public static final Setting SQL_ENABLED_SETTING = Setting.boolSetting( - LegacySettings.Key.SQL_ENABLED.getKeyValue(), - true, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting SQL_QUERY_SLOWLOG_SETTING = Setting.intSetting( - LegacySettings.Key.SQL_QUERY_SLOWLOG.getKeyValue(), - 2, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting SQL_CURSOR_KEEPALIVE_SETTING = Setting.positiveTimeSetting( - LegacySettings.Key.SQL_CURSOR_KEEPALIVE.getKeyValue(), - timeValueMinutes(1), - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting METRICS_ROLLING_WINDOW_SETTING = Setting.longSetting( - LegacySettings.Key.METRICS_ROLLING_WINDOW.getKeyValue(), - 3600L, - 2L, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting METRICS_ROLLING_INTERVAL_SETTING = Setting.longSetting( - LegacySettings.Key.METRICS_ROLLING_INTERVAL.getKeyValue(), - 60L, - 1L, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting PPL_ENABLED_SETTING = Setting.boolSetting( - LegacySettings.Key.PPL_ENABLED.getKeyValue(), - true, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting - PPL_QUERY_MEMORY_LIMIT_SETTING = Setting.memorySizeSetting( - LegacySettings.Key.PPL_QUERY_MEMORY_LIMIT.getKeyValue(), - "85%", - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); - - public static final Setting QUERY_SIZE_LIMIT_SETTING = Setting.intSetting( - LegacySettings.Key.QUERY_SIZE_LIMIT.getKeyValue(), - 200, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); + public static final Setting SQL_ENABLED_SETTING = + Setting.boolSetting( + LegacySettings.Key.SQL_ENABLED.getKeyValue(), + true, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); - /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the new engine is always enabled. - */ - public static final Setting SQL_NEW_ENGINE_ENABLED_SETTING = Setting.boolSetting( - LegacySettings.Key.SQL_NEW_ENGINE_ENABLED.getKeyValue(), - true, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); + public static final Setting SQL_QUERY_SLOWLOG_SETTING = + Setting.intSetting( + LegacySettings.Key.SQL_QUERY_SLOWLOG.getKeyValue(), + 2, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting SQL_CURSOR_KEEPALIVE_SETTING = + Setting.positiveTimeSetting( + LegacySettings.Key.SQL_CURSOR_KEEPALIVE.getKeyValue(), + timeValueMinutes(1), + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting METRICS_ROLLING_WINDOW_SETTING = + Setting.longSetting( + LegacySettings.Key.METRICS_ROLLING_WINDOW.getKeyValue(), + 3600L, + 2L, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting METRICS_ROLLING_INTERVAL_SETTING = + Setting.longSetting( + LegacySettings.Key.METRICS_ROLLING_INTERVAL.getKeyValue(), + 60L, + 1L, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting PPL_ENABLED_SETTING = + Setting.boolSetting( + LegacySettings.Key.PPL_ENABLED.getKeyValue(), + true, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting PPL_QUERY_MEMORY_LIMIT_SETTING = + Setting.memorySizeSetting( + LegacySettings.Key.PPL_QUERY_MEMORY_LIMIT.getKeyValue(), + "85%", + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + public static final Setting QUERY_SIZE_LIMIT_SETTING = + Setting.intSetting( + LegacySettings.Key.QUERY_SIZE_LIMIT.getKeyValue(), + 200, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); + + /** Deprecated and will be removed then. From OpenSearch 1.0, the new engine is always enabled. */ + public static final Setting SQL_NEW_ENGINE_ENABLED_SETTING = + Setting.boolSetting( + LegacySettings.Key.SQL_NEW_ENGINE_ENABLED.getKeyValue(), + true, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the query analysis in legacy engine is disabled. + * Deprecated and will be removed then. From OpenSearch 1.0, the query analysis in legacy engine + * is disabled. */ - public static final Setting QUERY_ANALYSIS_ENABLED_SETTING = Setting.boolSetting( - LegacySettings.Key.QUERY_ANALYSIS_ENABLED.getKeyValue(), - false, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); + public static final Setting QUERY_ANALYSIS_ENABLED_SETTING = + Setting.boolSetting( + LegacySettings.Key.QUERY_ANALYSIS_ENABLED.getKeyValue(), + false, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the query analysis suggestion in legacy engine is disabled. + * Deprecated and will be removed then. From OpenSearch 1.0, the query analysis suggestion in + * legacy engine is disabled. */ public static final Setting QUERY_ANALYSIS_SEMANTIC_SUGGESTION_SETTING = Setting.boolSetting( - LegacySettings.Key.QUERY_ANALYSIS_SEMANTIC_SUGGESTION.getKeyValue(), - false, - Setting.Property.NodeScope, - Setting.Property.Dynamic, - Setting.Property.Deprecated); + LegacySettings.Key.QUERY_ANALYSIS_SEMANTIC_SUGGESTION.getKeyValue(), + false, + Setting.Property.NodeScope, + Setting.Property.Dynamic, + Setting.Property.Deprecated); /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the query analysis threshold in legacy engine is disabled. + * Deprecated and will be removed then. From OpenSearch 1.0, the query analysis threshold in + * legacy engine is disabled. */ public static final Setting QUERY_ANALYSIS_SEMANTIC_THRESHOLD_SETTING = Setting.intSetting( @@ -124,8 +130,8 @@ public class LegacyOpenDistroSettings { Setting.Property.Deprecated); /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the query response format is default to JDBC format. + * Deprecated and will be removed then. From OpenSearch 1.0, the query response format is default + * to JDBC format. */ public static final Setting QUERY_RESPONSE_FORMAT_SETTING = Setting.simpleString( @@ -136,8 +142,8 @@ public class LegacyOpenDistroSettings { Setting.Property.Deprecated); /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the cursor feature is enabled by default. + * Deprecated and will be removed then. From OpenSearch 1.0, the cursor feature is enabled by + * default. */ public static final Setting SQL_CURSOR_ENABLED_SETTING = Setting.boolSetting( @@ -146,10 +152,10 @@ public class LegacyOpenDistroSettings { Setting.Property.NodeScope, Setting.Property.Dynamic, Setting.Property.Deprecated); + /** - * Deprecated and will be removed then. - * From OpenSearch 1.0, the fetch_size in query body will decide whether create the cursor - * context. No cursor will be created if the fetch_size = 0. + * Deprecated and will be removed then. From OpenSearch 1.0, the fetch_size in query body will + * decide whether create the cursor context. No cursor will be created if the fetch_size = 0. */ public static final Setting SQL_CURSOR_FETCH_SIZE_SETTING = Setting.intSetting( @@ -159,9 +165,7 @@ public class LegacyOpenDistroSettings { Setting.Property.Dynamic, Setting.Property.Deprecated); - /** - * Used by Plugin to init Setting. - */ + /** Used by Plugin to init Setting. */ public static List> legacySettings() { return new ImmutableList.Builder>() .add(SQL_ENABLED_SETTING) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/OpenSearchDataSourceFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/OpenSearchDataSourceFactory.java index 011f6236fb..b30d460c00 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/OpenSearchDataSourceFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/OpenSearchDataSourceFactory.java @@ -28,7 +28,9 @@ public DataSourceType getDataSourceType() { @Override public DataSource createDataSource(DataSourceMetadata metadata) { - return new DataSource(metadata.getName(), DataSourceType.OPENSEARCH, + return new DataSource( + metadata.getName(), + DataSourceType.OPENSEARCH, new OpenSearchStorageEngine(client, settings)); } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngine.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngine.java index 855aae645d..167bf88f30 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngine.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngine.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script; import com.google.common.collect.ImmutableMap; @@ -21,29 +20,23 @@ import org.opensearch.sql.opensearch.storage.serialization.ExpressionSerializer; /** - * Custom expression script engine that supports using core engine expression code in DSL - * as a new script language just like built-in Painless language. + * Custom expression script engine that supports using core engine expression code in DSL as a new + * script language just like built-in Painless language. */ @RequiredArgsConstructor public class ExpressionScriptEngine implements ScriptEngine { - /** - * Expression script language name. - */ + /** Expression script language name. */ public static final String EXPRESSION_LANG_NAME = "opensearch_query_expression"; - /** - * All supported script contexts and function to create factory from expression. - */ + /** All supported script contexts and function to create factory from expression. */ private static final Map, Function> CONTEXTS = new ImmutableMap.Builder, Function>() .put(FilterScript.CONTEXT, ExpressionFilterScriptFactory::new) .put(AggregationScript.CONTEXT, ExpressionAggregationScriptFactory::new) .build(); - /** - * Expression serializer that (de-)serializes expression. - */ + /** Expression serializer that (de-)serializes expression. */ private final ExpressionSerializer serializer; @Override @@ -52,10 +45,8 @@ public String getType() { } @Override - public T compile(String scriptName, - String scriptCode, - ScriptContext context, - Map params) { + public T compile( + String scriptName, String scriptCode, ScriptContext context, Map params) { /* * Note that in fact the expression source is already compiled in query engine. * The "code" is actually a serialized expression tree by our serializer. @@ -66,13 +57,15 @@ public T compile(String scriptName, if (CONTEXTS.containsKey(context)) { return context.factoryClazz.cast(CONTEXTS.get(context).apply(expression)); } - throw new IllegalStateException(String.format("Script context is currently not supported: " - + "all supported contexts [%s], given context [%s] ", CONTEXTS, context)); + throw new IllegalStateException( + String.format( + "Script context is currently not supported: " + + "all supported contexts [%s], given context [%s] ", + CONTEXTS, context)); } @Override public Set> getSupportedContexts() { return CONTEXTS.keySet(); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilder.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilder.java index 8b1cb08cfa..a218151b2e 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilder.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import com.google.common.annotations.VisibleForTesting; @@ -39,32 +38,23 @@ import org.opensearch.sql.opensearch.storage.serialization.ExpressionSerializer; /** - * Build the AggregationBuilder from the list of {@link NamedAggregator} - * and list of {@link NamedExpression}. + * Build the AggregationBuilder from the list of {@link NamedAggregator} and list of {@link + * NamedExpression}. */ @RequiredArgsConstructor public class AggregationQueryBuilder extends ExpressionNodeVisitor { - /** - * How many composite buckets should be returned. - */ + /** How many composite buckets should be returned. */ public static final int AGGREGATION_BUCKET_SIZE = 1000; - /** - * Bucket Aggregation builder. - */ + /** Bucket Aggregation builder. */ private final BucketAggregationBuilder bucketBuilder; - /** - * Metric Aggregation builder. - */ + /** Metric Aggregation builder. */ private final MetricAggregationBuilder metricBuilder; - /** - * Aggregation Query Builder Constructor. - */ - public AggregationQueryBuilder( - ExpressionSerializer serializer) { + /** Aggregation Query Builder Constructor. */ + public AggregationQueryBuilder(ExpressionSerializer serializer) { this.bucketBuilder = new BucketAggregationBuilder(serializer); this.metricBuilder = new MetricAggregationBuilder(serializer); } @@ -93,7 +83,10 @@ public AggregationQueryBuilder( bucketBuilder.build( groupByList.stream() .sorted(groupSortOrder) - .map(expr -> Triple.of(expr, + .map( + expr -> + Triple.of( + expr, groupSortOrder.sortOrder(expr), groupSortOrder.missingOrder(expr))) .collect(Collectors.toList()))) @@ -103,72 +96,62 @@ public AggregationQueryBuilder( } } - /** - * Build mapping for OpenSearchExprValueFactory. - */ + /** Build mapping for OpenSearchExprValueFactory. */ public Map buildTypeMapping( - List namedAggregatorList, - List groupByList) { + List namedAggregatorList, List groupByList) { ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); - namedAggregatorList.forEach(agg -> builder.put(agg.getName(), - OpenSearchDataType.of(agg.type()))); - groupByList.forEach(group -> builder.put(group.getNameOrAlias(), - OpenSearchDataType.of(group.type()))); + namedAggregatorList.forEach( + agg -> builder.put(agg.getName(), OpenSearchDataType.of(agg.type()))); + groupByList.forEach( + group -> builder.put(group.getNameOrAlias(), OpenSearchDataType.of(group.type()))); return builder.build(); } - /** - * Group By field sort order. - */ + /** Group By field sort order. */ @VisibleForTesting public static class GroupSortOrder implements Comparator { /** - * The default order of group field. - * The order is ASC NULL_FIRST. - * The field should be the last one in the group list. + * The default order of group field. The order is ASC NULL_FIRST. The field should be the last + * one in the group list. */ private static final Pair DEFAULT_ORDER = Pair.of(Sort.SortOption.DEFAULT_ASC, Integer.MAX_VALUE); - /** - * The mapping between {@link Sort.SortOrder} and {@link SortOrder}. - */ + /** The mapping between {@link Sort.SortOrder} and {@link SortOrder}. */ private static final Map SORT_MAP = new ImmutableMap.Builder() .put(Sort.SortOrder.ASC, SortOrder.ASC) - .put(Sort.SortOrder.DESC, SortOrder.DESC).build(); + .put(Sort.SortOrder.DESC, SortOrder.DESC) + .build(); - /** - * The mapping between {@link Sort.NullOrder} and {@link MissingOrder}. - */ + /** The mapping between {@link Sort.NullOrder} and {@link MissingOrder}. */ private static final Map NULL_MAP = new ImmutableMap.Builder() .put(Sort.NullOrder.NULL_FIRST, MissingOrder.FIRST) - .put(Sort.NullOrder.NULL_LAST, MissingOrder.LAST).build(); + .put(Sort.NullOrder.NULL_LAST, MissingOrder.LAST) + .build(); private final Map> map = new HashMap<>(); - /** - * Constructor of GroupSortOrder. - */ + /** Constructor of GroupSortOrder. */ public GroupSortOrder(List> sortList) { if (null == sortList) { return; } int pos = 0; for (Pair sortPair : sortList) { - map.put(((ReferenceExpression) sortPair.getRight()).getAttr(), + map.put( + ((ReferenceExpression) sortPair.getRight()).getAttr(), Pair.of(sortPair.getLeft(), pos++)); } } /** - * Compare the two expressions. The comparison is based on the pos in the sort list. - * If the expression is defined in the sort list. then the order of the expression is the pos - * in sort list. - * If the expression isn't defined in the sort list. the the order of the expression is the - * Integer.MAX_VALUE. you can think it is at the end of the sort list. + * Compare the two expressions. The comparison is based on the pos in the sort list. If the + * expression is defined in the sort list. then the order of the expression is the pos in sort + * list. If the expression isn't defined in the sort list. the the order of the expression is + * the Integer.MAX_VALUE. you can think it is at the end of the sort list. * * @param o1 NamedExpression * @param o2 NamedExpression @@ -176,24 +159,19 @@ public GroupSortOrder(List> sortList) { */ @Override public int compare(NamedExpression o1, NamedExpression o2) { - final Pair o1Value = - map.getOrDefault(o1.getName(), DEFAULT_ORDER); - final Pair o2Value = - map.getOrDefault(o2.getName(), DEFAULT_ORDER); + final Pair o1Value = map.getOrDefault(o1.getName(), DEFAULT_ORDER); + final Pair o2Value = map.getOrDefault(o2.getName(), DEFAULT_ORDER); return o1Value.getRight().compareTo(o2Value.getRight()); } - /** - * Get the {@link SortOrder} for expression. - * By default, the {@link SortOrder} is ASC. - */ + /** Get the {@link SortOrder} for expression. By default, the {@link SortOrder} is ASC. */ public SortOrder sortOrder(NamedExpression expression) { return SORT_MAP.get(sortOption(expression).getSortOrder()); } /** - * Get the {@link MissingOrder} for expression. - * By default, the {@link MissingOrder} is ASC missing first / DESC missing last. + * Get the {@link MissingOrder} for expression. By default, the {@link MissingOrder} is ASC + * missing first / DESC missing last. */ public MissingOrder missingOrder(NamedExpression expression) { return NULL_MAP.get(sortOption(expression).getNullOrder()); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScript.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScript.java index 2871bd4a97..7e7b2e959a 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScript.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScript.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import static java.time.temporal.ChronoUnit.MILLIS; @@ -22,20 +21,14 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchDataType; import org.opensearch.sql.opensearch.storage.script.core.ExpressionScript; -/** - * Aggregation expression script that executed on each document. - */ +/** Aggregation expression script that executed on each document. */ @EqualsAndHashCode(callSuper = false) public class ExpressionAggregationScript extends AggregationScript { - /** - * Expression Script. - */ + /** Expression Script. */ private final ExpressionScript expressionScript; - /** - * Constructor of ExpressionAggregationScript. - */ + /** Constructor of ExpressionAggregationScript. */ public ExpressionAggregationScript( Expression expression, SearchLookup lookup, @@ -51,7 +44,7 @@ public Object execute() { if (expr.type() instanceof OpenSearchDataType) { return expr.value(); } - switch ((ExprCoreType)expr.type()) { + switch ((ExprCoreType) expr.type()) { case TIME: // Can't get timestamp from `ExprTimeValue` return MILLIS.between(LocalTime.MIN, expr.timeValue()); @@ -64,8 +57,8 @@ public Object execute() { } } - private ExprValue evaluateExpression(Expression expression, Environment valueEnv) { + private ExprValue evaluateExpression( + Expression expression, Environment valueEnv) { ExprValue result = expression.valueOf(valueEnv); // The missing value is treated as null value in doc_value, so we can't distinguish with them. diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactory.java index 3138ee90fc..c0b92e5438 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactory.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import java.util.Map; @@ -12,9 +11,7 @@ import org.opensearch.search.lookup.SearchLookup; import org.opensearch.sql.expression.Expression; -/** - * Aggregation Expression script factory that generates leaf factory. - */ +/** Aggregation Expression script factory that generates leaf factory. */ @EqualsAndHashCode public class ExpressionAggregationScriptFactory implements AggregationScript.Factory { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptLeafFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptLeafFactory.java index 7d22f724e3..13f9c95c8f 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptLeafFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptLeafFactory.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import java.util.Map; @@ -12,29 +11,19 @@ import org.opensearch.search.lookup.SearchLookup; import org.opensearch.sql.expression.Expression; -/** - * Expression script leaf factory that produces script executor for each leaf. - */ +/** Expression script leaf factory that produces script executor for each leaf. */ public class ExpressionAggregationScriptLeafFactory implements AggregationScript.LeafFactory { - /** - * Expression to execute. - */ + /** Expression to execute. */ private final Expression expression; - /** - * Expression to execute. - */ + /** Expression to execute. */ private final Map params; - /** - * Expression to execute. - */ + /** Expression to execute. */ private final SearchLookup lookup; - /** - * Constructor of ExpressionAggregationScriptLeafFactory. - */ + /** Constructor of ExpressionAggregationScriptLeafFactory. */ public ExpressionAggregationScriptLeafFactory( Expression expression, Map params, SearchLookup lookup) { this.expression = expression; diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/AggregationBuilderHelper.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/AggregationBuilderHelper.java index 156b565976..7dd02d82d0 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/AggregationBuilderHelper.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/AggregationBuilderHelper.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation.dsl; import static java.util.Collections.emptyMap; @@ -20,9 +19,7 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchTextType; import org.opensearch.sql.opensearch.storage.serialization.ExpressionSerializer; -/** - * Abstract Aggregation Builder. - */ +/** Abstract Aggregation Builder. */ @RequiredArgsConstructor public class AggregationBuilderHelper { @@ -34,20 +31,23 @@ public class AggregationBuilderHelper { * @param expression Expression * @return AggregationBuilder */ - public T build(Expression expression, Function fieldBuilder, - Function scriptBuilder) { + public T build( + Expression expression, Function fieldBuilder, Function scriptBuilder) { if (expression instanceof ReferenceExpression) { String fieldName = ((ReferenceExpression) expression).getAttr(); return fieldBuilder.apply( - OpenSearchTextType.convertTextToKeyword(fieldName, expression.type())); + OpenSearchTextType.convertTextToKeyword(fieldName, expression.type())); } else if (expression instanceof FunctionExpression || expression instanceof LiteralExpression) { - return scriptBuilder.apply(new Script( - DEFAULT_SCRIPT_TYPE, EXPRESSION_LANG_NAME, serializer.serialize(expression), - emptyMap())); + return scriptBuilder.apply( + new Script( + DEFAULT_SCRIPT_TYPE, + EXPRESSION_LANG_NAME, + serializer.serialize(expression), + emptyMap())); } else { - throw new IllegalStateException(String.format("metric aggregation doesn't support " - + "expression %s", expression)); + throw new IllegalStateException( + String.format("metric aggregation doesn't support " + "expression %s", expression)); } } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilder.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilder.java index 1a6a82be96..4485626742 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilder.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilder.java @@ -26,29 +26,24 @@ import org.opensearch.sql.expression.span.SpanExpression; import org.opensearch.sql.opensearch.storage.serialization.ExpressionSerializer; -/** - * Bucket Aggregation Builder. - */ +/** Bucket Aggregation Builder. */ public class BucketAggregationBuilder { private final AggregationBuilderHelper helper; - public BucketAggregationBuilder( - ExpressionSerializer serializer) { + public BucketAggregationBuilder(ExpressionSerializer serializer) { this.helper = new AggregationBuilderHelper(serializer); } - /** - * Build the list of CompositeValuesSourceBuilder. - */ + /** Build the list of CompositeValuesSourceBuilder. */ public List> build( List> groupList) { ImmutableList.Builder> resultBuilder = new ImmutableList.Builder<>(); for (Triple groupPair : groupList) { resultBuilder.add( - buildCompositeValuesSourceBuilder(groupPair.getLeft(), - groupPair.getMiddle(), groupPair.getRight())); + buildCompositeValuesSourceBuilder( + groupPair.getLeft(), groupPair.getMiddle(), groupPair.getRight())); } return resultBuilder.build(); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilder.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilder.java index 5e7d34abce..c99fbfdc49 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilder.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation.dsl; import static org.opensearch.sql.data.type.ExprCoreType.INTEGER; @@ -33,18 +32,14 @@ import org.opensearch.sql.opensearch.storage.script.filter.FilterQueryBuilder; import org.opensearch.sql.opensearch.storage.serialization.ExpressionSerializer; -/** - * Build the Metric Aggregation and List of {@link MetricParser} from {@link NamedAggregator}. - */ +/** Build the Metric Aggregation and List of {@link MetricParser} from {@link NamedAggregator}. */ public class MetricAggregationBuilder extends ExpressionNodeVisitor, Object> { private final AggregationBuilderHelper helper; private final FilterQueryBuilder filterBuilder; - /** - * Constructor. - */ + /** Constructor. */ public MetricAggregationBuilder(ExpressionSerializer serializer) { this.helper = new AggregationBuilderHelper(serializer); this.filterBuilder = new FilterQueryBuilder(serializer); @@ -87,8 +82,9 @@ public Pair visitNamedAggregator( name, new SingleValueParser(name)); default: - throw new IllegalStateException(String.format( - "unsupported distinct aggregator %s", node.getFunctionName().getFunctionName())); + throw new IllegalStateException( + String.format( + "unsupported distinct aggregator %s", node.getFunctionName().getFunctionName())); } } @@ -186,14 +182,13 @@ private Pair make( return Pair.of(aggregationBuilder, parser); } - /** - * Make {@link CardinalityAggregationBuilder} for distinct count aggregations. - */ - private Pair make(CardinalityAggregationBuilder builder, - Expression expression, - Expression condition, - String name, - MetricParser parser) { + /** Make {@link CardinalityAggregationBuilder} for distinct count aggregations. */ + private Pair make( + CardinalityAggregationBuilder builder, + Expression expression, + Expression condition, + String name, + MetricParser parser) { CardinalityAggregationBuilder aggregationBuilder = helper.build(expression, builder::field, builder::script); if (condition != null) { @@ -204,15 +199,14 @@ private Pair make(CardinalityAggregationBuilde return Pair.of(aggregationBuilder, parser); } - /** - * Make {@link TopHitsAggregationBuilder} for take aggregations. - */ - private Pair make(TopHitsAggregationBuilder builder, - Expression expression, - Expression size, - Expression condition, - String name, - MetricParser parser) { + /** Make {@link TopHitsAggregationBuilder} for take aggregations. */ + private Pair make( + TopHitsAggregationBuilder builder, + Expression expression, + Expression size, + Expression condition, + String name, + MetricParser parser) { String fieldName = ((ReferenceExpression) expression).getAttr(); builder.fetchSource(fieldName, null); builder.size(size.valueOf().integerValue()); @@ -245,8 +239,8 @@ private Expression replaceStarOrLiteral(Expression countArg) { * Make builder to build FilterAggregation for aggregations with filter in the bucket. * * @param subAggBuilder AggregationBuilder instance which the filter is applied to. - * @param condition Condition expression in the filter. - * @param name Name of the FilterAggregation instance to build. + * @param condition Condition expression in the filter. + * @param name Name of the FilterAggregation instance to build. * @return {@link FilterAggregationBuilder}. */ private FilterAggregationBuilder makeFilterAggregation( diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/core/ExpressionScript.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/core/ExpressionScript.java index 9bdb15d63a..3a9ff02ba0 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/core/ExpressionScript.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/core/ExpressionScript.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.core; import static java.util.stream.Collectors.toMap; @@ -33,36 +32,27 @@ import org.opensearch.sql.opensearch.data.value.OpenSearchExprValueFactory; /** - * Expression script executor that executes the expression on each document - * and determine if the document is supposed to be filtered out or not. + * Expression script executor that executes the expression on each document and determine if the + * document is supposed to be filtered out or not. */ @EqualsAndHashCode(callSuper = false) public class ExpressionScript { - /** - * Expression to execute. - */ + /** Expression to execute. */ private final Expression expression; - /** - * ElasticsearchExprValueFactory. - */ - @EqualsAndHashCode.Exclude - private final OpenSearchExprValueFactory valueFactory; + /** ElasticsearchExprValueFactory. */ + @EqualsAndHashCode.Exclude private final OpenSearchExprValueFactory valueFactory; - /** - * Reference Fields. - */ - @EqualsAndHashCode.Exclude - private final Set fields; + /** Reference Fields. */ + @EqualsAndHashCode.Exclude private final Set fields; - /** - * Expression constructor. - */ + /** Expression constructor. */ public ExpressionScript(Expression expression) { this.expression = expression; - this.fields = AccessController.doPrivileged((PrivilegedAction>) () -> - extractFields(expression)); + this.fields = + AccessController.doPrivileged( + (PrivilegedAction>) () -> extractFields(expression)); this.valueFactory = AccessController.doPrivileged( (PrivilegedAction) () -> buildValueFactory(fields)); @@ -72,65 +62,67 @@ public ExpressionScript(Expression expression) { * Evaluate on the doc generate by the doc provider. * * @param docProvider doc provider. - * @param evaluator evaluator + * @param evaluator evaluator * @return expr value */ - public ExprValue execute(Supplier>> docProvider, - BiFunction, ExprValue> evaluator) { - return AccessController.doPrivileged((PrivilegedAction) () -> { - Environment valueEnv = - buildValueEnv(fields, valueFactory, docProvider); - ExprValue result = evaluator.apply(expression, valueEnv); - return result; - }); + public ExprValue execute( + Supplier>> docProvider, + BiFunction, ExprValue> evaluator) { + return AccessController.doPrivileged( + (PrivilegedAction) + () -> { + Environment valueEnv = + buildValueEnv(fields, valueFactory, docProvider); + ExprValue result = evaluator.apply(expression, valueEnv); + return result; + }); } private Set extractFields(Expression expr) { Set fields = new HashSet<>(); - expr.accept(new ExpressionNodeVisitor>() { - @Override - public Object visitReference(ReferenceExpression node, Set context) { - context.add(node); - return null; - } - - @Override - public Object visitParse(ParseExpression node, Set context) { - node.getSourceField().accept(this, context); - return null; - } - }, fields); + expr.accept( + new ExpressionNodeVisitor>() { + @Override + public Object visitReference(ReferenceExpression node, Set context) { + context.add(node); + return null; + } + + @Override + public Object visitParse(ParseExpression node, Set context) { + node.getSourceField().accept(this, context); + return null; + } + }, + fields); return fields; } private OpenSearchExprValueFactory buildValueFactory(Set fields) { - Map typeEnv = fields.stream().collect(toMap( - ReferenceExpression::getAttr, e -> OpenSearchDataType.of(e.type()))); + Map typeEnv = + fields.stream() + .collect(toMap(ReferenceExpression::getAttr, e -> OpenSearchDataType.of(e.type()))); return new OpenSearchExprValueFactory(typeEnv); } private Environment buildValueEnv( - Set fields, OpenSearchExprValueFactory valueFactory, + Set fields, + OpenSearchExprValueFactory valueFactory, Supplier>> docProvider) { Map valueEnv = new HashMap<>(); for (ReferenceExpression field : fields) { String fieldName = field.getAttr(); - ExprValue exprValue = valueFactory.construct( - fieldName, - getDocValue(field, docProvider), - false - ); + ExprValue exprValue = + valueFactory.construct(fieldName, getDocValue(field, docProvider), false); valueEnv.put(field, exprValue); } // Encapsulate map data structure into anonymous Environment class return valueEnv::get; } - private Object getDocValue(ReferenceExpression field, - Supplier>> docProvider) { + private Object getDocValue( + ReferenceExpression field, Supplier>> docProvider) { String fieldName = OpenSearchTextType.convertTextToKeyword(field.getAttr(), field.type()); ScriptDocValues docValue = docProvider.get().get(fieldName); if (docValue == null || docValue.isEmpty()) { @@ -145,9 +137,9 @@ private Object getDocValue(ReferenceExpression field, } /** - * DocValue only support long and double so cast to integer and float if needed. - * The doc value must be Long and Double for expr type Long/Integer and Double/Float respectively. - * Otherwise there must be bugs in our engine that causes the mismatch. + * DocValue only support long and double so cast to integer and float if needed. The doc value + * must be Long and Double for expr type Long/Integer and Double/Float respectively. Otherwise + * there must be bugs in our engine that causes the mismatch. */ private Object castNumberToFieldType(Object value, ExprType type) { if (value == null) { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScript.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScript.java index adce89d0df..557cbbe4c9 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScript.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScript.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import java.util.Map; @@ -19,21 +18,20 @@ import org.opensearch.sql.opensearch.storage.script.core.ExpressionScript; /** - * Expression script executor that executes the expression on each document - * and determine if the document is supposed to be filtered out or not. + * Expression script executor that executes the expression on each document and determine if the + * document is supposed to be filtered out or not. */ @EqualsAndHashCode(callSuper = false) class ExpressionFilterScript extends FilterScript { - /** - * Expression Script. - */ + /** Expression Script. */ private final ExpressionScript expressionScript; - public ExpressionFilterScript(Expression expression, - SearchLookup lookup, - LeafReaderContext context, - Map params) { + public ExpressionFilterScript( + Expression expression, + SearchLookup lookup, + LeafReaderContext context, + Map params) { super(params, lookup, context); this.expressionScript = new ExpressionScript(expression); } @@ -43,19 +41,20 @@ public boolean execute() { return expressionScript.execute(this::getDoc, this::evaluateExpression).booleanValue(); } - private ExprValue evaluateExpression(Expression expression, - Environment valueEnv) { + private ExprValue evaluateExpression( + Expression expression, Environment valueEnv) { ExprValue result = expression.valueOf(valueEnv); if (result.isNull()) { return ExprBooleanValue.of(false); } if (result.type() != ExprCoreType.BOOLEAN) { - throw new IllegalStateException(String.format( - "Expression has wrong result type instead of boolean: " - + "expression [%s], result [%s]", expression, result)); + throw new IllegalStateException( + String.format( + "Expression has wrong result type instead of boolean: " + + "expression [%s], result [%s]", + expression, result)); } return result; } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactory.java index e35482d618..5db10733a7 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactory.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import java.util.Map; @@ -12,15 +11,11 @@ import org.opensearch.search.lookup.SearchLookup; import org.opensearch.sql.expression.Expression; -/** - * Expression script factory that generates leaf factory. - */ +/** Expression script factory that generates leaf factory. */ @EqualsAndHashCode public class ExpressionFilterScriptFactory implements FilterScript.Factory { - /** - * Expression to execute. - */ + /** Expression to execute. */ private final Expression expression; public ExpressionFilterScriptFactory(Expression expression) { @@ -37,5 +32,4 @@ public boolean isResultDeterministic() { public FilterScript.LeafFactory newFactory(Map params, SearchLookup lookup) { return new ExpressionFilterScriptLeafFactory(expression, params, lookup); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptLeafFactory.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptLeafFactory.java index 22b4be1b69..6c04ca7233 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptLeafFactory.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptLeafFactory.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import java.util.Map; @@ -12,29 +11,20 @@ import org.opensearch.search.lookup.SearchLookup; import org.opensearch.sql.expression.Expression; -/** - * Expression script leaf factory that produces script executor for each leaf. - */ +/** Expression script leaf factory that produces script executor for each leaf. */ class ExpressionFilterScriptLeafFactory implements FilterScript.LeafFactory { - /** - * Expression to execute. - */ + /** Expression to execute. */ private final Expression expression; - /** - * Parameters for the expression. - */ + /** Parameters for the expression. */ private final Map params; - /** - * Document lookup that returns doc values. - */ + /** Document lookup that returns doc values. */ private final SearchLookup lookup; - public ExpressionFilterScriptLeafFactory(Expression expression, - Map params, - SearchLookup lookup) { + public ExpressionFilterScriptLeafFactory( + Expression expression, Map params, SearchLookup lookup) { this.expression = expression; this.params = params; this.lookup = lookup; @@ -44,5 +34,4 @@ public ExpressionFilterScriptLeafFactory(Expression expression, public FilterScript newInstance(LeafReaderContext ctx) { return new ExpressionFilterScript(expression, lookup, ctx, params); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilder.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilder.java index 51b10d2c41..fa0fe19105 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilder.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilder.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import static java.util.Collections.emptyMap; @@ -45,14 +44,10 @@ @RequiredArgsConstructor public class FilterQueryBuilder extends ExpressionNodeVisitor { - /** - * Serializer that serializes expression for build DSL query. - */ + /** Serializer that serializes expression for build DSL query. */ private final ExpressionSerializer serializer; - /** - * Mapping from function name to lucene query builder. - */ + /** Mapping from function name to lucene query builder. */ private final Map luceneQueries = ImmutableMap.builder() .put(BuiltinFunctionName.EQUAL.getName(), new TermQuery()) @@ -82,8 +77,9 @@ public class FilterQueryBuilder extends ExpressionNodeVisitor accumulator) { + private BoolQueryBuilder buildBoolQuery( + FunctionExpression node, + Object context, + BiFunction accumulator) { BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); for (Expression arg : node.getArguments()) { accumulator.apply(boolQuery, arg.accept(this, context)); @@ -131,8 +129,8 @@ private BoolQueryBuilder buildBoolQuery(FunctionExpression node, } private ScriptQueryBuilder buildScriptQuery(FunctionExpression node) { - return new ScriptQueryBuilder(new Script( - DEFAULT_SCRIPT_TYPE, EXPRESSION_LANG_NAME, serializer.serialize(node), emptyMap())); + return new ScriptQueryBuilder( + new Script( + DEFAULT_SCRIPT_TYPE, EXPRESSION_LANG_NAME, serializer.serialize(node), emptyMap())); } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LikeQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LikeQuery.java index 699af4f3fd..44c1c30200 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LikeQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LikeQuery.java @@ -21,10 +21,9 @@ public QueryBuilder doBuild(String fieldName, ExprType fieldType, ExprValue lite } /** - * Though WildcardQueryBuilder is required, LikeQuery needed its own class as - * it is not a relevance function which wildcard_query is. The arguments in - * LIKE are of type ReferenceExpression while wildcard_query are of type - * NamedArgumentExpression + * Though WildcardQueryBuilder is required, LikeQuery needed its own class as it is not a + * relevance function which wildcard_query is. The arguments in LIKE are of type + * ReferenceExpression while wildcard_query are of type NamedArgumentExpression */ protected WildcardQueryBuilder createBuilder(String field, String query) { String matchText = StringUtils.convertSqlWildcardToLucene(query); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java index a45c535383..c8e12876d6 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter.lucene; import static org.opensearch.sql.analysis.NestedAnalyzer.isNestedFunction; @@ -35,31 +34,28 @@ import org.opensearch.sql.expression.function.BuiltinFunctionName; import org.opensearch.sql.expression.function.FunctionName; -/** - * Lucene query abstraction that builds Lucene query from function expression. - */ +/** Lucene query abstraction that builds Lucene query from function expression. */ public abstract class LuceneQuery { /** - * Check if function expression supported by current Lucene query. - * Default behavior is that report supported if: - * 1. Left is a reference - * 2. Right side is a literal + * Check if function expression supported by current Lucene query. Default behavior is that report + * supported if: 1. Left is a reference 2. Right side is a literal * - * @param func function - * @return return true if supported, otherwise false. + * @param func function + * @return return true if supported, otherwise false. */ public boolean canSupport(FunctionExpression func) { return (func.getArguments().size() == 2) - && (func.getArguments().get(0) instanceof ReferenceExpression) - && (func.getArguments().get(1) instanceof LiteralExpression - || literalExpressionWrappedByCast(func)) + && (func.getArguments().get(0) instanceof ReferenceExpression) + && (func.getArguments().get(1) instanceof LiteralExpression + || literalExpressionWrappedByCast(func)) || isMultiParameterQuery(func); } /** * Check if predicate expression has nested function on left side of predicate expression. * Validation for right side being a `LiteralExpression` is done in NestedQuery. + * * @param func function. * @return return true if function has supported nested function expression. */ @@ -70,8 +66,8 @@ public boolean isNestedPredicate(FunctionExpression func) { /** * Check if the function expression has multiple named argument expressions as the parameters. * - * @param func function - * @return return true if the expression is a multi-parameter function. + * @param func function + * @return return true if the expression is a multi-parameter function. */ private boolean isMultiParameterQuery(FunctionExpression func) { for (Expression expr : func.getArguments()) { @@ -95,139 +91,163 @@ private boolean literalExpressionWrappedByCast(FunctionExpression func) { } /** - * Build Lucene query from function expression. - * The cast function is converted to literal expressions before generating DSL. + * Build Lucene query from function expression. The cast function is converted to literal + * expressions before generating DSL. * - * @param func function - * @return query + * @param func function + * @return query */ public QueryBuilder build(FunctionExpression func) { ReferenceExpression ref = (ReferenceExpression) func.getArguments().get(0); Expression expr = func.getArguments().get(1); - ExprValue literalValue = expr instanceof LiteralExpression ? expr - .valueOf() : cast((FunctionExpression) expr); + ExprValue literalValue = + expr instanceof LiteralExpression ? expr.valueOf() : cast((FunctionExpression) expr); return doBuild(ref.getAttr(), ref.type(), literalValue); } private ExprValue cast(FunctionExpression castFunction) { - return castMap.get(castFunction.getFunctionName()).apply( - (LiteralExpression) castFunction.getArguments().get(0)); + return castMap + .get(castFunction.getFunctionName()) + .apply((LiteralExpression) castFunction.getArguments().get(0)); } - /** - * Type converting map. - */ - private final Map> castMap = ImmutableMap - .>builder() - .put(BuiltinFunctionName.CAST_TO_STRING.getName(), expr -> { - if (!expr.type().equals(ExprCoreType.STRING)) { - return new ExprStringValue(String.valueOf(expr.valueOf().value())); - } else { - return expr.valueOf(); - } - }) - .put(BuiltinFunctionName.CAST_TO_BYTE.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprByteValue(expr.valueOf().byteValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprByteValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprByteValue(Byte.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_SHORT.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprShortValue(expr.valueOf().shortValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprShortValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprShortValue(Short.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_INT.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprIntegerValue(expr.valueOf().integerValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprIntegerValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprIntegerValue(Integer.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_LONG.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprLongValue(expr.valueOf().longValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprLongValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprLongValue(Long.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_FLOAT.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprFloatValue(expr.valueOf().floatValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprFloatValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprFloatValue(Float.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_DOUBLE.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return new ExprDoubleValue(expr.valueOf().doubleValue()); - } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { - return new ExprDoubleValue(expr.valueOf().booleanValue() ? 1 : 0); - } else { - return new ExprDoubleValue(Double.valueOf(expr.valueOf().stringValue())); - } - }) - .put(BuiltinFunctionName.CAST_TO_BOOLEAN.getName(), expr -> { - if (ExprCoreType.numberTypes().contains(expr.type())) { - return expr.valueOf().doubleValue() != 0 - ? ExprBooleanValue.of(true) : ExprBooleanValue.of(false); - } else if (expr.type().equals(ExprCoreType.STRING)) { - return ExprBooleanValue.of(Boolean.valueOf(expr.valueOf().stringValue())); - } else { - return expr.valueOf(); - } - }) - .put(BuiltinFunctionName.CAST_TO_DATE.getName(), expr -> { - if (expr.type().equals(ExprCoreType.STRING)) { - return new ExprDateValue(expr.valueOf().stringValue()); - } else { - return new ExprDateValue(expr.valueOf().dateValue()); - } - }) - .put(BuiltinFunctionName.CAST_TO_TIME.getName(), expr -> { - if (expr.type().equals(ExprCoreType.STRING)) { - return new ExprTimeValue(expr.valueOf().stringValue()); - } else { - return new ExprTimeValue(expr.valueOf().timeValue()); - } - }) - .put(BuiltinFunctionName.CAST_TO_DATETIME.getName(), expr -> { - if (expr.type().equals(ExprCoreType.STRING)) { - return new ExprDatetimeValue(expr.valueOf().stringValue()); - } else { - return new ExprDatetimeValue(expr.valueOf().datetimeValue()); - } - }) - .put(BuiltinFunctionName.CAST_TO_TIMESTAMP.getName(), expr -> { - if (expr.type().equals(ExprCoreType.STRING)) { - return new ExprTimestampValue(expr.valueOf().stringValue()); - } else { - return new ExprTimestampValue(expr.valueOf().timestampValue()); - } - }) - .build(); + /** Type converting map. */ + private final Map> castMap = + ImmutableMap.>builder() + .put( + BuiltinFunctionName.CAST_TO_STRING.getName(), + expr -> { + if (!expr.type().equals(ExprCoreType.STRING)) { + return new ExprStringValue(String.valueOf(expr.valueOf().value())); + } else { + return expr.valueOf(); + } + }) + .put( + BuiltinFunctionName.CAST_TO_BYTE.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprByteValue(expr.valueOf().byteValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprByteValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprByteValue(Byte.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_SHORT.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprShortValue(expr.valueOf().shortValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprShortValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprShortValue(Short.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_INT.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprIntegerValue(expr.valueOf().integerValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprIntegerValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprIntegerValue(Integer.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_LONG.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprLongValue(expr.valueOf().longValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprLongValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprLongValue(Long.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_FLOAT.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprFloatValue(expr.valueOf().floatValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprFloatValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprFloatValue(Float.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_DOUBLE.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return new ExprDoubleValue(expr.valueOf().doubleValue()); + } else if (expr.type().equals(ExprCoreType.BOOLEAN)) { + return new ExprDoubleValue(expr.valueOf().booleanValue() ? 1 : 0); + } else { + return new ExprDoubleValue(Double.valueOf(expr.valueOf().stringValue())); + } + }) + .put( + BuiltinFunctionName.CAST_TO_BOOLEAN.getName(), + expr -> { + if (ExprCoreType.numberTypes().contains(expr.type())) { + return expr.valueOf().doubleValue() != 0 + ? ExprBooleanValue.of(true) + : ExprBooleanValue.of(false); + } else if (expr.type().equals(ExprCoreType.STRING)) { + return ExprBooleanValue.of(Boolean.valueOf(expr.valueOf().stringValue())); + } else { + return expr.valueOf(); + } + }) + .put( + BuiltinFunctionName.CAST_TO_DATE.getName(), + expr -> { + if (expr.type().equals(ExprCoreType.STRING)) { + return new ExprDateValue(expr.valueOf().stringValue()); + } else { + return new ExprDateValue(expr.valueOf().dateValue()); + } + }) + .put( + BuiltinFunctionName.CAST_TO_TIME.getName(), + expr -> { + if (expr.type().equals(ExprCoreType.STRING)) { + return new ExprTimeValue(expr.valueOf().stringValue()); + } else { + return new ExprTimeValue(expr.valueOf().timeValue()); + } + }) + .put( + BuiltinFunctionName.CAST_TO_DATETIME.getName(), + expr -> { + if (expr.type().equals(ExprCoreType.STRING)) { + return new ExprDatetimeValue(expr.valueOf().stringValue()); + } else { + return new ExprDatetimeValue(expr.valueOf().datetimeValue()); + } + }) + .put( + BuiltinFunctionName.CAST_TO_TIMESTAMP.getName(), + expr -> { + if (expr.type().equals(ExprCoreType.STRING)) { + return new ExprTimestampValue(expr.valueOf().stringValue()); + } else { + return new ExprTimestampValue(expr.valueOf().timestampValue()); + } + }) + .build(); /** - * Build method that subclass implements by default which is to build query - * from reference and literal in function arguments. + * Build method that subclass implements by default which is to build query from reference and + * literal in function arguments. * - * @param fieldName field name - * @param fieldType field type - * @param literal field value literal - * @return query + * @param fieldName field name + * @param fieldType field type + * @param literal field value literal + * @return query */ protected QueryBuilder doBuild(String fieldName, ExprType fieldType, ExprValue literal) { throw new UnsupportedOperationException( diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/NestedQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/NestedQuery.java index 358637791c..f098d5df5a 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/NestedQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/NestedQuery.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter.lucene; import org.apache.lucene.search.join.ScoreMode; @@ -15,21 +14,20 @@ import org.opensearch.sql.expression.LiteralExpression; import org.opensearch.sql.expression.ReferenceExpression; -/** - * Lucene query that build nested query. - */ +/** Lucene query that build nested query. */ public class NestedQuery extends LuceneQuery { /** * Build query for 'nested' function used in predicate expression. Supports 'nested' function on * left and literal on right. + * * @param func Function expression. * @param innerQuery Comparison query to be place inside nested query. * @return Nested query. */ public QueryBuilder buildNested(FunctionExpression func, LuceneQuery innerQuery) { // Generate inner query for placement inside nested query - FunctionExpression nestedFunc = (FunctionExpression)func.getArguments().get(0); + FunctionExpression nestedFunc = (FunctionExpression) func.getArguments().get(0); validateArgs(nestedFunc, func.getArguments().get(1)); ExprValue literalValue = func.getArguments().get(1).valueOf(); ReferenceExpression ref = (ReferenceExpression) nestedFunc.getArguments().get(0); @@ -38,14 +36,17 @@ public QueryBuilder buildNested(FunctionExpression func, LuceneQuery innerQuery) // Generate nested query boolean hasPathParam = nestedFunc.getArguments().size() == 2; - String pathStr = hasPathParam ? nestedFunc.getArguments().get(1).toString() : - getNestedPathString((ReferenceExpression) nestedFunc.getArguments().get(0)); + String pathStr = + hasPathParam + ? nestedFunc.getArguments().get(1).toString() + : getNestedPathString((ReferenceExpression) nestedFunc.getArguments().get(0)); return QueryBuilders.nestedQuery(pathStr, innerQueryResult, ScoreMode.None); } /** - * Dynamically generate path for nested field. An example field of 'office.section.cubicle' - * would dynamically generate the path 'office.section'. + * Dynamically generate path for nested field. An example field of 'office.section.cubicle' would + * dynamically generate the path 'office.section'. + * * @param field nested field to generate path for. * @return path for nested field. */ @@ -59,31 +60,27 @@ private String getNestedPathString(ReferenceExpression field) { /** * Validate arguments in nested function and predicate expression. + * * @param nestedFunc Nested function expression. */ private void validateArgs(FunctionExpression nestedFunc, Expression rightExpression) { if (nestedFunc.getArguments().size() > 2) { throw new IllegalArgumentException( - "nested function supports 2 parameters (field, path) or 1 parameter (field)" - ); + "nested function supports 2 parameters (field, path) or 1 parameter (field)"); } for (var arg : nestedFunc.getArguments()) { if (!(arg instanceof ReferenceExpression)) { throw new IllegalArgumentException( - String.format("Illegal nested field name: %s", - arg.toString() - ) - ); + String.format("Illegal nested field name: %s", arg.toString())); } } if (!(rightExpression instanceof LiteralExpression)) { throw new IllegalArgumentException( - String.format("Illegal argument on right side of predicate expression: %s", - rightExpression.toString() - ) - ); + String.format( + "Illegal argument on right side of predicate expression: %s", + rightExpression.toString())); } } } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java index 1adddff95d..f86fc08f04 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java @@ -31,192 +31,254 @@ public class FunctionParameterRepository { public static final Map> - MatchBoolPrefixQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) - .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) - .put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions( - convertBoolValue(v, "fuzzy_transpositions"))) - .put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) - .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) - .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) - .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) - .build(); + MatchBoolPrefixQueryBuildActions = + ImmutableMap + .>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) + .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) + .put( + "fuzzy_transpositions", + (b, v) -> b.fuzzyTranspositions(convertBoolValue(v, "fuzzy_transpositions"))) + .put( + "max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) + .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) + .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) + .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) + .build(); public static final Map> - MatchPhrasePrefixQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) - .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) - .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) - .build(); + MatchPhrasePrefixQueryBuildActions = + ImmutableMap + .>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put( + "max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) + .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) + .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) + .build(); public static final Map> - MatchPhraseQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) - .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) - .build(); + MatchPhraseQueryBuildActions = + ImmutableMap.>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) + .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) + .build(); public static final Map> - MatchQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery( - convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) - .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) - .put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions( - convertBoolValue(v, "fuzzy_transpositions"))) - .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) - .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) - .put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) - .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) - .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) - .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) - .build(); + MatchQueryBuildActions = + ImmutableMap.>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put( + "auto_generate_synonyms_phrase_query", + (b, v) -> + b.autoGenerateSynonymsPhraseQuery( + convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) + .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) + .put( + "fuzzy_transpositions", + (b, v) -> b.fuzzyTranspositions(convertBoolValue(v, "fuzzy_transpositions"))) + .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) + .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) + .put( + "max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) + .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) + .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) + .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) + .build(); @SuppressWarnings("deprecation") // cutoffFrequency is deprecated public static final Map> - MultiMatchQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery( - convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("cutoff_frequency", (b, v) -> b.cutoffFrequency( - convertFloatValue(v, "cutoff_frequency"))) - .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) - .put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions( - convertBoolValue(v, "fuzzy_transpositions"))) - .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) - .put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) - .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) - .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) - .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) - .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) - .put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker"))) - .put("type", (b, v) -> b.type(convertType(v))) - .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) - .build(); + MultiMatchQueryBuildActions = + ImmutableMap.>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put( + "auto_generate_synonyms_phrase_query", + (b, v) -> + b.autoGenerateSynonymsPhraseQuery( + convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put( + "cutoff_frequency", + (b, v) -> b.cutoffFrequency(convertFloatValue(v, "cutoff_frequency"))) + .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) + .put( + "fuzzy_transpositions", + (b, v) -> b.fuzzyTranspositions(convertBoolValue(v, "fuzzy_transpositions"))) + .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) + .put( + "max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions"))) + .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) + .put("operator", (b, v) -> b.operator(convertOperator(v, "operator"))) + .put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length"))) + .put("slop", (b, v) -> b.slop(convertIntValue(v, "slop"))) + .put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker"))) + .put("type", (b, v) -> b.type(convertType(v))) + .put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v))) + .build(); public static final Map> - QueryStringQueryBuildActions = ImmutableMap.>builder() - .put("allow_leading_wildcard", (b, v) -> b.allowLeadingWildcard( - convertBoolValue(v, "allow_leading_wildcard"))) - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("analyze_wildcard", (b, v) -> b.analyzeWildcard( - convertBoolValue(v, "analyze_wildcard"))) - .put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery( - convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("default_operator", (b, v) -> b.defaultOperator( - convertOperator(v, "default_operator"))) - .put("enable_position_increments", (b, v) -> b.enablePositionIncrements( - convertBoolValue(v, "enable_position_increments"))) - .put("escape", (b, v) -> b.escape(convertBoolValue(v, "escape"))) - .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) - .put("fuzzy_max_expansions", (b, v) -> b.fuzzyMaxExpansions( - convertIntValue(v, "fuzzy_max_expansions"))) - .put("fuzzy_prefix_length", (b, v) -> b.fuzzyPrefixLength( - convertIntValue(v, "fuzzy_prefix_length"))) - .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) - .put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions( - convertBoolValue(v, "fuzzy_transpositions"))) - .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) - .put("max_determinized_states", (b, v) -> b.maxDeterminizedStates( - convertIntValue(v, "max_determinized_states"))) - .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) - .put("phrase_slop", (b, v) -> b.phraseSlop(convertIntValue(v, "phrase_slop"))) - .put("quote_analyzer", (b, v) -> b.quoteAnalyzer(v.stringValue())) - .put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue())) - .put("rewrite", (b, v) -> b.rewrite(checkRewrite(v, "rewrite"))) - .put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker"))) - .put("time_zone", (b, v) -> b.timeZone(checkTimeZone(v))) - .put("type", (b, v) -> b.type(convertType(v))) - .build(); + QueryStringQueryBuildActions = + ImmutableMap.>builder() + .put( + "allow_leading_wildcard", + (b, v) -> b.allowLeadingWildcard(convertBoolValue(v, "allow_leading_wildcard"))) + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put( + "analyze_wildcard", + (b, v) -> b.analyzeWildcard(convertBoolValue(v, "analyze_wildcard"))) + .put( + "auto_generate_synonyms_phrase_query", + (b, v) -> + b.autoGenerateSynonymsPhraseQuery( + convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put( + "default_operator", + (b, v) -> b.defaultOperator(convertOperator(v, "default_operator"))) + .put( + "enable_position_increments", + (b, v) -> + b.enablePositionIncrements(convertBoolValue(v, "enable_position_increments"))) + .put("escape", (b, v) -> b.escape(convertBoolValue(v, "escape"))) + .put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v))) + .put( + "fuzzy_max_expansions", + (b, v) -> b.fuzzyMaxExpansions(convertIntValue(v, "fuzzy_max_expansions"))) + .put( + "fuzzy_prefix_length", + (b, v) -> b.fuzzyPrefixLength(convertIntValue(v, "fuzzy_prefix_length"))) + .put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite"))) + .put( + "fuzzy_transpositions", + (b, v) -> b.fuzzyTranspositions(convertBoolValue(v, "fuzzy_transpositions"))) + .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) + .put( + "max_determinized_states", + (b, v) -> b.maxDeterminizedStates(convertIntValue(v, "max_determinized_states"))) + .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) + .put("phrase_slop", (b, v) -> b.phraseSlop(convertIntValue(v, "phrase_slop"))) + .put("quote_analyzer", (b, v) -> b.quoteAnalyzer(v.stringValue())) + .put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue())) + .put("rewrite", (b, v) -> b.rewrite(checkRewrite(v, "rewrite"))) + .put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker"))) + .put("time_zone", (b, v) -> b.timeZone(checkTimeZone(v))) + .put("type", (b, v) -> b.type(convertType(v))) + .build(); public static final Map> - SimpleQueryStringQueryBuildActions = ImmutableMap.>builder() - .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) - .put("analyze_wildcard", (b, v) -> b.analyzeWildcard( - convertBoolValue(v, "analyze_wildcard"))) - .put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery( - convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("default_operator", (b, v) -> b.defaultOperator( - convertOperator(v, "default_operator"))) - .put("flags", (b, v) -> b.flags(convertFlags(v))) - .put("fuzzy_max_expansions", (b, v) -> b.fuzzyMaxExpansions( - convertIntValue(v, "fuzzy_max_expansions"))) - .put("fuzzy_prefix_length", (b, v) -> b.fuzzyPrefixLength( - convertIntValue(v, "fuzzy_prefix_length"))) - .put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions( - convertBoolValue(v, "fuzzy_transpositions"))) - .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) - .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) - .put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue())) - .build(); + SimpleQueryStringQueryBuildActions = + ImmutableMap.>builder() + .put("analyzer", (b, v) -> b.analyzer(v.stringValue())) + .put( + "analyze_wildcard", + (b, v) -> b.analyzeWildcard(convertBoolValue(v, "analyze_wildcard"))) + .put( + "auto_generate_synonyms_phrase_query", + (b, v) -> + b.autoGenerateSynonymsPhraseQuery( + convertBoolValue(v, "auto_generate_synonyms_phrase_query"))) + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put( + "default_operator", + (b, v) -> b.defaultOperator(convertOperator(v, "default_operator"))) + .put("flags", (b, v) -> b.flags(convertFlags(v))) + .put( + "fuzzy_max_expansions", + (b, v) -> b.fuzzyMaxExpansions(convertIntValue(v, "fuzzy_max_expansions"))) + .put( + "fuzzy_prefix_length", + (b, v) -> b.fuzzyPrefixLength(convertIntValue(v, "fuzzy_prefix_length"))) + .put( + "fuzzy_transpositions", + (b, v) -> b.fuzzyTranspositions(convertBoolValue(v, "fuzzy_transpositions"))) + .put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient"))) + .put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue())) + .put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue())) + .build(); public static final Map> - WildcardQueryBuildActions = ImmutableMap.>builder() - .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) - .put("case_insensitive", (b, v) -> b.caseInsensitive(convertBoolValue(v, "case_insensitive"))) - .put("rewrite", (b, v) -> b.rewrite(checkRewrite(v, "rewrite"))) - .build(); + WildcardQueryBuildActions = + ImmutableMap.>builder() + .put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost"))) + .put( + "case_insensitive", + (b, v) -> b.caseInsensitive(convertBoolValue(v, "case_insensitive"))) + .put("rewrite", (b, v) -> b.rewrite(checkRewrite(v, "rewrite"))) + .build(); public static final Map ArgumentLimitations = ImmutableMap.builder() - .put("boost", "Accepts only floating point values greater than 0.") - .put("tie_breaker", "Accepts only floating point values in range 0 to 1.") - .put("rewrite", "Available values are: constant_score, " - + "scoring_boolean, constant_score_boolean, top_terms_X, top_terms_boost_X, " - + "top_terms_blended_freqs_X, where X is an integer value.") - .put("flags", String.format( - "Available values are: %s and any combinations of these separated by '|'.", - Arrays.stream(SimpleQueryStringFlag.class.getEnumConstants()) - .map(Enum::toString).collect(Collectors.joining(", ")))) - .put("time_zone", "For more information, follow this link: " - + "https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-") - .put("fuzziness", "Available values are: " - + "'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.") - .put("operator", String.format("Available values are: %s.", - Arrays.stream(Operator.class.getEnumConstants()) - .map(Enum::toString).collect(Collectors.joining(", ")))) - .put("type", String.format("Available values are: %s.", - Arrays.stream(MultiMatchQueryBuilder.Type.class.getEnumConstants()) - .map(Enum::toString).collect(Collectors.joining(", ")))) - .put("zero_terms_query", String.format("Available values are: %s.", - Arrays.stream(MatchQuery.ZeroTermsQuery.class.getEnumConstants()) - .map(Enum::toString).collect(Collectors.joining(", ")))) - .put("int", "Accepts only integer values.") - .put("float", "Accepts only floating point values.") - .put("bool", "Accepts only boolean values: 'true' or 'false'.") - .build(); - + .put("boost", "Accepts only floating point values greater than 0.") + .put("tie_breaker", "Accepts only floating point values in range 0 to 1.") + .put( + "rewrite", + "Available values are: constant_score, " + + "scoring_boolean, constant_score_boolean, top_terms_X, top_terms_boost_X, " + + "top_terms_blended_freqs_X, where X is an integer value.") + .put( + "flags", + String.format( + "Available values are: %s and any combinations of these separated by '|'.", + Arrays.stream(SimpleQueryStringFlag.class.getEnumConstants()) + .map(Enum::toString) + .collect(Collectors.joining(", ")))) + .put( + "time_zone", + "For more information, follow this link: " + + "https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-") + .put( + "fuzziness", + "Available values are: " + "'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.") + .put( + "operator", + String.format( + "Available values are: %s.", + Arrays.stream(Operator.class.getEnumConstants()) + .map(Enum::toString) + .collect(Collectors.joining(", ")))) + .put( + "type", + String.format( + "Available values are: %s.", + Arrays.stream(MultiMatchQueryBuilder.Type.class.getEnumConstants()) + .map(Enum::toString) + .collect(Collectors.joining(", ")))) + .put( + "zero_terms_query", + String.format( + "Available values are: %s.", + Arrays.stream(MatchQuery.ZeroTermsQuery.class.getEnumConstants()) + .map(Enum::toString) + .collect(Collectors.joining(", ")))) + .put("int", "Accepts only integer values.") + .put("float", "Accepts only floating point values.") + .put("bool", "Accepts only boolean values: 'true' or 'false'.") + .build(); private static String formatErrorMessage(String name, String value) { return formatErrorMessage(name, value, name); } private static String formatErrorMessage(String name, String value, String limitationName) { - return String.format("Invalid %s value: '%s'. %s", - name, value, ArgumentLimitations.containsKey(name) ? ArgumentLimitations.get(name) + return String.format( + "Invalid %s value: '%s'. %s", + name, + value, + ArgumentLimitations.containsKey(name) + ? ArgumentLimitations.get(name) : ArgumentLimitations.getOrDefault(limitationName, "")); } /** * Check whether value is valid for 'rewrite' or 'fuzzy_rewrite'. + * * @param value Value * @param name Value name * @return Converted @@ -233,6 +295,7 @@ public static String checkRewrite(ExprValue value, String name) { /** * Convert ExprValue to Flags. + * * @param value Value * @return Array of flags */ @@ -248,6 +311,7 @@ public static SimpleQueryStringFlag[] convertFlags(ExprValue value) { /** * Check whether ExprValue could be converted to timezone object. + * * @param value Value * @return Converted to string */ @@ -262,6 +326,7 @@ public static String checkTimeZone(ExprValue value) { /** * Convert ExprValue to Fuzziness object. + * * @param value Value * @return Fuzziness */ @@ -275,6 +340,7 @@ public static Fuzziness convertFuzziness(ExprValue value) { /** * Convert ExprValue to Operator object, could be used for 'operator' and 'default_operator'. + * * @param value Value * @param name Value name * @return Operator @@ -289,13 +355,14 @@ public static Operator convertOperator(ExprValue value, String name) { /** * Convert ExprValue to Type object. + * * @param value Value * @return Type */ public static MultiMatchQueryBuilder.Type convertType(ExprValue value) { try { - return MultiMatchQueryBuilder.Type.parse(value.stringValue().toLowerCase(), - LoggingDeprecationHandler.INSTANCE); + return MultiMatchQueryBuilder.Type.parse( + value.stringValue().toLowerCase(), LoggingDeprecationHandler.INSTANCE); } catch (Exception e) { throw new RuntimeException(formatErrorMessage("type", value.stringValue()), e); } @@ -303,6 +370,7 @@ public static MultiMatchQueryBuilder.Type convertType(ExprValue value) { /** * Convert ExprValue to ZeroTermsQuery object. + * * @param value Value * @return ZeroTermsQuery */ @@ -316,6 +384,7 @@ public static MatchQuery.ZeroTermsQuery convertZeroTermsQuery(ExprValue value) { /** * Convert ExprValue to int. + * * @param value Value * @param name Value name * @return int @@ -330,6 +399,7 @@ public static int convertIntValue(ExprValue value, String name) { /** * Convert ExprValue to float. + * * @param value Value * @param name Value name * @return float @@ -344,6 +414,7 @@ public static float convertFloatValue(ExprValue value, String name) { /** * Convert ExprValue to bool. + * * @param value Value * @param name Value name * @return bool diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchBoolPrefixQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchBoolPrefixQuery.java index 7044a56035..5443d7154d 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchBoolPrefixQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchBoolPrefixQuery.java @@ -8,14 +8,11 @@ import org.opensearch.index.query.MatchBoolPrefixQueryBuilder; import org.opensearch.index.query.QueryBuilders; -/** - * Initializes MatchBoolPrefixQueryBuilder from a FunctionExpression. - */ -public class MatchBoolPrefixQuery - extends SingleFieldQuery { +/** Initializes MatchBoolPrefixQueryBuilder from a FunctionExpression. */ +public class MatchBoolPrefixQuery extends SingleFieldQuery { /** - * Constructor for MatchBoolPrefixQuery to configure RelevanceQuery - * with support of optional parameters. + * Constructor for MatchBoolPrefixQuery to configure RelevanceQuery with support of optional + * parameters. */ public MatchBoolPrefixQuery() { super(FunctionParameterRepository.MatchBoolPrefixQueryBuildActions); @@ -23,9 +20,10 @@ public MatchBoolPrefixQuery() { /** * Maps correct query builder function to class. - * @param field Field to execute query in - * @param query Text used to search field - * @return Object of executed query + * + * @param field Field to execute query in + * @param query Text used to search field + * @return Object of executed query */ @Override protected MatchBoolPrefixQueryBuilder createBuilder(String field, String query) { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhrasePrefixQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhrasePrefixQuery.java index 8ee9ae299e..5a9b5e0d1c 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhrasePrefixQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhrasePrefixQuery.java @@ -8,12 +8,10 @@ import org.opensearch.index.query.MatchPhrasePrefixQueryBuilder; import org.opensearch.index.query.QueryBuilders; -/** - * Lucene query that builds a match_phrase_prefix query. - */ +/** Lucene query that builds a match_phrase_prefix query. */ public class MatchPhrasePrefixQuery extends SingleFieldQuery { /** - * Default constructor for MatchPhrasePrefixQuery configures how RelevanceQuery.build() handles + * Default constructor for MatchPhrasePrefixQuery configures how RelevanceQuery.build() handles * named arguments. */ public MatchPhrasePrefixQuery() { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhraseQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhraseQuery.java index 2afaca1a7a..3c823b7cae 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhraseQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhraseQuery.java @@ -8,13 +8,11 @@ import org.opensearch.index.query.MatchPhraseQueryBuilder; import org.opensearch.index.query.QueryBuilders; -/** - * Lucene query that builds a match_phrase query. - */ +/** Lucene query that builds a match_phrase query. */ public class MatchPhraseQuery extends SingleFieldQuery { /** - * Default constructor for MatchPhraseQuery configures how RelevanceQuery.build() handles - * named arguments. + * Default constructor for MatchPhraseQuery configures how RelevanceQuery.build() handles named + * arguments. */ public MatchPhraseQuery() { super(FunctionParameterRepository.MatchPhraseQueryBuildActions); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchQuery.java index a4de1c0831..b40d4fb85b 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchQuery.java @@ -8,13 +8,11 @@ import org.opensearch.index.query.MatchQueryBuilder; import org.opensearch.index.query.QueryBuilders; -/** - * Initializes MatchQueryBuilder from a FunctionExpression. - */ +/** Initializes MatchQueryBuilder from a FunctionExpression. */ public class MatchQuery extends SingleFieldQuery { /** - * Default constructor for MatchQuery configures how RelevanceQuery.build() handles - * named arguments. + * Default constructor for MatchQuery configures how RelevanceQuery.build() handles named + * arguments. */ public MatchQuery() { super(FunctionParameterRepository.MatchQueryBuildActions); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQuery.java index 9f37951072..b6e854a3f8 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQuery.java @@ -13,7 +13,8 @@ import org.opensearch.sql.expression.NamedArgumentExpression; /** - * Base class to represent relevance queries that search multiple fields. + * Base class to represent relevance queries that search multiple fields. + * * @param The builder class for the OpenSearch query. */ abstract class MultiFieldQuery extends RelevanceQuery { @@ -25,26 +26,24 @@ public MultiFieldQuery(Map> queryBuildActions) { @Override public T createQueryBuilder(List arguments) { // Extract 'fields' and 'query' - var fields = arguments.stream() - .filter(a -> a.getArgName().equalsIgnoreCase("fields")) - .findFirst() - .orElseThrow(() -> new SemanticCheckException("'fields' parameter is missing.")); - - var query = arguments.stream() - .filter(a -> a.getArgName().equalsIgnoreCase("query")) - .findFirst() - .orElseThrow(() -> new SemanticCheckException("'query' parameter is missing")); - - var fieldsAndWeights = fields - .getValue() - .valueOf() - .tupleValue() - .entrySet() - .stream() - .collect(ImmutableMap.toImmutableMap(e -> e.getKey(), e -> e.getValue().floatValue())); + var fields = + arguments.stream() + .filter(a -> a.getArgName().equalsIgnoreCase("fields")) + .findFirst() + .orElseThrow(() -> new SemanticCheckException("'fields' parameter is missing.")); + + var query = + arguments.stream() + .filter(a -> a.getArgName().equalsIgnoreCase("query")) + .findFirst() + .orElseThrow(() -> new SemanticCheckException("'query' parameter is missing")); + + var fieldsAndWeights = + fields.getValue().valueOf().tupleValue().entrySet().stream() + .collect(ImmutableMap.toImmutableMap(e -> e.getKey(), e -> e.getValue().floatValue())); return createBuilder(fieldsAndWeights, query.getValue().valueOf().stringValue()); } - protected abstract T createBuilder(ImmutableMap fields, String query); + protected abstract T createBuilder(ImmutableMap fields, String query); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiMatchQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiMatchQuery.java index a791bf756b..826e6d7dde 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiMatchQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiMatchQuery.java @@ -11,8 +11,8 @@ public class MultiMatchQuery extends MultiFieldQuery { /** - * Default constructor for MultiMatch configures how RelevanceQuery.build() handles - * named arguments. + * Default constructor for MultiMatch configures how RelevanceQuery.build() handles named + * arguments. */ public MultiMatchQuery() { super(FunctionParameterRepository.MultiMatchQueryBuildActions); diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQuery.java index 528b24af6c..ba79147c8c 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQuery.java @@ -33,36 +33,39 @@ protected void ignoreArguments(List arguments) { protected void checkValidArguments(String argNormalized, T queryBuilder) { if (!getQueryBuildActions().containsKey(argNormalized)) { throw new SemanticCheckException( - String.format("Parameter %s is invalid for %s function.", - argNormalized, getQueryName())); + String.format("Parameter %s is invalid for %s function.", argNormalized, getQueryName())); } } + /** - * Override build function because RelevanceQuery requires 2 fields, - * but NoFieldQuery must have no fields. + * Override build function because RelevanceQuery requires 2 fields, but NoFieldQuery must have no + * fields. * * @param func : Contains function name and passed in arguments. * @return : QueryBuilder object */ - @Override public QueryBuilder build(FunctionExpression func) { - var arguments = func.getArguments().stream().map( - a -> (NamedArgumentExpression) a).collect(Collectors.toList()); + var arguments = + func.getArguments().stream() + .map(a -> (NamedArgumentExpression) a) + .collect(Collectors.toList()); if (arguments.size() < 1) { - throw new SyntaxCheckException(String.format( - "%s requires at least one parameter", func.getFunctionName())); + throw new SyntaxCheckException( + String.format("%s requires at least one parameter", func.getFunctionName())); } return loadArguments(arguments); } - @Override public T createQueryBuilder(List arguments) { // Extract 'query' - var query = arguments.stream().filter(a -> a.getArgName().equalsIgnoreCase("query")).findFirst() - .orElseThrow(() -> new SemanticCheckException("'query' parameter is missing")); + var query = + arguments.stream() + .filter(a -> a.getArgName().equalsIgnoreCase("query")) + .findFirst() + .orElseThrow(() -> new SemanticCheckException("'query' parameter is missing")); return createBuilder(query.getValue().valueOf().stringValue()); } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializer.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializer.java index dc67da9de5..aa78d60a6e 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializer.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializer.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.serialization; import java.io.ByteArrayInputStream; @@ -14,9 +13,7 @@ import java.util.Base64; import org.opensearch.sql.expression.Expression; -/** - * Default serializer that (de-)serialize expressions by JDK serialization. - */ +/** Default serializer that (de-)serialize expressions by JDK serialization. */ public class DefaultExpressionSerializer implements ExpressionSerializer { @Override @@ -42,5 +39,4 @@ public Expression deserialize(String code) { throw new IllegalStateException("Failed to deserialize expression code: " + code, e); } } - } diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/ExpressionSerializer.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/ExpressionSerializer.java index b7caeb30f8..9c9779696c 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/ExpressionSerializer.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/serialization/ExpressionSerializer.java @@ -3,28 +3,26 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.serialization; import org.opensearch.sql.expression.Expression; -/** - * Expression serializer that (de-)serializes expression object. - */ +/** Expression serializer that (de-)serializes expression object. */ public interface ExpressionSerializer { /** * Serialize an expression. - * @param expr expression - * @return serialized string + * + * @param expr expression + * @return serialized string */ String serialize(Expression expr); /** * Deserialize an expression. - * @param code serialized code - * @return original expression object + * + * @param code serialized code + * @return original expression object */ Expression deserialize(String code); - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeRecognitionTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeRecognitionTest.java index c3a5d13dca..35ad6b7ea6 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeRecognitionTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeRecognitionTest.java @@ -35,8 +35,7 @@ private static Stream types() { Arguments.of("BINARY", new OpenSearchExprBinaryValue("A"), "binary"), Arguments.of("IP", new OpenSearchExprIpValue("A"), "ip"), Arguments.of("TEXT", new TestTextWithFieldValue("Hello World"), "text with fields"), - Arguments.of("GEO_POINT", new OpenSearchExprGeoPointValue(0d, 0d), "geo point") - ); + Arguments.of("GEO_POINT", new OpenSearchExprGeoPointValue(0d, 0d), "geo point")); } private String typeofGetValue(ExprValue input) { @@ -50,8 +49,8 @@ public TestTextWithFieldValue(String value) { @Override public ExprType type() { - return OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); + return OpenSearchTextType.of( + Map.of("words", OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); } } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeTest.java index 8d69b3d855..b0288dc9a7 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDataTypeTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.type; import static org.junit.jupiter.api.Assertions.assertAll; @@ -108,13 +107,9 @@ private static Stream getTestDataWithType() { Arguments.of(MappingType.Date, "date", TIMESTAMP), Arguments.of(MappingType.Object, "object", STRUCT), Arguments.of(MappingType.Nested, "nested", ARRAY), - Arguments.of(MappingType.GeoPoint, "geo_point", - OpenSearchGeoPointType.of()), - Arguments.of(MappingType.Binary, "binary", - OpenSearchBinaryType.of()), - Arguments.of(MappingType.Ip, "ip", - OpenSearchIpType.of()) - ); + Arguments.of(MappingType.GeoPoint, "geo_point", OpenSearchGeoPointType.of()), + Arguments.of(MappingType.Binary, "binary", OpenSearchBinaryType.of()), + Arguments.of(MappingType.Ip, "ip", OpenSearchIpType.of())); } @ParameterizedTest(name = "{1}") @@ -128,8 +123,7 @@ public void of_MappingType(MappingType mappingType, String name, ExprType dataTy assertAll( () -> assertEquals(nameForPPL, type.typeName()), () -> assertEquals(nameForSQL, type.legacyTypeName()), - () -> assertEquals(dataType, type.getExprType()) - ); + () -> assertEquals(dataType, type.getExprType())); } @ParameterizedTest(name = "{0}") @@ -168,15 +162,10 @@ public void of_OpenSearchDataType_from_MappingType(OpenSearchDataType.MappingTyp public void types_but_clones_are_singletons_and_cached() { var type = OpenSearchDataType.of(MappingType.Object); var alsoType = OpenSearchDataType.of(MappingType.Object); - Map properties = Map.of( - "properties", - Map.of("number", Map.of("type", "integer"))); - var typeWithProperties = OpenSearchDataType.of( - MappingType.Object, - properties); - var typeWithFields = OpenSearchDataType.of( - MappingType.Text, - Map.of()); + Map properties = + Map.of("properties", Map.of("number", Map.of("type", "integer"))); + var typeWithProperties = OpenSearchDataType.of(MappingType.Object, properties); + var typeWithFields = OpenSearchDataType.of(MappingType.Text, Map.of()); var cloneType = type.cloneEmpty(); assertAll( @@ -187,22 +176,20 @@ public void types_but_clones_are_singletons_and_cached() { () -> assertNotSame(typeWithProperties, typeWithProperties.cloneEmpty()), () -> assertNotSame(typeWithFields, typeWithFields.cloneEmpty()), () -> assertNotSame(dateType, dateType.cloneEmpty()), - () -> assertSame(OpenSearchDataType.of(MappingType.Text), - OpenSearchTextType.of()), - () -> assertSame(OpenSearchDataType.of(MappingType.Binary), - OpenSearchBinaryType.of()), - () -> assertSame(OpenSearchDataType.of(MappingType.GeoPoint), - OpenSearchGeoPointType.of()), - () -> assertSame(OpenSearchDataType.of(MappingType.Ip), - OpenSearchIpType.of()), - () -> assertNotSame(OpenSearchTextType.of(), - OpenSearchTextType.of(Map.of("properties", OpenSearchDataType.of(INTEGER)))), + () -> assertSame(OpenSearchDataType.of(MappingType.Text), OpenSearchTextType.of()), + () -> assertSame(OpenSearchDataType.of(MappingType.Binary), OpenSearchBinaryType.of()), + () -> assertSame(OpenSearchDataType.of(MappingType.GeoPoint), OpenSearchGeoPointType.of()), + () -> assertSame(OpenSearchDataType.of(MappingType.Ip), OpenSearchIpType.of()), + () -> + assertNotSame( + OpenSearchTextType.of(), + OpenSearchTextType.of(Map.of("properties", OpenSearchDataType.of(INTEGER)))), () -> assertSame(OpenSearchDataType.of(INTEGER), OpenSearchDataType.of(INTEGER)), () -> assertSame(OpenSearchDataType.of(STRING), OpenSearchDataType.of(STRING)), () -> assertSame(OpenSearchDataType.of(STRUCT), OpenSearchDataType.of(STRUCT)), - () -> assertNotSame(OpenSearchDataType.of(INTEGER), - OpenSearchDataType.of(INTEGER).cloneEmpty()) - ); + () -> + assertNotSame( + OpenSearchDataType.of(INTEGER), OpenSearchDataType.of(INTEGER).cloneEmpty())); } @Test @@ -211,17 +198,25 @@ public void types_but_clones_are_singletons_and_cached() { public void fields_and_properties_are_readonly() { var objectType = OpenSearchDataType.of(MappingType.Object); var textType = OpenSearchTextType.of(); - var textTypeWithFields = OpenSearchTextType.of( - Map.of("letters", OpenSearchDataType.of(MappingType.Keyword))); + var textTypeWithFields = + OpenSearchTextType.of(Map.of("letters", OpenSearchDataType.of(MappingType.Keyword))); assertAll( - () -> assertThrows(UnsupportedOperationException.class, - () -> objectType.getProperties().put("something", OpenSearchDataType.of(INTEGER))), - () -> assertThrows(UnsupportedOperationException.class, - () -> textType.getFields().put("words", OpenSearchDataType.of(MappingType.Keyword))), - () -> assertThrows(UnsupportedOperationException.class, - () -> textTypeWithFields.getFields().put("words", - OpenSearchDataType.of(MappingType.Keyword))) - ); + () -> + assertThrows( + UnsupportedOperationException.class, + () -> objectType.getProperties().put("something", OpenSearchDataType.of(INTEGER))), + () -> + assertThrows( + UnsupportedOperationException.class, + () -> + textType.getFields().put("words", OpenSearchDataType.of(MappingType.Keyword))), + () -> + assertThrows( + UnsupportedOperationException.class, + () -> + textTypeWithFields + .getFields() + .put("words", OpenSearchDataType.of(MappingType.Keyword)))); } @Test @@ -234,10 +229,8 @@ public void of_null_MappingType() { // cloneEmpty doesn't clone properties and fields. // Fields are cloned by OpenSearchTextType::cloneEmpty, because it is used in that type only. public void cloneEmpty() { - var type = OpenSearchDataType.of( - MappingType.Object, - Map.of("val", OpenSearchDataType.of(INTEGER)) - ); + var type = + OpenSearchDataType.of(MappingType.Object, Map.of("val", OpenSearchDataType.of(INTEGER))); var clone = type.cloneEmpty(); var textClone = textKeywordType.cloneEmpty(); @@ -246,9 +239,10 @@ public void cloneEmpty() { () -> assertEquals(type, clone), () -> assertTrue(clone.getProperties().isEmpty()), () -> assertEquals(textKeywordType, textClone), - () -> assertEquals(FieldUtils.readField(textKeywordType, "fields", true), - FieldUtils.readField(textClone, "fields", true)) - ); + () -> + assertEquals( + FieldUtils.readField(textKeywordType, "fields", true), + FieldUtils.readField(textClone, "fields", true))); } // Following structure of nested objects should be flattened @@ -294,26 +288,29 @@ public void traverseAndFlatten() { () -> assertEquals(9, flattened.size()), () -> assertTrue(flattened.get("mapping").getProperties().isEmpty()), () -> assertTrue(flattened.get("mapping.submapping").getProperties().isEmpty()), - () -> assertTrue( - flattened.get("mapping.submapping.subsubmapping").getProperties().isEmpty()), - + () -> + assertTrue(flattened.get("mapping.submapping.subsubmapping").getProperties().isEmpty()), () -> assertEquals(objectType, flattened.get("mapping")), () -> assertEquals(objectType, flattened.get("mapping.submapping")), () -> assertEquals(objectType, flattened.get("mapping.submapping.subsubmapping")), - - () -> assertEquals(OpenSearchDataType.of(MappingType.Keyword), - flattened.get("mapping.keyword")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Text), - flattened.get("mapping.text")), - () -> assertEquals(OpenSearchGeoPointType.of(), - flattened.get("mapping.submapping.geo_point")), - () -> assertEquals(OpenSearchTextType.of(), - flattened.get("mapping.submapping.textWithFieldsType")), - () -> assertEquals(OpenSearchTextType.of(), - flattened.get("mapping.submapping.subsubmapping.texttype")), - () -> assertEquals(OpenSearchDataType.of(INTEGER), - flattened.get("mapping.submapping.subsubmapping.INTEGER")) - ); + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Keyword), flattened.get("mapping.keyword")), + () -> assertEquals(OpenSearchDataType.of(MappingType.Text), flattened.get("mapping.text")), + () -> + assertEquals( + OpenSearchGeoPointType.of(), flattened.get("mapping.submapping.geo_point")), + () -> + assertEquals( + OpenSearchTextType.of(), flattened.get("mapping.submapping.textWithFieldsType")), + () -> + assertEquals( + OpenSearchTextType.of(), + flattened.get("mapping.submapping.subsubmapping.texttype")), + () -> + assertEquals( + OpenSearchDataType.of(INTEGER), + flattened.get("mapping.submapping.subsubmapping.INTEGER"))); } @Test @@ -322,25 +319,42 @@ public void resolve() { assertAll( () -> assertNull(OpenSearchDataType.resolve(mapping, "incorrect")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Object), - OpenSearchDataType.resolve(mapping, "mapping")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Object), - OpenSearchDataType.resolve(mapping, "submapping")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Object), - OpenSearchDataType.resolve(mapping, "subsubmapping")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Text), - OpenSearchDataType.resolve(mapping, "texttype")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Text), - OpenSearchDataType.resolve(mapping, "textWithFieldsType")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Text), - OpenSearchDataType.resolve(mapping, "text")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Integer), - OpenSearchDataType.resolve(mapping, "INTEGER")), - () -> assertEquals(OpenSearchDataType.of(MappingType.GeoPoint), - OpenSearchDataType.resolve(mapping, "geo_point")), - () -> assertEquals(OpenSearchDataType.of(MappingType.Keyword), - OpenSearchDataType.resolve(mapping, "keyword")) - ); + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Object), + OpenSearchDataType.resolve(mapping, "mapping")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Object), + OpenSearchDataType.resolve(mapping, "submapping")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Object), + OpenSearchDataType.resolve(mapping, "subsubmapping")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Text), + OpenSearchDataType.resolve(mapping, "texttype")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Text), + OpenSearchDataType.resolve(mapping, "textWithFieldsType")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Text), + OpenSearchDataType.resolve(mapping, "text")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Integer), + OpenSearchDataType.resolve(mapping, "INTEGER")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.GeoPoint), + OpenSearchDataType.resolve(mapping, "geo_point")), + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Keyword), + OpenSearchDataType.resolve(mapping, "keyword"))); } // type : Object @@ -357,39 +371,38 @@ public void resolve() { @Test public void text_type_with_fields_ctor() { - var type = OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(MappingType.Keyword))); + var type = OpenSearchTextType.of(Map.of("words", OpenSearchDataType.of(MappingType.Keyword))); assertAll( () -> assertEquals(OpenSearchTextType.of(), type), () -> assertEquals(1, type.getFields().size()), - () -> assertEquals(OpenSearchDataType.of(MappingType.Keyword), - type.getFields().get("words")) - ); + () -> + assertEquals( + OpenSearchDataType.of(MappingType.Keyword), type.getFields().get("words"))); } private Map getSampleMapping() { - Map subsubmapping = Map.of( - "properties", Map.of( - "texttype", Map.of("type", "text"), - "INTEGER", Map.of("type", "integer") - ) - ); - - Map submapping = Map.of( - "properties", Map.of( - "subsubmapping", subsubmapping, - "textWithFieldsType", Map.of("type", "text", "fieldsType", true), - "geo_point", Map.of("type", "geo_point") - ) - ); - - Map types = Map.of( - "properties", Map.of( - "submapping", submapping, - "keyword", Map.of("type", "keyword"), - "text", Map.of("type", "text") - ) - ); + Map subsubmapping = + Map.of( + "properties", + Map.of( + "texttype", Map.of("type", "text"), + "INTEGER", Map.of("type", "integer"))); + + Map submapping = + Map.of( + "properties", + Map.of( + "subsubmapping", subsubmapping, + "textWithFieldsType", Map.of("type", "text", "fieldsType", true), + "geo_point", Map.of("type", "geo_point"))); + + Map types = + Map.of( + "properties", + Map.of( + "submapping", submapping, + "keyword", Map.of("type", "keyword"), + "text", Map.of("type", "text"))); var mapping = OpenSearchDataType.of(MappingType.Object, types); return Map.of("mapping", mapping); @@ -397,8 +410,7 @@ private Map getSampleMapping() { @Test public void test_getExprType() { - assertEquals(OpenSearchTextType.of(), - OpenSearchDataType.of(MappingType.Text).getExprType()); + assertEquals(OpenSearchTextType.of(), OpenSearchDataType.of(MappingType.Text).getExprType()); assertEquals(FLOAT, OpenSearchDataType.of(MappingType.Float).getExprType()); assertEquals(FLOAT, OpenSearchDataType.of(MappingType.HalfFloat).getExprType()); assertEquals(DOUBLE, OpenSearchDataType.of(MappingType.Double).getExprType()); diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateTypeTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateTypeTest.java index 13393da732..a9511f8c0b 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateTypeTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/type/OpenSearchDateTypeTest.java @@ -47,10 +47,8 @@ class OpenSearchDateTypeTest { private static final OpenSearchDateType defaultDateType = OpenSearchDateType.of(defaultFormatString); - private static final OpenSearchDateType dateDateType = - OpenSearchDateType.of(dateFormatString); - private static final OpenSearchDateType timeDateType = - OpenSearchDateType.of(timeFormatString); + private static final OpenSearchDateType dateDateType = OpenSearchDateType.of(dateFormatString); + private static final OpenSearchDateType timeDateType = OpenSearchDateType.of(timeFormatString); private static final OpenSearchDateType datetimeDateType = OpenSearchDateType.of(datetimeFormatString); @@ -79,8 +77,7 @@ public void isCompatible() { () -> assertFalse(DATE.isCompatible(defaultDateType)), () -> assertTrue(DATE.isCompatible(dateDateType)), () -> assertFalse(DATE.isCompatible(timeDateType)), - () -> assertFalse(DATE.isCompatible(datetimeDateType)) - ); + () -> assertFalse(DATE.isCompatible(datetimeDateType))); } // `typeName` and `legacyTypeName` return the same thing for date objects: @@ -92,8 +89,7 @@ public void check_typeName() { () -> assertEquals("DATE", defaultDateType.typeName()), () -> assertEquals("DATE", timeDateType.typeName()), () -> assertEquals("DATE", dateDateType.typeName()), - () -> assertEquals("DATE", datetimeDateType.typeName()) - ); + () -> assertEquals("DATE", datetimeDateType.typeName())); } @Test @@ -103,8 +99,7 @@ public void check_legacyTypeName() { () -> assertEquals("DATE", defaultDateType.legacyTypeName()), () -> assertEquals("DATE", timeDateType.legacyTypeName()), () -> assertEquals("DATE", dateDateType.legacyTypeName()), - () -> assertEquals("DATE", datetimeDateType.legacyTypeName()) - ); + () -> assertEquals("DATE", datetimeDateType.legacyTypeName())); } @Test @@ -114,8 +109,7 @@ public void check_exprTypeName() { () -> assertEquals(TIMESTAMP, defaultDateType.getExprType()), () -> assertEquals(TIME, timeDateType.getExprType()), () -> assertEquals(DATE, dateDateType.getExprType()), - () -> assertEquals(TIMESTAMP, datetimeDateType.getExprType()) - ); + () -> assertEquals(TIMESTAMP, datetimeDateType.getExprType())); } private static Stream getAllSupportedFormats() { @@ -125,11 +119,12 @@ private static Stream getAllSupportedFormats() { @ParameterizedTest @MethodSource("getAllSupportedFormats") public void check_supported_format_names_coverage(FormatNames formatName) { - assertTrue(SUPPORTED_NAMED_NUMERIC_FORMATS.contains(formatName) - || SUPPORTED_NAMED_DATETIME_FORMATS.contains(formatName) - || SUPPORTED_NAMED_DATE_FORMATS.contains(formatName) - || SUPPORTED_NAMED_TIME_FORMATS.contains(formatName) - || SUPPORTED_NAMED_INCOMPLETE_DATE_FORMATS.contains(formatName), + assertTrue( + SUPPORTED_NAMED_NUMERIC_FORMATS.contains(formatName) + || SUPPORTED_NAMED_DATETIME_FORMATS.contains(formatName) + || SUPPORTED_NAMED_DATE_FORMATS.contains(formatName) + || SUPPORTED_NAMED_TIME_FORMATS.contains(formatName) + || SUPPORTED_NAMED_INCOMPLETE_DATE_FORMATS.contains(formatName), formatName + " not supported"); } @@ -142,17 +137,24 @@ private static Stream getSupportedDatetimeFormats() { public void check_datetime_format_names(FormatNames datetimeFormat) { String camelCaseName = datetimeFormat.getCamelCaseName(); if (camelCaseName != null && !camelCaseName.isEmpty()) { - OpenSearchDateType dateType = - OpenSearchDateType.of(camelCaseName); - assertSame(dateType.getExprType(), TIMESTAMP, camelCaseName - + " does not format to a TIMESTAMP type, instead got " + dateType.getExprType()); + OpenSearchDateType dateType = OpenSearchDateType.of(camelCaseName); + assertSame( + dateType.getExprType(), + TIMESTAMP, + camelCaseName + + " does not format to a TIMESTAMP type, instead got " + + dateType.getExprType()); } String snakeCaseName = datetimeFormat.getSnakeCaseName(); if (snakeCaseName != null && !snakeCaseName.isEmpty()) { OpenSearchDateType dateType = OpenSearchDateType.of(snakeCaseName); - assertSame(dateType.getExprType(), TIMESTAMP, snakeCaseName - + " does not format to a TIMESTAMP type, instead got " + dateType.getExprType()); + assertSame( + dateType.getExprType(), + TIMESTAMP, + snakeCaseName + + " does not format to a TIMESTAMP type, instead got " + + dateType.getExprType()); } else { fail(); } @@ -168,15 +170,19 @@ public void check_date_format_names(FormatNames dateFormat) { String camelCaseName = dateFormat.getCamelCaseName(); if (camelCaseName != null && !camelCaseName.isEmpty()) { OpenSearchDateType dateType = OpenSearchDateType.of(camelCaseName); - assertSame(dateType.getExprType(), DATE, camelCaseName - + " does not format to a DATE type, instead got " + dateType.getExprType()); + assertSame( + dateType.getExprType(), + DATE, + camelCaseName + " does not format to a DATE type, instead got " + dateType.getExprType()); } String snakeCaseName = dateFormat.getSnakeCaseName(); if (snakeCaseName != null && !snakeCaseName.isEmpty()) { OpenSearchDateType dateType = OpenSearchDateType.of(snakeCaseName); - assertSame(dateType.getExprType(), DATE, snakeCaseName - + " does not format to a DATE type, instead got " + dateType.getExprType()); + assertSame( + dateType.getExprType(), + DATE, + snakeCaseName + " does not format to a DATE type, instead got " + dateType.getExprType()); } else { fail(); } @@ -192,15 +198,19 @@ public void check_time_format_names(FormatNames timeFormat) { String camelCaseName = timeFormat.getCamelCaseName(); if (camelCaseName != null && !camelCaseName.isEmpty()) { OpenSearchDateType dateType = OpenSearchDateType.of(camelCaseName); - assertSame(dateType.getExprType(), TIME, camelCaseName - + " does not format to a TIME type, instead got " + dateType.getExprType()); + assertSame( + dateType.getExprType(), + TIME, + camelCaseName + " does not format to a TIME type, instead got " + dateType.getExprType()); } String snakeCaseName = timeFormat.getSnakeCaseName(); if (snakeCaseName != null && !snakeCaseName.isEmpty()) { OpenSearchDateType dateType = OpenSearchDateType.of(snakeCaseName); - assertSame(dateType.getExprType(), TIME, snakeCaseName - + " does not format to a TIME type, instead got " + dateType.getExprType()); + assertSame( + dateType.getExprType(), + TIME, + snakeCaseName + " does not format to a TIME type, instead got " + dateType.getExprType()); } else { fail(); } @@ -237,8 +247,7 @@ private static Stream get_format_combinations_for_test() { // D - day of year, N - nano of day Arguments.of(TIMESTAMP, List.of("dd.MM.yyyy N", "uuuu:D:HH:mm"), "custom datetime"), Arguments.of(DATE, List.of("dd.MM.yyyy", "uuuu:D"), "custom date"), - Arguments.of(TIME, List.of("HH:mm", "N"), "custom time") - ); + Arguments.of(TIME, List.of("HH:mm", "N"), "custom time")); } @ParameterizedTest(name = "[{index}] {2}") @@ -258,7 +267,6 @@ public void dont_use_incorrect_format_as_custom() { @Test public void check_if_date_type_compatible() { assertTrue(isDateTypeCompatible(DATE)); - assertFalse(isDateTypeCompatible(OpenSearchDataType.of( - OpenSearchDataType.MappingType.Text))); + assertFalse(isDateTypeCompatible(OpenSearchDataType.of(OpenSearchDataType.MappingType.Text))); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValueTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValueTest.java index 4e7b33f944..fa221bc214 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValueTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValueTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.data.value; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -24,22 +23,19 @@ public void compare() { @Test public void equal() { - OpenSearchExprBinaryValue value = - new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); + OpenSearchExprBinaryValue value = new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); assertTrue(value.equal(new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="))); } @Test public void value() { - OpenSearchExprBinaryValue value = - new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); + OpenSearchExprBinaryValue value = new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); assertEquals("U29tZSBiaW5hcnkgYmxvYg==", value.value()); } @Test public void type() { - OpenSearchExprBinaryValue value = - new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); + OpenSearchExprBinaryValue value = new OpenSearchExprBinaryValue("U29tZSBiaW5hcnkgYmxvYg=="); assertEquals(OpenSearchBinaryType.of(), value.type()); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngineTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngineTest.java index 330793a5d6..739b70b1b8 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngineTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/OpenSearchExecutionEngineTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor; import static com.google.common.collect.ImmutableMap.of; @@ -73,12 +72,12 @@ class OpenSearchExecutionEngineTest { @BeforeEach void setUp() { doAnswer( - invocation -> { - // Run task immediately - Runnable task = invocation.getArgument(0); - task.run(); - return null; - }) + invocation -> { + // Run task immediately + Runnable task = invocation.getArgument(0); + task.run(); + return null; + }) .when(client) .schedule(any()); } @@ -91,22 +90,22 @@ void execute_successfully() { FakePhysicalPlan plan = new FakePhysicalPlan(expected.iterator()); when(protector.protect(plan)).thenReturn(plan); - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); List actual = new ArrayList<>(); executor.execute( plan, - new ResponseListener<>() { - @Override - public void onResponse(QueryResponse response) { - actual.addAll(response.getResults()); - } - - @Override - public void onFailure(Exception e) { - fail("Error occurred during execution", e); - } - }); + new ResponseListener<>() { + @Override + public void onResponse(QueryResponse response) { + actual.addAll(response.getResults()); + } + + @Override + public void onFailure(Exception e) { + fail("Error occurred during execution", e); + } + }); assertTrue(plan.hasOpen); assertEquals(expected, actual); @@ -121,23 +120,23 @@ void execute_with_cursor() { var plan = new FakePhysicalPlan(expected.iterator()); when(protector.protect(plan)).thenReturn(plan); - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); List actual = new ArrayList<>(); executor.execute( plan, - new ResponseListener<>() { - @Override - public void onResponse(QueryResponse response) { - actual.addAll(response.getResults()); - assertTrue(response.getCursor().toString().startsWith("n:")); - } - - @Override - public void onFailure(Exception e) { - fail("Error occurred during execution", e); - } - }); + new ResponseListener<>() { + @Override + public void onResponse(QueryResponse response) { + actual.addAll(response.getResults()); + assertTrue(response.getCursor().toString().startsWith("n:")); + } + + @Override + public void onFailure(Exception e) { + fail("Error occurred during execution", e); + } + }); assertEquals(expected, actual); } @@ -149,78 +148,84 @@ void execute_with_failure() { when(plan.hasNext()).thenThrow(expected); when(protector.protect(plan)).thenReturn(plan); - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); AtomicReference actual = new AtomicReference<>(); executor.execute( plan, - new ResponseListener<>() { - @Override - public void onResponse(QueryResponse response) { - fail("Expected error didn't happen"); - } - - @Override - public void onFailure(Exception e) { - actual.set(e); - } - }); + new ResponseListener<>() { + @Override + public void onResponse(QueryResponse response) { + fail("Expected error didn't happen"); + } + + @Override + public void onFailure(Exception e) { + actual.set(e); + } + }); assertEquals(expected, actual.get()); verify(plan).close(); } @Test void explain_successfully() { - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); Settings settings = mock(Settings.class); - when(settings.getSettingValue(SQL_CURSOR_KEEP_ALIVE)) - .thenReturn(TimeValue.timeValueMinutes(1)); + when(settings.getSettingValue(SQL_CURSOR_KEEP_ALIVE)).thenReturn(TimeValue.timeValueMinutes(1)); OpenSearchExprValueFactory exprValueFactory = mock(OpenSearchExprValueFactory.class); final var name = new OpenSearchRequest.IndexName("test"); final int defaultQuerySize = 100; final int maxResultWindow = 10000; final var requestBuilder = new OpenSearchRequestBuilder(defaultQuerySize, exprValueFactory); - PhysicalPlan plan = new OpenSearchIndexScan(mock(OpenSearchClient.class), - maxResultWindow, requestBuilder.build(name, maxResultWindow, - settings.getSettingValue(SQL_CURSOR_KEEP_ALIVE))); + PhysicalPlan plan = + new OpenSearchIndexScan( + mock(OpenSearchClient.class), + maxResultWindow, + requestBuilder.build( + name, maxResultWindow, settings.getSettingValue(SQL_CURSOR_KEEP_ALIVE))); AtomicReference result = new AtomicReference<>(); - executor.explain(plan, new ResponseListener<>() { - @Override - public void onResponse(ExplainResponse response) { - result.set(response); - } - - @Override - public void onFailure(Exception e) { - fail(e); - } - }); + executor.explain( + plan, + new ResponseListener<>() { + @Override + public void onResponse(ExplainResponse response) { + result.set(response); + } + + @Override + public void onFailure(Exception e) { + fail(e); + } + }); assertNotNull(result.get()); } @Test void explain_with_failure() { - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); PhysicalPlan plan = mock(PhysicalPlan.class); when(plan.accept(any(), any())).thenThrow(IllegalStateException.class); AtomicReference result = new AtomicReference<>(); - executor.explain(plan, new ResponseListener<>() { - @Override - public void onResponse(ExplainResponse response) { - fail("Should fail as expected"); - } - - @Override - public void onFailure(Exception e) { - result.set(e); - } - }); + executor.explain( + plan, + new ResponseListener<>() { + @Override + public void onResponse(ExplainResponse response) { + fail("Should fail as expected"); + } + + @Override + public void onFailure(Exception e) { + result.set(e); + } + }); assertNotNull(result.get()); } @@ -234,8 +239,8 @@ void call_add_split_and_open_in_order() { when(protector.protect(plan)).thenReturn(plan); when(executionContext.getSplit()).thenReturn(Optional.of(split)); - OpenSearchExecutionEngine executor = new OpenSearchExecutionEngine(client, protector, - new PlanSerializer(null)); + OpenSearchExecutionEngine executor = + new OpenSearchExecutionEngine(client, protector, new PlanSerializer(null)); List actual = new ArrayList<>(); executor.execute( plan, @@ -266,12 +271,10 @@ private static class FakePhysicalPlan extends TableScanOperator implements Seria private boolean hasSplit; @Override - public void readExternal(ObjectInput in) { - } + public void readExternal(ObjectInput in) {} @Override - public void writeExternal(ObjectOutput out) { - } + public void writeExternal(ObjectOutput out) {} @Override public void open() { diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtectorTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtectorTest.java index 8dc49aad01..f028f3ea5d 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtectorTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/NoopExecutionProtectorTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor.protector; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,8 +16,7 @@ @ExtendWith(MockitoExtension.class) class NoopExecutionProtectorTest { - @Mock - private PhysicalPlan plan; + @Mock private PhysicalPlan plan; @Test void protect() { diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtectorTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtectorTest.java index fd5e747b5f..b2dc042110 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtectorTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/executor/protector/OpenSearchExecutionProtectorTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.executor.protector; import static java.util.Collections.emptyList; @@ -74,17 +73,13 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class OpenSearchExecutionProtectorTest { - @Mock - private OpenSearchClient client; + @Mock private OpenSearchClient client; - @Mock - private ResourceMonitor resourceMonitor; + @Mock private ResourceMonitor resourceMonitor; - @Mock - private OpenSearchExprValueFactory exprValueFactory; + @Mock private OpenSearchExprValueFactory exprValueFactory; - @Mock - private OpenSearchSettings settings; + @Mock private OpenSearchSettings settings; private OpenSearchExecutionProtector executionProtector; @@ -106,8 +101,7 @@ void test_protect_indexScan() { Expression filterExpr = literal(ExprBooleanValue.of(true)); List groupByExprs = List.of(named("age", ref("age", INTEGER))); List aggregators = - List.of(named("avg(age)", new AvgAggregator(List.of(ref("age", INTEGER)), - DOUBLE))); + List.of(named("avg(age)", new AvgAggregator(List.of(ref("age", INTEGER)), DOUBLE))); Map mappings = ImmutableMap.of(ref("name", STRING), ref("lastname", STRING)); Pair newEvalField = @@ -118,9 +112,12 @@ void test_protect_indexScan() { Integer offset = 10; final var name = new OpenSearchRequest.IndexName(indexName); - final var request = new OpenSearchRequestBuilder(querySizeLimit, exprValueFactory) - .build(name, maxResultWindow, - settings.getSettingValue(Settings.Key.SQL_CURSOR_KEEP_ALIVE)); + final var request = + new OpenSearchRequestBuilder(querySizeLimit, exprValueFactory) + .build( + name, + maxResultWindow, + settings.getSettingValue(Settings.Key.SQL_CURSOR_KEEP_ALIVE)); assertEquals( PhysicalPlanDSL.project( PhysicalPlanDSL.limit( @@ -134,8 +131,8 @@ void test_protect_indexScan() { PhysicalPlanDSL.agg( filter( resourceMonitor( - new OpenSearchIndexScan(client, - maxResultWindow, request)), + new OpenSearchIndexScan( + client, maxResultWindow, request)), filterExpr), aggregators, groupByExprs), @@ -161,8 +158,8 @@ void test_protect_indexScan() { PhysicalPlanDSL.rename( PhysicalPlanDSL.agg( filter( - new OpenSearchIndexScan(client, - maxResultWindow, request), + new OpenSearchIndexScan( + client, maxResultWindow, request), filterExpr), aggregators, groupByExprs), @@ -189,21 +186,9 @@ void test_protect_sort_for_windowOperator() { new WindowDefinition(emptyList(), ImmutableList.of(sortItem)); assertEquals( - window( - resourceMonitor( - sort( - values(emptyList()), - sortItem)), - rank, - windowDefinition), + window(resourceMonitor(sort(values(emptyList()), sortItem)), rank, windowDefinition), executionProtector.protect( - window( - sort( - values(emptyList()), - sortItem - ), - rank, - windowDefinition))); + window(sort(values(emptyList()), sortItem), rank, windowDefinition))); } @Test @@ -212,16 +197,8 @@ void test_protect_windowOperator_input() { WindowDefinition windowDefinition = mock(WindowDefinition.class); assertEquals( - window( - resourceMonitor( - values()), - avg, - windowDefinition), - executionProtector.protect( - window( - values(), - avg, - windowDefinition))); + window(resourceMonitor(values()), avg, windowDefinition), + executionProtector.protect(window(values(), avg, windowDefinition))); } @SuppressWarnings("unchecked") @@ -234,20 +211,9 @@ void test_not_protect_windowOperator_input_if_already_protected() { new WindowDefinition(emptyList(), ImmutableList.of(sortItem)); assertEquals( - window( - resourceMonitor( - sort( - values(emptyList()), - sortItem)), - avg, - windowDefinition), + window(resourceMonitor(sort(values(emptyList()), sortItem)), avg, windowDefinition), executionProtector.protect( - window( - sort( - values(emptyList()), - sortItem), - avg, - windowDefinition))); + window(sort(values(emptyList()), sortItem), avg, windowDefinition))); } @Test @@ -255,85 +221,80 @@ void test_without_protection() { Expression filterExpr = literal(ExprBooleanValue.of(true)); assertEquals( - filter( - filter(null, filterExpr), - filterExpr), - executionProtector.protect( - filter( - filter(null, filterExpr), - filterExpr) - ) - ); + filter(filter(null, filterExpr), filterExpr), + executionProtector.protect(filter(filter(null, filterExpr), filterExpr))); } @Test void test_visitMLcommons() { NodeClient nodeClient = mock(NodeClient.class); MLCommonsOperator mlCommonsOperator = - new MLCommonsOperator( - values(emptyList()), "kmeans", - new HashMap() {{ - put("centroids", new Literal(3, DataType.INTEGER)); - put("iterations", new Literal(2, DataType.INTEGER)); - put("distance_type", new Literal(null, DataType.STRING)); - }}, - nodeClient - ); + new MLCommonsOperator( + values(emptyList()), + "kmeans", + new HashMap() { + { + put("centroids", new Literal(3, DataType.INTEGER)); + put("iterations", new Literal(2, DataType.INTEGER)); + put("distance_type", new Literal(null, DataType.STRING)); + } + }, + nodeClient); - assertEquals(executionProtector.doProtect(mlCommonsOperator), - executionProtector.visitMLCommons(mlCommonsOperator, null)); + assertEquals( + executionProtector.doProtect(mlCommonsOperator), + executionProtector.visitMLCommons(mlCommonsOperator, null)); } @Test void test_visitAD() { NodeClient nodeClient = mock(NodeClient.class); ADOperator adOperator = - new ADOperator( - values(emptyList()), - new HashMap() {{ - put("shingle_size", new Literal(8, DataType.INTEGER)); - put("time_decay", new Literal(0.0001, DataType.DOUBLE)); - put("time_field", new Literal(null, DataType.STRING)); - }}, - nodeClient - ); + new ADOperator( + values(emptyList()), + new HashMap() { + { + put("shingle_size", new Literal(8, DataType.INTEGER)); + put("time_decay", new Literal(0.0001, DataType.DOUBLE)); + put("time_field", new Literal(null, DataType.STRING)); + } + }, + nodeClient); - assertEquals(executionProtector.doProtect(adOperator), - executionProtector.visitAD(adOperator, null)); + assertEquals( + executionProtector.doProtect(adOperator), executionProtector.visitAD(adOperator, null)); } @Test void test_visitML() { NodeClient nodeClient = mock(NodeClient.class); MLOperator mlOperator = - new MLOperator( - values(emptyList()), - new HashMap() {{ - put("action", new Literal("train", DataType.STRING)); - put("algorithm", new Literal("rcf", DataType.STRING)); - put("shingle_size", new Literal(8, DataType.INTEGER)); - put("time_decay", new Literal(0.0001, DataType.DOUBLE)); - put("time_field", new Literal(null, DataType.STRING)); - }}, - nodeClient - ); + new MLOperator( + values(emptyList()), + new HashMap() { + { + put("action", new Literal("train", DataType.STRING)); + put("algorithm", new Literal("rcf", DataType.STRING)); + put("shingle_size", new Literal(8, DataType.INTEGER)); + put("time_decay", new Literal(0.0001, DataType.DOUBLE)); + put("time_field", new Literal(null, DataType.STRING)); + } + }, + nodeClient); - assertEquals(executionProtector.doProtect(mlOperator), - executionProtector.visitML(mlOperator, null)); + assertEquals( + executionProtector.doProtect(mlOperator), executionProtector.visitML(mlOperator, null)); } @Test void test_visitNested() { Set args = Set.of("message.info"); - Map> groupedFieldsByPath = - Map.of("message", List.of("message.info")); + Map> groupedFieldsByPath = Map.of("message", List.of("message.info")); NestedOperator nestedOperator = - new NestedOperator( - values(emptyList()), - args, - groupedFieldsByPath); + new NestedOperator(values(emptyList()), args, groupedFieldsByPath); - assertEquals(executionProtector.doProtect(nestedOperator), + assertEquals( + executionProtector.doProtect(nestedOperator), executionProtector.visitNested(nestedOperator, values(emptyList()))); } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorTest.java index 20d2f633dd..e6d2bac85b 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLCommonsOperatorTest.java @@ -52,60 +52,60 @@ @MockitoSettings(strictness = Strictness.LENIENT) @RunWith(MockitoJUnitRunner.Silent.class) public class MLCommonsOperatorTest { - @Mock - private PhysicalPlan input; + @Mock private PhysicalPlan input; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private NodeClient nodeClient; private MLCommonsOperator mlCommonsOperator; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private MachineLearningNodeClient machineLearningNodeClient; @BeforeEach void setUp() { Map arguments = new HashMap<>(); - arguments.put("k1",AstDSL.intLiteral(3)); - arguments.put("k2",AstDSL.stringLiteral("v1")); - arguments.put("k3",AstDSL.booleanLiteral(true)); - arguments.put("k4",AstDSL.doubleLiteral(2.0D)); - arguments.put("k5",AstDSL.shortLiteral((short)2)); - arguments.put("k6",AstDSL.longLiteral(2L)); - arguments.put("k7",AstDSL.floatLiteral(2F)); - - - mlCommonsOperator = new MLCommonsOperator(input, "kmeans", arguments, - nodeClient); + arguments.put("k1", AstDSL.intLiteral(3)); + arguments.put("k2", AstDSL.stringLiteral("v1")); + arguments.put("k3", AstDSL.booleanLiteral(true)); + arguments.put("k4", AstDSL.doubleLiteral(2.0D)); + arguments.put("k5", AstDSL.shortLiteral((short) 2)); + arguments.put("k6", AstDSL.longLiteral(2L)); + arguments.put("k7", AstDSL.floatLiteral(2F)); + + mlCommonsOperator = new MLCommonsOperator(input, "kmeans", arguments, nodeClient); when(input.hasNext()).thenReturn(true).thenReturn(false); ImmutableMap.Builder resultBuilder = new ImmutableMap.Builder<>(); resultBuilder.put("k1", new ExprIntegerValue(2)); when(input.next()).thenReturn(ExprTupleValue.fromExprValueMap(resultBuilder.build())); - DataFrame dataFrame = DataFrameBuilder - .load(Collections.singletonList( - ImmutableMap.builder().put("result-k1", 2D) - .put("result-k2", 1) - .put("result-k3", "v3") - .put("result-k4", true) - .put("result-k5", (short)2) - .put("result-k6", 2L) - .put("result-k7", 2F) - .build()) - ); - MLPredictionOutput mlPredictionOutput = MLPredictionOutput.builder() + DataFrame dataFrame = + DataFrameBuilder.load( + Collections.singletonList( + ImmutableMap.builder() + .put("result-k1", 2D) + .put("result-k2", 1) + .put("result-k3", "v3") + .put("result-k4", true) + .put("result-k5", (short) 2) + .put("result-k6", 2L) + .put("result-k7", 2F) + .build())); + MLPredictionOutput mlPredictionOutput = + MLPredictionOutput.builder() .taskId("test_task_id") .status("test_status") .predictionResult(dataFrame) .build(); try (MockedStatic mlClientMockedStatic = Mockito.mockStatic(MLClient.class)) { - mlClientMockedStatic.when(() -> MLClient.getMLClient(any(NodeClient.class))) - .thenReturn(machineLearningNodeClient); - when(machineLearningNodeClient.trainAndPredict(any(MLInput.class)) - .actionGet(anyLong(), - eq(TimeUnit.SECONDS))) - .thenReturn(mlPredictionOutput); + mlClientMockedStatic + .when(() -> MLClient.getMLClient(any(NodeClient.class))) + .thenReturn(machineLearningNodeClient); + when(machineLearningNodeClient + .trainAndPredict(any(MLInput.class)) + .actionGet(anyLong(), eq(TimeUnit.SECONDS))) + .thenReturn(mlPredictionOutput); } } @@ -120,17 +120,17 @@ public void testOpen() { @Test public void testAccept() { - PhysicalPlanNodeVisitor physicalPlanNodeVisitor - = new PhysicalPlanNodeVisitor() {}; + PhysicalPlanNodeVisitor physicalPlanNodeVisitor = + new PhysicalPlanNodeVisitor() {}; assertNull(mlCommonsOperator.accept(physicalPlanNodeVisitor, null)); } @Test public void testConvertArgumentToMLParameter_UnsupportedType() { Map argument = new HashMap<>(); - argument.put("k2",AstDSL.dateLiteral("2020-10-31")); - assertThrows(IllegalArgumentException.class, () -> mlCommonsOperator - .convertArgumentToMLParameter(argument, "LINEAR_REGRESSION")); + argument.put("k2", AstDSL.dateLiteral("2020-10-31")); + assertThrows( + IllegalArgumentException.class, + () -> mlCommonsOperator.convertArgumentToMLParameter(argument, "LINEAR_REGRESSION")); } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLOperatorTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLOperatorTest.java index 7a73468391..0a3f56285f 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLOperatorTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/planner/physical/MLOperatorTest.java @@ -57,29 +57,27 @@ @MockitoSettings(strictness = Strictness.LENIENT) @RunWith(MockitoJUnitRunner.Silent.class) public class MLOperatorTest { - @Mock - private PhysicalPlan input; + @Mock private PhysicalPlan input; - @Mock - PlainActionFuture actionFuture; + @Mock PlainActionFuture actionFuture; - @Mock(answer = Answers.RETURNS_DEEP_STUBS) + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private NodeClient nodeClient; private MLOperator mlOperator; Map arguments = new HashMap<>(); - @Mock(answer = Answers.RETURNS_DEEP_STUBS) + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private MachineLearningNodeClient machineLearningNodeClient; void setUp(boolean isPredict) { - arguments.put("k1",AstDSL.intLiteral(3)); - arguments.put("k2",AstDSL.stringLiteral("v1")); - arguments.put("k3",AstDSL.booleanLiteral(true)); - arguments.put("k4",AstDSL.doubleLiteral(2.0D)); - arguments.put("k5",AstDSL.shortLiteral((short)2)); - arguments.put("k6",AstDSL.longLiteral(2L)); - arguments.put("k7",AstDSL.floatLiteral(2F)); + arguments.put("k1", AstDSL.intLiteral(3)); + arguments.put("k2", AstDSL.stringLiteral("v1")); + arguments.put("k3", AstDSL.booleanLiteral(true)); + arguments.put("k4", AstDSL.doubleLiteral(2.0D)); + arguments.put("k5", AstDSL.shortLiteral((short) 2)); + arguments.put("k6", AstDSL.longLiteral(2L)); + arguments.put("k7", AstDSL.floatLiteral(2F)); mlOperator = new MLOperator(input, arguments, nodeClient); when(input.hasNext()).thenReturn(true).thenReturn(false); @@ -87,49 +85,50 @@ void setUp(boolean isPredict) { resultBuilder.put("k1", new ExprIntegerValue(2)); when(input.next()).thenReturn(ExprTupleValue.fromExprValueMap(resultBuilder.build())); - DataFrame dataFrame = DataFrameBuilder - .load(Collections.singletonList( - ImmutableMap.builder().put("result-k1", 2D) - .put("result-k2", 1) - .put("result-k3", "v3") - .put("result-k4", true) - .put("result-k5", (short)2) - .put("result-k6", 2L) - .put("result-k7", 2F) - .build()) - ); + DataFrame dataFrame = + DataFrameBuilder.load( + Collections.singletonList( + ImmutableMap.builder() + .put("result-k1", 2D) + .put("result-k2", 1) + .put("result-k3", "v3") + .put("result-k4", true) + .put("result-k5", (short) 2) + .put("result-k6", 2L) + .put("result-k7", 2F) + .build())); MLOutput mlOutput; if (isPredict) { - mlOutput = MLPredictionOutput.builder() + mlOutput = + MLPredictionOutput.builder() .taskId("test_task_id") .status("test_status") .predictionResult(dataFrame) .build(); } else { - mlOutput = MLTrainingOutput.builder() + mlOutput = + MLTrainingOutput.builder() .taskId("test_task_id") .status("test_status") .modelId("test_model_id") .build(); } - when(actionFuture.actionGet(anyLong(), eq(TimeUnit.SECONDS))) - .thenReturn(mlOutput); - when(machineLearningNodeClient.run(any(MLInput.class), any())) - .thenReturn(actionFuture); + when(actionFuture.actionGet(anyLong(), eq(TimeUnit.SECONDS))).thenReturn(mlOutput); + when(machineLearningNodeClient.run(any(MLInput.class), any())).thenReturn(actionFuture); } void setUpPredict() { - arguments.put(ACTION,AstDSL.stringLiteral(PREDICT)); - arguments.put(ALGO,AstDSL.stringLiteral(KMEANS)); - arguments.put("modelid",AstDSL.stringLiteral("dummyID")); + arguments.put(ACTION, AstDSL.stringLiteral(PREDICT)); + arguments.put(ALGO, AstDSL.stringLiteral(KMEANS)); + arguments.put("modelid", AstDSL.stringLiteral("dummyID")); setUp(true); } void setUpTrain() { - arguments.put(ACTION,AstDSL.stringLiteral(TRAIN)); - arguments.put(ALGO,AstDSL.stringLiteral(KMEANS)); + arguments.put(ACTION, AstDSL.stringLiteral(TRAIN)); + arguments.put(ALGO, AstDSL.stringLiteral(KMEANS)); setUp(false); } @@ -162,10 +161,9 @@ public void testAccept() { setUpPredict(); try (MockedStatic mlClientMockedStatic = Mockito.mockStatic(MLClient.class)) { when(MLClient.getMLClient(any(NodeClient.class))).thenReturn(machineLearningNodeClient); - PhysicalPlanNodeVisitor physicalPlanNodeVisitor - = new PhysicalPlanNodeVisitor() {}; + PhysicalPlanNodeVisitor physicalPlanNodeVisitor = + new PhysicalPlanNodeVisitor() {}; assertNull(mlOperator.accept(physicalPlanNodeVisitor, null)); } } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequestTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequestTest.java index a720c2a266..8f954b68b2 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequestTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchCatIndicesRequestTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.request.system; import static org.hamcrest.MatcherAssert.assertThat; @@ -25,8 +24,7 @@ @ExtendWith(MockitoExtension.class) class OpenSearchCatIndicesRequestTest { - @Mock - private OpenSearchClient client; + @Mock private OpenSearchClient client; @Test void testSearch() { @@ -34,14 +32,12 @@ void testSearch() { final List results = new OpenSearchCatIndicesRequest(client).search(); assertEquals(1, results.size()); - assertThat(results.get(0).tupleValue(), anyOf( - hasEntry("TABLE_NAME", stringValue("index")) - )); + assertThat(results.get(0).tupleValue(), anyOf(hasEntry("TABLE_NAME", stringValue("index")))); } @Test void testToString() { - assertEquals("OpenSearchCatIndicesRequest{}", - new OpenSearchCatIndicesRequest(client).toString()); + assertEquals( + "OpenSearchCatIndicesRequest{}", new OpenSearchCatIndicesRequest(client).toString()); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequestTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequestTest.java index c19b3a3ccd..59ece9bfbc 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequestTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequestTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.request.system; import static org.hamcrest.MatcherAssert.assertThat; @@ -28,46 +27,47 @@ @ExtendWith(MockitoExtension.class) class OpenSearchDescribeIndexRequestTest { - @Mock - private OpenSearchClient client; + @Mock private OpenSearchClient client; - @Mock - private IndexMapping mapping; + @Mock private IndexMapping mapping; @Test void testSearch() { - when(mapping.getFieldMappings()).thenReturn( - Map.of("name", OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); + when(mapping.getFieldMappings()) + .thenReturn(Map.of("name", OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); when(client.getIndexMappings("index")).thenReturn(ImmutableMap.of("test", mapping)); final List results = new OpenSearchDescribeIndexRequest(client, "index").search(); assertEquals(1, results.size()); - assertThat(results.get(0).tupleValue(), anyOf( - hasEntry("TABLE_NAME", stringValue("index")), - hasEntry("COLUMN_NAME", stringValue("name")), - hasEntry("TYPE_NAME", stringValue("STRING")) - )); + assertThat( + results.get(0).tupleValue(), + anyOf( + hasEntry("TABLE_NAME", stringValue("index")), + hasEntry("COLUMN_NAME", stringValue("name")), + hasEntry("TYPE_NAME", stringValue("STRING")))); } @Test void testCrossClusterShouldSearchLocal() { - when(mapping.getFieldMappings()).thenReturn( - Map.of("name", OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); + when(mapping.getFieldMappings()) + .thenReturn(Map.of("name", OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))); when(client.getIndexMappings("index")).thenReturn(ImmutableMap.of("test", mapping)); final List results = new OpenSearchDescribeIndexRequest(client, "ccs:index").search(); assertEquals(1, results.size()); - assertThat(results.get(0).tupleValue(), anyOf( - hasEntry("TABLE_NAME", stringValue("index")), - hasEntry("COLUMN_NAME", stringValue("name")), - hasEntry("TYPE_NAME", stringValue("STRING")) - )); + assertThat( + results.get(0).tupleValue(), + anyOf( + hasEntry("TABLE_NAME", stringValue("index")), + hasEntry("COLUMN_NAME", stringValue("name")), + hasEntry("TYPE_NAME", stringValue("STRING")))); } @Test void testToString() { - assertEquals("OpenSearchDescribeIndexRequest{indexName='index'}", + assertEquals( + "OpenSearchDescribeIndexRequest{indexName='index'}", new OpenSearchDescribeIndexRequest(client, "index").toString()); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/AggregationResponseUtils.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/AggregationResponseUtils.java index bbc462e980..76148b9395 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/AggregationResponseUtils.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/AggregationResponseUtils.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response; import com.fasterxml.jackson.core.JsonFactory; @@ -52,37 +51,45 @@ public class AggregationResponseUtils { private static final List entryList = - new ImmutableMap.Builder>().put( - MinAggregationBuilder.NAME, (p, c) -> ParsedMin.fromXContent(p, (String) c)) - .put(MaxAggregationBuilder.NAME, (p, c) -> ParsedMax.fromXContent(p, (String) c)) - .put(SumAggregationBuilder.NAME, (p, c) -> ParsedSum.fromXContent(p, (String) c)) - .put(AvgAggregationBuilder.NAME, (p, c) -> ParsedAvg.fromXContent(p, (String) c)) - .put(ExtendedStatsAggregationBuilder.NAME, - (p, c) -> ParsedExtendedStats.fromXContent(p, (String) c)) - .put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c)) - .put(LongTerms.NAME, (p, c) -> ParsedLongTerms.fromXContent(p, (String) c)) - .put(DoubleTerms.NAME, (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c)) - .put(ValueCountAggregationBuilder.NAME, - (p, c) -> ParsedValueCount.fromXContent(p, (String) c)) - .put(PercentilesBucketPipelineAggregationBuilder.NAME, - (p, c) -> ParsedPercentilesBucket.fromXContent(p, (String) c)) - .put(DateHistogramAggregationBuilder.NAME, - (p, c) -> ParsedDateHistogram.fromXContent(p, (String) c)) - .put(HistogramAggregationBuilder.NAME, - (p, c) -> ParsedHistogram.fromXContent(p, (String) c)) - .put(CompositeAggregationBuilder.NAME, - (p, c) -> ParsedComposite.fromXContent(p, (String) c)) - .put(FilterAggregationBuilder.NAME, - (p, c) -> ParsedFilter.fromXContent(p, (String) c)) - .put(TopHitsAggregationBuilder.NAME, - (p, c) -> ParsedTopHits.fromXContent(p, (String) c)) - .build() - .entrySet() - .stream() - .map(entry -> new NamedXContentRegistry.Entry(Aggregation.class, - new ParseField(entry.getKey()), - entry.getValue())) - .collect(Collectors.toList()); + new ImmutableMap.Builder>() + .put(MinAggregationBuilder.NAME, (p, c) -> ParsedMin.fromXContent(p, (String) c)) + .put(MaxAggregationBuilder.NAME, (p, c) -> ParsedMax.fromXContent(p, (String) c)) + .put(SumAggregationBuilder.NAME, (p, c) -> ParsedSum.fromXContent(p, (String) c)) + .put(AvgAggregationBuilder.NAME, (p, c) -> ParsedAvg.fromXContent(p, (String) c)) + .put( + ExtendedStatsAggregationBuilder.NAME, + (p, c) -> ParsedExtendedStats.fromXContent(p, (String) c)) + .put(StringTerms.NAME, (p, c) -> ParsedStringTerms.fromXContent(p, (String) c)) + .put(LongTerms.NAME, (p, c) -> ParsedLongTerms.fromXContent(p, (String) c)) + .put(DoubleTerms.NAME, (p, c) -> ParsedDoubleTerms.fromXContent(p, (String) c)) + .put( + ValueCountAggregationBuilder.NAME, + (p, c) -> ParsedValueCount.fromXContent(p, (String) c)) + .put( + PercentilesBucketPipelineAggregationBuilder.NAME, + (p, c) -> ParsedPercentilesBucket.fromXContent(p, (String) c)) + .put( + DateHistogramAggregationBuilder.NAME, + (p, c) -> ParsedDateHistogram.fromXContent(p, (String) c)) + .put( + HistogramAggregationBuilder.NAME, + (p, c) -> ParsedHistogram.fromXContent(p, (String) c)) + .put( + CompositeAggregationBuilder.NAME, + (p, c) -> ParsedComposite.fromXContent(p, (String) c)) + .put( + FilterAggregationBuilder.NAME, (p, c) -> ParsedFilter.fromXContent(p, (String) c)) + .put( + TopHitsAggregationBuilder.NAME, + (p, c) -> ParsedTopHits.fromXContent(p, (String) c)) + .build() + .entrySet() + .stream() + .map( + entry -> + new NamedXContentRegistry.Entry( + Aggregation.class, new ParseField(entry.getKey()), entry.getValue())) + .collect(Collectors.toList()); private static final NamedXContentRegistry namedXContentRegistry = new NamedXContentRegistry(entryList); @@ -94,10 +101,11 @@ public class AggregationResponseUtils { */ public static Aggregations fromJson(String json) { try { - XContentParser contentParser = new JsonXContentParser( - namedXContentRegistry, - LoggingDeprecationHandler.INSTANCE, - new JsonFactory().createParser(json)); + XContentParser contentParser = + new JsonXContentParser( + namedXContentRegistry, + LoggingDeprecationHandler.INSTANCE, + new JsonFactory().createParser(json)); contentParser.nextToken(); return Aggregations.fromXContent(contentParser); } catch (IOException e) { diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java index 318110bdde..1a15e57c55 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response; import static org.hamcrest.MatcherAssert.assertThat; @@ -34,127 +33,116 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class OpenSearchAggregationResponseParserTest { - /** - * SELECT MAX(age) as max FROM accounts. - */ + /** SELECT MAX(age) as max FROM accounts. */ @Test void no_bucket_one_metric_should_pass() { - String response = "{\n" - + " \"max#max\": {\n" - + " \"value\": 40\n" - + " }\n" - + "}"; - NoBucketAggregationParser parser = new NoBucketAggregationParser( - new SingleValueParser("max") - ); + String response = "{\n" + " \"max#max\": {\n" + " \"value\": 40\n" + " }\n" + "}"; + NoBucketAggregationParser parser = new NoBucketAggregationParser(new SingleValueParser("max")); assertThat(parse(parser, response), contains(entry("max", 40d))); } - /** - * SELECT MAX(age) as max, MIN(age) as min FROM accounts. - */ + /** SELECT MAX(age) as max, MIN(age) as min FROM accounts. */ @Test void no_bucket_two_metric_should_pass() { - String response = "{\n" - + " \"max#max\": {\n" - + " \"value\": 40\n" - + " },\n" - + " \"min#min\": {\n" - + " \"value\": 20\n" - + " }\n" - + "}"; - NoBucketAggregationParser parser = new NoBucketAggregationParser( - new SingleValueParser("max"), - new SingleValueParser("min") - ); - assertThat(parse(parser, response), - contains(entry("max", 40d,"min", 20d))); + String response = + "{\n" + + " \"max#max\": {\n" + + " \"value\": 40\n" + + " },\n" + + " \"min#min\": {\n" + + " \"value\": 20\n" + + " }\n" + + "}"; + NoBucketAggregationParser parser = + new NoBucketAggregationParser(new SingleValueParser("max"), new SingleValueParser("min")); + assertThat(parse(parser, response), contains(entry("max", 40d, "min", 20d))); } @Test void one_bucket_one_metric_should_pass() { - String response = "{\n" - + " \"composite#composite_buckets\": {\n" - + " \"after_key\": {\n" - + " \"type\": \"sale\"\n" - + " },\n" - + " \"buckets\": [\n" - + " {\n" - + " \"key\": {\n" - + " \"type\": \"cost\"\n" - + " },\n" - + " \"doc_count\": 2,\n" - + " \"avg#avg\": {\n" - + " \"value\": 20\n" - + " }\n" - + " },\n" - + " {\n" - + " \"key\": {\n" - + " \"type\": \"sale\"\n" - + " },\n" - + " \"doc_count\": 2,\n" - + " \"avg#avg\": {\n" - + " \"value\": 105\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + "}"; + String response = + "{\n" + + " \"composite#composite_buckets\": {\n" + + " \"after_key\": {\n" + + " \"type\": \"sale\"\n" + + " },\n" + + " \"buckets\": [\n" + + " {\n" + + " \"key\": {\n" + + " \"type\": \"cost\"\n" + + " },\n" + + " \"doc_count\": 2,\n" + + " \"avg#avg\": {\n" + + " \"value\": 20\n" + + " }\n" + + " },\n" + + " {\n" + + " \"key\": {\n" + + " \"type\": \"sale\"\n" + + " },\n" + + " \"doc_count\": 2,\n" + + " \"avg#avg\": {\n" + + " \"value\": 105\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; - OpenSearchAggregationResponseParser parser = new CompositeAggregationParser( - new SingleValueParser("avg")); - assertThat(parse(parser, response), - containsInAnyOrder(ImmutableMap.of("type", "cost", "avg", 20d), + OpenSearchAggregationResponseParser parser = + new CompositeAggregationParser(new SingleValueParser("avg")); + assertThat( + parse(parser, response), + containsInAnyOrder( + ImmutableMap.of("type", "cost", "avg", 20d), ImmutableMap.of("type", "sale", "avg", 105d))); } @Test void two_bucket_one_metric_should_pass() { - String response = "{\n" - + " \"composite#composite_buckets\": {\n" - + " \"after_key\": {\n" - + " \"type\": \"sale\",\n" - + " \"region\": \"us\"\n" - + " },\n" - + " \"buckets\": [\n" - + " {\n" - + " \"key\": {\n" - + " \"type\": \"cost\",\n" - + " \"region\": \"us\"\n" - + " },\n" - + " \"avg#avg\": {\n" - + " \"value\": 20\n" - + " }\n" - + " },\n" - + " {\n" - + " \"key\": {\n" - + " \"type\": \"sale\",\n" - + " \"region\": \"uk\"\n" - + " },\n" - + " \"avg#avg\": {\n" - + " \"value\": 130\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + "}"; - OpenSearchAggregationResponseParser parser = new CompositeAggregationParser( - new SingleValueParser("avg")); - assertThat(parse(parser, response), - containsInAnyOrder(ImmutableMap.of("type", "cost", "region", "us", "avg", 20d), + String response = + "{\n" + + " \"composite#composite_buckets\": {\n" + + " \"after_key\": {\n" + + " \"type\": \"sale\",\n" + + " \"region\": \"us\"\n" + + " },\n" + + " \"buckets\": [\n" + + " {\n" + + " \"key\": {\n" + + " \"type\": \"cost\",\n" + + " \"region\": \"us\"\n" + + " },\n" + + " \"avg#avg\": {\n" + + " \"value\": 20\n" + + " }\n" + + " },\n" + + " {\n" + + " \"key\": {\n" + + " \"type\": \"sale\",\n" + + " \"region\": \"uk\"\n" + + " },\n" + + " \"avg#avg\": {\n" + + " \"value\": 130\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + OpenSearchAggregationResponseParser parser = + new CompositeAggregationParser(new SingleValueParser("avg")); + assertThat( + parse(parser, response), + containsInAnyOrder( + ImmutableMap.of("type", "cost", "region", "us", "avg", 20d), ImmutableMap.of("type", "sale", "region", "uk", "avg", 130d))); } @Test void unsupported_aggregation_should_fail() { - String response = "{\n" - + " \"date_histogram#date_histogram\": {\n" - + " \"value\": 40\n" - + " }\n" - + "}"; - NoBucketAggregationParser parser = new NoBucketAggregationParser( - new SingleValueParser("max") - ); + String response = + "{\n" + " \"date_histogram#date_histogram\": {\n" + " \"value\": 40\n" + " }\n" + "}"; + NoBucketAggregationParser parser = new NoBucketAggregationParser(new SingleValueParser("max")); RuntimeException exception = assertThrows(RuntimeException.class, () -> parse(parser, response)); assertEquals( @@ -170,14 +158,15 @@ void nan_value_should_return_null() { @Test void filter_aggregation_should_pass() { - String response = "{\n" - + " \"filter#filtered\" : {\n" - + " \"doc_count\" : 3,\n" - + " \"avg#filtered\" : {\n" - + " \"value\" : 37.0\n" - + " }\n" - + " }\n" - + " }"; + String response = + "{\n" + + " \"filter#filtered\" : {\n" + + " \"doc_count\" : 3,\n" + + " \"avg#filtered\" : {\n" + + " \"value\" : 37.0\n" + + " }\n" + + " }\n" + + " }"; OpenSearchAggregationResponseParser parser = new NoBucketAggregationParser( FilterParser.builder() @@ -189,132 +178,134 @@ void filter_aggregation_should_pass() { @Test void filter_aggregation_group_by_should_pass() { - String response = "{\n" - + " \"composite#composite_buckets\":{\n" - + " \"after_key\":{\n" - + " \"gender\":\"m\"\n" - + " },\n" - + " \"buckets\":[\n" - + " {\n" - + " \"key\":{\n" - + " \"gender\":\"f\"\n" - + " },\n" - + " \"doc_count\":3,\n" - + " \"filter#filter\":{\n" - + " \"doc_count\":1,\n" - + " \"avg#avg\":{\n" - + " \"value\":39.0\n" - + " }\n" - + " }\n" - + " },\n" - + " {\n" - + " \"key\":{\n" - + " \"gender\":\"m\"\n" - + " },\n" - + " \"doc_count\":4,\n" - + " \"filter#filter\":{\n" - + " \"doc_count\":2,\n" - + " \"avg#avg\":{\n" - + " \"value\":36.0\n" - + " }\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + "}"; - OpenSearchAggregationResponseParser parser = new CompositeAggregationParser( - FilterParser.builder() - .name("filter") - .metricsParser(new SingleValueParser("avg")) - .build() - ); - assertThat(parse(parser, response), containsInAnyOrder( - entry("gender", "f", "avg", 39.0), - entry("gender", "m", "avg", 36.0))); + String response = + "{\n" + + " \"composite#composite_buckets\":{\n" + + " \"after_key\":{\n" + + " \"gender\":\"m\"\n" + + " },\n" + + " \"buckets\":[\n" + + " {\n" + + " \"key\":{\n" + + " \"gender\":\"f\"\n" + + " },\n" + + " \"doc_count\":3,\n" + + " \"filter#filter\":{\n" + + " \"doc_count\":1,\n" + + " \"avg#avg\":{\n" + + " \"value\":39.0\n" + + " }\n" + + " }\n" + + " },\n" + + " {\n" + + " \"key\":{\n" + + " \"gender\":\"m\"\n" + + " },\n" + + " \"doc_count\":4,\n" + + " \"filter#filter\":{\n" + + " \"doc_count\":2,\n" + + " \"avg#avg\":{\n" + + " \"value\":36.0\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + OpenSearchAggregationResponseParser parser = + new CompositeAggregationParser( + FilterParser.builder() + .name("filter") + .metricsParser(new SingleValueParser("avg")) + .build()); + assertThat( + parse(parser, response), + containsInAnyOrder(entry("gender", "f", "avg", 39.0), entry("gender", "m", "avg", 36.0))); } - /** - * SELECT MAX(age) as max, STDDEV(age) as min FROM accounts. - */ + /** SELECT MAX(age) as max, STDDEV(age) as min FROM accounts. */ @Test void no_bucket_max_and_extended_stats() { - String response = "{\n" - + " \"extended_stats#esField\": {\n" - + " \"count\": 2033,\n" - + " \"min\": 0,\n" - + " \"max\": 360,\n" - + " \"avg\": 45.47958681751107,\n" - + " \"sum\": 92460,\n" - + " \"sum_of_squares\": 22059450,\n" - + " \"variance\": 8782.295820390027,\n" - + " \"variance_population\": 8782.295820390027,\n" - + " \"variance_sampling\": 8786.61781636463,\n" - + " \"std_deviation\": 93.71390409320287,\n" - + " \"std_deviation_population\": 93.71390409320287,\n" - + " \"std_deviation_sampling\": 93.73696078049805,\n" - + " \"std_deviation_bounds\": {\n" - + " \"upper\": 232.9073950039168,\n" - + " \"lower\": -141.94822136889468,\n" - + " \"upper_population\": 232.9073950039168,\n" - + " \"lower_population\": -141.94822136889468,\n" - + " \"upper_sampling\": 232.95350837850717,\n" - + " \"lower_sampling\": -141.99433474348504\n" - + " }\n" - + " },\n" - + " \"max#maxField\": {\n" - + " \"value\": 360\n" - + " }\n" - + "}"; + String response = + "{\n" + + " \"extended_stats#esField\": {\n" + + " \"count\": 2033,\n" + + " \"min\": 0,\n" + + " \"max\": 360,\n" + + " \"avg\": 45.47958681751107,\n" + + " \"sum\": 92460,\n" + + " \"sum_of_squares\": 22059450,\n" + + " \"variance\": 8782.295820390027,\n" + + " \"variance_population\": 8782.295820390027,\n" + + " \"variance_sampling\": 8786.61781636463,\n" + + " \"std_deviation\": 93.71390409320287,\n" + + " \"std_deviation_population\": 93.71390409320287,\n" + + " \"std_deviation_sampling\": 93.73696078049805,\n" + + " \"std_deviation_bounds\": {\n" + + " \"upper\": 232.9073950039168,\n" + + " \"lower\": -141.94822136889468,\n" + + " \"upper_population\": 232.9073950039168,\n" + + " \"lower_population\": -141.94822136889468,\n" + + " \"upper_sampling\": 232.95350837850717,\n" + + " \"lower_sampling\": -141.99433474348504\n" + + " }\n" + + " },\n" + + " \"max#maxField\": {\n" + + " \"value\": 360\n" + + " }\n" + + "}"; - NoBucketAggregationParser parser = new NoBucketAggregationParser( - new SingleValueParser("maxField"), - new StatsParser(ExtendedStats::getStdDeviation, "esField") - ); - assertThat(parse(parser, response), - contains(entry("esField", 93.71390409320287, "maxField", 360D))); + NoBucketAggregationParser parser = + new NoBucketAggregationParser( + new SingleValueParser("maxField"), + new StatsParser(ExtendedStats::getStdDeviation, "esField")); + assertThat( + parse(parser, response), contains(entry("esField", 93.71390409320287, "maxField", 360D))); } @Test void top_hits_aggregation_should_pass() { - String response = "{\n" - + " \"composite#composite_buckets\": {\n" - + " \"buckets\": [\n" - + " {\n" - + " \"key\": {\n" - + " \"type\": \"take\"\n" - + " },\n" - + " \"doc_count\": 2,\n" - + " \"top_hits#take\": {\n" - + " \"hits\": {\n" - + " \"total\": { \"value\": 2, \"relation\": \"eq\" },\n" - + " \"max_score\": 1.0,\n" - + " \"hits\": [\n" - + " {\n" - + " \"_index\": \"accounts\",\n" - + " \"_id\": \"1\",\n" - + " \"_score\": 1.0,\n" - + " \"_source\": {\n" - + " \"gender\": \"m\"\n" - + " }\n" - + " },\n" - + " {\n" - + " \"_index\": \"accounts\",\n" - + " \"_id\": \"2\",\n" - + " \"_score\": 1.0,\n" - + " \"_source\": {\n" - + " \"gender\": \"f\"\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + "}"; + String response = + "{\n" + + " \"composite#composite_buckets\": {\n" + + " \"buckets\": [\n" + + " {\n" + + " \"key\": {\n" + + " \"type\": \"take\"\n" + + " },\n" + + " \"doc_count\": 2,\n" + + " \"top_hits#take\": {\n" + + " \"hits\": {\n" + + " \"total\": { \"value\": 2, \"relation\": \"eq\" },\n" + + " \"max_score\": 1.0,\n" + + " \"hits\": [\n" + + " {\n" + + " \"_index\": \"accounts\",\n" + + " \"_id\": \"1\",\n" + + " \"_score\": 1.0,\n" + + " \"_source\": {\n" + + " \"gender\": \"m\"\n" + + " }\n" + + " },\n" + + " {\n" + + " \"_index\": \"accounts\",\n" + + " \"_id\": \"2\",\n" + + " \"_score\": 1.0,\n" + + " \"_source\": {\n" + + " \"gender\": \"f\"\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; OpenSearchAggregationResponseParser parser = new CompositeAggregationParser(new TopHitsParser("take")); - assertThat(parse(parser, response), + assertThat( + parse(parser, response), contains(ImmutableMap.of("type", "take", "take", ImmutableList.of("m", "f")))); } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactoryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactoryTest.java index c3ae5d139d..eb759233a8 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactoryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageFactoryTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageTest.java index ac0d46938a..90268502c2 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/ErrorMessageTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -20,45 +19,49 @@ class ErrorMessageTest { @Test public void testToString() { ErrorMessage errorMessage = - new ErrorMessage(new IllegalStateException("illegal state"), - SERVICE_UNAVAILABLE.getStatus()); - assertEquals("{\n" - + " \"error\": {\n" - + " \"reason\": \"There was internal problem at backend\",\n" - + " \"details\": \"illegal state\",\n" - + " \"type\": \"IllegalStateException\"\n" - + " },\n" - + " \"status\": 503\n" - + "}", errorMessage.toString()); + new ErrorMessage( + new IllegalStateException("illegal state"), SERVICE_UNAVAILABLE.getStatus()); + assertEquals( + "{\n" + + " \"error\": {\n" + + " \"reason\": \"There was internal problem at backend\",\n" + + " \"details\": \"illegal state\",\n" + + " \"type\": \"IllegalStateException\"\n" + + " },\n" + + " \"status\": 503\n" + + "}", + errorMessage.toString()); } @Test public void testBadRequestToString() { ErrorMessage errorMessage = - new ErrorMessage(new IllegalStateException(), - BAD_REQUEST.getStatus()); - assertEquals("{\n" - + " \"error\": {\n" - + " \"reason\": \"Invalid Query\",\n" - + " \"details\": \"\",\n" - + " \"type\": \"IllegalStateException\"\n" - + " },\n" - + " \"status\": 400\n" - + "}", errorMessage.toString()); + new ErrorMessage(new IllegalStateException(), BAD_REQUEST.getStatus()); + assertEquals( + "{\n" + + " \"error\": {\n" + + " \"reason\": \"Invalid Query\",\n" + + " \"details\": \"\",\n" + + " \"type\": \"IllegalStateException\"\n" + + " },\n" + + " \"status\": 400\n" + + "}", + errorMessage.toString()); } @Test public void testToStringWithEmptyErrorMessage() { ErrorMessage errorMessage = - new ErrorMessage(new IllegalStateException(), - SERVICE_UNAVAILABLE.getStatus()); - assertEquals("{\n" - + " \"error\": {\n" - + " \"reason\": \"There was internal problem at backend\",\n" - + " \"details\": \"\",\n" - + " \"type\": \"IllegalStateException\"\n" - + " },\n" - + " \"status\": 503\n" - + "}", errorMessage.toString()); + new ErrorMessage(new IllegalStateException(), SERVICE_UNAVAILABLE.getStatus()); + assertEquals( + "{\n" + + " \"error\": {\n" + + " \"reason\": \"There was internal problem at backend\",\n" + + " \"details\": \"\",\n" + + " \"type\": \"IllegalStateException\"\n" + + " },\n" + + " \"status\": 503\n" + + "}", + errorMessage.toString()); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessageTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessageTest.java index 3dcb38a558..f07b5dfdd3 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessageTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/error/OpenSearchErrorMessageTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.response.error; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -21,14 +20,11 @@ @ExtendWith(MockitoExtension.class) class OpenSearchErrorMessageTest { - @Mock - private OpenSearchException openSearchException; + @Mock private OpenSearchException openSearchException; - @Mock - private SearchPhaseExecutionException searchPhaseExecutionException; + @Mock private SearchPhaseExecutionException searchPhaseExecutionException; - @Mock - private ShardSearchFailure shardSearchFailure; + @Mock private ShardSearchFailure shardSearchFailure; @Test public void fetchReason() { @@ -45,7 +41,8 @@ public void fetchDetailsWithOpenSearchException() { OpenSearchErrorMessage errorMessage = new OpenSearchErrorMessage(openSearchException, SERVICE_UNAVAILABLE.getStatus()); - assertEquals("detail error\n" + assertEquals( + "detail error\n" + "For more details, please send request for " + "Json format to see the raw response from OpenSearch engine.", errorMessage.fetchDetails()); @@ -59,9 +56,9 @@ public void fetchDetailsWithSearchPhaseExecutionException() { when(shardSearchFailure.getCause()).thenReturn(new IllegalStateException("illegal state")); OpenSearchErrorMessage errorMessage = - new OpenSearchErrorMessage(searchPhaseExecutionException, - SERVICE_UNAVAILABLE.getStatus()); - assertEquals("Shard[1]: java.lang.IllegalStateException: illegal state\n" + new OpenSearchErrorMessage(searchPhaseExecutionException, SERVICE_UNAVAILABLE.getStatus()); + assertEquals( + "Shard[1]: java.lang.IllegalStateException: illegal state\n" + "\n" + "For more details, please send request for Json format to see the " + "raw response from OpenSearch engine.", diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/OpenSearchDefaultImplementorTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/OpenSearchDefaultImplementorTest.java index 1e44345576..85d0a4e94f 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/OpenSearchDefaultImplementorTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/OpenSearchDefaultImplementorTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -23,13 +22,11 @@ @ExtendWith(MockitoExtension.class) public class OpenSearchDefaultImplementorTest { - @Mock - OpenSearchClient client; + @Mock OpenSearchClient client; @Test public void visitMachineLearning() { - LogicalMLCommons node = Mockito.mock(LogicalMLCommons.class, - Answers.RETURNS_DEEP_STUBS); + LogicalMLCommons node = Mockito.mock(LogicalMLCommons.class, Answers.RETURNS_DEEP_STUBS); Mockito.when(node.getChild().get(0)).thenReturn(Mockito.mock(LogicalPlan.class)); OpenSearchIndex.OpenSearchDefaultImplementor implementor = new OpenSearchIndex.OpenSearchDefaultImplementor(client); @@ -38,8 +35,7 @@ public void visitMachineLearning() { @Test public void visitAD() { - LogicalAD node = Mockito.mock(LogicalAD.class, - Answers.RETURNS_DEEP_STUBS); + LogicalAD node = Mockito.mock(LogicalAD.class, Answers.RETURNS_DEEP_STUBS); Mockito.when(node.getChild().get(0)).thenReturn(Mockito.mock(LogicalPlan.class)); OpenSearchIndex.OpenSearchDefaultImplementor implementor = new OpenSearchIndex.OpenSearchDefaultImplementor(client); @@ -48,11 +44,10 @@ public void visitAD() { @Test public void visitML() { - LogicalML node = Mockito.mock(LogicalML.class, - Answers.RETURNS_DEEP_STUBS); + LogicalML node = Mockito.mock(LogicalML.class, Answers.RETURNS_DEEP_STUBS); Mockito.when(node.getChild().get(0)).thenReturn(Mockito.mock(LogicalPlan.class)); OpenSearchIndex.OpenSearchDefaultImplementor implementor = - new OpenSearchIndex.OpenSearchDefaultImplementor(client); + new OpenSearchIndex.OpenSearchDefaultImplementor(client); assertNotNull(implementor.visitML(node, null)); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngineTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngineTest.java index 3d497c2f5b..63710e57aa 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngineTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/ExpressionScriptEngineTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script; import static java.util.Collections.emptyMap; @@ -34,8 +33,7 @@ @ExtendWith(MockitoExtension.class) class ExpressionScriptEngineTest { - @Mock - private ExpressionSerializer serializer; + @Mock private ExpressionSerializer serializer; private ScriptEngine scriptEngine; @@ -55,19 +53,20 @@ void should_return_custom_script_language_name() { void can_initialize_filter_script_factory_by_compiled_script() { when(serializer.deserialize("test code")).thenReturn(expression); - assertThat(scriptEngine.getSupportedContexts(), + assertThat( + scriptEngine.getSupportedContexts(), contains(FilterScript.CONTEXT, AggregationScript.CONTEXT)); - Object actualFactory = scriptEngine.compile( - "test", "test code", FilterScript.CONTEXT, emptyMap()); + Object actualFactory = + scriptEngine.compile("test", "test code", FilterScript.CONTEXT, emptyMap()); assertEquals(new ExpressionFilterScriptFactory(expression), actualFactory); } @Test void should_throw_exception_for_unsupported_script_context() { ScriptContext unknownCtx = mock(ScriptContext.class); - assertThrows(IllegalStateException.class, () -> - scriptEngine.compile("test", "test code", unknownCtx, emptyMap())); + assertThrows( + IllegalStateException.class, + () -> scriptEngine.compile("test", "test code", unknownCtx, emptyMap())); } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java index c76567c1e9..6485dce124 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/AggregationQueryBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import static org.hamcrest.MatcherAssert.assertThat; @@ -61,8 +60,7 @@ @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) @ExtendWith(MockitoExtension.class) class AggregationQueryBuilderTest { - @Mock - private ExpressionSerializer serializer; + @Mock private ExpressionSerializer serializer; private AggregationQueryBuilder queryBuilder; @@ -73,31 +71,32 @@ void set_up() { @Test void should_build_composite_aggregation_for_field_reference() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"name\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"name\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"name\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"name\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), @@ -106,388 +105,415 @@ void should_build_composite_aggregation_for_field_reference() { @Test void should_build_composite_aggregation_for_field_reference_with_order() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"name\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"name\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"last\",%n" - + " \"order\" : \"desc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"name\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"name\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"last\",%n" + + " \"order\" : \"desc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), Arrays.asList(named("name", ref("name", STRING))), - sort(ref("name", STRING), Sort.SortOption.DEFAULT_DESC) - )); + sort(ref("name", STRING), Sort.SortOption.DEFAULT_DESC))); } @Test void should_build_type_mapping_for_field_reference() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), + buildTypeMapping( + Arrays.asList( + named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), Arrays.asList(named("name", ref("name", STRING)))), containsInAnyOrder( map("avg(age)", OpenSearchDataType.of(INTEGER)), - map("name", OpenSearchDataType.of(STRING)) - )); + map("name", OpenSearchDataType.of(STRING)))); } @Test void should_build_type_mapping_for_datetime_type() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(datetime)", + buildTypeMapping( + Arrays.asList( + named( + "avg(datetime)", new AvgAggregator(Arrays.asList(ref("datetime", DATETIME)), DATETIME))), Arrays.asList(named("datetime", ref("datetime", DATETIME)))), containsInAnyOrder( map("avg(datetime)", OpenSearchDateType.of(DATETIME)), - map("datetime", OpenSearchDateType.of(DATETIME)) - )); + map("datetime", OpenSearchDateType.of(DATETIME)))); } @Test void should_build_type_mapping_for_timestamp_type() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(timestamp)", + buildTypeMapping( + Arrays.asList( + named( + "avg(timestamp)", new AvgAggregator(Arrays.asList(ref("timestamp", TIMESTAMP)), TIMESTAMP))), Arrays.asList(named("timestamp", ref("timestamp", TIMESTAMP)))), containsInAnyOrder( map("avg(timestamp)", OpenSearchDateType.of()), - map("timestamp", OpenSearchDateType.of()) - )); + map("timestamp", OpenSearchDateType.of()))); } @Test void should_build_type_mapping_for_date_type() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(date)", - new AvgAggregator(Arrays.asList(ref("date", DATE)), DATE))), + buildTypeMapping( + Arrays.asList( + named("avg(date)", new AvgAggregator(Arrays.asList(ref("date", DATE)), DATE))), Arrays.asList(named("date", ref("date", DATE)))), containsInAnyOrder( map("avg(date)", OpenSearchDateType.of(DATE)), - map("date", OpenSearchDateType.of(DATE)) - )); + map("date", OpenSearchDateType.of(DATE)))); } @Test void should_build_type_mapping_for_time_type() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(time)", - new AvgAggregator(Arrays.asList(ref("time", TIME)), TIME))), + buildTypeMapping( + Arrays.asList( + named("avg(time)", new AvgAggregator(Arrays.asList(ref("time", TIME)), TIME))), Arrays.asList(named("time", ref("time", TIME)))), containsInAnyOrder( map("avg(time)", OpenSearchDateType.of(TIME)), - map("time", OpenSearchDateType.of(TIME)) - )); + map("time", OpenSearchDateType.of(TIME)))); } @Test void should_build_composite_aggregation_for_field_reference_of_keyword() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"name\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"name.keyword\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"name\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"name.keyword\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), - Arrays.asList(named("name", ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))))))); + Arrays.asList( + named( + "name", + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of( + OpenSearchDataType.MappingType.Keyword)))))))); } @Test void should_build_type_mapping_for_field_reference_of_keyword() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), + buildTypeMapping( + Arrays.asList( + named("avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))), Arrays.asList(named("name", ref("name", STRING)))), containsInAnyOrder( map("avg(age)", OpenSearchDataType.of(INTEGER)), - map("name", OpenSearchDataType.of(STRING)) - )); + map("name", OpenSearchDataType.of(STRING)))); } @Test void should_build_composite_aggregation_for_expression() { - doAnswer(invocation -> { - Expression expr = invocation.getArgument(0); - return expr.toString(); - }).when(serializer).serialize(any()); - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"age\" : {%n" - + " \"terms\" : {%n" - + " \"script\" : {%n" - + " \"source\" : \"asin(age)\",%n" - + " \"lang\" : \"opensearch_query_expression\"%n" - + " },%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(balance)\" : {%n" - + " \"avg\" : {%n" - + " \"script\" : {%n" - + " \"source\" : \"abs(balance)\",%n" - + " \"lang\" : \"opensearch_query_expression\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + doAnswer( + invocation -> { + Expression expr = invocation.getArgument(0); + return expr.toString(); + }) + .when(serializer) + .serialize(any()); + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"age\" : {%n" + + " \"terms\" : {%n" + + " \"script\" : {%n" + + " \"source\" : \"asin(age)\",%n" + + " \"lang\" : \"opensearch_query_expression\"%n" + + " },%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(balance)\" : {%n" + + " \"avg\" : {%n" + + " \"script\" : {%n" + + " \"source\" : \"abs(balance)\",%n" + + " \"lang\" : \"opensearch_query_expression\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("avg(balance)", new AvgAggregator( - Arrays.asList(DSL.abs(ref("balance", INTEGER))), INTEGER))), + named( + "avg(balance)", + new AvgAggregator(Arrays.asList(DSL.abs(ref("balance", INTEGER))), INTEGER))), Arrays.asList(named("age", DSL.asin(ref("age", INTEGER)))))); } @Test void should_build_composite_aggregation_follow_with_order_by_position() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"name\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"name\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"last\",%n" - + " \"order\" : \"desc\"%n" - + " }%n" - + " }%n" - + " }, {%n" - + " \"age\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"age\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(balance)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"balance\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"name\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"name\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"last\",%n" + + " \"order\" : \"desc\"%n" + + " }%n" + + " }%n" + + " }, {%n" + + " \"age\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"age\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(balance)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"balance\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( agg(named("avg(balance)", avg(ref("balance", INTEGER), INTEGER))), group(named("age", ref("age", INTEGER)), named("name", ref("name", STRING))), - sort(ref("name", STRING), Sort.SortOption.DEFAULT_DESC, - ref("age", INTEGER), Sort.SortOption.DEFAULT_ASC) - )); + sort( + ref("name", STRING), + Sort.SortOption.DEFAULT_DESC, + ref("age", INTEGER), + Sort.SortOption.DEFAULT_ASC))); } @Test void should_build_type_mapping_for_expression() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(balance)", new AvgAggregator( - Arrays.asList(DSL.abs(ref("balance", INTEGER))), INTEGER))), + buildTypeMapping( + Arrays.asList( + named( + "avg(balance)", + new AvgAggregator(Arrays.asList(DSL.abs(ref("balance", INTEGER))), INTEGER))), Arrays.asList(named("age", DSL.asin(ref("age", INTEGER))))), containsInAnyOrder( map("avg(balance)", OpenSearchDataType.of(INTEGER)), - map("age", OpenSearchDataType.of(DOUBLE)) - )); + map("age", OpenSearchDataType.of(DOUBLE)))); } @Test void should_build_aggregation_without_bucket() { - assertEquals(format( - "{%n" - + " \"avg(balance)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"balance\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"avg(balance)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"balance\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("avg(balance)", new AvgAggregator( - Arrays.asList(ref("balance", INTEGER)), INTEGER))), + named( + "avg(balance)", + new AvgAggregator(Arrays.asList(ref("balance", INTEGER)), INTEGER))), Collections.emptyList())); } @Test void should_build_filter_aggregation() { - assertEquals(format( - "{%n" - + " \"avg(age) filter(where age > 34)\" : {%n" - + " \"filter\" : {%n" - + " \"range\" : {%n" - + " \"age\" : {%n" - + " \"from\" : 20,%n" - + " \"to\" : null,%n" - + " \"include_lower\" : false,%n" - + " \"include_upper\" : true,%n" - + " \"boost\" : 1.0%n" - + " }%n" - + " }%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age) filter(where age > 34)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"avg(age) filter(where age > 34)\" : {%n" + + " \"filter\" : {%n" + + " \"range\" : {%n" + + " \"age\" : {%n" + + " \"from\" : 20,%n" + + " \"to\" : null,%n" + + " \"include_lower\" : false,%n" + + " \"include_upper\" : true,%n" + + " \"boost\" : 1.0%n" + + " }%n" + + " }%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age) filter(where age > 34)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( - Arrays.asList(named("avg(age) filter(where age > 34)", - new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER) - .condition(DSL.greater(ref("age", INTEGER), literal(20))))), + Arrays.asList( + named( + "avg(age) filter(where age > 34)", + new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER) + .condition(DSL.greater(ref("age", INTEGER), literal(20))))), Collections.emptyList())); } @Test void should_build_filter_aggregation_group_by() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"gender\" : {%n" - + " \"terms\" : {%n" - + " \"field\" : \"gender\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age) filter(where age > 34)\" : {%n" - + " \"filter\" : {%n" - + " \"range\" : {%n" - + " \"age\" : {%n" - + " \"from\" : 20,%n" - + " \"to\" : null,%n" - + " \"include_lower\" : false,%n" - + " \"include_upper\" : true,%n" - + " \"boost\" : 1.0%n" - + " }%n" - + " }%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"avg(age) filter(where age > 34)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"gender\" : {%n" + + " \"terms\" : {%n" + + " \"field\" : \"gender\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age) filter(where age > 34)\" : {%n" + + " \"filter\" : {%n" + + " \"range\" : {%n" + + " \"age\" : {%n" + + " \"from\" : 20,%n" + + " \"to\" : null,%n" + + " \"include_lower\" : false,%n" + + " \"include_upper\" : true,%n" + + " \"boost\" : 1.0%n" + + " }%n" + + " }%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"avg(age) filter(where age > 34)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( - Arrays.asList(named("avg(age) filter(where age > 34)", - new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER) - .condition(DSL.greater(ref("age", INTEGER), literal(20))))), + Arrays.asList( + named( + "avg(age) filter(where age > 34)", + new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER) + .condition(DSL.greater(ref("age", INTEGER), literal(20))))), Arrays.asList(named(ref("gender", OpenSearchDataType.of(STRING)))))); } @Test void should_build_type_mapping_without_bucket() { assertThat( - buildTypeMapping(Arrays.asList( - named("avg(balance)", new AvgAggregator( - Arrays.asList(ref("balance", INTEGER)), INTEGER))), + buildTypeMapping( + Arrays.asList( + named( + "avg(balance)", + new AvgAggregator(Arrays.asList(ref("balance", INTEGER)), INTEGER))), Collections.emptyList()), - containsInAnyOrder( - map("avg(balance)", OpenSearchDataType.of(INTEGER)) - )); + containsInAnyOrder(map("avg(balance)", OpenSearchDataType.of(INTEGER)))); } @Test void should_build_histogram() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"SpanExpression(field=age, value=10, unit=NONE)\" : {%n" - + " \"histogram\" : {%n" - + " \"field\" : \"age\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\",%n" - + " \"interval\" : 10.0%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(a)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"a\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"SpanExpression(field=age, value=10, unit=NONE)\" : {%n" + + " \"histogram\" : {%n" + + " \"field\" : \"age\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\",%n" + + " \"interval\" : 10.0%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(a)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"a\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), @@ -496,37 +522,38 @@ void should_build_histogram() { @Test void should_build_histogram_two_metrics() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"SpanExpression(field=age, value=10, unit=NONE)\" : {%n" - + " \"histogram\" : {%n" - + " \"field\" : \"age\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\",%n" - + " \"interval\" : 10.0%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(a)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"a\"%n" - + " }%n" - + " },%n" - + " \"avg(b)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"b\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"SpanExpression(field=age, value=10, unit=NONE)\" : {%n" + + " \"histogram\" : {%n" + + " \"field\" : \"age\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\",%n" + + " \"interval\" : 10.0%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(a)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"a\"%n" + + " }%n" + + " },%n" + + " \"avg(b)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"b\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER)), @@ -536,32 +563,33 @@ void should_build_histogram_two_metrics() { @Test void fixed_interval_time_span() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"SpanExpression(field=timestamp, value=1, unit=H)\" : {%n" - + " \"date_histogram\" : {%n" - + " \"field\" : \"timestamp\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\",%n" - + " \"fixed_interval\" : \"1h\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(a)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"a\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"SpanExpression(field=timestamp, value=1, unit=H)\" : {%n" + + " \"date_histogram\" : {%n" + + " \"field\" : \"timestamp\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\",%n" + + " \"fixed_interval\" : \"1h\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(a)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"a\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), @@ -570,32 +598,33 @@ void fixed_interval_time_span() { @Test void calendar_interval_time_span() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"SpanExpression(field=date, value=1, unit=W)\" : {%n" - + " \"date_histogram\" : {%n" - + " \"field\" : \"date\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\",%n" - + " \"calendar_interval\" : \"1w\"%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(a)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"a\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"SpanExpression(field=date, value=1, unit=W)\" : {%n" + + " \"date_histogram\" : {%n" + + " \"field\" : \"date\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\",%n" + + " \"calendar_interval\" : \"1w\"%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(a)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"a\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), @@ -604,32 +633,33 @@ void calendar_interval_time_span() { @Test void general_span() { - assertEquals(format( - "{%n" - + " \"composite_buckets\" : {%n" - + " \"composite\" : {%n" - + " \"size\" : 1000,%n" - + " \"sources\" : [ {%n" - + " \"SpanExpression(field=age, value=1, unit=NONE)\" : {%n" - + " \"histogram\" : {%n" - + " \"field\" : \"age\",%n" - + " \"missing_bucket\" : true,%n" - + " \"missing_order\" : \"first\",%n" - + " \"order\" : \"asc\",%n" - + " \"interval\" : 1.0%n" - + " }%n" - + " }%n" - + " } ]%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(a)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"a\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"composite_buckets\" : {%n" + + " \"composite\" : {%n" + + " \"size\" : 1000,%n" + + " \"sources\" : [ {%n" + + " \"SpanExpression(field=age, value=1, unit=NONE)\" : {%n" + + " \"histogram\" : {%n" + + " \"field\" : \"age\",%n" + + " \"missing_bucket\" : true,%n" + + " \"missing_order\" : \"first\",%n" + + " \"order\" : \"asc\",%n" + + " \"interval\" : 1.0%n" + + " }%n" + + " }%n" + + " } ]%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(a)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"a\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), @@ -638,15 +668,20 @@ void general_span() { @Test void invalid_unit() { - assertThrows(IllegalStateException.class, () -> buildQuery( - Arrays.asList( - named("count(a)", new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), - Arrays.asList(named(span(ref("age", INTEGER), literal(1), "invalid_unit"))))); + assertThrows( + IllegalStateException.class, + () -> + buildQuery( + Arrays.asList( + named( + "count(a)", + new CountAggregator(Arrays.asList(ref("a", INTEGER)), INTEGER))), + Arrays.asList(named(span(ref("age", INTEGER), literal(1), "invalid_unit"))))); } @SneakyThrows - private String buildQuery(List namedAggregatorList, - List groupByList) { + private String buildQuery( + List namedAggregatorList, List groupByList) { return buildQuery(namedAggregatorList, groupByList, null); } @@ -667,8 +702,7 @@ private String buildQuery( } private Set> buildTypeMapping( - List namedAggregatorList, - List groupByList) { + List namedAggregatorList, List groupByList) { return queryBuilder.buildTypeMapping(namedAggregatorList, groupByList).entrySet(); } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactoryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactoryTest.java index 38107934a0..618a9ca77a 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactoryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptFactoryTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -31,14 +30,11 @@ @ExtendWith(MockitoExtension.class) class ExpressionAggregationScriptFactoryTest { - @Mock - private SearchLookup searchLookup; + @Mock private SearchLookup searchLookup; - @Mock - private LeafSearchLookup leafSearchLookup; + @Mock private LeafSearchLookup leafSearchLookup; - @Mock - private LeafReaderContext leafReaderContext; + @Mock private LeafReaderContext leafReaderContext; private final Expression expression = DSL.literal(true); @@ -63,7 +59,6 @@ void can_initialize_expression_filter_script() throws IOException { assertEquals( new ExpressionAggregationScript(expression, searchLookup, leafReaderContext, params), - actualScript - ); + actualScript); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptTest.java index b98bc538ab..520e301301 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/ExpressionAggregationScriptTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import static java.time.temporal.ChronoUnit.MILLIS; @@ -46,21 +45,17 @@ @ExtendWith(MockitoExtension.class) class ExpressionAggregationScriptTest { - @Mock - private SearchLookup lookup; + @Mock private SearchLookup lookup; - @Mock - private LeafSearchLookup leafLookup; + @Mock private LeafSearchLookup leafLookup; - @Mock - private LeafReaderContext context; + @Mock private LeafReaderContext context; @Test void can_execute_expression_with_integer_field() { assertThat() .docValues("age", 30L) // DocValue only supports long - .evaluate( - DSL.abs(ref("age", INTEGER))) + .evaluate(DSL.abs(ref("age", INTEGER))) .shouldMatch(30); } @@ -68,8 +63,7 @@ void can_execute_expression_with_integer_field() { void can_execute_expression_with_integer_field_with_boolean_result() { assertThat() .docValues("age", 30L) // DocValue only supports long - .evaluate( - DSL.greater(ref("age", INTEGER), literal(20))) + .evaluate(DSL.greater(ref("age", INTEGER), literal(20))) .shouldMatch(true); } @@ -78,34 +72,36 @@ void can_execute_expression_with_text_keyword_field() { assertThat() .docValues("name.keyword", "John") .evaluate( - DSL.equal(ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), + DSL.equal( + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), literal("John"))) .shouldMatch(true); } @Test void can_execute_expression_with_null_field() { - assertThat() - .docValues("age", null) - .evaluate(ref("age", INTEGER)) - .shouldMatch(null); + assertThat().docValues("age", null).evaluate(ref("age", INTEGER)).shouldMatch(null); } @Test void can_execute_expression_with_missing_field() { - assertThat() - .docValues("age", 30) - .evaluate(ref("name", STRING)) - .shouldMatch(null); + assertThat().docValues("age", 30).evaluate(ref("name", STRING)).shouldMatch(null); } @Test void can_execute_parse_expression() { assertThat() .docValues("age_string", "age: 30") - .evaluate(DSL.regex(DSL.ref("age_string", STRING), DSL.literal("age: (?\\d+)"), - DSL.literal("age"))) + .evaluate( + DSL.regex( + DSL.ref("age_string", STRING), + DSL.literal("age: (?\\d+)"), + DSL.literal("age"))) .shouldMatch("30"); } @@ -113,28 +109,23 @@ void can_execute_parse_expression() { void can_execute_expression_interpret_dates_for_aggregation() { assertThat() .docValues("date", "1961-04-12") - .evaluate( - DSL.date(ref("date", STRING))) - .shouldMatch(new ExprDateValue(LocalDate.of(1961, 4, 12)) - .timestampValue().toEpochMilli()); + .evaluate(DSL.date(ref("date", STRING))) + .shouldMatch(new ExprDateValue(LocalDate.of(1961, 4, 12)).timestampValue().toEpochMilli()); } @Test void can_execute_expression_interpret_datetimes_for_aggregation() { assertThat() .docValues("datetime", "1984-03-17 22:16:42") - .evaluate( - DSL.datetime(ref("datetime", STRING))) - .shouldMatch(new ExprDatetimeValue("1984-03-17 22:16:42") - .timestampValue().toEpochMilli()); + .evaluate(DSL.datetime(ref("datetime", STRING))) + .shouldMatch(new ExprDatetimeValue("1984-03-17 22:16:42").timestampValue().toEpochMilli()); } @Test void can_execute_expression_interpret_times_for_aggregation() { assertThat() .docValues("time", "22:13:42") - .evaluate( - DSL.time(ref("time", STRING))) + .evaluate(DSL.time(ref("time", STRING))) .shouldMatch(MILLIS.between(LocalTime.MIN, LocalTime.of(22, 13, 42))); } @@ -142,10 +133,8 @@ void can_execute_expression_interpret_times_for_aggregation() { void can_execute_expression_interpret_timestamps_for_aggregation() { assertThat() .docValues("timestamp", "1984-03-17 22:16:42") - .evaluate( - DSL.timestamp(ref("timestamp", STRING))) - .shouldMatch(new ExprTimestampValue("1984-03-17 22:16:42") - .timestampValue().toEpochMilli()); + .evaluate(DSL.timestamp(ref("timestamp", STRING))) + .shouldMatch(new ExprTimestampValue("1984-03-17 22:16:42").timestampValue().toEpochMilli()); } @Test @@ -172,20 +161,20 @@ ExprScriptAssertion docValues() { } ExprScriptAssertion docValues(String name, Object value) { - LeafDocLookup leafDocLookup = mockLeafDocLookup( - ImmutableMap.of(name, new FakeScriptDocValues<>(value))); + LeafDocLookup leafDocLookup = + mockLeafDocLookup(ImmutableMap.of(name, new FakeScriptDocValues<>(value))); when(lookup.getLeafSearchLookup(any())).thenReturn(leafLookup); when(leafLookup.doc()).thenReturn(leafDocLookup); return this; } - ExprScriptAssertion docValues(String name1, Object value1, - String name2, Object value2) { - LeafDocLookup leafDocLookup = mockLeafDocLookup( - ImmutableMap.of( - name1, new FakeScriptDocValues<>(value1), - name2, new FakeScriptDocValues<>(value2))); + ExprScriptAssertion docValues(String name1, Object value1, String name2, Object value2) { + LeafDocLookup leafDocLookup = + mockLeafDocLookup( + ImmutableMap.of( + name1, new FakeScriptDocValues<>(value1), + name2, new FakeScriptDocValues<>(value2))); when(lookup.getLeafSearchLookup(any())).thenReturn(leafLookup); when(leafLookup.doc()).thenReturn(leafDocLookup); diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/GroupSortOrderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/GroupSortOrderTest.java index bff04604c1..2ab8a24d68 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/GroupSortOrderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/GroupSortOrderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -28,10 +27,12 @@ class GroupSortOrderTest { private final AggregationQueryBuilder.GroupSortOrder groupSortOrder = new AggregationQueryBuilder.GroupSortOrder( - sort(ref("name", STRING), Sort.SortOption.DEFAULT_DESC, - ref("age", INTEGER), Sort.SortOption.DEFAULT_ASC)); - @Mock - private ReferenceExpression ref; + sort( + ref("name", STRING), + Sort.SortOption.DEFAULT_DESC, + ref("age", INTEGER), + Sort.SortOption.DEFAULT_ASC)); + @Mock private ReferenceExpression ref; @Test void both_expression_in_sort_list() { diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilderTest.java index 208904d9c3..d11d7da2fe 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/BucketAggregationBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation.dsl; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -48,8 +47,7 @@ @ExtendWith(MockitoExtension.class) class BucketAggregationBuilderTest { - @Mock - private ExpressionSerializer serializer; + @Mock private ExpressionSerializer serializer; private BucketAggregationBuilder aggregationBuilder; @@ -69,9 +67,7 @@ void should_build_bucket_with_field() { + " \"order\" : \"asc\"\n" + " }\n" + "}", - buildQuery( - Arrays.asList( - asc(named("age", ref("age", INTEGER)))))); + buildQuery(Arrays.asList(asc(named("age", ref("age", INTEGER)))))); } @Test @@ -90,9 +86,7 @@ void should_build_bucket_with_literal() { + " \"order\" : \"asc\"\n" + " }\n" + "}", - buildQuery( - Arrays.asList( - asc(named(literal))))); + buildQuery(Arrays.asList(asc(named(literal))))); } @Test @@ -108,8 +102,16 @@ void should_build_bucket_with_keyword_field() { + "}", buildQuery( Arrays.asList( - asc(named("name", ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword))))))))); + asc( + named( + "name", + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of( + OpenSearchDataType.MappingType.Keyword))))))))); } @Test @@ -129,13 +131,13 @@ void should_build_bucket_with_parse_expression() { + " \"order\" : \"asc\"\n" + " }\n" + "}", - buildQuery( - Arrays.asList( - asc(named("name", parseExpression))))); + buildQuery(Arrays.asList(asc(named("name", parseExpression))))); } @ParameterizedTest(name = "{0}") - @EnumSource(value = ExprCoreType.class, names = {"TIMESTAMP", "TIME", "DATE", "DATETIME"}) + @EnumSource( + value = ExprCoreType.class, + names = {"TIMESTAMP", "TIME", "DATE", "DATETIME"}) void terms_bucket_for_datetime_types_uses_long(ExprType dataType) { assertEquals( "{\n" @@ -147,9 +149,7 @@ void terms_bucket_for_datetime_types_uses_long(ExprType dataType) { + " \"order\" : \"asc\"\n" + " }\n" + "}", - buildQuery( - Arrays.asList( - asc(named("date", ref("date", dataType)))))); + buildQuery(Arrays.asList(asc(named("date", ref("date", dataType)))))); } @SneakyThrows diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java index 94f152f913..7f302c9c53 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/aggregation/dsl/MetricAggregationBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.aggregation.dsl; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -49,11 +48,9 @@ @ExtendWith(MockitoExtension.class) class MetricAggregationBuilderTest { - @Mock - private ExpressionSerializer serializer; + @Mock private ExpressionSerializer serializer; - @Mock - private NamedAggregator aggregator; + @Mock private NamedAggregator aggregator; private MetricAggregationBuilder aggregationBuilder; @@ -64,299 +61,332 @@ void set_up() { @Test void should_build_avg_aggregation() { - assertEquals(format( - "{%n" - + " \"avg(age)\" : {%n" - + " \"avg\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"avg(age)\" : {%n" + + " \"avg\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("avg(age)", - new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); + named( + "avg(age)", new AvgAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_sum_aggregation() { - assertEquals(format( - "{%n" - + " \"sum(age)\" : {%n" - + " \"sum\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"sum(age)\" : {%n" + + " \"sum\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("sum(age)", - new SumAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); + named( + "sum(age)", new SumAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_count_aggregation() { - assertEquals(format( - "{%n" - + " \"count(age)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"count(age)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("count(age)", + named( + "count(age)", new CountAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_count_star_aggregation() { - assertEquals(format( - "{%n" - + " \"count(*)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"_index\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"count(*)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"_index\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("count(*)", - new CountAggregator(Arrays.asList(literal("*")), INTEGER))))); + named("count(*)", new CountAggregator(Arrays.asList(literal("*")), INTEGER))))); } @Test void should_build_count_other_literal_aggregation() { - assertEquals(format( - "{%n" - + " \"count(1)\" : {%n" - + " \"value_count\" : {%n" - + " \"field\" : \"_index\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"count(1)\" : {%n" + + " \"value_count\" : {%n" + + " \"field\" : \"_index\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("count(1)", - new CountAggregator(Arrays.asList(literal(1)), INTEGER))))); + named("count(1)", new CountAggregator(Arrays.asList(literal(1)), INTEGER))))); } @Test void should_build_min_aggregation() { - assertEquals(format( - "{%n" - + " \"min(age)\" : {%n" - + " \"min\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"min(age)\" : {%n" + + " \"min\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("min(age)", - new MinAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); + named( + "min(age)", new MinAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_max_aggregation() { - assertEquals(format( - "{%n" - + " \"max(age)\" : {%n" - + " \"max\" : {%n" - + " \"field\" : \"age\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"max(age)\" : {%n" + + " \"max\" : {%n" + + " \"field\" : \"age\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("max(age)", - new MaxAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); + named( + "max(age)", new MaxAggregator(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_varPop_aggregation() { - assertEquals(format( - "{%n" - + " \"var_pop(age)\" : {%n" - + " \"extended_stats\" : {%n" - + " \"field\" : \"age\",%n" - + " \"sigma\" : 2.0%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"var_pop(age)\" : {%n" + + " \"extended_stats\" : {%n" + + " \"field\" : \"age\",%n" + + " \"sigma\" : 2.0%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("var_pop(age)", + named( + "var_pop(age)", variancePopulation(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_varSamp_aggregation() { - assertEquals(format( - "{%n" - + " \"var_samp(age)\" : {%n" - + " \"extended_stats\" : {%n" - + " \"field\" : \"age\",%n" - + " \"sigma\" : 2.0%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"var_samp(age)\" : {%n" + + " \"extended_stats\" : {%n" + + " \"field\" : \"age\",%n" + + " \"sigma\" : 2.0%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("var_samp(age)", + named( + "var_samp(age)", varianceSample(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_stddevPop_aggregation() { - assertEquals(format( - "{%n" - + " \"stddev_pop(age)\" : {%n" - + " \"extended_stats\" : {%n" - + " \"field\" : \"age\",%n" - + " \"sigma\" : 2.0%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"stddev_pop(age)\" : {%n" + + " \"extended_stats\" : {%n" + + " \"field\" : \"age\",%n" + + " \"sigma\" : 2.0%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("stddev_pop(age)", + named( + "stddev_pop(age)", stddevPopulation(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_stddevSamp_aggregation() { - assertEquals(format( - "{%n" - + " \"stddev_samp(age)\" : {%n" - + " \"extended_stats\" : {%n" - + " \"field\" : \"age\",%n" - + " \"sigma\" : 2.0%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"stddev_samp(age)\" : {%n" + + " \"extended_stats\" : {%n" + + " \"field\" : \"age\",%n" + + " \"sigma\" : 2.0%n" + + " }%n" + + " }%n" + + "}"), buildQuery( Arrays.asList( - named("stddev_samp(age)", + named( + "stddev_samp(age)", stddevSample(Arrays.asList(ref("age", INTEGER)), INTEGER))))); } @Test void should_build_cardinality_aggregation() { - assertEquals(format( - "{%n" - + " \"count(distinct name)\" : {%n" - + " \"cardinality\" : {%n" - + " \"field\" : \"name\"%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"count(distinct name)\" : {%n" + + " \"cardinality\" : {%n" + + " \"field\" : \"name\"%n" + + " }%n" + + " }%n" + + "}"), buildQuery( - Collections.singletonList(named("count(distinct name)", new CountAggregator( - Collections.singletonList(ref("name", STRING)), INTEGER).distinct(true))))); + Collections.singletonList( + named( + "count(distinct name)", + new CountAggregator(Collections.singletonList(ref("name", STRING)), INTEGER) + .distinct(true))))); } @Test void should_build_filtered_cardinality_aggregation() { - assertEquals(format( - "{%n" - + " \"count(distinct name) filter(where age > 30)\" : {%n" - + " \"filter\" : {%n" - + " \"range\" : {%n" - + " \"age\" : {%n" - + " \"from\" : 30,%n" - + " \"to\" : null,%n" - + " \"include_lower\" : false,%n" - + " \"include_upper\" : true,%n" - + " \"boost\" : 1.0%n" - + " }%n" - + " }%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"count(distinct name) filter(where age > 30)\" : {%n" - + " \"cardinality\" : {%n" - + " \"field\" : \"name\"%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), - buildQuery(Collections.singletonList(named( - "count(distinct name) filter(where age > 30)", - new CountAggregator(Collections.singletonList(ref("name", STRING)), INTEGER) - .condition(DSL.greater(ref("age", INTEGER), literal(30))) - .distinct(true))))); + assertEquals( + format( + "{%n" + + " \"count(distinct name) filter(where age > 30)\" : {%n" + + " \"filter\" : {%n" + + " \"range\" : {%n" + + " \"age\" : {%n" + + " \"from\" : 30,%n" + + " \"to\" : null,%n" + + " \"include_lower\" : false,%n" + + " \"include_upper\" : true,%n" + + " \"boost\" : 1.0%n" + + " }%n" + + " }%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"count(distinct name) filter(where age > 30)\" : {%n" + + " \"cardinality\" : {%n" + + " \"field\" : \"name\"%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), + buildQuery( + Collections.singletonList( + named( + "count(distinct name) filter(where age > 30)", + new CountAggregator(Collections.singletonList(ref("name", STRING)), INTEGER) + .condition(DSL.greater(ref("age", INTEGER), literal(30))) + .distinct(true))))); } @Test void should_build_top_hits_aggregation() { - assertEquals(format( - "{%n" - + " \"take(name, 10)\" : {%n" - + " \"top_hits\" : {%n" - + " \"from\" : 0,%n" - + " \"size\" : 10,%n" - + " \"version\" : false,%n" - + " \"seq_no_primary_term\" : false,%n" - + " \"explain\" : false,%n" - + " \"_source\" : {%n" - + " \"includes\" : [ \"name\" ],%n" - + " \"excludes\" : [ ]%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), + assertEquals( + format( + "{%n" + + " \"take(name, 10)\" : {%n" + + " \"top_hits\" : {%n" + + " \"from\" : 0,%n" + + " \"size\" : 10,%n" + + " \"version\" : false,%n" + + " \"seq_no_primary_term\" : false,%n" + + " \"explain\" : false,%n" + + " \"_source\" : {%n" + + " \"includes\" : [ \"name\" ],%n" + + " \"excludes\" : [ ]%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), buildQuery( - Collections.singletonList(named("take(name, 10)", new TakeAggregator( - ImmutableList.of(ref("name", STRING), literal(10)), ARRAY))))); + Collections.singletonList( + named( + "take(name, 10)", + new TakeAggregator( + ImmutableList.of(ref("name", STRING), literal(10)), ARRAY))))); } @Test void should_build_filtered_top_hits_aggregation() { - assertEquals(format( - "{%n" - + " \"take(name, 10) filter(where age > 30)\" : {%n" - + " \"filter\" : {%n" - + " \"range\" : {%n" - + " \"age\" : {%n" - + " \"from\" : 30,%n" - + " \"to\" : null,%n" - + " \"include_lower\" : false,%n" - + " \"include_upper\" : true,%n" - + " \"boost\" : 1.0%n" - + " }%n" - + " }%n" - + " },%n" - + " \"aggregations\" : {%n" - + " \"take(name, 10) filter(where age > 30)\" : {%n" - + " \"top_hits\" : {%n" - + " \"from\" : 0,%n" - + " \"size\" : 10,%n" - + " \"version\" : false,%n" - + " \"seq_no_primary_term\" : false,%n" - + " \"explain\" : false,%n" - + " \"_source\" : {%n" - + " \"includes\" : [ \"name\" ],%n" - + " \"excludes\" : [ ]%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + " }%n" - + "}"), - buildQuery(Collections.singletonList(named( - "take(name, 10) filter(where age > 30)", - new TakeAggregator( - ImmutableList.of(ref("name", STRING), literal(10)), ARRAY) - .condition(DSL.greater(ref("age", INTEGER), literal(30))))))); + assertEquals( + format( + "{%n" + + " \"take(name, 10) filter(where age > 30)\" : {%n" + + " \"filter\" : {%n" + + " \"range\" : {%n" + + " \"age\" : {%n" + + " \"from\" : 30,%n" + + " \"to\" : null,%n" + + " \"include_lower\" : false,%n" + + " \"include_upper\" : true,%n" + + " \"boost\" : 1.0%n" + + " }%n" + + " }%n" + + " },%n" + + " \"aggregations\" : {%n" + + " \"take(name, 10) filter(where age > 30)\" : {%n" + + " \"top_hits\" : {%n" + + " \"from\" : 0,%n" + + " \"size\" : 10,%n" + + " \"version\" : false,%n" + + " \"seq_no_primary_term\" : false,%n" + + " \"explain\" : false,%n" + + " \"_source\" : {%n" + + " \"includes\" : [ \"name\" ],%n" + + " \"excludes\" : [ ]%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + " }%n" + + "}"), + buildQuery( + Collections.singletonList( + named( + "take(name, 10) filter(where age > 30)", + new TakeAggregator(ImmutableList.of(ref("name", STRING), literal(10)), ARRAY) + .condition(DSL.greater(ref("age", INTEGER), literal(30))))))); } @Test void should_throw_exception_for_unsupported_distinct_aggregator() { - assertThrows(IllegalStateException.class, - () -> buildQuery(Collections.singletonList(named("avg(distinct age)", new AvgAggregator( - Collections.singletonList(ref("name", STRING)), STRING).distinct(true)))), + assertThrows( + IllegalStateException.class, + () -> + buildQuery( + Collections.singletonList( + named( + "avg(distinct age)", + new AvgAggregator(Collections.singletonList(ref("name", STRING)), STRING) + .distinct(true)))), "unsupported distinct aggregator avg"); } @@ -366,7 +396,8 @@ void should_throw_exception_for_unsupported_aggregator() { when(aggregator.getArguments()).thenReturn(Arrays.asList(ref("age", INTEGER))); IllegalStateException exception = - assertThrows(IllegalStateException.class, + assertThrows( + IllegalStateException.class, () -> buildQuery(Arrays.asList(named("unsupported_agg(age)", aggregator)))); assertEquals("unsupported aggregator unsupported_agg", exception.getMessage()); } @@ -374,19 +405,23 @@ void should_throw_exception_for_unsupported_aggregator() { @Test void should_throw_exception_for_unsupported_exception() { IllegalStateException exception = - assertThrows(IllegalStateException.class, () -> buildQuery(Arrays.asList( - named("count(age)", - new CountAggregator(Arrays.asList(named("age", ref("age", INTEGER))), INTEGER))))); - assertEquals( - "metric aggregation doesn't support expression age", - exception.getMessage()); + assertThrows( + IllegalStateException.class, + () -> + buildQuery( + Arrays.asList( + named( + "count(age)", + new CountAggregator( + Arrays.asList(named("age", ref("age", INTEGER))), INTEGER))))); + assertEquals("metric aggregation doesn't support expression age", exception.getMessage()); } @SneakyThrows private String buildQuery(List namedAggregatorList) { ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.readTree( - aggregationBuilder.build(namedAggregatorList).getLeft().toString()) + return objectMapper + .readTree(aggregationBuilder.build(namedAggregatorList).getLeft().toString()) .toPrettyString(); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactoryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactoryTest.java index 3c927c9a0b..d2d349c14b 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactoryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptFactoryTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -30,14 +29,11 @@ @ExtendWith(MockitoExtension.class) class ExpressionFilterScriptFactoryTest { - @Mock - private SearchLookup searchLookup; + @Mock private SearchLookup searchLookup; - @Mock - private LeafSearchLookup leafSearchLookup; + @Mock private LeafSearchLookup leafSearchLookup; - @Mock - private LeafReaderContext leafReaderContext; + @Mock private LeafReaderContext leafReaderContext; private final Expression expression = DSL.literal(true); @@ -59,8 +55,6 @@ void can_initialize_expression_filter_script() throws IOException { assertEquals( new ExpressionFilterScript(expression, searchLookup, leafReaderContext, params), - actualFilterScript - ); + actualFilterScript); } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptTest.java index 61a3e9d35f..cca51c8f4a 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/ExpressionFilterScriptTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import static java.util.Collections.emptyList; @@ -55,37 +54,27 @@ @ExtendWith(MockitoExtension.class) class ExpressionFilterScriptTest { - @Mock - private SearchLookup lookup; + @Mock private SearchLookup lookup; - @Mock - private LeafSearchLookup leafLookup; + @Mock private LeafSearchLookup leafLookup; - @Mock - private LeafReaderContext context; + @Mock private LeafReaderContext context; @Test void should_match_if_true_literal() { - assertThat() - .docValues() - .filterBy(literal(true)) - .shouldMatch(); + assertThat().docValues().filterBy(literal(true)).shouldMatch(); } @Test void should_not_match_if_false_literal() { - assertThat() - .docValues() - .filterBy(literal(false)) - .shouldNotMatch(); + assertThat().docValues().filterBy(literal(false)).shouldNotMatch(); } @Test void can_execute_expression_with_integer_field() { assertThat() .docValues("age", 30L) // DocValue only supports long - .filterBy( - DSL.greater(ref("age", INTEGER), literal(20))) + .filterBy(DSL.greater(ref("age", INTEGER), literal(20))) .shouldMatch(); } @@ -94,8 +83,13 @@ void can_execute_expression_with_text_keyword_field() { assertThat() .docValues("name.keyword", "John") .filterBy( - DSL.equal(ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), + DSL.equal( + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), literal("John"))) .shouldMatch(); } @@ -151,34 +145,31 @@ void can_execute_expression_with_time_field() { @Test void can_execute_expression_with_missing_field() { - assertThat() - .docValues("age", 30) - .filterBy(ref("name", STRING)) - .shouldNotMatch(); + assertThat().docValues("age", 30).filterBy(ref("name", STRING)).shouldNotMatch(); } @Test void can_execute_expression_with_empty_doc_value() { - assertThat() - .docValues("name", emptyList()) - .filterBy(ref("name", STRING)) - .shouldNotMatch(); + assertThat().docValues("name", emptyList()).filterBy(ref("name", STRING)).shouldNotMatch(); } @Test void can_execute_parse_expression() { assertThat() .docValues("age_string", "age: 30") - .filterBy(DSL.equal( - DSL.regex(DSL.ref("age_string", STRING), literal("age: (?\\d+)"), literal("age")), - literal("30"))) + .filterBy( + DSL.equal( + DSL.regex( + DSL.ref("age_string", STRING), literal("age: (?\\d+)"), literal("age")), + literal("30"))) .shouldMatch(); } @Test void cannot_execute_non_predicate_expression() { - assertThrow(IllegalStateException.class, - "Expression has wrong result type instead of boolean: expression [10], result [10]") + assertThrow( + IllegalStateException.class, + "Expression has wrong result type instead of boolean: expression [10], result [10]") .docValues() .filterBy(literal(10)); } @@ -187,8 +178,7 @@ private ExprScriptAssertion assertThat() { return new ExprScriptAssertion(lookup, leafLookup, context); } - private ExprScriptAssertion assertThrow(Class clazz, - String message) { + private ExprScriptAssertion assertThrow(Class clazz, String message) { return new ExprScriptAssertion(lookup, leafLookup, context) { @Override ExprScriptAssertion filterBy(Expression expr) { @@ -211,20 +201,20 @@ ExprScriptAssertion docValues() { } ExprScriptAssertion docValues(String name, Object value) { - LeafDocLookup leafDocLookup = mockLeafDocLookup( - ImmutableMap.of(name, new FakeScriptDocValues<>(value))); + LeafDocLookup leafDocLookup = + mockLeafDocLookup(ImmutableMap.of(name, new FakeScriptDocValues<>(value))); when(lookup.getLeafSearchLookup(any())).thenReturn(leafLookup); when(leafLookup.doc()).thenReturn(leafDocLookup); return this; } - ExprScriptAssertion docValues(String name1, Object value1, - String name2, Object value2) { - LeafDocLookup leafDocLookup = mockLeafDocLookup( - ImmutableMap.of( - name1, new FakeScriptDocValues<>(value1), - name2, new FakeScriptDocValues<>(value2))); + ExprScriptAssertion docValues(String name1, Object value1, String name2, Object value2) { + LeafDocLookup leafDocLookup = + mockLeafDocLookup( + ImmutableMap.of( + name1, new FakeScriptDocValues<>(value1), + name2, new FakeScriptDocValues<>(value2))); when(lookup.getLeafSearchLookup(any())).thenReturn(leafLookup); when(leafLookup.doc()).thenReturn(leafDocLookup); @@ -276,5 +266,4 @@ public int size() { return values.size(); } } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilderTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilderTest.java index eb07076257..1fc2d5ee29 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilderTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/FilterQueryBuilderTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -63,22 +62,42 @@ class FilterQueryBuilderTest { private static Stream numericCastSource() { - return Stream.of(literal((byte) 1), literal((short) -1), literal( - 1), literal(21L), literal(3.14F), literal(3.1415D), literal(true), literal("1")); + return Stream.of( + literal((byte) 1), + literal((short) -1), + literal(1), + literal(21L), + literal(3.14F), + literal(3.1415D), + literal(true), + literal("1")); } private static Stream booleanTrueCastSource() { - return Stream.of(literal((byte) 1), literal((short) -1), literal( - 1), literal(42L), literal(3.14F), literal(3.1415D), literal(true), literal("true")); + return Stream.of( + literal((byte) 1), + literal((short) -1), + literal(1), + literal(42L), + literal(3.14F), + literal(3.1415D), + literal(true), + literal("true")); } private static Stream booleanFalseCastSource() { - return Stream.of(literal((byte) 0), literal((short) 0), literal( - 0), literal(0L), literal(0.0F), literal(0.0D), literal(false), literal("false")); + return Stream.of( + literal((byte) 0), + literal((short) 0), + literal(0), + literal(0L), + literal(0.0F), + literal(0.0D), + literal(false), + literal("false")); } - @Mock - private ExpressionSerializer serializer; + @Mock private ExpressionSerializer serializer; private FilterQueryBuilder filterQueryBuilder; @@ -98,34 +117,42 @@ void should_build_term_query_for_equality_expression() { + " }\n" + " }\n" + "}", - buildQuery( - DSL.equal( - ref("name", STRING), literal("John")))); + buildQuery(DSL.equal(ref("name", STRING), literal("John")))); } @Test void should_build_range_query_for_comparison_expression() { Expression[] params = {ref("age", INTEGER), literal(30)}; - Map ranges = ImmutableMap.of( - DSL.less(params), new Object[]{null, 30, true, false}, - DSL.greater(params), new Object[]{30, null, false, true}, - DSL.lte(params), new Object[]{null, 30, true, true}, - DSL.gte(params), new Object[]{30, null, true, true}); - - ranges.forEach((expr, range) -> - assertJsonEquals( - "{\n" - + " \"range\" : {\n" - + " \"age\" : {\n" - + " \"from\" : " + range[0] + ",\n" - + " \"to\" : " + range[1] + ",\n" - + " \"include_lower\" : " + range[2] + ",\n" - + " \"include_upper\" : " + range[3] + ",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(expr))); + Map ranges = + ImmutableMap.of( + DSL.less(params), new Object[] {null, 30, true, false}, + DSL.greater(params), new Object[] {30, null, false, true}, + DSL.lte(params), new Object[] {null, 30, true, true}, + DSL.gte(params), new Object[] {30, null, true, true}); + + ranges.forEach( + (expr, range) -> + assertJsonEquals( + "{\n" + + " \"range\" : {\n" + + " \"age\" : {\n" + + " \"from\" : " + + range[0] + + ",\n" + + " \"to\" : " + + range[1] + + ",\n" + + " \"include_lower\" : " + + range[2] + + ",\n" + + " \"include_upper\" : " + + range[3] + + ",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery(expr))); } @Test @@ -140,9 +167,7 @@ void should_build_wildcard_query_for_like_expression() { + " }\n" + " }\n" + "}", - buildQuery( - DSL.like( - ref("name", STRING), literal("%John_")))); + buildQuery(DSL.like(ref("name", STRING), literal("%John_")))); } @Test @@ -158,8 +183,7 @@ void should_build_script_query_for_unsupported_lucene_query() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery( - DSL.isnotnull(ref("age", INTEGER)))); + buildQuery(DSL.isnotnull(ref("age", INTEGER)))); } @Test @@ -175,9 +199,7 @@ void should_build_script_query_for_function_expression() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery( - DSL.equal( - DSL.abs(ref("age", INTEGER)), literal(30)))); + buildQuery(DSL.equal(DSL.abs(ref("age", INTEGER)), literal(30)))); } @Test @@ -193,26 +215,23 @@ void should_build_script_query_for_comparison_between_fields() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery( - DSL.equal( - ref("age1", INTEGER), ref("age2", INTEGER)))); + buildQuery(DSL.equal(ref("age1", INTEGER), ref("age2", INTEGER)))); } @Test void should_build_bool_query_for_and_or_expression() { - String[] names = { "filter", "should" }; + String[] names = {"filter", "should"}; FunctionExpression expr1 = DSL.equal(ref("name", STRING), literal("John")); FunctionExpression expr2 = DSL.equal(ref("age", INTEGER), literal(30)); - Expression[] exprs = { - DSL.and(expr1, expr2), - DSL.or(expr1, expr2) - }; + Expression[] exprs = {DSL.and(expr1, expr2), DSL.or(expr1, expr2)}; for (int i = 0; i < names.length; i++) { assertJsonEquals( "{\n" + " \"bool\" : {\n" - + " \"" + names[i] + "\" : [\n" + + " \"" + + names[i] + + "\" : [\n" + " {\n" + " \"term\" : {\n" + " \"name\" : {\n" @@ -257,10 +276,7 @@ void should_build_bool_query_for_not_expression() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery( - DSL.not( - DSL.equal( - ref("age", INTEGER), literal(30))))); + buildQuery(DSL.not(DSL.equal(ref("age", INTEGER), literal(30))))); } @Test @@ -276,8 +292,12 @@ void should_use_keyword_for_multi_field_in_equality_expression() { + "}", buildQuery( DSL.equal( - ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), literal("John")))); } @@ -295,8 +315,12 @@ void should_use_keyword_for_multi_field_in_like_expression() { + "}", buildQuery( DSL.like( - ref("name", OpenSearchTextType.of(Map.of("words", - OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), + ref( + "name", + OpenSearchTextType.of( + Map.of( + "words", + OpenSearchDataType.of(OpenSearchDataType.MappingType.Keyword)))), literal("John%")))); } @@ -320,13 +344,9 @@ void should_build_term_query_predicate_expression_with_nested_function() { + " }\n" + "}", buildQuery( - DSL.equal(DSL.nested( - DSL.ref("message.info", STRING), - DSL.ref("message", STRING)), - literal("string_value") - ) - ) - ); + DSL.equal( + DSL.nested(DSL.ref("message.info", STRING), DSL.ref("message", STRING)), + literal("string_value")))); } @Test @@ -351,78 +371,67 @@ void should_build_range_query_predicate_expression_with_nested_function() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery( - DSL.greater(DSL.nested( - DSL.ref("lottery.number.id", INTEGER)), literal(1234) - ) - ) - ); + buildQuery(DSL.greater(DSL.nested(DSL.ref("lottery.number.id", INTEGER)), literal(1234)))); } // TODO remove this test when alternate syntax is implemented for nested // function in WHERE clause: nested(path, condition) @Test void ensure_alternate_syntax_falls_back_to_legacy_engine() { - assertThrows(SyntaxCheckException.class, () -> - buildQuery( - DSL.nested( - DSL.ref("message", STRING), - DSL.equal(DSL.literal("message.info"), literal("a")) - ) - ) - ); + assertThrows( + SyntaxCheckException.class, + () -> + buildQuery( + DSL.nested( + DSL.ref("message", STRING), + DSL.equal(DSL.literal("message.info"), literal("a"))))); } @Test void nested_filter_wrong_right_side_type_in_predicate_throws_exception() { - assertThrows(IllegalArgumentException.class, () -> - buildQuery( - DSL.equal(DSL.nested( - DSL.ref("message.info", STRING), - DSL.ref("message", STRING)), - DSL.ref("string_value", STRING) - ) - ) - ); + assertThrows( + IllegalArgumentException.class, + () -> + buildQuery( + DSL.equal( + DSL.nested(DSL.ref("message.info", STRING), DSL.ref("message", STRING)), + DSL.ref("string_value", STRING)))); } @Test void nested_filter_wrong_first_param_type_throws_exception() { - assertThrows(IllegalArgumentException.class, () -> - buildQuery( - DSL.equal(DSL.nested( - DSL.namedArgument("field", literal("message"))), - literal("string_value") - ) - ) - ); + assertThrows( + IllegalArgumentException.class, + () -> + buildQuery( + DSL.equal( + DSL.nested(DSL.namedArgument("field", literal("message"))), + literal("string_value")))); } @Test void nested_filter_wrong_second_param_type_throws_exception() { - assertThrows(IllegalArgumentException.class, () -> - buildQuery( - DSL.equal(DSL.nested( - DSL.ref("message.info", STRING), - DSL.literal(2)), - literal("string_value") - ) - ) - ); + assertThrows( + IllegalArgumentException.class, + () -> + buildQuery( + DSL.equal( + DSL.nested(DSL.ref("message.info", STRING), DSL.literal(2)), + literal("string_value")))); } @Test void nested_filter_too_many_params_throws_exception() { - assertThrows(IllegalArgumentException.class, () -> - buildQuery( - DSL.equal(DSL.nested( - DSL.ref("message.info", STRING), - DSL.ref("message", STRING), - DSL.ref("message", STRING)), - literal("string_value") - ) - ) - ); + assertThrows( + IllegalArgumentException.class, + () -> + buildQuery( + DSL.equal( + DSL.nested( + DSL.ref("message.info", STRING), + DSL.ref("message", STRING), + DSL.ref("message", STRING)), + literal("string_value")))); } @Test @@ -445,8 +454,8 @@ void should_build_match_query_with_default_parameters() { + "}", buildQuery( DSL.match( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query"))))); } @@ -474,8 +483,8 @@ void should_build_match_query_with_custom_parameters() { + "}", buildQuery( DSL.match( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query")), DSL.namedArgument("operator", literal("AND")), DSL.namedArgument("analyzer", literal("keyword")), @@ -493,60 +502,65 @@ void should_build_match_query_with_custom_parameters() { @Test void match_invalid_parameter() { - FunctionExpression expr = DSL.match( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + FunctionExpression expr = + DSL.match( + DSL.namedArgument("field", new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertTrue(msg.startsWith("Parameter invalid_parameter is invalid for match function.")); } @Test void match_disallow_duplicate_parameter() { - FunctionExpression expr = DSL.match( - DSL.namedArgument("field", literal("message")), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("analyzer", literal("keyword")), - DSL.namedArgument("AnalYzer", literal("english"))); + FunctionExpression expr = + DSL.match( + DSL.namedArgument("field", literal("message")), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("analyzer", literal("keyword")), + DSL.namedArgument("AnalYzer", literal("english"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("Parameter 'analyzer' can only be specified once.", msg); } @Test void match_disallow_duplicate_query() { - FunctionExpression expr = DSL.match( - DSL.namedArgument("field", literal("message")), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("analyzer", literal("keyword")), - DSL.namedArgument("QUERY", literal("something"))); + FunctionExpression expr = + DSL.match( + DSL.namedArgument("field", literal("message")), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("analyzer", literal("keyword")), + DSL.namedArgument("QUERY", literal("something"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("Parameter 'query' can only be specified once.", msg); } @Test void match_disallow_duplicate_field() { - FunctionExpression expr = DSL.match( - DSL.namedArgument("field", literal("message")), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("analyzer", literal("keyword")), - DSL.namedArgument("Field", literal("something"))); + FunctionExpression expr = + DSL.match( + DSL.namedArgument("field", literal("message")), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("analyzer", literal("keyword")), + DSL.namedArgument("Field", literal("something"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("Parameter 'field' can only be specified once.", msg); } @Test void match_missing_field() { - FunctionExpression expr = DSL.match( - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("analyzer", literal("keyword"))); + FunctionExpression expr = + DSL.match( + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("analyzer", literal("keyword"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("'field' parameter is missing.", msg); } @Test void match_missing_query() { - FunctionExpression expr = DSL.match( + FunctionExpression expr = + DSL.match( DSL.namedArgument("field", literal("field1")), DSL.namedArgument("analyzer", literal("keyword"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); @@ -556,7 +570,7 @@ void match_missing_query() { @Test void should_build_match_phrase_query_with_default_parameters() { assertJsonEquals( - "{\n" + "{\n" + " \"match_phrase\" : {\n" + " \"message\" : {\n" + " \"query\" : \"search query\",\n" @@ -568,14 +582,15 @@ void should_build_match_phrase_query_with_default_parameters() { + "}", buildQuery( DSL.match_phrase( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query"))))); } @Test void should_build_multi_match_query_with_default_parameters_single_field() { - assertJsonEquals("{\n" + assertJsonEquals( + "{\n" + " \"multi_match\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [\n" @@ -592,16 +607,21 @@ void should_build_multi_match_query_with_default_parameters_single_field() { + " \"boost\" : 1.0,\n" + " }\n" + "}", - buildQuery(DSL.multi_match( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F)))))), - DSL.namedArgument("query", literal("search query"))))); + buildQuery( + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of("field1", ExprValueUtils.floatValue(1.F)))))), + DSL.namedArgument("query", literal("search query"))))); } @Test void should_build_multi_match_query_with_default_parameters_all_fields() { - assertJsonEquals("{\n" + assertJsonEquals( + "{\n" + " \"multi_match\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [\n" @@ -618,16 +638,21 @@ void should_build_multi_match_query_with_default_parameters_all_fields() { + " \"boost\" : 1.0,\n" + " }\n" + "}", - buildQuery(DSL.multi_match( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "*", ExprValueUtils.floatValue(1.F)))))), - DSL.namedArgument("query", literal("search query"))))); + buildQuery( + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of("*", ExprValueUtils.floatValue(1.F)))))), + DSL.namedArgument("query", literal("search query"))))); } @Test void should_build_multi_match_query_with_default_parameters_no_fields() { - assertJsonEquals("{\n" + assertJsonEquals( + "{\n" + " \"multi_match\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [],\n" @@ -642,17 +667,20 @@ void should_build_multi_match_query_with_default_parameters_no_fields() { + " \"boost\" : 1.0,\n" + " }\n" + "}", - buildQuery(DSL.multi_match( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of())))), - DSL.namedArgument("query", literal("search query"))))); + buildQuery( + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal(new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of())))), + DSL.namedArgument("query", literal("search query"))))); } // Note: we can't test `multi_match` and `simple_query_string` without weight(s) @Test void should_build_multi_match_query_with_default_parameters_multiple_fields() { - var expected = "{\n" + var expected = + "{\n" + " \"multi_match\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [%s],\n" @@ -667,23 +695,31 @@ void should_build_multi_match_query_with_default_parameters_multiple_fields() { + " \"boost\" : 1.0,\n" + " }\n" + "}"; - var actual = buildQuery(DSL.multi_match( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("search query")))); + var actual = + buildQuery( + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("search query")))); var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) - || new JSONObject(ex2).similar(new JSONObject(actual)), + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) + || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void should_build_multi_match_query_with_custom_parameters() { - var expected = "{\n" + var expected = + "{\n" + " \"multi_match\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [%s],\n" @@ -704,10 +740,13 @@ void should_build_multi_match_query_with_custom_parameters() { + " \"boost\" : 2.0\n" + " }\n" + "}"; - var actual = buildQuery( + var actual = + buildQuery( DSL.multi_match( - DSL.namedArgument("fields", DSL.literal( - ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), + DSL.namedArgument( + "fields", + DSL.literal( + ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), DSL.namedArgument("query", literal("search query")), DSL.namedArgument("analyzer", literal("keyword")), DSL.namedArgument("auto_generate_synonyms_phrase_query", literal("false")), @@ -727,28 +766,36 @@ void should_build_multi_match_query_with_custom_parameters() { var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) - || new JSONObject(ex2).similar(new JSONObject(actual)), + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) + || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void multi_match_invalid_parameter() { - FunctionExpression expr = DSL.multi_match( - DSL.namedArgument("fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); - assertThrows(SemanticCheckException.class, () -> buildQuery(expr), + FunctionExpression expr = + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + assertThrows( + SemanticCheckException.class, + () -> buildQuery(expr), "Parameter invalid_parameter is invalid for match function."); } @Test void should_build_match_phrase_query_with_custom_parameters() { assertJsonEquals( - "{\n" + "{\n" + " \"match_phrase\" : {\n" + " \"message\" : {\n" + " \"query\" : \"search query\",\n" @@ -761,8 +808,8 @@ void should_build_match_phrase_query_with_custom_parameters() { + "}", buildQuery( DSL.match_phrase( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("boost", literal("1.2")), DSL.namedArgument("query", literal("search query")), DSL.namedArgument("analyzer", literal("keyword")), @@ -772,150 +819,171 @@ void should_build_match_phrase_query_with_custom_parameters() { @Test void wildcard_query_invalid_parameter() { - FunctionExpression expr = DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query*")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); - assertThrows(SemanticCheckException.class, () -> buildQuery(expr), + FunctionExpression expr = + DSL.wildcard_query( + DSL.namedArgument("field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query*")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + assertThrows( + SemanticCheckException.class, + () -> buildQuery(expr), "Parameter invalid_parameter is invalid for wildcard_query function."); } @Test void wildcard_query_convert_sql_wildcard_to_lucene() { // Test conversion of % wildcard to * - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query*\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query%"))))); - - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query?\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query_"))))); + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query*\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query%"))))); + + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query?\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query_"))))); } @Test void wildcard_query_escape_wildcards_characters() { - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query%\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query\\%"))))); - - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query_\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query\\_"))))); - - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query\\\\*\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query\\*"))))); - - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query\\\\?\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query\\?"))))); + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query%\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query\\%"))))); + + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query_\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query\\_"))))); + + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query\\\\*\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query\\*"))))); + + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query\\\\?\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query\\?"))))); } @Test void should_build_wildcard_query_with_default_parameters() { - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query*\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query*"))))); + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query*\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query*"))))); } @Test void should_build_wildcard_query_query_with_custom_parameters() { - assertJsonEquals("{\n" - + " \"wildcard\" : {\n" - + " \"field\" : {\n" - + " \"wildcard\" : \"search query*\",\n" - + " \"boost\" : 0.6,\n" - + " \"case_insensitive\" : true,\n" - + " \"rewrite\" : \"constant_score_boolean\"\n" - + " }\n" - + " }\n" - + "}", - buildQuery(DSL.wildcard_query( - DSL.namedArgument("field", - new ReferenceExpression("field", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query*")), - DSL.namedArgument("boost", literal("0.6")), - DSL.namedArgument("case_insensitive", literal("true")), - DSL.namedArgument("rewrite", literal("constant_score_boolean"))))); + assertJsonEquals( + "{\n" + + " \"wildcard\" : {\n" + + " \"field\" : {\n" + + " \"wildcard\" : \"search query*\",\n" + + " \"boost\" : 0.6,\n" + + " \"case_insensitive\" : true,\n" + + " \"rewrite\" : \"constant_score_boolean\"\n" + + " }\n" + + " }\n" + + "}", + buildQuery( + DSL.wildcard_query( + DSL.namedArgument( + "field", new ReferenceExpression("field", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query*")), + DSL.namedArgument("boost", literal("0.6")), + DSL.namedArgument("case_insensitive", literal("true")), + DSL.namedArgument("rewrite", literal("constant_score_boolean"))))); } @Test void query_invalid_parameter() { - FunctionExpression expr = DSL.query( - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); - assertThrows(SemanticCheckException.class, () -> buildQuery(expr), - "Parameter invalid_parameter is invalid for query function."); + FunctionExpression expr = + DSL.query(DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + assertThrows( + SemanticCheckException.class, + () -> buildQuery(expr), + "Parameter invalid_parameter is invalid for query function."); } @Test void query_invalid_fields_parameter_exception_message() { - FunctionExpression expr = DSL.query( - DSL.namedArgument("fields", literal("field1")), - DSL.namedArgument("query", literal("search query"))); + FunctionExpression expr = + DSL.query( + DSL.namedArgument("fields", literal("field1")), + DSL.namedArgument("query", literal("search query"))); var exception = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)); assertEquals("Parameter fields is invalid for query function.", exception.getMessage()); @@ -923,7 +991,8 @@ void query_invalid_fields_parameter_exception_message() { @Test void should_build_query_query_with_default_parameters() { - var expected = "{\n" + var expected = + "{\n" + " \"query_string\" : {\n" + " \"query\" : \"field1:query_value\",\n" + " \"fields\" : [],\n" @@ -942,13 +1011,14 @@ void should_build_query_query_with_default_parameters() { + " }\n" + "}"; - assertJsonEquals(expected, buildQuery(DSL.query( - DSL.namedArgument("query", literal("field1:query_value"))))); + assertJsonEquals( + expected, buildQuery(DSL.query(DSL.namedArgument("query", literal("field1:query_value"))))); } @Test void should_build_query_query_with_custom_parameters() { - var expected = "{\n" + var expected = + "{\n" + " \"query_string\" : {\n" + " \"query\" : \"field1:query_value\",\n" + " \"fields\" : [],\n" @@ -971,125 +1041,147 @@ void should_build_query_query_with_custom_parameters() { + " \"boost\" : 2.0,\n" + " }\n" + "}"; - var actual = buildQuery( + var actual = + buildQuery( DSL.query( - DSL.namedArgument("query", literal("field1:query_value")), - DSL.namedArgument("analyze_wildcard", literal("true")), - DSL.namedArgument("analyzer", literal("keyword")), - DSL.namedArgument("auto_generate_synonyms_phrase_query", literal("false")), - DSL.namedArgument("default_operator", literal("AND")), - DSL.namedArgument("fuzzy_max_expansions", literal("10")), - DSL.namedArgument("fuzzy_prefix_length", literal("2")), - DSL.namedArgument("fuzzy_transpositions", literal("false")), - DSL.namedArgument("lenient", literal("false")), - DSL.namedArgument("minimum_should_match", literal("3")), - DSL.namedArgument("tie_breaker", literal("1.3")), - DSL.namedArgument("type", literal("cross_fields")), - DSL.namedArgument("boost", literal("2.0")))); + DSL.namedArgument("query", literal("field1:query_value")), + DSL.namedArgument("analyze_wildcard", literal("true")), + DSL.namedArgument("analyzer", literal("keyword")), + DSL.namedArgument("auto_generate_synonyms_phrase_query", literal("false")), + DSL.namedArgument("default_operator", literal("AND")), + DSL.namedArgument("fuzzy_max_expansions", literal("10")), + DSL.namedArgument("fuzzy_prefix_length", literal("2")), + DSL.namedArgument("fuzzy_transpositions", literal("false")), + DSL.namedArgument("lenient", literal("false")), + DSL.namedArgument("minimum_should_match", literal("3")), + DSL.namedArgument("tie_breaker", literal("1.3")), + DSL.namedArgument("type", literal("cross_fields")), + DSL.namedArgument("boost", literal("2.0")))); assertJsonEquals(expected, actual); } @Test void query_string_invalid_parameter() { - FunctionExpression expr = DSL.query_string( - DSL.namedArgument("fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); - assertThrows(SemanticCheckException.class, () -> buildQuery(expr), + FunctionExpression expr = + DSL.query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + assertThrows( + SemanticCheckException.class, + () -> buildQuery(expr), "Parameter invalid_parameter is invalid for match function."); } @Test void should_build_query_string_query_with_default_parameters_multiple_fields() { - var expected = "{\n" - + " \"query_string\" : {\n" - + " \"query\" : \"query_value\",\n" - + " \"fields\" : [%s],\n" - + " \"type\" : \"best_fields\",\n" - + " \"default_operator\" : \"or\",\n" - + " \"max_determinized_states\" : 10000,\n" - + " \"enable_position_increments\" : true,\n" - + " \"fuzziness\" : \"AUTO\",\n" - + " \"fuzzy_prefix_length\" : 0,\n" - + " \"fuzzy_max_expansions\" : 50,\n" - + " \"phrase_slop\" : 0,\n" - + " \"escape\" : false,\n" - + " \"auto_generate_synonyms_phrase_query\" : true,\n" - + " \"fuzzy_transpositions\" : true,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + "}"; - var actual = buildQuery(DSL.query_string( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("query_value")))); + var expected = + "{\n" + + " \"query_string\" : {\n" + + " \"query\" : \"query_value\",\n" + + " \"fields\" : [%s],\n" + + " \"type\" : \"best_fields\",\n" + + " \"default_operator\" : \"or\",\n" + + " \"max_determinized_states\" : 10000,\n" + + " \"enable_position_increments\" : true,\n" + + " \"fuzziness\" : \"AUTO\",\n" + + " \"fuzzy_prefix_length\" : 0,\n" + + " \"fuzzy_max_expansions\" : 50,\n" + + " \"phrase_slop\" : 0,\n" + + " \"escape\" : false,\n" + + " \"auto_generate_synonyms_phrase_query\" : true,\n" + + " \"fuzzy_transpositions\" : true,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + "}"; + var actual = + buildQuery( + DSL.query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("query_value")))); var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void should_build_query_string_query_with_custom_parameters() { - var expected = "{\n" - + " \"query_string\" : {\n" - + " \"query\" : \"query_value\",\n" - + " \"fields\" : [%s],\n" - + " \"type\" : \"cross_fields\",\n" - + " \"tie_breaker\" : 1.3,\n" - + " \"default_operator\" : \"and\",\n" - + " \"analyzer\" : \"keyword\",\n" - + " \"max_determinized_states\" : 10000,\n" - + " \"enable_position_increments\" : true,\n" - + " \"fuzziness\" : \"AUTO\",\n" - + " \"fuzzy_prefix_length\" : 2,\n" - + " \"fuzzy_max_expansions\" : 10,\n" - + " \"phrase_slop\" : 0,\n" - + " \"analyze_wildcard\" : true,\n" - + " \"minimum_should_match\" : \"3\",\n" - + " \"lenient\" : false,\n" - + " \"escape\" : false,\n" - + " \"auto_generate_synonyms_phrase_query\" : false,\n" - + " \"fuzzy_transpositions\" : false,\n" - + " \"boost\" : 2.0,\n" - + " }\n" - + "}"; - var actual = buildQuery( - DSL.query_string( - DSL.namedArgument("fields", DSL.literal( - ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), - DSL.namedArgument("query", literal("query_value")), - DSL.namedArgument("analyze_wildcard", literal("true")), - DSL.namedArgument("analyzer", literal("keyword")), - DSL.namedArgument("auto_generate_synonyms_phrase_query", literal("false")), - DSL.namedArgument("default_operator", literal("AND")), - DSL.namedArgument("fuzzy_max_expansions", literal("10")), - DSL.namedArgument("fuzzy_prefix_length", literal("2")), - DSL.namedArgument("fuzzy_transpositions", literal("false")), - DSL.namedArgument("lenient", literal("false")), - DSL.namedArgument("minimum_should_match", literal("3")), - DSL.namedArgument("tie_breaker", literal("1.3")), - DSL.namedArgument("type", literal("cross_fields")), - DSL.namedArgument("boost", literal("2.0")))); + var expected = + "{\n" + + " \"query_string\" : {\n" + + " \"query\" : \"query_value\",\n" + + " \"fields\" : [%s],\n" + + " \"type\" : \"cross_fields\",\n" + + " \"tie_breaker\" : 1.3,\n" + + " \"default_operator\" : \"and\",\n" + + " \"analyzer\" : \"keyword\",\n" + + " \"max_determinized_states\" : 10000,\n" + + " \"enable_position_increments\" : true,\n" + + " \"fuzziness\" : \"AUTO\",\n" + + " \"fuzzy_prefix_length\" : 2,\n" + + " \"fuzzy_max_expansions\" : 10,\n" + + " \"phrase_slop\" : 0,\n" + + " \"analyze_wildcard\" : true,\n" + + " \"minimum_should_match\" : \"3\",\n" + + " \"lenient\" : false,\n" + + " \"escape\" : false,\n" + + " \"auto_generate_synonyms_phrase_query\" : false,\n" + + " \"fuzzy_transpositions\" : false,\n" + + " \"boost\" : 2.0,\n" + + " }\n" + + "}"; + var actual = + buildQuery( + DSL.query_string( + DSL.namedArgument( + "fields", + DSL.literal( + ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), + DSL.namedArgument("query", literal("query_value")), + DSL.namedArgument("analyze_wildcard", literal("true")), + DSL.namedArgument("analyzer", literal("keyword")), + DSL.namedArgument("auto_generate_synonyms_phrase_query", literal("false")), + DSL.namedArgument("default_operator", literal("AND")), + DSL.namedArgument("fuzzy_max_expansions", literal("10")), + DSL.namedArgument("fuzzy_prefix_length", literal("2")), + DSL.namedArgument("fuzzy_transpositions", literal("false")), + DSL.namedArgument("lenient", literal("false")), + DSL.namedArgument("minimum_should_match", literal("3")), + DSL.namedArgument("tie_breaker", literal("1.3")), + DSL.namedArgument("type", literal("cross_fields")), + DSL.namedArgument("boost", literal("2.0")))); var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void should_build_query_string_query_with_default_parameters_single_field() { - assertJsonEquals("{\n" + assertJsonEquals( + "{\n" + " \"query_string\" : {\n" + " \"query\" : \"query_value\",\n" + " \"fields\" : [\n" @@ -1109,11 +1201,15 @@ void should_build_query_string_query_with_default_parameters_single_field() { + " \"boost\" : 1.0,\n" + " }\n" + "}", - buildQuery(DSL.query_string( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F)))))), - DSL.namedArgument("query", literal("query_value"))))); + buildQuery( + DSL.query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of("field1", ExprValueUtils.floatValue(1.F)))))), + DSL.namedArgument("query", literal("query_value"))))); } @Test @@ -1122,7 +1218,8 @@ void should_build_query_string_query_with_default_parameters_single_field() { // 2) `flags` are printed by OpenSearch as an integer // 3) `minimum_should_match` printed as a string void should_build_simple_query_string_query_with_default_parameters_single_field() { - assertJsonEquals("{\n" + assertJsonEquals( + "{\n" + " \"simple_query_string\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [\n" @@ -1138,16 +1235,21 @@ void should_build_simple_query_string_query_with_default_parameters_single_field + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery(DSL.simple_query_string( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F)))))), - DSL.namedArgument("query", literal("search query"))))); + buildQuery( + DSL.simple_query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of("field1", ExprValueUtils.floatValue(1.F)))))), + DSL.namedArgument("query", literal("search query"))))); } @Test void should_build_simple_query_string_query_with_default_parameters_multiple_fields() { - var expected = "{\n" + var expected = + "{\n" + " \"simple_query_string\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [%s],\n" @@ -1161,23 +1263,31 @@ void should_build_simple_query_string_query_with_default_parameters_multiple_fie + " \"boost\" : 1.0\n" + " }\n" + "}"; - var actual = buildQuery(DSL.simple_query_string( - DSL.namedArgument("fields", DSL.literal(new ExprTupleValue( - new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("search query")))); + var actual = + buildQuery( + DSL.simple_query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("search query")))); var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) - || new JSONObject(ex2).similar(new JSONObject(actual)), + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) + || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void should_build_simple_query_string_query_with_custom_parameters() { - var expected = "{\n" + var expected = + "{\n" + " \"simple_query_string\" : {\n" + " \"query\" : \"search query\",\n" + " \"fields\" : [%s],\n" @@ -1194,10 +1304,13 @@ void should_build_simple_query_string_query_with_custom_parameters() { + " \"boost\" : 2.0\n" + " }\n" + "}"; - var actual = buildQuery( + var actual = + buildQuery( DSL.simple_query_string( - DSL.namedArgument("fields", DSL.literal( - ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), + DSL.namedArgument( + "fields", + DSL.literal( + ExprValueUtils.tupleValue(ImmutableMap.of("field1", 1.F, "field2", .3F)))), DSL.namedArgument("query", literal("search query")), DSL.namedArgument("analyze_wildcard", literal("true")), DSL.namedArgument("analyzer", literal("keyword")), @@ -1213,95 +1326,105 @@ void should_build_simple_query_string_query_with_custom_parameters() { var ex1 = String.format(expected, "\"field1^1.0\", \"field2^0.3\""); var ex2 = String.format(expected, "\"field2^0.3\", \"field1^1.0\""); - assertTrue(new JSONObject(ex1).similar(new JSONObject(actual)) - || new JSONObject(ex2).similar(new JSONObject(actual)), + assertTrue( + new JSONObject(ex1).similar(new JSONObject(actual)) + || new JSONObject(ex2).similar(new JSONObject(actual)), StringUtils.format("Actual %s doesn't match neither expected %s nor %s", actual, ex1, ex2)); } @Test void simple_query_string_invalid_parameter() { - FunctionExpression expr = DSL.simple_query_string( - DSL.namedArgument("fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); - assertThrows(SemanticCheckException.class, () -> buildQuery(expr), + FunctionExpression expr = + DSL.simple_query_string( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + assertThrows( + SemanticCheckException.class, + () -> buildQuery(expr), "Parameter invalid_parameter is invalid for match function."); } @Test void match_phrase_invalid_parameter() { - FunctionExpression expr = DSL.match_phrase( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("invalid_parameter", literal("invalid_value"))); + FunctionExpression expr = + DSL.match_phrase( + DSL.namedArgument("field", new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("invalid_parameter", literal("invalid_value"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertTrue(msg.startsWith("Parameter invalid_parameter is invalid for match_phrase function.")); } @Test void relevancy_func_invalid_arg_values() { - final var field = DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())); - final var fields = DSL.namedArgument("fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))); + final var field = + DSL.namedArgument("field", new ReferenceExpression("message", OpenSearchTextType.of())); + final var fields = + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))); final var query = DSL.namedArgument("query", literal("search query")); - var slopTest = DSL.match_phrase(field, query, - DSL.namedArgument("slop", literal("1.5"))); + var slopTest = DSL.match_phrase(field, query, DSL.namedArgument("slop", literal("1.5"))); var msg = assertThrows(RuntimeException.class, () -> buildQuery(slopTest)).getMessage(); assertEquals("Invalid slop value: '1.5'. Accepts only integer values.", msg); - var ztqTest = DSL.match_phrase(field, query, - DSL.namedArgument("zero_terms_query", literal("meow"))); + var ztqTest = + DSL.match_phrase(field, query, DSL.namedArgument("zero_terms_query", literal("meow"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(ztqTest)).getMessage(); assertEquals( "Invalid zero_terms_query value: 'meow'. Available values are: NONE, ALL, NULL.", msg); - var boostTest = DSL.match(field, query, - DSL.namedArgument("boost", literal("pewpew"))); + var boostTest = DSL.match(field, query, DSL.namedArgument("boost", literal("pewpew"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(boostTest)).getMessage(); assertEquals( "Invalid boost value: 'pewpew'. Accepts only floating point values greater than 0.", msg); - var boolTest = DSL.query_string(fields, query, - DSL.namedArgument("escape", literal("42"))); + var boolTest = DSL.query_string(fields, query, DSL.namedArgument("escape", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(boolTest)).getMessage(); assertEquals( "Invalid escape value: '42'. Accepts only boolean values: 'true' or 'false'.", msg); - var typeTest = DSL.multi_match(fields, query, - DSL.namedArgument("type", literal("42"))); + var typeTest = DSL.multi_match(fields, query, DSL.namedArgument("type", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(typeTest)).getMessage(); assertTrue(msg.startsWith("Invalid type value: '42'. Available values are:")); - var operatorTest = DSL.simple_query_string(fields, query, - DSL.namedArgument("default_operator", literal("42"))); + var operatorTest = + DSL.simple_query_string( + fields, query, DSL.namedArgument("default_operator", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(operatorTest)).getMessage(); assertTrue(msg.startsWith("Invalid default_operator value: '42'. Available values are:")); - var flagsTest = DSL.simple_query_string(fields, query, - DSL.namedArgument("flags", literal("42"))); + var flagsTest = + DSL.simple_query_string(fields, query, DSL.namedArgument("flags", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(flagsTest)).getMessage(); assertTrue(msg.startsWith("Invalid flags value: '42'. Available values are:")); - var fuzzinessTest = DSL.match_bool_prefix(field, query, - DSL.namedArgument("fuzziness", literal("AUTO:"))); + var fuzzinessTest = + DSL.match_bool_prefix(field, query, DSL.namedArgument("fuzziness", literal("AUTO:"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(fuzzinessTest)).getMessage(); assertTrue(msg.startsWith("Invalid fuzziness value: 'AUTO:'. Available values are:")); - var rewriteTest = DSL.match_bool_prefix(field, query, - DSL.namedArgument("fuzzy_rewrite", literal("42"))); + var rewriteTest = + DSL.match_bool_prefix(field, query, DSL.namedArgument("fuzzy_rewrite", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(rewriteTest)).getMessage(); assertTrue(msg.startsWith("Invalid fuzzy_rewrite value: '42'. Available values are:")); - var timezoneTest = DSL.query_string(fields, query, - DSL.namedArgument("time_zone", literal("42"))); + var timezoneTest = + DSL.query_string(fields, query, DSL.namedArgument("time_zone", literal("42"))); msg = assertThrows(RuntimeException.class, () -> buildQuery(timezoneTest)).getMessage(); assertTrue(msg.startsWith("Invalid time_zone value: '42'.")); } @@ -1323,30 +1446,39 @@ void should_build_match_bool_prefix_query_with_default_parameters() { + "}", buildQuery( DSL.match_bool_prefix( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query"))))); } @Test void multi_match_missing_fields_even_with_struct() { - FunctionExpression expr = DSL.multi_match( - DSL.namedArgument("something-but-not-fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "pewpew", ExprValueUtils.integerValue(42)))))), - DSL.namedArgument("query", literal("search query")), - DSL.namedArgument("analyzer", literal("keyword"))); + FunctionExpression expr = + DSL.multi_match( + DSL.namedArgument( + "something-but-not-fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of("pewpew", ExprValueUtils.integerValue(42)))))), + DSL.namedArgument("query", literal("search query")), + DSL.namedArgument("analyzer", literal("keyword"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("'fields' parameter is missing.", msg); } @Test void multi_match_missing_query_even_with_struct() { - FunctionExpression expr = DSL.multi_match( - DSL.namedArgument("fields", DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "field1", ExprValueUtils.floatValue(1.F), - "field2", ExprValueUtils.floatValue(.3F)))))), + FunctionExpression expr = + DSL.multi_match( + DSL.namedArgument( + "fields", + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "field1", ExprValueUtils.floatValue(1.F), + "field2", ExprValueUtils.floatValue(.3F)))))), DSL.namedArgument("analyzer", literal("keyword"))); var msg = assertThrows(SemanticCheckException.class, () -> buildQuery(expr)).getMessage(); assertEquals("'query' parameter is missing", msg); @@ -1368,8 +1500,8 @@ void should_build_match_phrase_prefix_query_with_default_parameters() { + "}", buildQuery( DSL.match_phrase_prefix( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query"))))); } @@ -1390,8 +1522,8 @@ void should_build_match_phrase_prefix_query_with_non_default_parameters() { + "}", buildQuery( DSL.match_phrase_prefix( - DSL.namedArgument("field", - new ReferenceExpression("message", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("message", OpenSearchTextType.of())), DSL.namedArgument("query", literal("search query")), DSL.namedArgument("boost", literal("1.2")), DSL.namedArgument("max_expansions", literal("42")), @@ -1400,30 +1532,31 @@ void should_build_match_phrase_prefix_query_with_non_default_parameters() { @Test void cast_to_string_in_filter() { - String json = "{\n" - + " \"term\" : {\n" - + " \"string_value\" : {\n" - + " \"value\" : \"1\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"string_value\" : {\n" + + " \"value\" : \"1\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; - assertJsonEquals(json, buildQuery( - DSL.equal(ref("string_value", STRING), DSL.castString(literal(1))))); - assertJsonEquals(json, buildQuery( - DSL.equal(ref("string_value", STRING), DSL.castString(literal("1"))))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("string_value", STRING), DSL.castString(literal(1))))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("string_value", STRING), DSL.castString(literal("1"))))); } private Float castToFloat(Object o) { if (o instanceof Number) { - return ((Number)o).floatValue(); + return ((Number) o).floatValue(); } if (o instanceof String) { return Float.parseFloat((String) o); } if (o instanceof Boolean) { - return ((Boolean)o) ? 1F : 0F; + return ((Boolean) o) ? 1F : 0F; } // unreachable code throw new IllegalArgumentException(); @@ -1431,13 +1564,13 @@ private Float castToFloat(Object o) { private Integer castToInteger(Object o) { if (o instanceof Number) { - return ((Number)o).intValue(); + return ((Number) o).intValue(); } if (o instanceof String) { return Integer.parseInt((String) o); } if (o instanceof Boolean) { - return ((Boolean)o) ? 1 : 0; + return ((Boolean) o) ? 1 : 0; } // unreachable code throw new IllegalArgumentException(); @@ -1446,75 +1579,85 @@ private Integer castToInteger(Object o) { @ParameterizedTest(name = "castByte({0})") @MethodSource({"numericCastSource"}) void cast_to_byte_in_filter(LiteralExpression expr) { - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"byte_value\" : {\n" - + " \"value\" : %d,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", castToInteger(expr.valueOf().value())), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"byte_value\" : {\n" + + " \"value\" : %d,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + castToInteger(expr.valueOf().value())), buildQuery(DSL.equal(ref("byte_value", BYTE), DSL.castByte(expr)))); } @ParameterizedTest(name = "castShort({0})") @MethodSource({"numericCastSource"}) void cast_to_short_in_filter(LiteralExpression expr) { - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"short_value\" : {\n" - + " \"value\" : %d,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", castToInteger(expr.valueOf().value())), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"short_value\" : {\n" + + " \"value\" : %d,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + castToInteger(expr.valueOf().value())), buildQuery(DSL.equal(ref("short_value", SHORT), DSL.castShort(expr)))); } @ParameterizedTest(name = "castInt({0})") @MethodSource({"numericCastSource"}) void cast_to_int_in_filter(LiteralExpression expr) { - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"integer_value\" : {\n" - + " \"value\" : %d,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", castToInteger(expr.valueOf().value())), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"integer_value\" : {\n" + + " \"value\" : %d,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + castToInteger(expr.valueOf().value())), buildQuery(DSL.equal(ref("integer_value", INTEGER), DSL.castInt(expr)))); } @ParameterizedTest(name = "castLong({0})") @MethodSource({"numericCastSource"}) void cast_to_long_in_filter(LiteralExpression expr) { - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"long_value\" : {\n" - + " \"value\" : %d,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", castToInteger(expr.valueOf().value())), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"long_value\" : {\n" + + " \"value\" : %d,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + castToInteger(expr.valueOf().value())), buildQuery(DSL.equal(ref("long_value", LONG), DSL.castLong(expr)))); } @ParameterizedTest(name = "castFloat({0})") @MethodSource({"numericCastSource"}) void cast_to_float_in_filter(LiteralExpression expr) { - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"float_value\" : {\n" - + " \"value\" : %f,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", castToFloat(expr.valueOf().value())), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"float_value\" : {\n" + + " \"value\" : %f,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + castToFloat(expr.valueOf().value())), buildQuery(DSL.equal(ref("float_value", FLOAT), DSL.castFloat(expr)))); } @@ -1523,32 +1666,35 @@ void cast_to_float_in_filter(LiteralExpression expr) { void cast_to_double_in_filter(LiteralExpression expr) { // double values affected by floating point imprecision, so we can't compare them in json // (Double)(Float)3.14 -> 3.14000010490417 - assertEquals(castToFloat(expr.valueOf().value()), - DSL.castDouble(expr).valueOf().doubleValue(), 0.00001); + assertEquals( + castToFloat(expr.valueOf().value()), DSL.castDouble(expr).valueOf().doubleValue(), 0.00001); - assertJsonEquals(String.format( - "{\n" - + " \"term\" : {\n" - + " \"double_value\" : {\n" - + " \"value\" : %2.20f,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}", DSL.castDouble(expr).valueOf().doubleValue()), + assertJsonEquals( + String.format( + "{\n" + + " \"term\" : {\n" + + " \"double_value\" : {\n" + + " \"value\" : %2.20f,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}", + DSL.castDouble(expr).valueOf().doubleValue()), buildQuery(DSL.equal(ref("double_value", DOUBLE), DSL.castDouble(expr)))); } @ParameterizedTest(name = "castBooleanTrue({0})") @MethodSource({"booleanTrueCastSource"}) void cast_to_boolean_true_in_filter(LiteralExpression expr) { - String json = "{\n" - + " \"term\" : {\n" - + " \"boolean_value\" : {\n" - + " \"value\" : true,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"boolean_value\" : {\n" + + " \"value\" : true,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; assertJsonEquals( json, buildQuery(DSL.equal(ref("boolean_value", BOOLEAN), DSL.castBoolean(expr)))); @@ -1557,14 +1703,15 @@ void cast_to_boolean_true_in_filter(LiteralExpression expr) { @ParameterizedTest(name = "castBooleanFalse({0})") @MethodSource({"booleanFalseCastSource"}) void cast_to_boolean_false_in_filter(LiteralExpression expr) { - String json = "{\n" - + " \"term\" : {\n" - + " \"boolean_value\" : {\n" - + " \"value\" : false,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"boolean_value\" : {\n" + + " \"value\" : false,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; assertJsonEquals( json, buildQuery(DSL.equal(ref("boolean_value", BOOLEAN), DSL.castBoolean(expr)))); @@ -1573,118 +1720,153 @@ void cast_to_boolean_false_in_filter(LiteralExpression expr) { @Test void cast_from_boolean() { Expression booleanExpr = literal(false); - String json = "{\n" - + " \"term\" : {\n" - + " \"my_value\" : {\n" - + " \"value\" : 0,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", BYTE), DSL.castByte(booleanExpr)))); - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", SHORT), DSL.castShort(booleanExpr)))); - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", INTEGER), DSL.castInt(booleanExpr)))); - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", LONG), DSL.castLong(booleanExpr)))); - - json = "{\n" - + " \"term\" : {\n" - + " \"my_value\" : {\n" - + " \"value\" : 0.0,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", FLOAT), DSL.castFloat(booleanExpr)))); - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", DOUBLE), DSL.castDouble(booleanExpr)))); - - json = "{\n" - + " \"term\" : {\n" - + " \"my_value\" : {\n" - + " \"value\" : \"false\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; - assertJsonEquals(json, buildQuery( - DSL.equal(ref("my_value", STRING), DSL.castString(booleanExpr)))); + String json = + "{\n" + + " \"term\" : {\n" + + " \"my_value\" : {\n" + + " \"value\" : 0,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; + assertJsonEquals(json, buildQuery(DSL.equal(ref("my_value", BYTE), DSL.castByte(booleanExpr)))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("my_value", SHORT), DSL.castShort(booleanExpr)))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("my_value", INTEGER), DSL.castInt(booleanExpr)))); + assertJsonEquals(json, buildQuery(DSL.equal(ref("my_value", LONG), DSL.castLong(booleanExpr)))); + + json = + "{\n" + + " \"term\" : {\n" + + " \"my_value\" : {\n" + + " \"value\" : 0.0,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; + assertJsonEquals( + json, buildQuery(DSL.equal(ref("my_value", FLOAT), DSL.castFloat(booleanExpr)))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("my_value", DOUBLE), DSL.castDouble(booleanExpr)))); + + json = + "{\n" + + " \"term\" : {\n" + + " \"my_value\" : {\n" + + " \"value\" : \"false\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; + assertJsonEquals( + json, buildQuery(DSL.equal(ref("my_value", STRING), DSL.castString(booleanExpr)))); } @Test void cast_to_date_in_filter() { - String json = "{\n" - + " \"term\" : {\n" - + " \"date_value\" : {\n" - + " \"value\" : \"2021-11-08\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"date_value\" : {\n" + + " \"value\" : \"2021-11-08\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; - assertJsonEquals(json, buildQuery(DSL.equal( - ref("date_value", DATE), DSL.castDate(literal("2021-11-08"))))); - assertJsonEquals(json, buildQuery(DSL.equal( - ref("date_value", DATE), DSL.castDate(literal(new ExprDateValue("2021-11-08")))))); - assertJsonEquals(json, buildQuery(DSL.equal(ref( - "date_value", DATE), DSL.castDate(literal(new ExprDatetimeValue("2021-11-08 17:00:00")))))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("date_value", DATE), DSL.castDate(literal("2021-11-08"))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("date_value", DATE), DSL.castDate(literal(new ExprDateValue("2021-11-08")))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("date_value", DATE), + DSL.castDate(literal(new ExprDatetimeValue("2021-11-08 17:00:00")))))); } @Test void cast_to_time_in_filter() { - String json = "{\n" - + " \"term\" : {\n" - + " \"time_value\" : {\n" - + " \"value\" : \"17:00:00\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"time_value\" : {\n" + + " \"value\" : \"17:00:00\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; - assertJsonEquals(json, buildQuery(DSL.equal( - ref("time_value", TIME), DSL.castTime(literal("17:00:00"))))); - assertJsonEquals(json, buildQuery(DSL.equal( - ref("time_value", TIME), DSL.castTime(literal(new ExprTimeValue("17:00:00")))))); - assertJsonEquals(json, buildQuery(DSL.equal(ref("time_value", TIME), DSL - .castTime(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); + assertJsonEquals( + json, buildQuery(DSL.equal(ref("time_value", TIME), DSL.castTime(literal("17:00:00"))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("time_value", TIME), DSL.castTime(literal(new ExprTimeValue("17:00:00")))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("time_value", TIME), + DSL.castTime(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); } @Test void cast_to_datetime_in_filter() { - String json = "{\n" - + " \"term\" : {\n" - + " \"datetime_value\" : {\n" - + " \"value\" : \"2021-11-08 17:00:00\",\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"datetime_value\" : {\n" + + " \"value\" : \"2021-11-08 17:00:00\",\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; - assertJsonEquals(json, buildQuery(DSL.equal(ref("datetime_value", DATETIME), DSL - .castDatetime(literal("2021-11-08 17:00:00"))))); - assertJsonEquals(json, buildQuery(DSL.equal(ref("datetime_value", DATETIME), DSL - .castDatetime(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("datetime_value", DATETIME), + DSL.castDatetime(literal("2021-11-08 17:00:00"))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("datetime_value", DATETIME), + DSL.castDatetime(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); } @Test void cast_to_timestamp_in_filter() { - String json = "{\n" - + " \"term\" : {\n" - + " \"timestamp_value\" : {\n" - + " \"value\" : 1636390800000,\n" - + " \"boost\" : 1.0\n" - + " }\n" - + " }\n" - + "}"; + String json = + "{\n" + + " \"term\" : {\n" + + " \"timestamp_value\" : {\n" + + " \"value\" : 1636390800000,\n" + + " \"boost\" : 1.0\n" + + " }\n" + + " }\n" + + "}"; - assertJsonEquals(json, buildQuery(DSL.equal(ref("timestamp_value", TIMESTAMP), DSL - .castTimestamp(literal("2021-11-08 17:00:00"))))); - assertJsonEquals(json, buildQuery(DSL.equal(ref("timestamp_value", TIMESTAMP), DSL - .castTimestamp(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("timestamp_value", TIMESTAMP), + DSL.castTimestamp(literal("2021-11-08 17:00:00"))))); + assertJsonEquals( + json, + buildQuery( + DSL.equal( + ref("timestamp_value", TIMESTAMP), + DSL.castTimestamp(literal(new ExprTimestampValue("2021-11-08 17:00:00")))))); } @Test @@ -1701,8 +1883,10 @@ void cast_in_range_query() { + " }\n" + " }\n" + "}", - buildQuery(DSL.greater(ref("timestamp_value", TIMESTAMP), DSL - .castTimestamp(literal("2021-11-08 17:00:00"))))); + buildQuery( + DSL.greater( + ref("timestamp_value", TIMESTAMP), + DSL.castTimestamp(literal("2021-11-08 17:00:00"))))); } @Test @@ -1718,9 +1902,9 @@ void non_literal_in_cast_should_build_script() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery(DSL.equal(ref("string_value", STRING), DSL.castString(DSL - .add(literal(1), literal(0))))) - ); + buildQuery( + DSL.equal( + ref("string_value", STRING), DSL.castString(DSL.add(literal(1), literal(0)))))); } @Test @@ -1736,13 +1920,13 @@ void non_cast_nested_function_should_build_script() { + " \"boost\" : 1.0\n" + " }\n" + "}", - buildQuery(DSL.equal(ref("integer_value", INTEGER), DSL.abs(DSL - .add(literal(1), literal(0))))) - ); + buildQuery( + DSL.equal(ref("integer_value", INTEGER), DSL.abs(DSL.add(literal(1), literal(0)))))); } private static void assertJsonEquals(String expected, String actual) { - assertTrue(new JSONObject(expected).similar(new JSONObject(actual)), + assertTrue( + new JSONObject(expected).similar(new JSONObject(actual)), StringUtils.format("Expected: %s, actual: %s", expected, actual)); } @@ -1751,10 +1935,12 @@ private String buildQuery(Expression expr) { } private void mockToStringSerializer() { - doAnswer(invocation -> { - Expression expr = invocation.getArgument(0); - return expr.toString(); - }).when(serializer).serialize(any()); + doAnswer( + invocation -> { + Expression expr = invocation.getArgument(0); + return expr.toString(); + }) + .when(serializer) + .serialize(any()); } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQueryTest.java index 37b8326ef4..df3a730bad 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQueryTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter.lucene; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -20,13 +19,12 @@ class LuceneQueryTest { @Test void should_not_support_single_argument_by_default() { - assertFalse(new LuceneQuery(){}.canSupport(DSL.abs(DSL.ref("age", INTEGER)))); + assertFalse(new LuceneQuery() {}.canSupport(DSL.abs(DSL.ref("age", INTEGER)))); } @Test void should_throw_exception_if_not_implemented() { - assertThrows(UnsupportedOperationException.class, () -> - new LuceneQuery(){}.doBuild(null, null, null)); + assertThrows( + UnsupportedOperationException.class, () -> new LuceneQuery() {}.doBuild(null, null, null)); } - } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchBoolPrefixQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchBoolPrefixQueryTest.java index 6906619065..7465bfc5a4 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchBoolPrefixQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchBoolPrefixQueryTest.java @@ -35,8 +35,8 @@ public class MatchBoolPrefixQueryTest { private final FunctionName matchBoolPrefix = FunctionName.of("match_bool_prefix"); static Stream> generateValidData() { - NamedArgumentExpression field = DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())); + NamedArgumentExpression field = + DSL.namedArgument("field", new ReferenceExpression("field_value", OpenSearchTextType.of())); NamedArgumentExpression query = DSL.namedArgument("query", DSL.literal("query_value")); return List.of( DSL.namedArgument("fuzziness", DSL.literal("AUTO")), @@ -48,8 +48,9 @@ static Stream> generateValidData() { DSL.namedArgument("boost", DSL.literal("1")), DSL.namedArgument("analyzer", DSL.literal("simple")), DSL.namedArgument("operator", DSL.literal("Or")), - DSL.namedArgument("operator", DSL.literal("and")) - ).stream().map(arg -> List.of(field, query, arg)); + DSL.namedArgument("operator", DSL.literal("and"))) + .stream() + .map(arg -> List.of(field, query, arg)); } @ParameterizedTest @@ -60,35 +61,40 @@ public void test_valid_arguments(List validArgs) { @Test public void test_valid_when_two_arguments() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - DSL.namedArgument("query", "query_value")); + List arguments = + List.of( + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument("query", "query_value")); Assertions.assertNotNull(matchBoolPrefixQuery.build(new MatchExpression(arguments))); } @Test public void test_SyntaxCheckException_when_no_arguments() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> matchBoolPrefixQuery.build(new MatchExpression(arguments))); } @Test public void test_SyntaxCheckException_when_one_argument() { List arguments = List.of(DSL.namedArgument("field", "field_value")); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> matchBoolPrefixQuery.build(new MatchExpression(arguments))); } @Test public void test_SemanticCheckException_when_invalid_argument() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - DSL.namedArgument("query", "query_value"), - DSL.namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument("query", "query_value"), + DSL.namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, () -> matchBoolPrefixQuery.build(new MatchExpression(arguments))); } @@ -99,14 +105,16 @@ public MatchExpression(List arguments) { @Override public ExprValue valueOf(Environment valueEnv) { - throw new UnsupportedOperationException("Invalid function call, " - + "valueOf function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "valueOf function need implementation only to support Expression interface"); } @Override public ExprType type() { - throw new UnsupportedOperationException("Invalid function call, " - + "type function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "type function need implementation only to support Expression interface"); } } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhrasePrefixQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhrasePrefixQueryTest.java index 0defee0008..a3cf54bc5f 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhrasePrefixQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhrasePrefixQueryTest.java @@ -5,7 +5,6 @@ package org.opensearch.sql.opensearch.storage.script.filter.lucene; - import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; @@ -27,7 +26,7 @@ import org.opensearch.sql.opensearch.storage.script.filter.lucene.relevance.MatchPhrasePrefixQuery; @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) -public class MatchPhrasePrefixQueryTest { +public class MatchPhrasePrefixQueryTest { private final MatchPhrasePrefixQuery matchPhrasePrefixQuery = new MatchPhrasePrefixQuery(); private final FunctionName matchPhrasePrefix = FunctionName.of("match_phrase_prefix"); @@ -35,90 +34,89 @@ public class MatchPhrasePrefixQueryTest { @Test public void test_SyntaxCheckException_when_no_arguments() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_SyntaxCheckException_when_one_argument() { - List arguments = List.of(DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of()))); - assertThrows(SyntaxCheckException.class, + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of()))); + assertThrows( + SyntaxCheckException.class, () -> matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_SyntaxCheckException_when_invalid_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2"), - DSL.namedArgument("unsupported", "3")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2"), + DSL.namedArgument("unsupported", "3")); + Assertions.assertThrows( + SemanticCheckException.class, () -> matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_analyzer_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("analyzer", "standard") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("analyzer", "standard")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void build_succeeds_with_two_arguments() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2")); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_slop_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("slop", "2") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("slop", "2")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_zero_terms_query_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "ALL") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "ALL")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_zero_terms_query_parameter_lower_case() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "all") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "all")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_boost_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("boost", "0.1") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("boost", "0.1")); Assertions.assertNotNull(matchPhrasePrefixQuery.build(new MatchPhraseExpression(arguments))); } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhraseQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhraseQueryTest.java index 20ecb869ba..66c4c00059 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhraseQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchPhraseQueryTest.java @@ -5,7 +5,6 @@ package org.opensearch.sql.opensearch.storage.script.filter.lucene; - import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.List; @@ -37,256 +36,259 @@ public class MatchPhraseQueryTest { @Test public void test_SyntaxCheckException_when_no_arguments() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_SyntaxCheckException_when_one_argument() { - List arguments = List.of(DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of()))); - assertThrows(SyntaxCheckException.class, + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of()))); + assertThrows( + SyntaxCheckException.class, () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_SyntaxCheckException_when_invalid_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2"), - DSL.namedArgument("unsupported", "3")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2"), + DSL.namedArgument("unsupported", "3")); + Assertions.assertThrows( + SemanticCheckException.class, () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_analyzer_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("analyzer", "standard") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("analyzer", "standard")); Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void build_succeeds_with_two_arguments() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2")); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2")); Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_slop_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("slop", "2") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("slop", "2")); Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_zero_terms_query_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "ALL") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "ALL")); Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_zero_terms_query_parameter_lower_case() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "all") - ); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "all")); Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression(arguments))); } @Test public void test_SyntaxCheckException_when_no_arguments_match_phrase_syntax() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + assertThrows( + SyntaxCheckException.class, + () -> + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_SyntaxCheckException_when_one_argument_match_phrase_syntax() { - List arguments = List.of(DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of()))); - assertThrows(SyntaxCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); - + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of()))); + assertThrows( + SyntaxCheckException.class, + () -> + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_SyntaxCheckException_when_invalid_parameter_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2"), - DSL.namedArgument("unsupported", "3")); - Assertions.assertThrows(SemanticCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2"), + DSL.namedArgument("unsupported", "3")); + Assertions.assertThrows( + SemanticCheckException.class, + () -> + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_analyzer_parameter_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("analyzer", "standard") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("analyzer", "standard")); + Assertions.assertNotNull( + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void build_succeeds_with_two_arguments_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2")); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2")); + Assertions.assertNotNull( + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_slop_parameter_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("slop", "2") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("slop", "2")); + Assertions.assertNotNull( + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_zero_terms_query_parameter_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "ALL") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "ALL")); + Assertions.assertNotNull( + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_zero_terms_query_parameter_lower_case_match_phrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "all") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "all")); + Assertions.assertNotNull( + matchPhraseQuery.build( + new MatchPhraseExpression(arguments, matchPhraseWithUnderscoreName))); } @Test public void test_SyntaxCheckException_when_no_arguments_matchphrase_syntax() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + assertThrows( + SyntaxCheckException.class, + () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_SyntaxCheckException_when_one_argument_matchphrase_syntax() { - List arguments = List.of(DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of()))); - assertThrows(SyntaxCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); - + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of()))); + assertThrows( + SyntaxCheckException.class, + () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_SyntaxCheckException_when_invalid_parameter_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2"), - DSL.namedArgument("unsupported", "3")); - Assertions.assertThrows(SemanticCheckException.class, - () -> matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2"), + DSL.namedArgument("unsupported", "3")); + Assertions.assertThrows( + SemanticCheckException.class, + () -> matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_analyzer_parameter_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("analyzer", "standard") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("analyzer", "standard")); + Assertions.assertNotNull( + matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void build_succeeds_with_two_arguments_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("test", OpenSearchTextType.of())), - DSL.namedArgument("query", "test2")); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("test", OpenSearchTextType.of())), + DSL.namedArgument("query", "test2")); + Assertions.assertNotNull( + matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_slop_parameter_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("slop", "2") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("slop", "2")); + Assertions.assertNotNull( + matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_zero_terms_query_parameter_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "ALL") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "ALL")); + Assertions.assertNotNull( + matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } @Test public void test_zero_terms_query_parameter_lower_case_matchphrase_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("t1", OpenSearchTextType.of())), - DSL.namedArgument("query", "t2"), - DSL.namedArgument("zero_terms_query", "all") - ); - Assertions.assertNotNull(matchPhraseQuery.build(new MatchPhraseExpression( - arguments, matchPhraseQueryName))); + List arguments = + List.of( + DSL.namedArgument("field", new ReferenceExpression("t1", OpenSearchTextType.of())), + DSL.namedArgument("query", "t2"), + DSL.namedArgument("zero_terms_query", "all")); + Assertions.assertNotNull( + matchPhraseQuery.build(new MatchPhraseExpression(arguments, matchPhraseQueryName))); } private class MatchPhraseExpression extends FunctionExpression { diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchQueryTest.java index ddabb3820e..28b7878d63 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MatchQueryTest.java @@ -35,95 +35,81 @@ public class MatchQueryTest { private final FunctionName matchName = FunctionName.of("match"); private final FunctionName matchQueryName = FunctionName.of("matchquery"); private final FunctionName matchQueryWithUnderscoreName = FunctionName.of("match_query"); - private final FunctionName[] functionNames = - {matchName,matchQueryName, matchQueryWithUnderscoreName}; + private final FunctionName[] functionNames = { + matchName, matchQueryName, matchQueryWithUnderscoreName + }; static Stream> generateValidData() { return Stream.of( List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - DSL.namedArgument("query", DSL.literal("query_value")) - ), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument("query", DSL.literal("query_value"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("analyzer", DSL.literal("standard")) - ), + DSL.namedArgument("analyzer", DSL.literal("standard"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("auto_generate_synonyms_phrase_query", DSL.literal("true")) - ), + DSL.namedArgument("auto_generate_synonyms_phrase_query", DSL.literal("true"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("fuzziness", DSL.literal("AUTO")) - ), + DSL.namedArgument("fuzziness", DSL.literal("AUTO"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("max_expansions", DSL.literal("50")) - ), + DSL.namedArgument("max_expansions", DSL.literal("50"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("prefix_length", DSL.literal("0")) - ), + DSL.namedArgument("prefix_length", DSL.literal("0"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("fuzzy_transpositions", DSL.literal("true")) - ), + DSL.namedArgument("fuzzy_transpositions", DSL.literal("true"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("fuzzy_rewrite", DSL.literal("constant_score")) - ), + DSL.namedArgument("fuzzy_rewrite", DSL.literal("constant_score"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("lenient", DSL.literal("false")) - ), + DSL.namedArgument("lenient", DSL.literal("false"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("operator", DSL.literal("OR")) - ), + DSL.namedArgument("operator", DSL.literal("OR"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("minimum_should_match", DSL.literal("3")) - ), + DSL.namedArgument("minimum_should_match", DSL.literal("3"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("zero_terms_query", DSL.literal("NONE")) - ), + DSL.namedArgument("zero_terms_query", DSL.literal("NONE"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("zero_terms_query", DSL.literal("none")) - ), + DSL.namedArgument("zero_terms_query", DSL.literal("none"))), List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), DSL.namedArgument("query", DSL.literal("query_value")), - DSL.namedArgument("boost", DSL.literal("1")) - ) - ); + DSL.namedArgument("boost", DSL.literal("1")))); } @ParameterizedTest @@ -135,99 +121,108 @@ public void test_valid_parameters(List validArgs) { @Test public void test_SyntaxCheckException_when_no_arguments() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build(new MatchExpression(arguments))); + assertThrows( + SyntaxCheckException.class, () -> matchQuery.build(new MatchExpression(arguments))); } @Test public void test_SyntaxCheckException_when_one_argument() { List arguments = List.of(namedArgument("field", "field_value")); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build(new MatchExpression(arguments))); + assertThrows( + SyntaxCheckException.class, () -> matchQuery.build(new MatchExpression(arguments))); } @Test public void test_SemanticCheckException_when_invalid_parameter() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - namedArgument("query", "query_value"), - namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, - () -> matchQuery.build(new MatchExpression(arguments))); + List arguments = + List.of( + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + namedArgument("query", "query_value"), + namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, () -> matchQuery.build(new MatchExpression(arguments))); } @ParameterizedTest @MethodSource("generateValidData") public void test_valid_parameters_matchquery_syntax(List validArgs) { - Assertions.assertNotNull(matchQuery.build( - new MatchExpression(validArgs, MatchQueryTest.this.matchQueryName))); + Assertions.assertNotNull( + matchQuery.build(new MatchExpression(validArgs, MatchQueryTest.this.matchQueryName))); } @Test public void test_SyntaxCheckException_when_no_arguments_matchquery_syntax() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); + assertThrows( + SyntaxCheckException.class, + () -> matchQuery.build(new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); } @Test public void test_SyntaxCheckException_when_one_argument_matchquery_syntax() { List arguments = List.of(namedArgument("field", "field_value")); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); + assertThrows( + SyntaxCheckException.class, + () -> matchQuery.build(new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); } @Test public void test_SemanticCheckException_when_invalid_parameter_matchquery_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - namedArgument("query", "query_value"), - namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); + List arguments = + List.of( + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + namedArgument("query", "query_value"), + namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, + () -> matchQuery.build(new MatchExpression(arguments, MatchQueryTest.this.matchQueryName))); } @ParameterizedTest @MethodSource("generateValidData") public void test_valid_parameters_match_query_syntax(List validArgs) { - Assertions.assertNotNull(matchQuery.build( - new MatchExpression(validArgs, MatchQueryTest.this.matchQueryWithUnderscoreName))); + Assertions.assertNotNull( + matchQuery.build( + new MatchExpression(validArgs, MatchQueryTest.this.matchQueryWithUnderscoreName))); } @Test public void test_SyntaxCheckException_when_no_arguments_match_query_syntax() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); + assertThrows( + SyntaxCheckException.class, + () -> + matchQuery.build( + new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); } @Test public void test_SyntaxCheckException_when_one_argument_match_query_syntax() { List arguments = List.of(namedArgument("field", "field_value")); - assertThrows(SyntaxCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); + assertThrows( + SyntaxCheckException.class, + () -> + matchQuery.build( + new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); } @Test public void test_SemanticCheckException_when_invalid_parameter_match_query_syntax() { - List arguments = List.of( - DSL.namedArgument("field", - new ReferenceExpression("field_value", OpenSearchTextType.of())), - namedArgument("query", "query_value"), - namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, - () -> matchQuery.build( - new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); + List arguments = + List.of( + DSL.namedArgument( + "field", new ReferenceExpression("field_value", OpenSearchTextType.of())), + namedArgument("query", "query_value"), + namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, + () -> + matchQuery.build( + new MatchExpression(arguments, MatchQueryTest.this.matchQueryWithUnderscoreName))); } - private NamedArgumentExpression namedArgument(String name, String value) { return DSL.namedArgument(name, DSL.literal(value)); } @@ -244,14 +239,16 @@ public MatchExpression(List arguments, FunctionName funcName) { @Override public ExprValue valueOf(Environment valueEnv) { - throw new UnsupportedOperationException("Invalid function call, " - + "valueOf function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "valueOf function need implementation only to support Expression interface"); } @Override public ExprType type() { - throw new UnsupportedOperationException("Invalid function call, " - + "type function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "type function need implementation only to support Expression interface"); } } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MultiMatchTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MultiMatchTest.java index 93b0cdbc93..7fcc4a6430 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MultiMatchTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/MultiMatchTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.script.filter.lucene; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -39,186 +38,181 @@ class MultiMatchTest { private final FunctionName multiMatchName = FunctionName.of("multimatch"); private final FunctionName snakeCaseMultiMatchName = FunctionName.of("multi_match"); private final FunctionName multiMatchQueryName = FunctionName.of("multimatchquery"); - private static final LiteralExpression fields_value = DSL.literal( - new ExprTupleValue(new LinkedHashMap<>(ImmutableMap.of( - "title", ExprValueUtils.floatValue(1.F), - "body", ExprValueUtils.floatValue(.3F))))); + private static final LiteralExpression fields_value = + DSL.literal( + new ExprTupleValue( + new LinkedHashMap<>( + ImmutableMap.of( + "title", ExprValueUtils.floatValue(1.F), + "body", ExprValueUtils.floatValue(.3F))))); private static final LiteralExpression query_value = DSL.literal("query_value"); static Stream> generateValidData() { return Stream.of( - List.of( - DSL.namedArgument("fields", fields_value), - DSL.namedArgument("query", query_value) - ), + List.of(DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value)), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("analyzer", DSL.literal("simple")) - ), + DSL.namedArgument("analyzer", DSL.literal("simple"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("auto_generate_synonyms_phrase_query", DSL.literal("true")) - ), + DSL.namedArgument("auto_generate_synonyms_phrase_query", DSL.literal("true"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("boost", DSL.literal("1.3")) - ), + DSL.namedArgument("boost", DSL.literal("1.3"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("cutoff_frequency", DSL.literal("4.2")) - ), + DSL.namedArgument("cutoff_frequency", DSL.literal("4.2"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("fuzziness", DSL.literal("AUTO:2,4")) - ), + DSL.namedArgument("fuzziness", DSL.literal("AUTO:2,4"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("fuzzy_transpositions", DSL.literal("true")) - ), + DSL.namedArgument("fuzzy_transpositions", DSL.literal("true"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("lenient", DSL.literal("true")) - ), + DSL.namedArgument("lenient", DSL.literal("true"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("max_expansions", DSL.literal("7")) - ), + DSL.namedArgument("max_expansions", DSL.literal("7"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("minimum_should_match", DSL.literal("4")) - ), + DSL.namedArgument("minimum_should_match", DSL.literal("4"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("operator", DSL.literal("AND")) - ), + DSL.namedArgument("operator", DSL.literal("AND"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("prefix_length", DSL.literal("7")) - ), + DSL.namedArgument("prefix_length", DSL.literal("7"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("tie_breaker", DSL.literal("0.3")) - ), + DSL.namedArgument("tie_breaker", DSL.literal("0.3"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("type", DSL.literal("cross_fields")) - ), + DSL.namedArgument("type", DSL.literal("cross_fields"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("zero_terms_query", DSL.literal("ALL")) - ), + DSL.namedArgument("zero_terms_query", DSL.literal("ALL"))), List.of( DSL.namedArgument("fields", fields_value), DSL.namedArgument("query", query_value), - DSL.namedArgument("zero_terms_query", DSL.literal("all")) - ) - ); + DSL.namedArgument("zero_terms_query", DSL.literal("all")))); } @ParameterizedTest @MethodSource("generateValidData") public void test_valid_parameters_multiMatch(List validArgs) { - Assertions.assertNotNull(multiMatchQuery.build( - new MultiMatchExpression(validArgs))); + Assertions.assertNotNull(multiMatchQuery.build(new MultiMatchExpression(validArgs))); } @ParameterizedTest @MethodSource("generateValidData") public void test_valid_parameters_multi_match(List validArgs) { - Assertions.assertNotNull(multiMatchQuery.build( - new MultiMatchExpression(validArgs, snakeCaseMultiMatchName))); + Assertions.assertNotNull( + multiMatchQuery.build(new MultiMatchExpression(validArgs, snakeCaseMultiMatchName))); } @ParameterizedTest @MethodSource("generateValidData") public void test_valid_parameters_multiMatchQuery(List validArgs) { - Assertions.assertNotNull(multiMatchQuery.build( - new MultiMatchExpression(validArgs, multiMatchQueryName))); + Assertions.assertNotNull( + multiMatchQuery.build(new MultiMatchExpression(validArgs, multiMatchQueryName))); } @Test public void test_SyntaxCheckException_when_no_arguments_multiMatch() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments))); } @Test public void test_SyntaxCheckException_when_no_arguments_multi_match() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, multiMatchName))); } @Test public void test_SyntaxCheckException_when_no_arguments_multiMatchQuery() { List arguments = List.of(); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, multiMatchQueryName))); } @Test public void test_SyntaxCheckException_when_one_argument_multiMatch() { List arguments = List.of(namedArgument("fields", fields_value)); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments))); } @Test public void test_SyntaxCheckException_when_one_argument_multi_match() { List arguments = List.of(namedArgument("fields", fields_value)); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, snakeCaseMultiMatchName))); } @Test public void test_SyntaxCheckException_when_one_argument_multiMatchQuery() { List arguments = List.of(namedArgument("fields", fields_value)); - assertThrows(SyntaxCheckException.class, + assertThrows( + SyntaxCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, multiMatchQueryName))); } @Test public void test_SemanticCheckException_when_invalid_parameter_multiMatch() { - List arguments = List.of( - namedArgument("fields", fields_value), - namedArgument("query", query_value), - DSL.namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + namedArgument("fields", fields_value), + namedArgument("query", query_value), + DSL.namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments))); } @Test public void test_SemanticCheckException_when_invalid_parameter_multi_match() { - List arguments = List.of( - namedArgument("fields", fields_value), - namedArgument("query", query_value), - DSL.namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + namedArgument("fields", fields_value), + namedArgument("query", query_value), + DSL.namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, snakeCaseMultiMatchName))); } @Test public void test_SemanticCheckException_when_invalid_parameter_multiMatchQuery() { - List arguments = List.of( - namedArgument("fields", fields_value), - namedArgument("query", query_value), - DSL.namedArgument("unsupported", "unsupported_value")); - Assertions.assertThrows(SemanticCheckException.class, + List arguments = + List.of( + namedArgument("fields", fields_value), + namedArgument("query", query_value), + DSL.namedArgument("unsupported", "unsupported_value")); + Assertions.assertThrows( + SemanticCheckException.class, () -> multiMatchQuery.build(new MultiMatchExpression(arguments, multiMatchQueryName))); } @@ -235,17 +229,18 @@ public MultiMatchExpression(List arguments, FunctionName funcName) { super(funcName, arguments); } - @Override public ExprValue valueOf(Environment valueEnv) { - throw new UnsupportedOperationException("Invalid function call, " - + "valueOf function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "valueOf function need implementation only to support Expression interface"); } @Override public ExprType type() { - throw new UnsupportedOperationException("Invalid function call, " - + "type function need implementation only to support Expression interface"); + throw new UnsupportedOperationException( + "Invalid function call, " + + "type function need implementation only to support Expression interface"); } } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQueryTest.java index 01ec85d64d..9518136ff0 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MultiFieldQueryTest.java @@ -27,14 +27,17 @@ class MultiFieldQueryTest { MultiFieldQuery query; private final String testQueryName = "test_query"; - private final Map> actionMap - = ImmutableMap.of("paramA", (o, v) -> o); + private final Map> actionMap = + ImmutableMap.of("paramA", (o, v) -> o); @BeforeEach public void setUp() { - query = mock(MultiFieldQuery.class, - Mockito.withSettings().useConstructor(actionMap) - .defaultAnswer(Mockito.CALLS_REAL_METHODS)); + query = + mock( + MultiFieldQuery.class, + Mockito.withSettings() + .useConstructor(actionMap) + .defaultAnswer(Mockito.CALLS_REAL_METHODS)); when(query.getQueryName()).thenReturn(testQueryName); } @@ -44,17 +47,26 @@ void createQueryBuilderTest() { String sampleField = "fieldA"; float sampleValue = 34f; - var fieldSpec = ImmutableMap.builder().put(sampleField, - ExprValueUtils.floatValue(sampleValue)).build(); + var fieldSpec = + ImmutableMap.builder() + .put(sampleField, ExprValueUtils.floatValue(sampleValue)) + .build(); - query.createQueryBuilder(List.of(DSL.namedArgument("fields", - new LiteralExpression(ExprTupleValue.fromExprValueMap(fieldSpec))), - DSL.namedArgument("query", - new LiteralExpression(ExprValueUtils.stringValue(sampleQuery))))); + query.createQueryBuilder( + List.of( + DSL.namedArgument( + "fields", new LiteralExpression(ExprTupleValue.fromExprValueMap(fieldSpec))), + DSL.namedArgument( + "query", new LiteralExpression(ExprValueUtils.stringValue(sampleQuery))))); - verify(query).createBuilder(argThat( - (ArgumentMatcher>) map -> map.size() == 1 - && map.containsKey(sampleField) && map.containsValue(sampleValue)), - eq(sampleQuery)); + verify(query) + .createBuilder( + argThat( + (ArgumentMatcher>) + map -> + map.size() == 1 + && map.containsKey(sampleField) + && map.containsValue(sampleValue)), + eq(sampleQuery)); } } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQueryTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQueryTest.java index c4e4f1242a..17b775fa0b 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQueryTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/NoFieldQueryTest.java @@ -23,14 +23,17 @@ class NoFieldQueryTest { NoFieldQuery query; private final String testQueryName = "test_query"; - private final Map actionMap - = ImmutableMap.of("paramA", (o, v) -> o); + private final Map actionMap = + ImmutableMap.of("paramA", (o, v) -> o); @BeforeEach void setUp() { - query = mock(NoFieldQuery.class, - Mockito.withSettings().useConstructor(actionMap) - .defaultAnswer(Mockito.CALLS_REAL_METHODS)); + query = + mock( + NoFieldQuery.class, + Mockito.withSettings() + .useConstructor(actionMap) + .defaultAnswer(Mockito.CALLS_REAL_METHODS)); when(query.getQueryName()).thenReturn(testQueryName); } @@ -38,9 +41,10 @@ void setUp() { void createQueryBuilderTest() { String sampleQuery = "field:query"; - query.createQueryBuilder(List.of( - DSL.namedArgument("query", - new LiteralExpression(ExprValueUtils.stringValue(sampleQuery))))); + query.createQueryBuilder( + List.of( + DSL.namedArgument( + "query", new LiteralExpression(ExprValueUtils.stringValue(sampleQuery))))); verify(query).createBuilder(eq(sampleQuery)); } diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializerTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializerTest.java index 72a319dbfe..b70595c74b 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializerTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/storage/serialization/DefaultExpressionSerializerTest.java @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - package org.opensearch.sql.opensearch.storage.serialization; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -57,23 +56,25 @@ public void can_serialize_and_deserialize_functions() { @Test public void cannot_serialize_illegal_expression() { - Expression illegalExpr = new Expression() { - private final Object object = new Object(); // non-serializable - @Override - public ExprValue valueOf(Environment valueEnv) { - return null; - } + Expression illegalExpr = + new Expression() { + private final Object object = new Object(); // non-serializable + + @Override + public ExprValue valueOf(Environment valueEnv) { + return null; + } - @Override - public ExprType type() { - return null; - } + @Override + public ExprType type() { + return null; + } - @Override - public T accept(ExpressionNodeVisitor visitor, C context) { - return null; - } - }; + @Override + public T accept(ExpressionNodeVisitor visitor, C context) { + return null; + } + }; assertThrows(IllegalStateException.class, () -> serializer.serialize(illegalExpr)); } @@ -81,5 +82,4 @@ public T accept(ExpressionNodeVisitor visitor, C context) { public void cannot_deserialize_illegal_expression_code() { assertThrows(IllegalStateException.class, () -> serializer.deserialize("hello world")); } - } From f5b27489ea5b1a3fd151420eff4ad5412af79b7b Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Wed, 16 Aug 2023 16:13:20 -0700 Subject: [PATCH 02/11] Manual spotless changes Signed-off-by: Mitchell Gale --- .../sql/opensearch/data/type/OpenSearchBinaryType.java | 4 ++-- .../org/opensearch/sql/opensearch/data/utils/Content.java | 8 +++++--- .../opensearch/data/value/OpenSearchExprBinaryValue.java | 4 ++-- .../data/value/OpenSearchExprGeoPointValue.java | 4 ++-- .../storage/script/filter/lucene/LuceneQuery.java | 4 +++- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java index ddd7ab8eb9..b3be5e7b7f 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/type/OpenSearchBinaryType.java @@ -10,8 +10,8 @@ import lombok.EqualsAndHashCode; /** - * The type of a binary value. See doc + * The type of binary value. See
+ * doc */ @EqualsAndHashCode(callSuper = false) public class OpenSearchBinaryType extends OpenSearchDataType { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java index 21070fa3d6..a0048c57c6 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java @@ -10,10 +10,12 @@ import org.apache.commons.lang3.tuple.Pair; /** + *
  * Regardless the underling data format, the {@link Content} define the data in abstract manner.
- * which could be parsed by ElasticsearchExprValueFactory. There are two major use cases: 1.
- * Represent the JSON data retrieve from OpenSearch search response. 2. Represent the Object data
- * extract from the OpenSearch aggregation response.
+ * which could be parsed by ElasticsearchExprValueFactory. There are two major use cases:
+ * 1. Represent the JSON data retrieve from OpenSearch search response.
+ * 2. Represent the Object data extract from the OpenSearch aggregation response.
+ * 
*/ public interface Content { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java index 1043c1acdc..95558c88bc 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprBinaryValue.java @@ -12,8 +12,8 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchBinaryType; /** - * OpenSearch BinaryValue. Todo, add this to avoid the unknown value type exception, the - * implementation will be changed. + * OpenSearch BinaryValue.
+ * Todo, add this to avoid the unknown value type exception, the implementation will be changed. */ @EqualsAndHashCode(callSuper = false) public class OpenSearchExprBinaryValue extends AbstractExprValue { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java index 0de9c898e8..c13c39c355 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/value/OpenSearchExprGeoPointValue.java @@ -13,8 +13,8 @@ import org.opensearch.sql.opensearch.data.type.OpenSearchGeoPointType; /** - * OpenSearch GeoPointValue. Todo, add this to avoid the unknown value type exception, the - * implementation will be changed. + * OpenSearch GeoPointValue.
+ * Todo, add this to avoid the unknown value type exception, the implementation will be changed. */ public class OpenSearchExprGeoPointValue extends AbstractExprValue { diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java index c8e12876d6..62043fff2e 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java @@ -39,7 +39,9 @@ public abstract class LuceneQuery { /** * Check if function expression supported by current Lucene query. Default behavior is that report - * supported if: 1. Left is a reference 2. Right side is a literal + * supported if:
+ * 1. Left is a reference
+ * 2. Right side is a literal * * @param func function * @return return true if supported, otherwise false. From 6b532cb3a0dd9e0c560edb8a4b7c68cf923dd3fc Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Wed, 16 Aug 2023 16:14:38 -0700 Subject: [PATCH 03/11] ignore failures for checkstyles. Signed-off-by: Mitchell Gale --- opensearch/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/opensearch/build.gradle b/opensearch/build.gradle index 4095d519cb..a2ab670403 100644 --- a/opensearch/build.gradle +++ b/opensearch/build.gradle @@ -48,6 +48,9 @@ dependencies { testImplementation group: 'org.opensearch.test', name: 'framework', version: "${opensearch_version}" } +checkstyleTest.ignoreFailures = true +checkstyleMain.ignoreFailures = true + pitest { targetClasses = ['org.opensearch.sql.*'] pitestVersion = '1.9.0' From 81d40df257291d9a3130a6effbb7a68660973e0e Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 09:36:23 -0700 Subject: [PATCH 04/11] Apply suggestions from code review Co-authored-by: Yury-Fridlyand Signed-off-by: Mitchell Gale --- .../filter/lucene/relevance/FunctionParameterRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java index f86fc08f04..a830adb590 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java @@ -235,7 +235,7 @@ public class FunctionParameterRepository { + "https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-") .put( "fuzziness", - "Available values are: " + "'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.") + "Available values are: 'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.") .put( "operator", String.format( From 9274d53478d954b1a64cc790a1d5320117d5f310 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 09:36:45 -0700 Subject: [PATCH 05/11] Apply suggestions from code review Co-authored-by: Yury-Fridlyand Signed-off-by: Mitchell Gale --- .../response/OpenSearchAggregationResponseParserTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java index 1a15e57c55..c67d99661f 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java @@ -141,7 +141,11 @@ void two_bucket_one_metric_should_pass() { @Test void unsupported_aggregation_should_fail() { String response = - "{\n" + " \"date_histogram#date_histogram\": {\n" + " \"value\": 40\n" + " }\n" + "}"; + "{\n" + + " \"date_histogram#date_histogram\": {\n" + + " \"value\": 40\n" + + " }\n" + + "}"; NoBucketAggregationParser parser = new NoBucketAggregationParser(new SingleValueParser("max")); RuntimeException exception = assertThrows(RuntimeException.class, () -> parse(parser, response)); From d4f50c05f08800846fe6fa888357b9abe1e7acd1 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 09:36:59 -0700 Subject: [PATCH 06/11] Apply suggestions from code review Co-authored-by: Yury-Fridlyand Signed-off-by: Mitchell Gale --- .../response/OpenSearchAggregationResponseParserTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java index c67d99661f..7ed6c900dd 100644 --- a/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java +++ b/opensearch/src/test/java/org/opensearch/sql/opensearch/response/OpenSearchAggregationResponseParserTest.java @@ -36,7 +36,12 @@ class OpenSearchAggregationResponseParserTest { /** SELECT MAX(age) as max FROM accounts. */ @Test void no_bucket_one_metric_should_pass() { - String response = "{\n" + " \"max#max\": {\n" + " \"value\": 40\n" + " }\n" + "}"; + String response = + "{\n" + + " \"max#max\": {\n" + + " \"value\": 40\n" + + " }\n" + + "}"; NoBucketAggregationParser parser = new NoBucketAggregationParser(new SingleValueParser("max")); assertThat(parse(parser, response), contains(entry("max", 40d))); } From 4150908fd02b17e4160760977604e316e17ed39f Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 09:36:32 -0700 Subject: [PATCH 07/11] Address PR comment Signed-off-by: Mitchell Gale --- .../storage/script/filter/lucene/LuceneQuery.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java index 62043fff2e..a1b633f942 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/LuceneQuery.java @@ -39,10 +39,11 @@ public abstract class LuceneQuery { /** * Check if function expression supported by current Lucene query. Default behavior is that report - * supported if:
- * 1. Left is a reference
- * 2. Right side is a literal - * + * supported if: + *
    + *
  1. Left is a reference
  2. + *
  3. Right side is a literal
  4. + *
* @param func function * @return return true if supported, otherwise false. */ From 854f0f7b6c262732bd2b549c4c6dc92e47ba7a5c Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 10:50:50 -0700 Subject: [PATCH 08/11] add order list in Content.java Signed-off-by: Mitchell Gale --- .../opensearch/sql/opensearch/data/utils/Content.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java index a0048c57c6..0c3d2aec45 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/data/utils/Content.java @@ -10,12 +10,13 @@ import org.apache.commons.lang3.tuple.Pair; /** - *
+ *
  * Regardless the underling data format, the {@link Content} define the data in abstract manner.
  * which could be parsed by ElasticsearchExprValueFactory. There are two major use cases:
- * 1. Represent the JSON data retrieve from OpenSearch search response.
- * 2. Represent the Object data extract from the OpenSearch aggregation response.
- * 
+ *
    + *
  1. Represent the JSON data retrieve from OpenSearch search response.
  2. + *
  3. Represent the Object data extract from the OpenSearch aggregation response.
  4. + *
*/ public interface Content { From 2768f294b5b5debb285f0a4941363b13f56ade4b Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 14:15:40 -0700 Subject: [PATCH 09/11] Update opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java Co-authored-by: Guian Gumpac Signed-off-by: Mitchell Gale --- .../request/system/OpenSearchDescribeIndexRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java index c4ac270547..5fbe989542 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java @@ -140,6 +140,6 @@ private String clusterName(Map meta) { @Override public String toString() { - return "OpenSearchDescribeIndexRequest{" + "indexName='" + indexName + '\'' + '}'; + return "OpenSearchDescribeIndexRequest{indexName='" + indexName + '\'}'; } } From 4e84c3b89738007b1093e1e1e86fa8cb6c22c017 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Thu, 17 Aug 2023 14:15:48 -0700 Subject: [PATCH 10/11] Update opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java Co-authored-by: Guian Gumpac Signed-off-by: Mitchell Gale --- .../sql/opensearch/response/agg/MetricParserHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java index 0d1f770470..4df9537973 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/response/agg/MetricParserHelper.java @@ -49,7 +49,7 @@ public Map parse(Aggregations aggregations) { } else { throw new RuntimeException( StringUtils.format( - "couldn't parse field %s in aggregation " + "response", aggregation.getName())); + "couldn't parse field %s in aggregation response", aggregation.getName())); } } return resultMap; From dbc818a0a28b31ee9a3665e1e86c2a6628fb4655 Mon Sep 17 00:00:00 2001 From: Mitchell Gale Date: Fri, 18 Aug 2023 08:48:36 -0700 Subject: [PATCH 11/11] Fixing compilation error Signed-off-by: Mitchell Gale --- .../request/system/OpenSearchDescribeIndexRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java index 5fbe989542..5e96ad83c5 100644 --- a/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java +++ b/opensearch/src/main/java/org/opensearch/sql/opensearch/request/system/OpenSearchDescribeIndexRequest.java @@ -140,6 +140,6 @@ private String clusterName(Map meta) { @Override public String toString() { - return "OpenSearchDescribeIndexRequest{indexName='" + indexName + '\'}'; + return "OpenSearchDescribeIndexRequest{indexName='" + indexName + "\'}"; } }