Skip to content

Commit 624133e

Browse files
committed
Added unit tests
1 parent 0f15462 commit 624133e

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.action.fieldcaps;
9+
10+
import org.elasticsearch.action.ActionRequestValidationException;
11+
import org.elasticsearch.index.query.BoolQueryBuilder;
12+
import org.elasticsearch.index.query.BoostingQueryBuilder;
13+
import org.elasticsearch.index.query.ConstantScoreQueryBuilder;
14+
import org.elasticsearch.index.query.DisMaxQueryBuilder;
15+
import org.elasticsearch.index.query.MatchAllQueryBuilder;
16+
import org.elasticsearch.index.query.NestedQueryBuilder;
17+
import org.elasticsearch.index.query.QueryBuilder;
18+
import org.elasticsearch.index.query.TermQueryBuilder;
19+
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
20+
import org.elasticsearch.test.ESTestCase;
21+
import org.elasticsearch.xpack.inference.queries.SemanticQueryBuilder;
22+
import org.apache.lucene.search.join.ScoreMode;
23+
24+
import static org.hamcrest.Matchers.containsString;
25+
import static org.hamcrest.Matchers.notNullValue;
26+
27+
public class FieldCapabilitiesRequestSemanticIndexFilterTests extends ESTestCase {
28+
private static final String EXPECTED_ERROR_MESSAGE = "index filter cannot contain semantic queries. Use an exists query instead.";
29+
30+
public void testValidateWithoutIndexFilter() {
31+
FieldCapabilitiesRequest request = new FieldCapabilitiesRequest();
32+
request.fields("field1", "field2");
33+
34+
ActionRequestValidationException validationException = request.validate();
35+
assertNull(validationException);
36+
}
37+
38+
public void testValidateWithNonSemanticIndexFilter() {
39+
FieldCapabilitiesRequest request = new FieldCapabilitiesRequest();
40+
request.fields("field1", "field2");
41+
request.indexFilter(randomNonSemanticQuery());
42+
43+
ActionRequestValidationException validationException = request.validate();
44+
assertNull(validationException);
45+
}
46+
47+
public void testValidateWithDirectSemanticQuery() {
48+
FieldCapabilitiesRequest request = new FieldCapabilitiesRequest();
49+
request.fields("field1", "field2");
50+
request.indexFilter(randomSemanticQuery());
51+
52+
ActionRequestValidationException validationException = request.validate();
53+
assertThat(validationException, notNullValue());
54+
assertThat(validationException.getMessage(), containsString(EXPECTED_ERROR_MESSAGE));
55+
}
56+
57+
public void testValidateWithRandomCompoundQueryContainingSemantic() {
58+
for (int i = 0; i < 100; i++) {
59+
FieldCapabilitiesRequest request = new FieldCapabilitiesRequest();
60+
request.fields("field1", "field2");
61+
62+
// Create a randomly structured compound query containing semantic query
63+
QueryBuilder randomCompoundQuery = randomCompoundQueryWithSemantic(randomIntBetween(1, 3));
64+
request.indexFilter(randomCompoundQuery);
65+
66+
ActionRequestValidationException validationException = request.validate();
67+
assertThat(validationException, notNullValue());
68+
assertThat(validationException.getMessage(), containsString(EXPECTED_ERROR_MESSAGE));
69+
}
70+
}
71+
72+
private static SemanticQueryBuilder randomSemanticQuery() {
73+
return new SemanticQueryBuilder(
74+
randomAlphaOfLength(5),
75+
randomAlphaOfLength(10)
76+
);
77+
}
78+
79+
private static QueryBuilder randomNonSemanticQuery() {
80+
return switch (randomIntBetween(0, 2)) {
81+
case 0 -> new TermQueryBuilder(randomAlphaOfLength(5), randomAlphaOfLength(5));
82+
case 1 -> new MatchAllQueryBuilder();
83+
case 2 -> {
84+
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
85+
boolQuery.must(new TermQueryBuilder(randomAlphaOfLength(5), randomAlphaOfLength(5)));
86+
yield boolQuery;
87+
}
88+
default -> throw new IllegalStateException("Unexpected value");
89+
};
90+
}
91+
92+
private static QueryBuilder randomCompoundQueryWithSemantic(int depth) {
93+
if (depth <= 0) {
94+
return randomSemanticQuery();
95+
}
96+
97+
return switch (randomIntBetween(0, 5)) {
98+
case 0 -> {
99+
BoolQueryBuilder boolQuery = new BoolQueryBuilder();
100+
QueryBuilder clauseQuery = randomCompoundQueryWithSemantic(depth - 1);
101+
switch (randomIntBetween(0, 3)) {
102+
case 0 -> boolQuery.must(clauseQuery);
103+
case 1 -> boolQuery.mustNot(clauseQuery);
104+
case 2 -> boolQuery.should(clauseQuery);
105+
case 3 -> boolQuery.filter(clauseQuery);
106+
default -> throw new IllegalStateException("Unexpected value");
107+
}
108+
109+
if (randomBoolean()) {
110+
boolQuery.should(randomNonSemanticQuery());
111+
}
112+
113+
yield boolQuery;
114+
}
115+
case 1 -> {
116+
DisMaxQueryBuilder disMax = new DisMaxQueryBuilder();
117+
disMax.add(randomCompoundQueryWithSemantic(depth - 1));
118+
if (randomBoolean()) {
119+
disMax.add(randomNonSemanticQuery());
120+
}
121+
yield disMax;
122+
}
123+
case 2 -> new NestedQueryBuilder(
124+
randomAlphaOfLength(5),
125+
randomCompoundQueryWithSemantic(depth - 1),
126+
ScoreMode.Max
127+
);
128+
case 3 -> {
129+
boolean positiveSemanticQuery = randomBoolean();
130+
QueryBuilder semanticQuery = randomCompoundQueryWithSemantic(depth - 1);
131+
QueryBuilder nonSemanticQuery = randomNonSemanticQuery();
132+
133+
yield new BoostingQueryBuilder(
134+
positiveSemanticQuery ? semanticQuery : nonSemanticQuery,
135+
positiveSemanticQuery ? nonSemanticQuery : semanticQuery
136+
);
137+
}
138+
case 4 -> new ConstantScoreQueryBuilder(randomCompoundQueryWithSemantic(depth - 1));
139+
case 5 -> new FunctionScoreQueryBuilder(randomCompoundQueryWithSemantic(depth - 1));
140+
default -> throw new IllegalStateException("Unexpected value");
141+
};
142+
}
143+
}

0 commit comments

Comments
 (0)