/* * 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.piggybank.test.evaluation; import java.util.Arrays; import org.apache.pig.data.BagFactory; import org.apache.pig.data.DataBag; import org.apache.pig.data.Tuple; import org.apache.pig.data.TupleFactory; import org.apache.pig.piggybank.evaluation.ExtremalTupleByNthField; import org.junit.Assert; import org.junit.Test; public class TestExtremalTupleByNthField { @Test public void testMin() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("3", "min"); DataBag input = BagFactory.getInstance().newDefaultBag(); for (int i = 100; i > 0; --i) { Tuple t = TupleFactory.getInstance().newTuple(); t.append(i); t.append(" " + i); t.append(i); input.add(t); } Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); Assert.assertEquals(" 1", (String) out.get(1)); } @Test public void testMax() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("4", "max"); DataBag input = BagFactory.getInstance().newDefaultBag(); for (int i = 0; i < 100; i++) { Tuple t = TupleFactory.getInstance().newTuple(); t.append(i); t.append(" " + i); t.append(i); t.append(i); input.add(t); } Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); Assert.assertEquals(" 99", (String) out.get(1)); } @Test public void testMaxComplexKey() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("3", "max"); DataBag input = BagFactory.getInstance().newDefaultBag(); for (int j = 0; j < 3; ++j) { for (int i = 0; i < 100; i++) { Tuple t = TupleFactory.getInstance().newTuple(); t.append(-i); t.append(" " + j + ", " + i); Tuple key = TupleFactory.getInstance().newTuple(); key.append(j); key.append(i); t.append(key); t.append(-i); input.add(t); } } Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); Assert.assertEquals(" 2, 99", (String) out.get(1)); } @Test public void testMinComplexKey() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("3", "min"); DataBag input = BagFactory.getInstance().newDefaultBag(); for (int j = 0; j < 3; ++j) { for (int i = 0; i < 100; i++) { Tuple t = TupleFactory.getInstance().newTuple(); t.append(-i); t.append(" " + j + ", " + i); Tuple key = TupleFactory.getInstance().newTuple(); key.append(j); key.append(i); t.append(key); t.append(-i); input.add(t); } } Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); Assert.assertEquals(" 0, 0", (String) out.get(1)); } @Test public void testMinStringey() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("4", "min"); DataBag input = BagFactory.getInstance().newDefaultBag(); Tuple t = TupleFactory.getInstance().newTuple(); t.append("a"); t.append("a"); t.append("a"); t.append("min"); input.add(t); t = TupleFactory.getInstance().newTuple(); t.append("b"); t.append("b"); t.append("b"); t.append("max"); input.add(t); Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); // ironically "max" is smaller than "min" Assert.assertEquals("b", (String) out.get(1)); } @Test public void testBiggerBag() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("1", "max"); DataBag input = BagFactory.getInstance().newDefaultBag(); DataBag dbSmaller = BagFactory.getInstance().newDefaultBag(); dbSmaller.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has three items"))); dbSmaller.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has three items"))); dbSmaller.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has three items"))); input.add(TupleFactory.getInstance().newTuple( Arrays.asList(dbSmaller, "smaller"))); DataBag dbBigger = BagFactory.getInstance().newDefaultBag(); dbBigger.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has four items"))); dbBigger.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has four items"))); dbBigger.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has four items"))); dbBigger.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has four items"))); dbBigger.add(TupleFactory.getInstance().newTuple( Arrays.asList("This bag has four items"))); input.add(TupleFactory.getInstance().newTuple( Arrays.asList(dbBigger, "bigger"))); Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); // DataBags are ordered by size, so the bigger one will be the one // containing 4 items Assert.assertEquals("bigger", out.get(1)); } @Test public void testBiggerTuple() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("1", "min"); DataBag input = BagFactory.getInstance().newDefaultBag(); Tuple tpSmaller = TupleFactory.getInstance().newTuple(); tpSmaller.append("This is a smaller tuple."); tpSmaller.append("This is a smaller tuple."); tpSmaller.append("This is a smaller tuple."); input.add(TupleFactory.getInstance().newTuple( Arrays.asList(tpSmaller, "smaller"))); Tuple tpBigger = TupleFactory.getInstance().newTuple(); tpBigger.append("This is a bigger tuple."); tpBigger.append("This is a bigger tuple."); tpBigger.append("This is a bigger tuple."); tpBigger.append("This is a bigger tuple."); input.add(TupleFactory.getInstance().newTuple( Arrays.asList(tpBigger, "bigger"))); Tuple tupleInput = TupleFactory.getInstance().newTuple(); tupleInput.append(input); Tuple out = o.exec(tupleInput); // DataBags are ordered by size, so the bigger one will be the one // containing 4 items Assert.assertEquals("smaller", out.get(1)); } @Test public void testMaxAccumulated() throws Exception { ExtremalTupleByNthField o = new ExtremalTupleByNthField("5", "max"); for (int j = 0; j < 5; ++j) { for (int i = 0; i < 100; i++) { Tuple t = TupleFactory.getInstance().newTuple(); t.append(i + j); t.append(" " + (i + j)); t.append(i + j); t.append(i + j); t.append(i + j); o.accumulate(t); } Tuple out = o.getValue(); Assert.assertEquals(" " + (99 + j), (String) out.get(1)); o.cleanup(); } } }