2929import org .elasticsearch .xpack .esql .parser .ParsingException ;
3030import org .elasticsearch .xpack .esql .parser .QueryParam ;
3131import org .elasticsearch .xpack .esql .parser .QueryParams ;
32+ import org .elasticsearch .xpack .esql .plan .logical .Enrich ;
3233
3334import java .util .ArrayList ;
3435import java .util .LinkedHashMap ;
3839import java .util .Map ;
3940import java .util .Set ;
4041
42+ import static org .elasticsearch .xpack .core .enrich .EnrichPolicy .MATCH_TYPE ;
4143import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_CFG ;
44+ import static org .elasticsearch .xpack .esql .EsqlTestUtils .TEST_VERIFIER ;
4245import static org .elasticsearch .xpack .esql .EsqlTestUtils .paramAsConstant ;
4346import static org .elasticsearch .xpack .esql .EsqlTestUtils .withDefaultLimitWarning ;
47+ import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .defaultLookupResolution ;
48+ import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .loadEnrichPolicyResolution ;
4449import static org .elasticsearch .xpack .esql .analysis .AnalyzerTestUtils .loadMapping ;
4550import static org .elasticsearch .xpack .esql .core .type .DataType .BOOLEAN ;
4651import static org .elasticsearch .xpack .esql .core .type .DataType .CARTESIAN_POINT ;
@@ -2268,6 +2273,78 @@ public void testRemoteLookupJoinWithPipelineBreaker() {
22682273 );
22692274 }
22702275
2276+ public void testRemoteEnrichAfterLookupJoinWithPipelineBreaker () {
2277+ EnrichResolution enrichResolution = new EnrichResolution ();
2278+ loadEnrichPolicyResolution (
2279+ enrichResolution ,
2280+ Enrich .Mode .REMOTE ,
2281+ MATCH_TYPE ,
2282+ "languages" ,
2283+ "language_code" ,
2284+ "languages_idx" ,
2285+ "mapping-languages.json"
2286+ );
2287+ loadEnrichPolicyResolution (
2288+ enrichResolution ,
2289+ Enrich .Mode .COORDINATOR ,
2290+ MATCH_TYPE ,
2291+ "languages_coord" ,
2292+ "language_code" ,
2293+ "languages_idx" ,
2294+ "mapping-languages.json"
2295+ );
2296+ var analyzer = AnalyzerTestUtils .analyzer (
2297+ loadMapping ("mapping-default.json" , "test" ),
2298+ defaultLookupResolution (),
2299+ enrichResolution ,
2300+ TEST_VERIFIER
2301+ );
2302+
2303+ String err = error ("""
2304+ FROM test
2305+ | STATS c = COUNT(*) by languages
2306+ | EVAL language_code = languages
2307+ | LOOKUP JOIN languages_lookup ON language_code
2308+ | ENRICH _remote:languages ON language_code
2309+ """ , analyzer );
2310+ assertThat (
2311+ err ,
2312+ containsString ("4:3: LOOKUP JOIN with remote indices can't be executed after [STATS c = COUNT(*) by languages]@2:3" )
2313+ );
2314+ assertThat (err , containsString ("5:3: ENRICH with remote policy can't be executed after STATS" ));
2315+
2316+ err = error ("""
2317+ FROM test
2318+ | SORT emp_no
2319+ | EVAL language_code = languages
2320+ | LOOKUP JOIN languages_lookup ON language_code
2321+ | ENRICH _remote:languages ON language_code
2322+ """ , analyzer );
2323+ assertThat (err , containsString ("4:3: LOOKUP JOIN with remote indices can't be executed after [SORT emp_no]@2:3" ));
2324+
2325+ err = error ("""
2326+ FROM test
2327+ | LIMIT 2
2328+ | EVAL language_code = languages
2329+ | LOOKUP JOIN languages_lookup ON language_code
2330+ | ENRICH _remote:languages ON language_code
2331+ """ , analyzer );
2332+ assertThat (err , containsString ("4:3: LOOKUP JOIN with remote indices can't be executed after [LIMIT 2]@2:3" ));
2333+
2334+ err = error ("""
2335+ FROM test
2336+ | EVAL language_code = languages
2337+ | ENRICH _coordinator:languages_coord
2338+ | LOOKUP JOIN languages_lookup ON language_code
2339+ | ENRICH _remote:languages ON language_code
2340+ """ , analyzer );
2341+ assertThat (
2342+ err ,
2343+ containsString ("4:3: LOOKUP JOIN with remote indices can't be executed after [ENRICH _coordinator:languages_coord]@3:3" )
2344+ );
2345+ assertThat (err , containsString ("5:3: ENRICH with remote policy can't be executed after another ENRICH with coordinator policy" ));
2346+ }
2347+
22712348 public void testRemoteLookupJoinIsSnapshot () {
22722349 // TODO: remove when we allow remote joins in release builds
22732350 assumeTrue ("Remote LOOKUP JOIN not enabled" , EsqlCapabilities .Cap .ENABLE_LOOKUP_JOIN_ON_REMOTE .isEnabled ());
@@ -2282,7 +2359,6 @@ public void testRemoteLookupJoinIsDisabled() {
22822359 () -> query ("FROM test,remote:test | EVAL language_code = languages | LOOKUP JOIN languages_lookup ON language_code" )
22832360 );
22842361 assertThat (e .getMessage (), containsString ("remote clusters are not supported with LOOKUP JOIN" ));
2285-
22862362 }
22872363
22882364 private void checkFullTextFunctionsInStats (String functionInvocation ) {
0 commit comments