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