Skip to content

Commit 9cc0527

Browse files
Add Supplier for Automaton and CharacterRunAutomaton
1 parent bca38b2 commit 9cc0527

File tree

5 files changed

+48
-8
lines changed

5 files changed

+48
-8
lines changed

benchmarks/src/main/java/org/elasticsearch/benchmark/compute/operator/EvalBenchmark.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,8 @@ private static Configuration configuration() {
349349
false,
350350
Map.of(),
351351
0,
352-
false
352+
false,
353+
true
353354
);
354355
}
355356

server/src/main/java/org/elasticsearch/index/mapper/ConstantFieldType.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import java.util.Collection;
2727
import java.util.Map;
28+
import java.util.function.Supplier;
2829

2930
/**
3031
* A {@link MappedFieldType} that has the same value for all documents.
@@ -164,12 +165,13 @@ public final boolean fieldHasValue(FieldInfos fieldInfos) {
164165
*/
165166
@Override
166167
public Query automatonQuery(
167-
Automaton automaton,
168+
Supplier<Automaton> automatonSupplier,
169+
Supplier<CharacterRunAutomaton> characterRunAutomatonSupplier,
168170
@Nullable MultiTermQuery.RewriteMethod method,
169171
SearchExecutionContext context,
170172
String description
171173
) {
172-
CharacterRunAutomaton compiled = new CharacterRunAutomaton(automaton);
174+
CharacterRunAutomaton compiled = characterRunAutomatonSupplier.get();
173175
boolean matches = compiled.run(getConstantFieldValue(context));
174176
if (matches) {
175177
return new MatchAllDocsQuery();

server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.lucene.util.BytesRef;
3333
import org.apache.lucene.util.automaton.Automata;
3434
import org.apache.lucene.util.automaton.Automaton;
35+
import org.apache.lucene.util.automaton.CharacterRunAutomaton;
3536
import org.apache.lucene.util.automaton.CompiledAutomaton;
3637
import org.apache.lucene.util.automaton.CompiledAutomaton.AUTOMATON_TYPE;
3738
import org.apache.lucene.util.automaton.Operations;
@@ -84,6 +85,7 @@
8485
import java.util.Map;
8586
import java.util.Objects;
8687
import java.util.Set;
88+
import java.util.function.Supplier;
8789

8890
import static org.apache.lucene.index.IndexWriter.MAX_TERM_LENGTH;
8991
import static org.elasticsearch.core.Strings.format;
@@ -1047,12 +1049,13 @@ public boolean hasDocValuesSkipper() {
10471049

10481050
@Override
10491051
public Query automatonQuery(
1050-
Automaton automaton,
1052+
Supplier<Automaton> automatonSupplier,
1053+
Supplier<CharacterRunAutomaton> characterRunAutomatonSupplier,
10511054
@Nullable MultiTermQuery.RewriteMethod method,
10521055
SearchExecutionContext context,
10531056
String description
10541057
) {
1055-
return new AutomatonQueryWithDescription(new Term(name()), automaton, description);
1058+
return new AutomatonQueryWithDescription(new Term(name()), automatonSupplier.get(), description);
10561059
}
10571060
}
10581061

server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.lucene.search.TermQuery;
2727
import org.apache.lucene.util.BytesRef;
2828
import org.apache.lucene.util.automaton.Automaton;
29+
import org.apache.lucene.util.automaton.CharacterRunAutomaton;
2930
import org.elasticsearch.ElasticsearchException;
3031
import org.elasticsearch.ElasticsearchParseException;
3132
import org.elasticsearch.cluster.metadata.IndexMetadata;
@@ -55,6 +56,7 @@
5556
import java.util.Objects;
5657
import java.util.Set;
5758
import java.util.function.Function;
59+
import java.util.function.Supplier;
5860

5961
import static org.elasticsearch.search.SearchService.ALLOW_EXPENSIVE_QUERIES;
6062

@@ -389,7 +391,8 @@ public Query regexpQuery(
389391
* For now can only be AutomatonQuery or MatchAllDocsQuery() or MatchNoDocsQuery()
390392
*/
391393
public Query automatonQuery(
392-
Automaton automaton,
394+
Supplier<Automaton> automatonSupplier,
395+
Supplier<CharacterRunAutomaton> characterRunAutomatonSupplier,
393396
@Nullable MultiTermQuery.RewriteMethod method,
394397
SearchExecutionContext context,
395398
String description

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/scalar/string/regex/WildcardLikeList.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.apache.lucene.search.MultiTermQuery.RewriteMethod;
1111
import org.apache.lucene.util.automaton.Automaton;
12+
import org.apache.lucene.util.automaton.CharacterRunAutomaton;
1213
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
1314
import org.elasticsearch.common.io.stream.StreamInput;
1415
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -31,6 +32,7 @@
3132
import org.elasticsearch.xpack.esql.session.Configuration;
3233

3334
import java.io.IOException;
35+
import java.util.function.Supplier;
3436
import java.util.stream.Collectors;
3537

3638
public class WildcardLikeList extends RegexMatch<WildcardPatternList> {
@@ -42,6 +44,30 @@ public class WildcardLikeList extends RegexMatch<WildcardPatternList> {
4244
@Nullable
4345
private final Configuration configuration;
4446

47+
Supplier<Automaton> automatonSupplier = new Supplier<>() {
48+
Automaton cached;
49+
50+
@Override
51+
public Automaton get() {
52+
if (cached == null) {
53+
cached = pattern().createAutomaton(caseInsensitive());
54+
}
55+
return cached;
56+
}
57+
};
58+
59+
Supplier<CharacterRunAutomaton> characterRunAutomatonSupplier = new Supplier<>() {
60+
CharacterRunAutomaton cached;
61+
62+
@Override
63+
public CharacterRunAutomaton get() {
64+
if (cached == null) {
65+
cached = new CharacterRunAutomaton(automatonSupplier.get());
66+
}
67+
return cached;
68+
}
69+
};
70+
4571
/**
4672
* The documentation for this function is in WildcardLike, and shown to the users `LIKE` in the docs.
4773
*/
@@ -139,8 +165,13 @@ public org.apache.lucene.search.Query asLuceneQuery(
139165
RewriteMethod constantScoreRewrite,
140166
SearchExecutionContext context
141167
) {
142-
Automaton automaton = pattern().createAutomaton(caseInsensitive());
143-
return fieldType.automatonQuery(automaton, constantScoreRewrite, context, getLuceneQueryDescription());
168+
return fieldType.automatonQuery(
169+
automatonSupplier,
170+
characterRunAutomatonSupplier,
171+
constantScoreRewrite,
172+
context,
173+
getLuceneQueryDescription()
174+
);
144175
}
145176

146177
private String getLuceneQueryDescription() {

0 commit comments

Comments
 (0)