package com.mongodb.hadoop.pig; 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.bson.BasicBSONObject; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /* * Unit tests for JSONPigReplace */ public class JSONPigReplaceTest { private static TupleFactory tupleFactory; private static BagFactory bagFactory; @Before public void setUp() throws Exception { tupleFactory = TupleFactory.getInstance(); bagFactory = BagFactory.getInstance(); } @Test public void testNonNestedReplace() throws Exception { // create tuple ("Daniel", "Alabi") // with schema 'first:chararray, last:chararray' Tuple t = tupleFactory.newTuple(2); t.set(0, "Daniel"); t.set(1, "Alabi"); JSONPigReplace j = new JSONPigReplace(new String[]{"{first: '$first', last: '$last'}"}); BasicBSONObject[] bs = j.substitute(t, "first:chararray, last:chararray", null); assertNotNull(bs); assertTrue(bs.length == 1); // should produce BSONObject // {first:"Daniel", last:"Alabi"} BasicBSONObject res = bs[0]; assertEquals(res.get("first"), "Daniel"); assertEquals(res.get("last"), "Alabi"); } @Test public void testNamedArrayReplace() throws Exception { // create tuple ({("a"), ("b"), ("c")}) // with schema 'cars:{f:(t:chararray)}' DataBag b = bagFactory.newDefaultBag(); b.add(tupleFactory.newTuple("a")); b.add(tupleFactory.newTuple("b")); b.add(tupleFactory.newTuple("c")); JSONPigReplace j = new JSONPigReplace( new String[]{ "{days : [1,2,3], age : 19, cars : '$cars'}" } ); BasicBSONObject[] bs = j.substitute(tupleFactory.newTuple(b), "cars : {f:(t:chararray)}", null); assertNotNull(bs); assertTrue(bs.length == 1); // should produce BSONObject // { "days" : [ 1 , 2 , 3] , "age" : 19 , "cars" : [ { "t" : "a"} , { "t" : "b"} , { "t" : "c"}]} BasicBSONObject res = bs[0]; ArrayList cars = (ArrayList) res.get("cars"); assertEquals(cars.size(), 3); Object o = cars.get(0); assertEquals(((Map) o).get("t"), "a"); } @Test public void testUnnamedArrayReplace() throws Exception { // create tuple ({("a"), ("b"), ("c")}) // with schema 'cars:{f:(t:chararray)}' DataBag b = bagFactory.newDefaultBag(); b.add(tupleFactory.newTuple("a")); b.add(tupleFactory.newTuple("b")); b.add(tupleFactory.newTuple("c")); JSONPigReplace j = new JSONPigReplace( new String[]{ "{days : [1,2,3], age : 19, cars : '$cars'}" } ); BasicBSONObject[] bs = j.substitute(tupleFactory.newTuple(b), "cars : {f:(t:chararray)}", "t"); assertNotNull(bs); assertTrue(bs.length == 1); // should produce // { "name" : "Daniel" , "age" : 19 , "property" : { "cars" : [ "a" , "b" , "c"]} , "school" : "Carleton College"} BasicBSONObject res = bs[0]; ArrayList cars = (ArrayList) res.get("cars"); assertEquals(cars.size(), 3); assertEquals(cars.get(0), "a"); } @Test public void testSimpleNestedReplace() throws Exception { // create tuple ({("Daniel", "Alabi")}, "Carleton College") // with schema 'b:{t:(f:chararray,l:chararray)}, s:chararray' Tuple t1 = tupleFactory.newTuple(2); t1.set(0, "Daniel"); t1.set(1, "Alabi"); DataBag b = bagFactory.newDefaultBag(); b.add(t1); Tuple t = tupleFactory.newTuple(2); t.set(0, b); t.set(1, "Carleton College"); JSONPigReplace j = new JSONPigReplace( new String[]{ "{first:'$f', last:'$l', school:'$s'}" } ); BasicBSONObject[] bs = j.substitute(t, "b:{t:(f:chararray,l:chararray)}, s:chararray", null); assertNotNull(bs); assertTrue(bs.length == 1); // should produce // { "first" : "Daniel" , "last" : "Alabi" , "school" : "Carleton College"} BasicBSONObject res = bs[0]; assertEquals(res.get("first"), "Daniel"); assertEquals(res.get("last"), "Alabi"); assertEquals(res.get("school"), "Carleton College"); } @Test public void testSimpleMultipleReplace() throws Exception { // create tuple ({("Daniel", "Alabi")}, "Carleton College") // with schema 'b:{b:(f:chararray,l:chararray)}, s:chararray' Tuple t1 = tupleFactory.newTuple(2); t1.set(0, "Daniel"); t1.set(1, "Alabi"); DataBag b = bagFactory.newDefaultBag(); b.add(t1); Tuple t = tupleFactory.newTuple(2); t.set(0, b); t.set(1, "Carleton College"); JSONPigReplace j = new JSONPigReplace( new String[]{ "{first:'$f', last:'$l', school:'$s'}", "{$push : {schools: '$s'}}" } ); BasicBSONObject[] bs = j.substitute(t, "b:{t:(f:chararray,l:chararray)}, s:chararray", null); assertNotNull(bs); assertTrue(bs.length == 2); // should produce // { "first" : "Daniel" , "last" : "Alabi" , "school" : "Carleton College"} // and // { "$push" : { "schools" : "Carleton College"}} BasicBSONObject res1 = bs[0]; BasicBSONObject res2 = bs[1]; assertEquals(res1.get("first"), "Daniel"); assertEquals(res1.get("last"), "Alabi"); assertEquals(((BasicBSONObject) res2.get("$push")).get("schools"), "Carleton College"); } @Test public void testSampleQueryUpdateReplace() throws Exception { // create tuple ("Daniel", "Alabi", 19, {("a"), ("b"), ("c")}) // with schema 'f:chararray,l:chararray,age:int,cars:{t:(t:chararray)}' DataBag b = bagFactory.newDefaultBag(); b.add(tupleFactory.newTuple("a")); b.add(tupleFactory.newTuple("b")); b.add(tupleFactory.newTuple("c")); Tuple t = tupleFactory.newTuple(4); t.set(0, "Daniel"); t.set(1, "Alabi"); t.set(2, 19); t.set(3, b); JSONPigReplace j = new JSONPigReplace(new String[]{"{first:'$f', last:'$l'}", "{$set: {age: '$age'}, $pushAll : {cars: '$cars'}}"}); BasicBSONObject[] bs = j.substitute(t, "f:chararray,l:chararray,age:int,cars:{t:(t:chararray)}", "t"); assertTrue(bs.length == 2); // should produce // { "first" : "Daniel" , "last" : "Alabi"} // { "$set" : { "age" : 19} , "$pushAll" : { "cars" : [ "a" , "b" , "c"]}} BasicBSONObject res1 = bs[0]; BasicBSONObject res2 = bs[1]; assertEquals(res1.get("first"), "Daniel"); assertEquals(((BasicBSONObject) res2.get("$set")).get("age"), 19); } }