|  | @@ -417,8 +417,8 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expects
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[last_name{f}#23, first_name{f}#20, k{r}#4],[SUM(salary{f}#24) AS s, last_name{f}#23, first_name{f}#20, first_n
 | 
	
		
			
				|  |  | -     * ame{f}#20 AS k]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[last_name{f}#23, first_name{f}#20],[SUM(salary{f}#24) AS s, last_name{f}#23, first_name{f}#20, first_name{f}#2
 | 
	
		
			
				|  |  | +     * 0 AS k]]
 | 
	
		
			
				|  |  |       *   \_EsRelation[test][_meta_field{f}#25, emp_no{f}#19, first_name{f}#20, ..]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testCombineProjectionWithAggregationAndEval() {
 | 
	
	
		
			
				|  | @@ -432,7 +432,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  |          var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  |          assertThat(Expressions.names(agg.aggregates()), contains("s", "last_name", "first_name", "k"));
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("last_name", "first_name", "k"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("last_name", "first_name"));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -552,6 +552,12 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          assertThat(condition.list(), equalTo(List.of(new Literal(EMPTY, 1, INTEGER), new Literal(EMPTY, 2, INTEGER))));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Expects
 | 
	
		
			
				|  |  | +     * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[first_name{f}#12],[COUNT(salary{f}#16) AS count(salary), first_name{f}#12 AS x]]
 | 
	
		
			
				|  |  | +     *   \_EsRelation[test][_meta_field{f}#17, emp_no{f}#11, first_name{f}#12, ..]
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  |      public void testCombineProjectionWithPruning() {
 | 
	
		
			
				|  |  |          var plan = plan("""
 | 
	
		
			
				|  |  |              from test
 | 
	
	
		
			
				|  | @@ -563,19 +569,17 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  |          var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  |          assertThat(Expressions.names(agg.aggregates()), contains("count(salary)", "x"));
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("x"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("first_name"));
 | 
	
		
			
				|  |  |          var alias = as(agg.aggregates().get(1), Alias.class);
 | 
	
		
			
				|  |  |          var field = as(alias.child(), FieldAttribute.class);
 | 
	
		
			
				|  |  |          assertThat(field.name(), is("first_name"));
 | 
	
		
			
				|  |  | -        var group = as(agg.groupings().get(0), Attribute.class);
 | 
	
		
			
				|  |  | -        assertThat(group, is(alias.toAttribute()));
 | 
	
		
			
				|  |  |          var from = as(agg.child(), EsRelation.class);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expects
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[f{r}#7],[SUM(emp_no{f}#15) AS s, COUNT(first_name{f}#16) AS c, first_name{f}#16 AS f]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[first_name{f}#16],[SUM(emp_no{f}#15) AS s, COUNT(first_name{f}#16) AS c, first_name{f}#16 AS f]]
 | 
	
		
			
				|  |  |       *   \_EsRelation[test][_meta_field{f}#21, emp_no{f}#15, first_name{f}#16, ..]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testCombineProjectionWithAggregationFirstAndAliasedGroupingUsedInAgg() {
 | 
	
	
		
			
				|  | @@ -599,13 +603,13 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          as = as(aggs.get(2), Alias.class);
 | 
	
		
			
				|  |  |          assertThat(Expressions.name(as.child()), is("first_name"));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("f"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("first_name"));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expects
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[f{r}#7],[SUM(emp_no{f}#15) AS s, first_name{f}#16 AS f]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[first_name{f}#16],[SUM(emp_no{f}#15) AS s, first_name{f}#16 AS f]]
 | 
	
		
			
				|  |  |       *   \_EsRelation[test][_meta_field{f}#21, emp_no{f}#15, first_name{f}#16, ..]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testCombineProjectionWithAggregationFirstAndAliasedGroupingUnused() {
 | 
	
	
		
			
				|  | @@ -625,7 +629,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          as = as(aggs.get(1), Alias.class);
 | 
	
		
			
				|  |  |          assertThat(Expressions.name(as.child()), is("first_name"));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("f"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("first_name"));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -2786,6 +2790,27 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |          var source = as(agg.child(), EsRelation.class);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * Expects
 | 
	
		
			
				|  |  | +     * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[salary{f}#12],[salary{f}#12, salary{f}#12 AS x]]
 | 
	
		
			
				|  |  | +     *   \_EsRelation[test][_meta_field{f}#13, emp_no{f}#7, first_name{f}#8, ge..]
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public void testEliminateDuplicateRenamedGroupings() {
 | 
	
		
			
				|  |  | +        var plan = plan("""
 | 
	
		
			
				|  |  | +            from test
 | 
	
		
			
				|  |  | +            | eval x = salary
 | 
	
		
			
				|  |  | +            | stats by salary, x
 | 
	
		
			
				|  |  | +            """);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  | +        var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  | +        var relation = as(agg.child(), EsRelation.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("salary"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.aggregates()), contains("salary", "x"));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expected
 | 
	
		
			
				|  |  |       * Limit[2[INTEGER]]
 | 
	
	
		
			
				|  | @@ -2832,7 +2857,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expected
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[a{r}#2, bar{r}#8],[COUNT([2a][KEYWORD]) AS baz, b{r}#4 AS bar]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[a{r}#3, b{r}#5],[COUNT([2a][KEYWORD]) AS baz, b{r}#5 AS bar]]
 | 
	
		
			
				|  |  |       *   \_Row[[1[INTEGER] AS a, 2[INTEGER] AS b]]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testMultipleRenameStatsDropGroup() {
 | 
	
	
		
			
				|  | @@ -2844,15 +2869,15 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  |          var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("a", "bar"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("a", "b"));
 | 
	
		
			
				|  |  |          var row = as(agg.child(), Row.class);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expected
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[emp_no{f}#11, bar{r}#4],[MAX(salary{f}#16) AS baz, gender{f}#13 AS bar]]
 | 
	
		
			
				|  |  | -     *   \_EsRelation[test][_meta_field{f}#17, emp_no{f}#11, first_name{f}#12, ..]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[emp_no{f}#14, gender{f}#16],[MAX(salary{f}#19) AS baz, gender{f}#16 AS bar]]
 | 
	
		
			
				|  |  | +     *   \_EsRelation[test][_meta_field{f}#20, emp_no{f}#14, first_name{f}#15, ..]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testMultipleRenameStatsDropGroupMultirow() {
 | 
	
		
			
				|  |  |          LogicalPlan plan = optimizedPlan("""
 | 
	
	
		
			
				|  | @@ -2863,7 +2888,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  |          var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("emp_no", "bar"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("emp_no", "gender"));
 | 
	
		
			
				|  |  |          var row = as(agg.child(), EsRelation.class);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2944,7 +2969,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * Expects
 | 
	
		
			
				|  |  |       * Limit[1000[INTEGER]]
 | 
	
		
			
				|  |  | -     * \_Aggregate[[x{r}#4],[SUM(salary{f}#13) AS sum(salary), salary{f}#13 AS x]]
 | 
	
		
			
				|  |  | +     * \_Aggregate[[salary{f}#13],[SUM(salary{f}#13) AS sum(salary), salary{f}#13 AS x]]
 | 
	
		
			
				|  |  |       *   \_EsRelation[test][_meta_field{f}#14, emp_no{f}#8, first_name{f}#9, ge..]
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public void testIsNotNullConstraintForStatsWithAndOnGroupingAlias() {
 | 
	
	
		
			
				|  | @@ -2956,7 +2981,7 @@ public class LogicalPlanOptimizerTests extends ESTestCase {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          var limit = as(plan, Limit.class);
 | 
	
		
			
				|  |  |          var agg = as(limit.child(), Aggregate.class);
 | 
	
		
			
				|  |  | -        assertThat(Expressions.names(agg.groupings()), contains("x"));
 | 
	
		
			
				|  |  | +        assertThat(Expressions.names(agg.groupings()), contains("salary"));
 | 
	
		
			
				|  |  |          assertThat(Expressions.names(agg.aggregates()), contains("sum(salary)", "x"));
 | 
	
		
			
				|  |  |          var from = as(agg.child(), EsRelation.class);
 | 
	
		
			
				|  |  |      }
 |