@@ -6223,6 +6223,83 @@ public void testLookupJoinPushDownDisabledForDisjunctionBetweenLeftAndRightField
62236223 var rightRel = as (join .right (), EsRelation .class );
62246224 }
62256225
6226+ /**
6227+ * When dropping lookup fields, the lookup relation shouldn't include them.
6228+ * At least until we can implement InsertFieldExtract there.
6229+ * Expects
6230+ * EsqlProject[[languages{f}#10]]
6231+ * \_Join[LEFT,[language_code{r}#4],[language_code{r}#4],[language_code{f}#18]]
6232+ * |_Project[[_meta_field{f}#13, emp_no{f}#7, first_name{f}#8, gender{f}#9, hire_date{f}#14, job{f}#15, job.raw{f}#16, lang
6233+ * uages{f}#10, last_name{f}#11, long_noidx{f}#17, salary{f}#12, languages{f}#10 AS language_code]]
6234+ * | \_Limit[1000[INTEGER]]
6235+ * | \_EsRelation[test][_meta_field{f}#13, emp_no{f}#7, first_name{f}#8, ge..]
6236+ * \_EsRelation[languages_lookup][LOOKUP][language_code{f}#18]
6237+ */
6238+ public void testLookupJoinKeepNoLookupFields () {
6239+ assumeTrue ("Requires LOOKUP JOIN" , EsqlCapabilities .Cap .JOIN_LOOKUP_V11 .isEnabled ());
6240+
6241+ String commandDiscardingFields = randomBoolean () ? "| KEEP languages" : """
6242+ | DROP _meta_field, emp_no, first_name, gender, language_code,
6243+ language_name, last_name, salary, hire_date, job, job.raw, long_noidx
6244+ """ ;
6245+
6246+ String query = """
6247+ FROM test
6248+ | EVAL language_code = languages
6249+ | LOOKUP JOIN languages_lookup ON language_code
6250+ """ + commandDiscardingFields ;
6251+
6252+ var plan = optimizedPlan (query );
6253+
6254+ var project = as (plan , Project .class );
6255+ assertThat (project .projections ().size (), equalTo (1 ));
6256+ assertThat (project .projections ().get (0 ).name (), equalTo ("languages" ));
6257+
6258+ var join = as (project .child (), Join .class );
6259+ var joinRightRelation = as (join .right (), EsRelation .class );
6260+
6261+ assertThat (joinRightRelation .output ().size (), equalTo (1 ));
6262+ assertThat (joinRightRelation .output ().get (0 ).name (), equalTo ("language_code" ));
6263+ }
6264+
6265+ /**
6266+ * Ensure a JOIN shadowed by another JOIN doesn't request the shadowed fields.
6267+ *
6268+ * Expected
6269+ * Join[LEFT,[language_code{r}#4],[language_code{r}#4],[language_code{f}#20]]
6270+ * |_Join[LEFT,[language_code{r}#4],[language_code{r}#4],[language_code{f}#18]]
6271+ * | |_Eval[[languages{f}#10 AS language_code]]
6272+ * | | \_Limit[1000[INTEGER]]
6273+ * | | \_EsRelation[test][_meta_field{f}#13, emp_no{f}#7, first_name{f}#8, ge..]
6274+ * | \_EsRelation[languages_lookup][LOOKUP][language_code{f}#18]
6275+ * \_EsRelation[languages_lookup][LOOKUP][language_code{f}#20, language_name{f}#21]
6276+ */
6277+ public void testMultipleLookupShadowing () {
6278+ assumeTrue ("Requires LOOKUP JOIN" , EsqlCapabilities .Cap .JOIN_LOOKUP_V11 .isEnabled ());
6279+
6280+ String query = """
6281+ FROM test
6282+ | EVAL language_code = languages
6283+ | LOOKUP JOIN languages_lookup ON language_code
6284+ | LOOKUP JOIN languages_lookup ON language_code
6285+ """ ;
6286+
6287+ var plan = optimizedPlan (query );
6288+
6289+ var finalJoin = as (plan , Join .class );
6290+ var finalJoinRightRelation = as (finalJoin .right (), EsRelation .class );
6291+
6292+ assertThat (finalJoinRightRelation .output ().size (), equalTo (2 ));
6293+ assertThat (finalJoinRightRelation .output ().get (0 ).name (), equalTo ("language_code" ));
6294+ assertThat (finalJoinRightRelation .output ().get (1 ).name (), equalTo ("language_name" ));
6295+
6296+ var initialJoin = as (finalJoin .left (), Join .class );
6297+ var initialJoinRightRelation = as (initialJoin .right (), EsRelation .class );
6298+
6299+ assertThat (initialJoinRightRelation .output ().size (), equalTo (1 ));
6300+ assertThat (initialJoinRightRelation .output ().get (0 ).name (), equalTo ("language_code" ));
6301+ }
6302+
62266303 //
62276304 //
62286305 //
0 commit comments