@@ -0,0 +1,2446 @@
+/*%0A * Licensed under the Apache License, Version 2.0 (the %22License%22);%0A * you may not use this file except in compliance with the License.%0A * You may obtain a copy of the License at%0A *%0A *     http://www.apache.org/licenses/LICENSE-2.0%0A *%0A * Unless required by applicable law or agreed to in writing, software%0A * distributed under the License is distributed on an %22AS IS%22 BASIS,%0A * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.%0A * See the License for the specific language governing permissions and%0A * limitations under the License.%0A */%0Apackage com.facebook.presto.sql.planner.iterative.rule;%0A%0Aimport com.facebook.presto.sql.planner.Symbol;%0Aimport com.facebook.presto.sql.planner.iterative.rule.test.BaseRuleTest;%0Aimport com.facebook.presto.sql.planner.plan.Assignments;%0Aimport com.google.common.collect.ImmutableMap;%0Aimport org.testng.annotations.Test;%0A%0Aimport static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.expression;%0Aimport static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.limit;%0Aimport static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.strictProject;%0Aimport static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.values;%0Aimport static com.facebook.presto.sql.tree.BooleanLiteral.TRUE_LITERAL;%0A%0Apublic class TestPushLimitThroughProject%0A        extends BaseRuleTest%0A%7B%0A    @Test%0A    public void testPushdownLimitNonIdentityProjection()%0A    %7B%0A        tester().assertThat(new PushLimitThroughProject())%0A                .on(p -%3E %7B%0A                    Symbol a = p.symbol(%22a%22);%0A                    return p.limit(1,%0A                            p.project(%0A                                    Assignments.of(a, TRUE_LITERAL),%0A                                    p.values()));%0A                %7D)%0A                .matches(%0A                        strictProject(%0A                                ImmutableMap.of(%22b%22, expression(%22true%22)),%0A                                limit(1, values())));%0A    %7D%0A%0A    @Test%0A    public void testDoesntPushdownLimitThroughIdentityProjection()%0A    %7B%0A        tester().assertThat(new PushLimitThroughProject())%0A                .on(p -%3E %7B%0A                    Symbol a = p.symbol(%22a%22);%0A                    return p.limit(1,%0A                            p.project(%0A                                    Assignments.of(a, a.toSymbolReference()),%0A                                    p.values(a)));%0A                %7D).doesNotFire();%0A    %7D%0A%7D%0A

Add PushLimitThoughProject tests