4646import org .elasticsearch .index .mapper .vectors .DenseVectorFieldMapperTestUtils ;
4747import org .elasticsearch .index .query .MatchNoneQueryBuilder ;
4848import org .elasticsearch .index .query .QueryBuilder ;
49+ import org .elasticsearch .index .query .QueryBuilders ;
4950import org .elasticsearch .index .query .QueryRewriteContext ;
5051import org .elasticsearch .index .query .SearchExecutionContext ;
5152import org .elasticsearch .index .search .ESToParentBlockJoinQuery ;
@@ -241,6 +242,15 @@ protected SemanticQueryBuilder doCreateTestQueryBuilder() {
241242 if (randomBoolean ()) {
242243 builder .queryName (randomAlphaOfLength (4 ));
243244 }
245+ if (randomBoolean ()) {
246+ List <QueryBuilder > filters = new ArrayList <>();
247+ int numFilters = randomIntBetween (1 , 5 );
248+ for (int i = 0 ; i < numFilters ; i ++) {
249+ String filterFieldName = randomBoolean () ? KEYWORD_FIELD_NAME : TEXT_FIELD_NAME ;
250+ filters .add (QueryBuilders .termQuery (filterFieldName , randomAlphaOfLength (10 )));
251+ }
252+ builder .addFilterQueries (filters );
253+ }
244254
245255 return builder ;
246256 }
@@ -256,13 +266,13 @@ protected void doAssertLuceneQuery(SemanticQueryBuilder queryBuilder, Query quer
256266
257267 switch (inferenceResultType ) {
258268 case NONE -> assertThat (nestedQuery .getChildQuery (), instanceOf (MatchNoDocsQuery .class ));
259- case SPARSE_EMBEDDING -> assertSparseEmbeddingLuceneQuery (nestedQuery .getChildQuery ());
260- case TEXT_EMBEDDING -> assertTextEmbeddingLuceneQuery (nestedQuery .getChildQuery ());
269+ case SPARSE_EMBEDDING -> assertSparseEmbeddingLuceneQuery (queryBuilder , nestedQuery .getChildQuery ());
270+ case TEXT_EMBEDDING -> assertTextEmbeddingLuceneQuery (queryBuilder , nestedQuery .getChildQuery ());
261271 }
262272 }
263273
264- private void assertSparseEmbeddingLuceneQuery (Query query ) {
265- Query innerQuery = assertOuterBooleanQuery (query );
274+ private void assertSparseEmbeddingLuceneQuery (SemanticQueryBuilder queryBuilder , Query query ) {
275+ Query innerQuery = assertOuterBooleanQuery (query , queryBuilder );
266276 assertThat (innerQuery , instanceOf (SparseVectorQueryWrapper .class ));
267277 var sparseQuery = (SparseVectorQueryWrapper ) innerQuery ;
268278 assertThat (sparseQuery .getTermsQuery (), instanceOf (BooleanQuery .class ));
@@ -272,8 +282,8 @@ private void assertSparseEmbeddingLuceneQuery(Query query) {
272282 assertThat (innerBooleanQuery .clauses ().size (), equalTo (0 ));
273283 }
274284
275- private void assertTextEmbeddingLuceneQuery (Query query ) {
276- Query innerQuery = assertOuterBooleanQuery (query );
285+ private void assertTextEmbeddingLuceneQuery (SemanticQueryBuilder queryBuilder , Query query ) {
286+ Query innerQuery = assertOuterBooleanQuery (query , queryBuilder );
277287
278288 Class <? extends Query > expectedKnnQueryClass = switch (denseVectorElementType ) {
279289 case FLOAT -> KnnFloatVectorQuery .class ;
@@ -282,12 +292,38 @@ private void assertTextEmbeddingLuceneQuery(Query query) {
282292 assertThat (innerQuery , instanceOf (expectedKnnQueryClass ));
283293 }
284294
285- private Query assertOuterBooleanQuery (Query query ) {
295+ private Query assertOuterBooleanQuery (Query query , SemanticQueryBuilder queryBuilder ) {
286296 assertThat (query , instanceOf (BooleanQuery .class ));
287297 BooleanQuery outerBooleanQuery = (BooleanQuery ) query ;
288298
289299 List <BooleanClause > outerMustClauses = new ArrayList <>();
290300 List <BooleanClause > outerFilterClauses = new ArrayList <>();
301+ retrieveMustAndFilterClauses (outerBooleanQuery , outerMustClauses , outerFilterClauses );
302+
303+ assertThat (outerMustClauses .size (), equalTo (1 ));
304+
305+ int expectedFilterClauses = 1 ;
306+ if (inferenceResultType == InferenceResultType .SPARSE_EMBEDDING ) {
307+ // Outer must clause contains query builder filters and the must clause
308+ outerBooleanQuery = (BooleanQuery ) outerMustClauses .get (0 ).query ();
309+ outerMustClauses .clear ();
310+ outerFilterClauses .clear ();
311+
312+ retrieveMustAndFilterClauses (outerBooleanQuery , outerMustClauses , outerFilterClauses );
313+
314+ assertThat (outerMustClauses .size (), equalTo (1 ));
315+ expectedFilterClauses = queryBuilder .getFilterQueries ().size ();
316+ }
317+ assertThat (outerFilterClauses .size (), equalTo (expectedFilterClauses ));
318+
319+ return outerMustClauses .get (0 ).query ();
320+ }
321+
322+ private static void retrieveMustAndFilterClauses (
323+ BooleanQuery outerBooleanQuery ,
324+ List <BooleanClause > outerMustClauses ,
325+ List <BooleanClause > outerFilterClauses
326+ ) {
291327 for (BooleanClause clause : outerBooleanQuery .clauses ()) {
292328 BooleanClause .Occur occur = clause .occur ();
293329 if (occur == MUST ) {
@@ -298,11 +334,6 @@ private Query assertOuterBooleanQuery(Query query) {
298334 fail ("Unexpected boolean " + occur + " clause" );
299335 }
300336 }
301-
302- assertThat (outerMustClauses .size (), equalTo (1 ));
303- assertThat (outerFilterClauses .size (), equalTo (1 ));
304-
305- return outerMustClauses .get (0 ).query ();
306337 }
307338
308339 @ Override
0 commit comments