1111import org .apache .lucene .search .BooleanQuery ;
1212import org .apache .lucene .search .MatchAllDocsQuery ;
1313import org .apache .lucene .search .MatchNoDocsQuery ;
14+ import org .apache .lucene .search .TermQuery ;
1415import org .elasticsearch .TransportVersion ;
1516import org .elasticsearch .TransportVersions ;
1617import org .elasticsearch .common .io .stream .NamedWriteableRegistry ;
1920import org .elasticsearch .compute .operator .DriverContext ;
2021import org .elasticsearch .compute .operator .Warnings ;
2122import org .elasticsearch .compute .querydsl .query .SingleValueMatchQuery ;
23+ import org .elasticsearch .index .mapper .IgnoredFieldMapper ;
2224import org .elasticsearch .index .mapper .MappedFieldType ;
2325import org .elasticsearch .index .mapper .TextFieldMapper ;
2426import org .elasticsearch .index .query .AbstractQueryBuilder ;
3032import org .elasticsearch .xpack .esql .core .querydsl .query .Query ;
3133import org .elasticsearch .xpack .esql .core .tree .Location ;
3234import org .elasticsearch .xpack .esql .core .tree .Source ;
35+ import org .elasticsearch .xpack .esql .expression .function .fulltext .Term ;
3336import org .elasticsearch .xpack .esql .io .stream .PlanStreamInput ;
3437
3538import java .io .IOException ;
@@ -163,35 +166,6 @@ public Source source() {
163166 return source ;
164167 }
165168
166- protected abstract MappedFieldType mappedFieldType (SearchExecutionContext context );
167-
168- @ Override
169- protected final org .apache .lucene .search .Query doToQuery (SearchExecutionContext context ) throws IOException {
170- MappedFieldType ft = mappedFieldType (context );
171- if (ft == null ) {
172- return new MatchNoDocsQuery ("missing field [" + field + "]" );
173- }
174- SingleValueMatchQuery singleValueQuery = new SingleValueMatchQuery (
175- context .getForField (ft , MappedFieldType .FielddataOperation .SEARCH ),
176- Warnings .createWarnings (
177- DriverContext .WarningsMode .COLLECT ,
178- source .source ().getLineNumber (),
179- source .source ().getColumnNumber (),
180- source .text ()
181- ),
182- "single-value function encountered multi-value"
183- );
184- org .apache .lucene .search .Query rewrite = singleValueQuery .rewrite (context .searcher ());
185- if (rewrite instanceof MatchAllDocsQuery ) {
186- // nothing to filter
187- return next .toQuery (context );
188- }
189- BooleanQuery .Builder builder = new BooleanQuery .Builder ();
190- builder .add (next .toQuery (context ), BooleanClause .Occur .FILTER );
191- builder .add (rewrite , BooleanClause .Occur .FILTER );
192- return builder .build ();
193- }
194-
195169 protected abstract AbstractBuilder rewrite (QueryBuilder next );
196170
197171 @ Override
@@ -246,8 +220,30 @@ public TransportVersion getMinimalSupportedVersion() {
246220 }
247221
248222 @ Override
249- protected MappedFieldType mappedFieldType (SearchExecutionContext context ) {
250- return context .getFieldType (field ());
223+ protected final org .apache .lucene .search .Query doToQuery (SearchExecutionContext context ) throws IOException {
224+ MappedFieldType ft = context .getFieldType (field ());
225+ if (ft == null ) {
226+ return new MatchNoDocsQuery ("missing field [" + field () + "]" );
227+ }
228+ SingleValueMatchQuery singleValueQuery = new SingleValueMatchQuery (
229+ context .getForField (ft , MappedFieldType .FielddataOperation .SEARCH ),
230+ Warnings .createWarnings (
231+ DriverContext .WarningsMode .COLLECT ,
232+ source ().source ().getLineNumber (),
233+ source ().source ().getColumnNumber (),
234+ source ().text ()
235+ ),
236+ "single-value function encountered multi-value"
237+ );
238+ org .apache .lucene .search .Query rewrite = singleValueQuery .rewrite (context .searcher ());
239+ if (rewrite instanceof MatchAllDocsQuery ) {
240+ // nothing to filter
241+ return next ().toQuery (context );
242+ }
243+ BooleanQuery .Builder builder = new BooleanQuery .Builder ();
244+ builder .add (next ().toQuery (context ), BooleanClause .Occur .FILTER );
245+ builder .add (rewrite , BooleanClause .Occur .FILTER );
246+ return builder .build ();
251247 }
252248
253249 @ Override
@@ -261,13 +257,9 @@ public static class SyntheticSourceDelegateBuilder extends AbstractBuilder {
261257 super (next , field , source );
262258 }
263259
264- SyntheticSourceDelegateBuilder (StreamInput in ) throws IOException {
265- super (in );
266- }
267-
268260 @ Override
269261 public String getWriteableName () {
270- throw new UnsupportedOperationException ();
262+ throw new UnsupportedOperationException ("Not serialized" );
271263 }
272264
273265 @ Override
@@ -281,12 +273,42 @@ protected void doXContent(XContentBuilder builder, Params params) throws IOExcep
281273
282274 @ Override
283275 public TransportVersion getMinimalSupportedVersion () {
284- throw new UnsupportedOperationException ();
276+ throw new UnsupportedOperationException ("Not serialized" );
285277 }
286278
287279 @ Override
288- protected MappedFieldType mappedFieldType (SearchExecutionContext context ) {
289- return ((TextFieldMapper .TextFieldType ) context .getFieldType (field ())).syntheticSourceDelegate ();
280+ protected final org .apache .lucene .search .Query doToQuery (SearchExecutionContext context ) throws IOException {
281+ MappedFieldType ft = context .getFieldType (field ());
282+ if (ft == null ) {
283+ return new MatchNoDocsQuery ("missing field [" + field () + "]" );
284+ }
285+ ft = ((TextFieldMapper .TextFieldType ) ft ).syntheticSourceDelegate ();
286+
287+ BooleanQuery .Builder builder = new BooleanQuery .Builder ();
288+ builder .add (next ().toQuery (context ), BooleanClause .Occur .FILTER );
289+
290+ org .apache .lucene .search .Query singleValueQuery = new SingleValueMatchQuery (
291+ context .getForField (ft , MappedFieldType .FielddataOperation .SEARCH ),
292+ Warnings .createWarnings (
293+ DriverContext .WarningsMode .COLLECT ,
294+ source ().source ().getLineNumber (),
295+ source ().source ().getColumnNumber (),
296+ source ().text ()
297+ ),
298+ "single-value function encountered multi-value"
299+ );
300+ singleValueQuery = singleValueQuery .rewrite (context .searcher ());
301+ if (singleValueQuery instanceof MatchAllDocsQuery == false ) {
302+ builder .add (singleValueQuery , BooleanClause .Occur .FILTER );
303+ }
304+
305+ org .apache .lucene .search .Query ignored = new TermQuery (new org .apache .lucene .index .Term (IgnoredFieldMapper .NAME , ft .name ()));
306+ ignored = ignored .rewrite (context .searcher ());
307+ if (ignored instanceof MatchNoDocsQuery == false ) {
308+ builder .add (ignored , BooleanClause .Occur .MUST_NOT );
309+ }
310+
311+ return builder .build ();
290312 }
291313
292314 @ Override
0 commit comments