9
9
10
10
package org .elasticsearch .index .query ;
11
11
12
+ import org .apache .lucene .analysis .core .KeywordAnalyzer ;
13
+ import org .apache .lucene .document .Field ;
14
+ import org .apache .lucene .document .TextField ;
15
+ import org .apache .lucene .index .IndexReader ;
12
16
import org .apache .lucene .index .Term ;
13
17
import org .apache .lucene .queries .intervals .IntervalQuery ;
14
18
import org .apache .lucene .queries .intervals .Intervals ;
15
19
import org .apache .lucene .queries .intervals .IntervalsSource ;
16
20
import org .apache .lucene .search .BoostQuery ;
17
21
import org .apache .lucene .search .FuzzyQuery ;
22
+ import org .apache .lucene .search .IndexSearcher ;
18
23
import org .apache .lucene .search .MatchNoDocsQuery ;
19
24
import org .apache .lucene .search .Query ;
25
+ import org .apache .lucene .search .ScoreMode ;
26
+ import org .apache .lucene .store .Directory ;
27
+ import org .apache .lucene .tests .index .RandomIndexWriter ;
20
28
import org .apache .lucene .util .BytesRef ;
21
29
import org .elasticsearch .common .ParsingException ;
22
30
import org .elasticsearch .common .Strings ;
34
42
import java .util .Collections ;
35
43
import java .util .List ;
36
44
45
+ import static java .util .Collections .singleton ;
37
46
import static org .elasticsearch .xcontent .XContentFactory .jsonBuilder ;
47
+ import static org .hamcrest .CoreMatchers .containsString ;
38
48
import static org .hamcrest .Matchers .equalTo ;
39
49
import static org .hamcrest .Matchers .instanceOf ;
40
50
@@ -606,7 +616,7 @@ public void testPrefixes() throws IOException {
606
616
}
607
617
}""" , TEXT_FIELD_NAME );
608
618
IntervalQueryBuilder builder = (IntervalQueryBuilder ) parseQuery (json );
609
- Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .prefix (new BytesRef ("term" )));
619
+ Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .prefix (new BytesRef ("term" ), IndexSearcher . getMaxClauseCount () ));
610
620
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
611
621
612
622
String no_positions_json = Strings .format ("""
@@ -667,7 +677,8 @@ public void testPrefixes() throws IOException {
667
677
builder = (IntervalQueryBuilder ) parseQuery (short_prefix_json );
668
678
expected = new IntervalQuery (
669
679
PREFIXED_FIELD ,
670
- Intervals .or (Intervals .fixField (PREFIXED_FIELD + "._index_prefix" , Intervals .wildcard (new BytesRef ("t?" ))), Intervals .term ("t" ))
680
+ Intervals .or (Intervals .fixField (PREFIXED_FIELD + "._index_prefix" ,
681
+ Intervals .wildcard (new BytesRef ("t?" ), IndexSearcher .getMaxClauseCount ())), Intervals .term ("t" ))
671
682
);
672
683
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
673
684
@@ -739,7 +750,7 @@ public void testRegexp() throws IOException {
739
750
}""" , TEXT_FIELD_NAME );
740
751
741
752
IntervalQueryBuilder builder = (IntervalQueryBuilder ) parseQuery (json );
742
- Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .regexp (new BytesRef ("te.*m" )));
753
+ Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .regexp (new BytesRef ("te.*m" ), IndexSearcher . getMaxClauseCount () ));
743
754
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
744
755
745
756
String no_positions_json = Strings .format ("""
@@ -771,7 +782,8 @@ public void testRegexp() throws IOException {
771
782
}""" , TEXT_FIELD_NAME );
772
783
773
784
builder = (IntervalQueryBuilder ) parseQuery (fixed_field_json );
774
- expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD , Intervals .regexp (new BytesRef ("te.*m" ))));
785
+ expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD ,
786
+ Intervals .regexp (new BytesRef ("te.*m" ), IndexSearcher .getMaxClauseCount ())));
775
787
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
776
788
777
789
String fixed_field_json_no_positions = Strings .format ("""
@@ -791,6 +803,38 @@ public void testRegexp() throws IOException {
791
803
});
792
804
}
793
805
806
+ public void testMaxExpansionExceptionFailure () throws Exception {
807
+ IntervalsSourceProvider provider1 = new IntervalsSourceProvider .Prefix ("bar" , "keyword" , null );
808
+ IntervalsSourceProvider provider2 = new IntervalsSourceProvider .Wildcard ("bar*" , "keyword" , null );
809
+ IntervalsSourceProvider provider3 = new IntervalsSourceProvider .Fuzzy ("bar" , 0 , true , Fuzziness .fromEdits (1 ), "keyword" ,null );
810
+ IntervalsSourceProvider provider4 = new IntervalsSourceProvider .Regexp ("bar.*" , "keyword" , null );
811
+ IntervalsSourceProvider provider5 = new IntervalsSourceProvider .Range ("bar" , "bar2" , true , true , "keyword" , null );
812
+ IntervalsSourceProvider provider = randomFrom (provider1 , provider2 , provider3 , provider4 , provider5 );
813
+
814
+ try (Directory directory = newDirectory ()) {
815
+ try (RandomIndexWriter iw = new RandomIndexWriter (random (), directory , new KeywordAnalyzer ())) {
816
+ for (int i = 0 ; i < 3 ; i ++) {
817
+ iw .addDocument (singleton (new TextField (TEXT_FIELD_NAME , "bar" + i , Field .Store .NO )));
818
+ }
819
+ try (IndexReader reader = iw .getReader ()) {
820
+ int origBoolMaxClauseCount = IndexSearcher .getMaxClauseCount ();
821
+ IndexSearcher .setMaxClauseCount (1 );
822
+ try {
823
+
824
+ IntervalQueryBuilder queryBuilder = new IntervalQueryBuilder (TEXT_FIELD_NAME , provider );
825
+ IndexSearcher searcher = newSearcher (reader );
826
+ Query query = queryBuilder .toQuery (createSearchExecutionContext (searcher ));
827
+ RuntimeException exc = expectThrows (RuntimeException .class ,
828
+ () -> query .createWeight (searcher , ScoreMode .COMPLETE , 1.0f ).scorer (searcher .getLeafContexts ().get (0 )));
829
+ assertThat (exc .getMessage (), containsString ("expanded to too many terms (limit 1)" ));
830
+ } finally {
831
+ IndexSearcher .setMaxClauseCount (origBoolMaxClauseCount );
832
+ }
833
+ }
834
+ }
835
+ }
836
+ }
837
+
794
838
public void testWildcard () throws IOException {
795
839
String json = Strings .format ("""
796
840
{
@@ -804,7 +848,7 @@ public void testWildcard() throws IOException {
804
848
}""" , TEXT_FIELD_NAME );
805
849
806
850
IntervalQueryBuilder builder = (IntervalQueryBuilder ) parseQuery (json );
807
- Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .wildcard (new BytesRef ("te?m" )));
851
+ Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .wildcard (new BytesRef ("te?m" ), IndexSearcher . getMaxClauseCount () ));
808
852
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
809
853
810
854
String no_positions_json = Strings .format ("""
@@ -836,7 +880,7 @@ public void testWildcard() throws IOException {
836
880
}""" , TEXT_FIELD_NAME );
837
881
838
882
builder = (IntervalQueryBuilder ) parseQuery (keyword_json );
839
- expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .wildcard (new BytesRef ("Te?m" )));
883
+ expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .wildcard (new BytesRef ("Te?m" ), IndexSearcher . getMaxClauseCount () ));
840
884
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
841
885
842
886
String fixed_field_json = Strings .format ("""
@@ -852,7 +896,8 @@ public void testWildcard() throws IOException {
852
896
}""" , TEXT_FIELD_NAME );
853
897
854
898
builder = (IntervalQueryBuilder ) parseQuery (fixed_field_json );
855
- expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD , Intervals .wildcard (new BytesRef ("te?m" ))));
899
+ expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD ,
900
+ Intervals .wildcard (new BytesRef ("te?m" ), IndexSearcher .getMaxClauseCount ())));
856
901
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
857
902
858
903
String fixed_field_json_no_positions = Strings .format ("""
@@ -885,13 +930,15 @@ public void testWildcard() throws IOException {
885
930
}""" , TEXT_FIELD_NAME );
886
931
887
932
builder = (IntervalQueryBuilder ) parseQuery (fixed_field_analyzer_json );
888
- expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD , Intervals .wildcard (new BytesRef ("Te?m" ))));
933
+ expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .fixField (MASKED_FIELD ,
934
+ Intervals .wildcard (new BytesRef ("Te?m" ), IndexSearcher .getMaxClauseCount ())));
889
935
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
890
936
}
891
937
892
938
private static IntervalsSource buildFuzzySource (String term , String label , int prefixLength , boolean transpositions , int editDistance ) {
893
- FuzzyQuery fq = new FuzzyQuery (new Term ("field" , term ), editDistance , prefixLength , 128 , transpositions );
894
- return Intervals .multiterm (fq .getAutomata (), label );
939
+ FuzzyQuery fq =
940
+ new FuzzyQuery (new Term ("field" , term ), editDistance , prefixLength , IndexSearcher .getMaxClauseCount (), transpositions );
941
+ return Intervals .multiterm (fq .getAutomata (), IndexSearcher .getMaxClauseCount (), label );
895
942
}
896
943
897
944
public void testFuzzy () throws IOException {
@@ -1011,7 +1058,8 @@ public void testRange() throws IOException {
1011
1058
}
1012
1059
}""" , TEXT_FIELD_NAME );
1013
1060
IntervalQueryBuilder builder = (IntervalQueryBuilder ) parseQuery (json );
1014
- Query expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .range (new BytesRef ("aaa" ), new BytesRef ("aab" ), true , true ));
1061
+ Query expected = new IntervalQuery (TEXT_FIELD_NAME ,
1062
+ Intervals .range (new BytesRef ("aaa" ), new BytesRef ("aab" ), true , true , IndexSearcher .getMaxClauseCount ()));
1015
1063
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
1016
1064
1017
1065
json = Strings .format ("""
@@ -1026,7 +1074,8 @@ public void testRange() throws IOException {
1026
1074
}
1027
1075
}""" , TEXT_FIELD_NAME );
1028
1076
builder = (IntervalQueryBuilder ) parseQuery (json );
1029
- expected = new IntervalQuery (TEXT_FIELD_NAME , Intervals .range (new BytesRef ("aaa" ), new BytesRef ("aab" ), false , false ));
1077
+ expected = new IntervalQuery (TEXT_FIELD_NAME ,
1078
+ Intervals .range (new BytesRef ("aaa" ), new BytesRef ("aab" ), false , false , IndexSearcher .getMaxClauseCount ()));
1030
1079
assertEquals (expected , builder .toQuery (createSearchExecutionContext ()));
1031
1080
1032
1081
String incomplete_range = Strings .format ("""
0 commit comments