/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.pig.test; import java.util.List; import java.util.Properties; import org.junit.After; import org.junit.Test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pig.ExecType; import org.apache.pig.builtin.PigStorage; import org.apache.pig.impl.PigContext; import org.apache.pig.impl.plan.RequiredFields; import org.apache.pig.impl.logicalLayer.*; import org.apache.pig.impl.util.Pair; import org.apache.pig.test.utils.LogicalPlanTester; public class TestRequiredFields extends junit.framework.TestCase { private final Log log = LogFactory.getLog(getClass()); PigContext pc = new PigContext(ExecType.LOCAL, new Properties()); LogicalPlanTester planTester = new LogicalPlanTester(pc); @After @Override public void tearDown() throws Exception{ planTester.reset(); } private static final String simpleEchoStreamingCommand; static { if (System.getProperty("os.name").toUpperCase().startsWith("WINDOWS")) simpleEchoStreamingCommand = "perl -ne 'print \\\"$_\\\"'"; else simpleEchoStreamingCommand = "perl -ne 'print \"$_\"'"; } @Test public void testQueryForeach1() { String query = "foreach (load 'a') generate $1,$2;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load required fields is null LOLoad load = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadRequiredFields = load.getRequiredFields(); assertTrue(loadRequiredFields.size() == 1); RequiredFields requiredField = loadRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 2); } @Test public void testQueryForeach2() { String query = "foreach (load 'a' using " + PigStorage.class.getName() + "(':')) generate $1, 'aoeuaoeu' ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load required fields is null LOLoad load = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadRequiredFields = load.getRequiredFields(); assertTrue(loadRequiredFields.size() == 1); RequiredFields requiredField = loadRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryCogroup1() { String query = "foreach (cogroup (load 'a') by $1, (load 'b') by $1) generate org.apache.pig.builtin.AVG($1) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 2); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); requiredField = cogroupRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 1); //check that the foreach required fields contain [<0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryGroupAll() throws Exception { String query = "foreach (group (load 'a') ALL) generate $1 ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 1); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryGroup2() { String query = "foreach (group (load 'a') by $1) generate group, '1' ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 1); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); //check that the foreach required fields contain [<0, 0>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); } @Test public void testQueryCogroup2() { String query = "foreach (cogroup (load 'a') by ($1), (load 'b') by ($1)) generate $1.$1, $2.$1 ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 2); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); requiredField = cogroupRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 1); //check that the foreach required fields contain [<0, 1>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 2); } @Test public void testQueryGroup3() { String query = "foreach (group (load 'a') by ($6, $7)) generate flatten(group) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 1); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 6); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 7); //check that the foreach required fields contain [<0, 0>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); } @Test public void testQueryFilterNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("b = filter a by $1 == '3';"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check filter required fields LOFilter filter = (LOFilter)lp.getSuccessors(loada).get(0); List<RequiredFields> filterRequiredFields = filter.getRequiredFields(); assertTrue(filterRequiredFields.size() == 1); requiredField = filterRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQuerySplitNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("split a into b if $0 == '3', c if $1 == '3';"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOSplit split = (LOSplit)lp.getSuccessors(loada).get(0); List<RequiredFields> splitRequiredFields = split.getRequiredFields(); assertTrue(splitRequiredFields.size() == 1); requiredField = splitRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.getFields() == null); //check split outputs' required fields LOSplitOutput splitb = (LOSplitOutput)lp.getSuccessors(split).get(0); List<RequiredFields> splitbRequiredFields = splitb.getRequiredFields(); assertTrue(splitbRequiredFields.size() == 1); requiredField = splitbRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); LOSplitOutput splitc = (LOSplitOutput)lp.getSuccessors(split).get(1); List<RequiredFields> splitcRequiredFields = splitc.getRequiredFields(); assertTrue(splitcRequiredFields.size() == 1); requiredField = splitcRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryOrderByNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("b = order a by $1;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryLimitNoSchema() { planTester.buildPlan("a = load 'a';"); planTester.buildPlan("b = order a by $1;"); LogicalPlan lp = planTester.buildPlan("c = limit b 10;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); //check limit required fields LOLimit limit = (LOLimit)lp.getLeaves().get(0); List<RequiredFields> limitRequiredFields = limit.getRequiredFields(); assertTrue(limitRequiredFields.size() == 1); requiredField = limitRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryDistinctNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("b = distinct a;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check distinct required fields LODistinct distinct = (LODistinct)lp.getSuccessors(loada).get(0); List<RequiredFields> distinctRequiredFields = distinct.getRequiredFields(); assertTrue(distinctRequiredFields.size() == 1); requiredField = distinctRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQueryStreamingNoSchema() { String query = "stream (load 'a') through `" + simpleEchoStreamingCommand + "`;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check streaming required fields LOStream stream = (LOStream)lp.getSuccessors(loada).get(0); List<RequiredFields> streamRequiredFields = stream.getRequiredFields(); assertTrue(streamRequiredFields.size() == 1); requiredField = streamRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryStreamingNoSchema1() { String query = "stream (load 'a' as (url, hitCount)) through `" + simpleEchoStreamingCommand + "` ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check streaming required fields LOStream stream = (LOStream)lp.getSuccessors(loada).get(0); List<RequiredFields> streamRequiredFields = stream.getRequiredFields(); assertTrue(streamRequiredFields.size() == 1); requiredField = streamRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeach3() { String query = "foreach (load 'a') generate ($1 == '3'? $2 : $3) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 2>, <0,3>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 3); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 2); assertTrue(fields.get(2).first == 0); assertTrue(fields.get(2).second == 3); } @Test public void testQueryForeach4() { planTester.buildPlan("A = load 'a';"); planTester.buildPlan("B = load 'b';"); LogicalPlan lp = planTester.buildPlan("foreach (cogroup A by ($1), B by ($1)) generate A, flatten(B.($1, $2, $3));"); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 2); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); requiredField = cogroupRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 1); //check that the foreach required fields contain [<0, 1>, <0, 2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 2); } @Test public void testForeach5() { planTester.buildPlan("A = load 'a';"); planTester.buildPlan("B = load 'b';"); planTester.buildPlan("C = cogroup A by ($1), B by ($1);"); String query = "foreach C { " + "B = order B by $0; " + "generate FLATTEN(A), B.($1, $2, $3) ;" + "};" ; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 2); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); requiredField = cogroupRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 1); //check that the foreach required fields contain [<0, 1>, <0, 2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 2); } @Test public void testQueryCrossNoSchema(){ String query = "c = cross (load 'a'), (load 'b');"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cross required fields LOCross cross = (LOCross)lp.getSuccessors(loada).get(0); List<RequiredFields> crossRequiredFields = cross.getRequiredFields(); assertTrue(crossRequiredFields.size() == 2); requiredField = crossRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = crossRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryUnionNoSchema(){ String query = "c = union (load 'a'), (load 'b');"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check union required fields LOUnion union = (LOUnion)lp.getSuccessors(loada).get(0); List<RequiredFields> unionRequiredFields = union.getRequiredFields(); assertTrue(unionRequiredFields.size() == 2); requiredField = unionRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = unionRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryFRJoinNoSchema(){ String query = "c = join (load 'a') by $0, (load 'b') by $0 using \"replicated\";"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check frjoin required fields LOJoin frjoin = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> frjoinRequiredFields = frjoin.getRequiredFields(); assertTrue(frjoinRequiredFields.size() == 2); requiredField = frjoinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = frjoinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryJoinNoSchema(){ String query = "c = join (load 'a') by $0, (load 'b') by $0;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check join required fields LOJoin join = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> joinRequiredFields = join.getRequiredFields(); assertTrue(joinRequiredFields.size() == 2); requiredField = joinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = joinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryFilterWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); LogicalPlan lp = planTester.buildPlan("b = filter a by $1 == '3';"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check filter required fields LOFilter filter = (LOFilter)lp.getSuccessors(loada).get(0); List<RequiredFields> filterRequiredFields = filter.getRequiredFields(); assertTrue(filterRequiredFields.size() == 1); requiredField = filterRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQuerySplitWithSchema() { planTester.buildPlan("a = load 'a' as (url, hitCount);"); LogicalPlan lp = planTester.buildPlan("split a into b if url == '3', c if hitCount == '3';"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOSplit split = (LOSplit)lp.getSuccessors(loada).get(0); List<RequiredFields> splitRequiredFields = split.getRequiredFields(); assertTrue(splitRequiredFields.size() == 1); requiredField = splitRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.getFields() == null); //check split outputs' required fields LOSplitOutput splitb = (LOSplitOutput)lp.getSuccessors(split).get(0); List<RequiredFields> splitbRequiredFields = splitb.getRequiredFields(); assertTrue(splitbRequiredFields.size() == 1); requiredField = splitbRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); LOSplitOutput splitc = (LOSplitOutput)lp.getSuccessors(split).get(1); List<RequiredFields> splitcRequiredFields = splitc.getRequiredFields(); assertTrue(splitcRequiredFields.size() == 1); requiredField = splitcRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryOrderByWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); LogicalPlan lp = planTester.buildPlan("b = order a by $1;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryLimitWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); planTester.buildPlan("b = order a by $1;"); LogicalPlan lp = planTester.buildPlan("c = limit b 10;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); //check limit required fields LOLimit limit = (LOLimit)lp.getLeaves().get(0); List<RequiredFields> limitRequiredFields = limit.getRequiredFields(); assertTrue(limitRequiredFields.size() == 1); requiredField = limitRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryDistinctWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); LogicalPlan lp = planTester.buildPlan("b = distinct a;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check distinct required fields LODistinct distinct = (LODistinct)lp.getSuccessors(loada).get(0); List<RequiredFields> distinctRequiredFields = distinct.getRequiredFields(); assertTrue(distinctRequiredFields.size() == 1); requiredField = distinctRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQueryStreamingWithSchema() { String query = "stream (load 'a') through `" + simpleEchoStreamingCommand + "` as (x, y);"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check streaming required fields LOStream stream = (LOStream)lp.getSuccessors(loada).get(0); List<RequiredFields> streamRequiredFields = stream.getRequiredFields(); assertTrue(streamRequiredFields.size() == 1); requiredField = streamRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryStreamingWithSchema1() { String query = "stream (load 'a' as (url, hitCount)) through `" + simpleEchoStreamingCommand + "` as (x, y);"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check streaming required fields LOStream stream = (LOStream)lp.getSuccessors(loada).get(0); List<RequiredFields> streamRequiredFields = stream.getRequiredFields(); assertTrue(streamRequiredFields.size() == 1); requiredField = streamRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryImplicitJoinWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); planTester.buildPlan("b = load 'b' as (url,rank);"); planTester.buildPlan("c = cogroup a by url, b by url;"); LogicalPlan lp = planTester.buildPlan("d = foreach c generate group,flatten(a),flatten(b);"); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 2); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = cogroupRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); //check that the foreach required fields contain [<0, 0>, <0, 1>, <0, 2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); fields = requiredField.getFields(); assertTrue(fields.size() == 3); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); assertTrue(fields.get(2).first == 0); assertTrue(fields.get(2).second == 2); } @Test public void testQueryCrossWithSchema(){ String query = "c = cross (load 'a' as (url, hitcount)), (load 'b' as (url, rank));"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cross required fields LOCross cross = (LOCross)lp.getSuccessors(loada).get(0); List<RequiredFields> crossRequiredFields = cross.getRequiredFields(); assertTrue(crossRequiredFields.size() == 2); requiredField = crossRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = crossRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryUnionWithSchema(){ String query = "c = union (load 'a' as (url, hitcount)), (load 'b' as (url, rank));"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check union required fields LOUnion union = (LOUnion)lp.getSuccessors(loada).get(0); List<RequiredFields> unionRequiredFields = union.getRequiredFields(); assertTrue(unionRequiredFields.size() == 2); requiredField = unionRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = unionRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryFRJoinWithSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by $0, (load 'b' as (url, rank)) by $0 using \"replicated\";"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check frjoin required fields LOJoin frjoin = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> frjoinRequiredFields = frjoin.getRequiredFields(); assertTrue(frjoinRequiredFields.size() == 2); requiredField = frjoinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = frjoinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryJoinWithSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by $0, (load 'b' as (url, rank)) by $0;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check join required fields LOJoin join = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> joinRequiredFields = join.getRequiredFields(); assertTrue(joinRequiredFields.size() == 2); requiredField = joinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = joinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryCrossWithMixedSchema(){ String query = "c = cross (load 'a' as (url, hitcount)), (load 'b');"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cross required fields LOCross cross = (LOCross)lp.getSuccessors(loada).get(0); List<RequiredFields> crossRequiredFields = cross.getRequiredFields(); assertTrue(crossRequiredFields.size() == 2); requiredField = crossRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = crossRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryUnionWithMixedSchema(){ String query = "c = union (load 'a' as (url, hitcount)), (load 'b');"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check union required fields LOUnion union = (LOUnion)lp.getSuccessors(loada).get(0); List<RequiredFields> unionRequiredFields = union.getRequiredFields(); assertTrue(unionRequiredFields.size() == 2); requiredField = unionRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = unionRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryFRJoinWithMixedSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by $0, (load 'b') by $0 using \"replicated\";"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check frjoin required fields LOJoin frjoin = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> frjoinRequiredFields = frjoin.getRequiredFields(); assertTrue(frjoinRequiredFields.size() == 2); requiredField = frjoinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = frjoinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryJoinWithMixedSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by $0, (load 'b') by $0;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check join required fields LOJoin join = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> joinRequiredFields = join.getRequiredFields(); assertTrue(joinRequiredFields.size() == 2); requiredField = joinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); requiredField = joinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); } @Test public void testQueryFilterWithStarNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("b = filter a by COUNT(*) == 3;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check filter required fields LOFilter filter = (LOFilter)lp.getSuccessors(loada).get(0); List<RequiredFields> filterRequiredFields = filter.getRequiredFields(); assertTrue(filterRequiredFields.size() == 1); requiredField = filterRequiredFields.get(0); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQueryOrderByStarNoSchema() { planTester.buildPlan("a = load 'a';"); LogicalPlan lp = planTester.buildPlan("b = order a by *;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQueryGroupByStarNoSchema() throws Exception { String query = "foreach (group (load 'a') by *) generate $1 ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 1); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryFRJoinOnStarNoSchema(){ String query = "c = join (load 'a') by *, (load 'b') by * using \"replicated\";"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check frjoin required fields LOJoin frjoin = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> frjoinRequiredFields = frjoin.getRequiredFields(); assertTrue(frjoinRequiredFields.size() == 2); requiredField = frjoinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = frjoinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryJoinOnStarNoSchema(){ String query = "c = join (load 'a') by *, (load 'b') by *;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check join required fields LOJoin join = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> joinRequiredFields = join.getRequiredFields(); assertTrue(joinRequiredFields.size() == 2); requiredField = joinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); requiredField = joinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryFilterStarWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); LogicalPlan lp = planTester.buildPlan("b = filter a by COUNT(*) == 3;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check filter required fields LOFilter filter = (LOFilter)lp.getSuccessors(loada).get(0); List<RequiredFields> filterRequiredFields = filter.getRequiredFields(); assertTrue(filterRequiredFields.size() == 1); requiredField = filterRequiredFields.get(0); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQuerySplitWithStarSchema() { planTester.buildPlan("a = load 'a' as (url, hitCount);"); LogicalPlan lp = planTester.buildPlan("split a into b if url == '3', c if COUNT(*) == '3';"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOSplit split = (LOSplit)lp.getSuccessors(loada).get(0); List<RequiredFields> splitRequiredFields = split.getRequiredFields(); assertTrue(splitRequiredFields.size() == 1); requiredField = splitRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.getFields() == null); //check split outputs' required fields LOSplitOutput splitb = (LOSplitOutput)lp.getSuccessors(split).get(0); List<RequiredFields> splitbRequiredFields = splitb.getRequiredFields(); assertTrue(splitbRequiredFields.size() == 1); requiredField = splitbRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); LOSplitOutput splitc = (LOSplitOutput)lp.getSuccessors(split).get(1); List<RequiredFields> splitcRequiredFields = splitc.getRequiredFields(); assertTrue(splitcRequiredFields.size() == 1); requiredField = splitcRequiredFields.get(0); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.getFields() == null); } @Test public void testQueryOrderByStarWithSchema() { planTester.buildPlan("a = load 'a' as (url,hitCount);"); LogicalPlan lp = planTester.buildPlan("b = order a by *;"); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check order by required fields LOSort sort = (LOSort)lp.getSuccessors(loada).get(0); List<RequiredFields> sortRequiredFields = sort.getRequiredFields(); assertTrue(sortRequiredFields.size() == 1); requiredField = sortRequiredFields.get(0); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.needNoFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); } @Test public void testQueryGroupByStarWithSchema() throws Exception { String query = "foreach (group (load 'a' as (url, hitCount)) by *) generate $1 ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check cogroup required fields LOCogroup cogroup = (LOCogroup)lp.getSuccessors(loada).get(0); List<RequiredFields> cogroupRequiredFields = cogroup.getRequiredFields(); assertTrue(cogroupRequiredFields.size() == 1); requiredField = cogroupRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); //check that the foreach required fields contain [<0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 1); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 1); } @Test public void testQueryFRJoinOnStarWithSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by *, (load 'b' as (url, rank)) by * using \"replicated\";"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check frjoin required fields LOJoin frjoin = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> frjoinRequiredFields = frjoin.getRequiredFields(); assertTrue(frjoinRequiredFields.size() == 2); requiredField = frjoinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); requiredField = frjoinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 1); assertTrue(fields.get(1).second == 1); } @Test public void testQueryJoinOnStarWithSchema(){ String query = "c = join (load 'a' as (url, hitcount)) by *, (load 'b' as (url, rank)) by *;"; LogicalPlan lp = planTester.buildPlan(query); //check that the loads' required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); LOLoad loadb = (LOLoad) lp.getRoots().get(1); List<RequiredFields> loadbRequiredFields = loadb.getRequiredFields(); assertTrue(loadbRequiredFields.size() == 1); requiredField = loadbRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check join required fields LOJoin join = (LOJoin)lp.getSuccessors(loada).get(0); List<RequiredFields> joinRequiredFields = join.getRequiredFields(); assertTrue(joinRequiredFields.size() == 2); requiredField = joinRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); requiredField = joinRequiredFields.get(1); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 1); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 1); assertTrue(fields.get(1).second == 1); } @Test public void testQueryForeachGenerateStarNoSchema() { String query = "foreach (load 'a') generate * ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 3>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateCountStarNoSchema() { String query = "foreach (load 'a') generate COUNT(*) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 3>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateStarNoSchema1() { String query = "foreach (load 'a') generate *, COUNT(*) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 3>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateStarNoSchema2() { String query = "foreach (load 'a') generate *, $0 ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 3>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateStarWithSchema() { String query = "foreach (load 'a' as (url, hitCount)) generate * ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 1>, <0, 3>, <0,2>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); } @Test public void testQueryForeachGenerateCountStarWithSchema() { String query = "foreach (load 'a' as (url, hitCount)) generate COUNT(*) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check the foreach required fields LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateStarWithSchema1() { String query = "foreach (load 'a' as (url, hitCount)) generate *, COUNT(*) ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check the foreach required fields LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == true); assertTrue(requiredField.getFields() == null); } @Test public void testQueryForeachGenerateStarWithSchema2() { String query = "foreach (load 'a' as (url, hitCount)) generate *, url ;"; LogicalPlan lp = planTester.buildPlan(query); //check that the load's required fields is null LOLoad loada = (LOLoad) lp.getRoots().get(0); List<RequiredFields> loadaRequiredFields = loada.getRequiredFields(); assertTrue(loadaRequiredFields.size() == 1); RequiredFields requiredField = loadaRequiredFields.get(0); assertTrue(requiredField.needNoFields() == true); assertTrue(requiredField.needAllFields() == false); assertTrue(requiredField.getFields() == null); //check that the foreach required fields contain [<0, 0>, <0, 1>] LOForEach foreach = (LOForEach)lp.getLeaves().get(0); List<RequiredFields> foreachRequiredFields = foreach.getRequiredFields(); assertTrue(foreachRequiredFields.size() == 1); requiredField = foreachRequiredFields.get(0); assertTrue(requiredField.needNoFields() == false); assertTrue(requiredField.needAllFields() == false); List<Pair<Integer, Integer>> fields = requiredField.getFields(); assertTrue(fields.size() == 2); assertTrue(fields.get(0).first == 0); assertTrue(fields.get(0).second == 0); assertTrue(fields.get(1).first == 0); assertTrue(fields.get(1).second == 1); } }