Skip to content

Commit 056c698

Browse files
vishnuchilamakuruChristoph Büscher
authored andcommitted
Add Validation for maxQueryTerms to be greater than 0 for MoreLikeThisQuery (#49966)
Adds validation for maxQueryTerms to be greater than 0 for MoreLikeThisQuery and MoreLikeThisQueryBuilder. Closes #49927
1 parent 1918a21 commit 056c698

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

server/src/main/java/org/elasticsearch/common/lucene/search/MoreLikeThisQuery.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,9 @@ public int getMaxQueryTerms() {
308308
}
309309

310310
public void setMaxQueryTerms(int maxQueryTerms) {
311+
if (maxQueryTerms <= 0) {
312+
throw new IllegalArgumentException("requires 'maxQueryTerms' to be greater than 0");
313+
}
311314
this.maxQueryTerms = maxQueryTerms;
312315
}
313316

server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,9 @@ public Item[] unlikeItems() {
641641
* Defaults to {@code 25}.
642642
*/
643643
public MoreLikeThisQueryBuilder maxQueryTerms(int maxQueryTerms) {
644+
if (maxQueryTerms <= 0) {
645+
throw new IllegalArgumentException("requires 'maxQueryTerms' to be greater than 0");
646+
}
644647
this.maxQueryTerms = maxQueryTerms;
645648
return this;
646649
}

server/src/test/java/org/elasticsearch/common/lucene/search/morelikethis/MoreLikeThisQueryTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.common.lucene.search.MoreLikeThisQuery;
3434
import org.elasticsearch.test.ESTestCase;
3535

36+
import static org.hamcrest.Matchers.containsString;
3637
import static org.hamcrest.Matchers.equalTo;
3738

3839
public class MoreLikeThisQueryTests extends ESTestCase {
@@ -64,4 +65,15 @@ public void testSimple() throws Exception {
6465
reader.close();
6566
indexWriter.close();
6667
}
68+
69+
public void testValidateMaxQueryTerms() {
70+
IllegalArgumentException e1 = expectThrows(IllegalArgumentException.class,
71+
() -> new MoreLikeThisQuery("lucene", new String[]{"text"}, Lucene.STANDARD_ANALYZER).setMaxQueryTerms(0));
72+
assertThat(e1.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
73+
74+
IllegalArgumentException e2 = expectThrows(IllegalArgumentException.class,
75+
() -> new MoreLikeThisQuery("lucene", new String[]{"text"}, Lucene.STANDARD_ANALYZER).setMaxQueryTerms(-3));
76+
assertThat(e2.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
77+
}
78+
6779
}

server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ protected MoreLikeThisQueryBuilder doCreateTestQueryBuilder() {
174174
queryBuilder.unlike(randomUnlikeItems);
175175
}
176176
if (randomBoolean()) {
177-
queryBuilder.maxQueryTerms(randomInt(25));
177+
queryBuilder.maxQueryTerms(randomIntBetween(1, 25));
178178
}
179179
if (randomBoolean()) {
180180
queryBuilder.minTermFreq(randomInt(5));
@@ -351,6 +351,16 @@ public void testMoreLikeThisBuilder() throws Exception {
351351
assertThat(mltQuery.getMaxQueryTerms(), equalTo(12));
352352
}
353353

354+
public void testValidateMaxQueryTerms() {
355+
IllegalArgumentException e1 = expectThrows(IllegalArgumentException.class,
356+
() -> new MoreLikeThisQueryBuilder(new String[]{"name.first", "name.last"}, new String[]{"something"}, null).maxQueryTerms(0));
357+
assertThat(e1.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
358+
359+
IllegalArgumentException e2 = expectThrows(IllegalArgumentException.class,
360+
() -> new MoreLikeThisQueryBuilder(new String[]{"name.first", "name.last"}, new String[]{"something"}, null).maxQueryTerms(-3));
361+
assertThat(e2.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
362+
}
363+
354364
public void testItemSerialization() throws IOException {
355365
Item expectedItem = generateRandomItem();
356366
BytesStreamOutput output = new BytesStreamOutput();

0 commit comments

Comments
 (0)