Skip to content

Commit 827a0cf

Browse files
Move queryBuildActions for all types of queries to FunctionParameterRepository.
Signed-off-by: Yury-Fridlyand <yuryf@bitquilltech.com>
1 parent b5ad3c9 commit 827a0cf

8 files changed

Lines changed: 182 additions & 220 deletions

File tree

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/FunctionParameterRepository.java

Lines changed: 174 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,191 @@
1010
import java.util.Arrays;
1111
import java.util.Map;
1212
import java.util.stream.Collectors;
13+
import lombok.experimental.UtilityClass;
1314
import org.opensearch.common.unit.Fuzziness;
1415
import org.opensearch.common.xcontent.LoggingDeprecationHandler;
16+
import org.opensearch.index.query.MatchBoolPrefixQueryBuilder;
17+
import org.opensearch.index.query.MatchPhrasePrefixQueryBuilder;
18+
import org.opensearch.index.query.MatchPhraseQueryBuilder;
19+
import org.opensearch.index.query.MatchQueryBuilder;
1520
import org.opensearch.index.query.MultiMatchQueryBuilder;
1621
import org.opensearch.index.query.Operator;
22+
import org.opensearch.index.query.QueryStringQueryBuilder;
23+
import org.opensearch.index.query.SimpleQueryStringBuilder;
1724
import org.opensearch.index.query.SimpleQueryStringFlag;
1825
import org.opensearch.index.query.support.QueryParsers;
1926
import org.opensearch.index.search.MatchQuery;
2027
import org.opensearch.sql.data.model.ExprValue;
2128

29+
@UtilityClass
2230
public class FunctionParameterRepository {
23-
private FunctionParameterRepository() {
24-
}
2531

26-
public static final Map<String, String> ArgumentLimitations;
27-
28-
static {
29-
ArgumentLimitations = ImmutableMap.<String, String>builder()
30-
.put("boost", "Accepts only floating point values greater than 0.")
31-
.put("tie_breaker", "Accepts only floating point values in range 0 to 1.")
32-
.put("rewrite", "Available values are: constant_score, "
33-
+ "scoring_boolean, constant_score_boolean, top_terms_X, top_terms_boost_X, "
34-
+ "top_terms_blended_freqs_X, where X is an integer value.")
35-
.put("flags", String.format(
36-
"Available values are: %s and any combinations of these separated by '|'.",
37-
Arrays.stream(SimpleQueryStringFlag.class.getEnumConstants())
38-
.map(Enum::toString).collect(Collectors.joining(", "))))
39-
.put("time_zone", "For more information, follow this link: "
40-
+ "https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-")
41-
.put("fuzziness", "Available values are: "
42-
+ "'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.")
43-
.put("operator", String.format("Available values are: %s.",
44-
Arrays.stream(Operator.class.getEnumConstants())
45-
.map(Enum::toString).collect(Collectors.joining(", "))))
46-
.put("type", String.format("Available values are: %s.",
47-
Arrays.stream(MultiMatchQueryBuilder.Type.class.getEnumConstants())
48-
.map(Enum::toString).collect(Collectors.joining(", "))))
49-
.put("zero_terms_query", String.format("Available values are: %s.",
50-
Arrays.stream(MatchQuery.ZeroTermsQuery.class.getEnumConstants())
51-
.map(Enum::toString).collect(Collectors.joining(", "))))
52-
.put("int", "Accepts only integer values.")
53-
.put("float", "Accepts only floating point values.")
54-
.put("bool", "Accepts only boolean values: 'true' or 'false'.")
55-
.build();
56-
}
32+
public static final Map<String, RelevanceQuery.QueryBuilderStep<MatchBoolPrefixQueryBuilder>>
33+
MatchBoolPrefixQueryBuildActions = ImmutableMap.<String,
34+
RelevanceQuery.QueryBuilderStep<MatchBoolPrefixQueryBuilder>>builder()
35+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
36+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
37+
.put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v)))
38+
.put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite")))
39+
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
40+
convertBoolValue(v, "fuzzy_transpositions")))
41+
.put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions")))
42+
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
43+
.put("operator", (b, v) -> b.operator(convertOperator(v, "operator")))
44+
.put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length")))
45+
.build();
46+
47+
public static final Map<String, RelevanceQuery.QueryBuilderStep<MatchPhrasePrefixQueryBuilder>>
48+
MatchPhrasePrefixQueryBuildActions = ImmutableMap.<String,
49+
RelevanceQuery.QueryBuilderStep<MatchPhrasePrefixQueryBuilder>>builder()
50+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
51+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
52+
.put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions")))
53+
.put("slop", (b, v) -> b.slop(convertIntValue(v, "slop")))
54+
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v)))
55+
.build();
56+
57+
public static final Map<String, RelevanceQuery.QueryBuilderStep<MatchPhraseQueryBuilder>>
58+
MatchPhraseQueryBuildActions = ImmutableMap.<String,
59+
RelevanceQuery.QueryBuilderStep<MatchPhraseQueryBuilder>>builder()
60+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
61+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
62+
.put("slop", (b, v) -> b.slop(convertIntValue(v, "slop")))
63+
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v)))
64+
.build();
65+
66+
public static final Map<String, RelevanceQuery.QueryBuilderStep<MatchQueryBuilder>>
67+
MatchQueryBuildActions = ImmutableMap.<String,
68+
RelevanceQuery.QueryBuilderStep<MatchQueryBuilder>>builder()
69+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
70+
.put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery(
71+
convertBoolValue(v, "auto_generate_synonyms_phrase_query")))
72+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
73+
.put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v)))
74+
.put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite")))
75+
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
76+
convertBoolValue(v, "fuzzy_transpositions")))
77+
.put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient")))
78+
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
79+
.put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions")))
80+
.put("operator", (b, v) -> b.operator(convertOperator(v, "operator")))
81+
.put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length")))
82+
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v)))
83+
.build();
84+
85+
@SuppressWarnings("deprecation") // cutoffFrequency is deprecated
86+
public static final Map<String, RelevanceQuery.QueryBuilderStep<MultiMatchQueryBuilder>>
87+
MultiMatchQueryBuildActions = ImmutableMap.<String,
88+
RelevanceQuery.QueryBuilderStep<MultiMatchQueryBuilder>>builder()
89+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
90+
.put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery(
91+
convertBoolValue(v, "auto_generate_synonyms_phrase_query")))
92+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
93+
.put("cutoff_frequency", (b, v) -> b.cutoffFrequency(
94+
convertFloatValue(v, "cutoff_frequency")))
95+
.put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v)))
96+
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
97+
convertBoolValue(v, "fuzzy_transpositions")))
98+
.put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient")))
99+
.put("max_expansions", (b, v) -> b.maxExpansions(convertIntValue(v, "max_expansions")))
100+
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
101+
.put("operator", (b, v) -> b.operator(convertOperator(v, "operator")))
102+
.put("prefix_length", (b, v) -> b.prefixLength(convertIntValue(v, "prefix_length")))
103+
.put("slop", (b, v) -> b.slop(convertIntValue(v, "slop")))
104+
.put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker")))
105+
.put("type", (b, v) -> b.type(convertType(v)))
106+
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(convertZeroTermsQuery(v)))
107+
.build();
108+
109+
public static final Map<String, RelevanceQuery.QueryBuilderStep<QueryStringQueryBuilder>>
110+
QueryStringQueryBuildActions = ImmutableMap.<String,
111+
RelevanceQuery.QueryBuilderStep<QueryStringQueryBuilder>>builder()
112+
.put("allow_leading_wildcard", (b, v) -> b.allowLeadingWildcard(
113+
convertBoolValue(v, "allow_leading_wildcard")))
114+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
115+
.put("analyze_wildcard", (b, v) -> b.analyzeWildcard(
116+
convertBoolValue(v, "analyze_wildcard")))
117+
.put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery(
118+
convertBoolValue(v, "auto_generate_synonyms_phrase_query")))
119+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
120+
.put("default_operator", (b, v) -> b.defaultOperator(
121+
convertOperator(v, "default_operator")))
122+
.put("enable_position_increments", (b, v) -> b.enablePositionIncrements(
123+
convertBoolValue(v, "enable_position_increments")))
124+
.put("escape", (b, v) -> b.escape(convertBoolValue(v, "escape")))
125+
.put("fuzziness", (b, v) -> b.fuzziness(convertFuzziness(v)))
126+
.put("fuzzy_max_expansions", (b, v) -> b.fuzzyMaxExpansions(
127+
convertIntValue(v, "fuzzy_max_expansions")))
128+
.put("fuzzy_prefix_length", (b, v) -> b.fuzzyPrefixLength(
129+
convertIntValue(v, "fuzzy_prefix_length")))
130+
.put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(checkRewrite(v, "fuzzy_rewrite")))
131+
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
132+
convertBoolValue(v, "fuzzy_transpositions")))
133+
.put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient")))
134+
.put("max_determinized_states", (b, v) -> b.maxDeterminizedStates(
135+
convertIntValue(v, "max_determinized_states")))
136+
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
137+
.put("phrase_slop", (b, v) -> b.phraseSlop(convertIntValue(v, "phrase_slop")))
138+
.put("quote_analyzer", (b, v) -> b.quoteAnalyzer(v.stringValue()))
139+
.put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue()))
140+
.put("rewrite", (b, v) -> b.rewrite(checkRewrite(v, "rewrite")))
141+
.put("tie_breaker", (b, v) -> b.tieBreaker(convertFloatValue(v, "tie_breaker")))
142+
.put("time_zone", (b, v) -> b.timeZone(checkTimeZone(v)))
143+
.put("type", (b, v) -> b.type(convertType(v)))
144+
.build();
145+
146+
public static final Map<String, RelevanceQuery.QueryBuilderStep<SimpleQueryStringBuilder>>
147+
SimpleQueryStringQueryBuildActions = ImmutableMap.<String,
148+
RelevanceQuery.QueryBuilderStep<SimpleQueryStringBuilder>>builder()
149+
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
150+
.put("analyze_wildcard", (b, v) -> b.analyzeWildcard(
151+
convertBoolValue(v, "analyze_wildcard")))
152+
.put("auto_generate_synonyms_phrase_query", (b, v) -> b.autoGenerateSynonymsPhraseQuery(
153+
convertBoolValue(v, "auto_generate_synonyms_phrase_query")))
154+
.put("boost", (b, v) -> b.boost(convertFloatValue(v, "boost")))
155+
.put("default_operator", (b, v) -> b.defaultOperator(
156+
convertOperator(v, "default_operator")))
157+
.put("flags", (b, v) -> b.flags(convertFlags(v)))
158+
.put("fuzzy_max_expansions", (b, v) -> b.fuzzyMaxExpansions(
159+
convertIntValue(v, "fuzzy_max_expansions")))
160+
.put("fuzzy_prefix_length", (b, v) -> b.fuzzyPrefixLength(
161+
convertIntValue(v, "fuzzy_prefix_length")))
162+
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
163+
convertBoolValue(v, "fuzzy_transpositions")))
164+
.put("lenient", (b, v) -> b.lenient(convertBoolValue(v, "lenient")))
165+
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
166+
.put("quote_field_suffix", (b, v) -> b.quoteFieldSuffix(v.stringValue()))
167+
.build();
168+
169+
public static final Map<String, String> ArgumentLimitations =
170+
ImmutableMap.<String, String>builder()
171+
.put("boost", "Accepts only floating point values greater than 0.")
172+
.put("tie_breaker", "Accepts only floating point values in range 0 to 1.")
173+
.put("rewrite", "Available values are: constant_score, "
174+
+ "scoring_boolean, constant_score_boolean, top_terms_X, top_terms_boost_X, "
175+
+ "top_terms_blended_freqs_X, where X is an integer value.")
176+
.put("flags", String.format(
177+
"Available values are: %s and any combinations of these separated by '|'.",
178+
Arrays.stream(SimpleQueryStringFlag.class.getEnumConstants())
179+
.map(Enum::toString).collect(Collectors.joining(", "))))
180+
.put("time_zone", "For more information, follow this link: "
181+
+ "https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html#of-java.lang.String-")
182+
.put("fuzziness", "Available values are: "
183+
+ "'AUTO', 'AUTO:x,y' or z, where x, y, z - integer values.")
184+
.put("operator", String.format("Available values are: %s.",
185+
Arrays.stream(Operator.class.getEnumConstants())
186+
.map(Enum::toString).collect(Collectors.joining(", "))))
187+
.put("type", String.format("Available values are: %s.",
188+
Arrays.stream(MultiMatchQueryBuilder.Type.class.getEnumConstants())
189+
.map(Enum::toString).collect(Collectors.joining(", "))))
190+
.put("zero_terms_query", String.format("Available values are: %s.",
191+
Arrays.stream(MatchQuery.ZeroTermsQuery.class.getEnumConstants())
192+
.map(Enum::toString).collect(Collectors.joining(", "))))
193+
.put("int", "Accepts only integer values.")
194+
.put("float", "Accepts only floating point values.")
195+
.put("bool", "Accepts only boolean values: 'true' or 'false'.")
196+
.build();
197+
57198

58199
private static String formatErrorMessage(String name, String value) {
59200
return formatErrorMessage(name, value, name);

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchBoolPrefixQuery.java

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55

66
package org.opensearch.sql.opensearch.storage.script.filter.lucene.relevance;
77

8-
import com.google.common.collect.ImmutableMap;
98
import org.opensearch.index.query.MatchBoolPrefixQueryBuilder;
10-
import org.opensearch.index.query.Operator;
119
import org.opensearch.index.query.QueryBuilders;
1210

1311
/**
@@ -20,23 +18,7 @@ public class MatchBoolPrefixQuery
2018
* with support of optional parameters.
2119
*/
2220
public MatchBoolPrefixQuery() {
23-
super(ImmutableMap.<String, QueryBuilderStep<MatchBoolPrefixQueryBuilder>>builder()
24-
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
25-
.put("boost", (b, v) -> b.boost(
26-
FunctionParameterRepository.convertFloatValue(v, "boost")))
27-
.put("fuzziness", (b, v) -> b.fuzziness(FunctionParameterRepository.convertFuzziness(v)))
28-
.put("fuzzy_rewrite", (b, v) -> b.fuzzyRewrite(
29-
FunctionParameterRepository.checkRewrite(v, "fuzzy_rewrite")))
30-
.put("fuzzy_transpositions", (b, v) -> b.fuzzyTranspositions(
31-
FunctionParameterRepository.convertBoolValue(v, "fuzzy_transpositions")))
32-
.put("max_expansions", (b, v) -> b.maxExpansions(
33-
FunctionParameterRepository.convertIntValue(v, "max_expansions")))
34-
.put("minimum_should_match", (b, v) -> b.minimumShouldMatch(v.stringValue()))
35-
.put("operator", (b, v) -> b.operator(
36-
FunctionParameterRepository.convertOperator(v, "operator")))
37-
.put("prefix_length", (b, v) -> b.prefixLength(
38-
FunctionParameterRepository.convertIntValue(v, "prefix_length")))
39-
.build());
21+
super(FunctionParameterRepository.MatchBoolPrefixQueryBuildActions);
4022
}
4123

4224
/**

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhrasePrefixQuery.java

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,19 @@
55

66
package org.opensearch.sql.opensearch.storage.script.filter.lucene.relevance;
77

8-
import com.google.common.collect.ImmutableMap;
98
import org.opensearch.index.query.MatchPhrasePrefixQueryBuilder;
109
import org.opensearch.index.query.QueryBuilders;
1110

1211
/**
1312
* Lucene query that builds a match_phrase_prefix query.
1413
*/
15-
public class MatchPhrasePrefixQuery extends SingleFieldQuery<MatchPhrasePrefixQueryBuilder> {
14+
public class MatchPhrasePrefixQuery extends SingleFieldQuery<MatchPhrasePrefixQueryBuilder> {
1615
/**
1716
* Default constructor for MatchPhrasePrefixQuery configures how RelevanceQuery.build() handles
1817
* named arguments.
1918
*/
2019
public MatchPhrasePrefixQuery() {
21-
super(ImmutableMap.<String, QueryBuilderStep<MatchPhrasePrefixQueryBuilder>>builder()
22-
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
23-
.put("boost", (b, v) -> b.boost(
24-
FunctionParameterRepository.convertFloatValue(v, "boost")))
25-
.put("max_expansions", (b, v) -> b.maxExpansions(
26-
FunctionParameterRepository.convertIntValue(v, "max_expansions")))
27-
.put("slop", (b, v) -> b.slop(
28-
FunctionParameterRepository.convertIntValue(v, "slop")))
29-
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(
30-
FunctionParameterRepository.convertZeroTermsQuery(v)))
31-
.build());
20+
super(FunctionParameterRepository.MatchPhrasePrefixQueryBuildActions);
3221
}
3322

3423
@Override

opensearch/src/main/java/org/opensearch/sql/opensearch/storage/script/filter/lucene/relevance/MatchPhraseQuery.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,8 @@
55

66
package org.opensearch.sql.opensearch.storage.script.filter.lucene.relevance;
77

8-
import com.google.common.collect.ImmutableMap;
9-
import java.util.Iterator;
10-
import java.util.List;
11-
import java.util.Objects;
12-
import java.util.function.BiFunction;
138
import org.opensearch.index.query.MatchPhraseQueryBuilder;
14-
import org.opensearch.index.query.QueryBuilder;
159
import org.opensearch.index.query.QueryBuilders;
16-
import org.opensearch.sql.data.model.ExprValue;
17-
import org.opensearch.sql.exception.SemanticCheckException;
18-
import org.opensearch.sql.expression.Expression;
19-
import org.opensearch.sql.expression.FunctionExpression;
20-
import org.opensearch.sql.expression.NamedArgumentExpression;
21-
import org.opensearch.sql.opensearch.storage.script.filter.lucene.LuceneQuery;
2210

2311
/**
2412
* Lucene query that builds a match_phrase query.
@@ -29,15 +17,7 @@ public class MatchPhraseQuery extends SingleFieldQuery<MatchPhraseQueryBuilder>
2917
* named arguments.
3018
*/
3119
public MatchPhraseQuery() {
32-
super(ImmutableMap.<String, QueryBuilderStep<MatchPhraseQueryBuilder>>builder()
33-
.put("analyzer", (b, v) -> b.analyzer(v.stringValue()))
34-
.put("boost", (b, v) -> b.boost(
35-
FunctionParameterRepository.convertFloatValue(v, "boost")))
36-
.put("slop", (b, v) -> b.slop(
37-
FunctionParameterRepository.convertIntValue(v, "slop")))
38-
.put("zero_terms_query", (b, v) -> b.zeroTermsQuery(
39-
FunctionParameterRepository.convertZeroTermsQuery(v)))
40-
.build());
20+
super(FunctionParameterRepository.MatchPhraseQueryBuildActions);
4121
}
4222

4323
@Override

0 commit comments

Comments
 (0)