/*
* Copyright (c) 2007-2010 Concurrent, Inc. All Rights Reserved.
*
* Project and contact information: http://www.cascading.org/
*
* This file is part of the Cascading project.
*
* Cascading is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Cascading is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Cascading. If not, see <http://www.gnu.org/licenses/>.
*/
package cascading.tuple;
import cascading.CascadingTestCase;
public class FieldsTest extends CascadingTestCase
{
public FieldsTest()
{
super( "field tests" );
}
@Override
protected void setUp() throws Exception
{
super.setUp();
}
public void testDuplicate()
{
try
{
new Fields( 0, 0 );
fail( "accepted dupe field names" );
}
catch( Exception exception )
{
// do nothing
}
try
{
new Fields( "foo", "foo" );
fail( "accepted dupe field names" );
}
catch( Exception exception )
{
// do nothing
}
}
public void testAppend()
{
Fields fieldA = new Fields( 0, 1 );
Fields fieldB = new Fields( 0 );
Fields appended = fieldA.append( fieldB );
assertEquals( "not equal: ", 3, appended.size() );
assertEquals( "not equal: ", 0, appended.get( 0 ) );
assertEquals( "not equal: ", 1, appended.get( 1 ) );
assertEquals( "not equal: ", 2, appended.get( 2 ) );
}
public void testAppend2()
{
Fields fieldA = new Fields( 0, 1 );
Fields fieldB = new Fields( 2 );
Fields appended = fieldA.append( fieldB );
assertEquals( "not equal: ", 3, appended.size() );
assertEquals( "not equal: ", 0, appended.get( 0 ) );
assertEquals( "not equal: ", 1, appended.get( 1 ) );
assertEquals( "not equal: ", 2, appended.get( 2 ) );
}
public void testAppendNamed()
{
Fields fieldA = new Fields( 0, 1 );
Fields fieldB = new Fields( "a" );
Fields appended = fieldA.append( fieldB );
assertEquals( "not equal: ", 3, appended.size() );
assertEquals( "not equal: ", 0, appended.get( 0 ) );
assertEquals( "not equal: ", 1, appended.get( 1 ) );
assertEquals( "not equal: ", "a", appended.get( 2 ) );
}
public void testAppendNamed2()
{
Fields fieldA = new Fields( "a" );
Fields fieldB = new Fields( 0, 1 );
Fields appended = fieldA.append( fieldB );
assertEquals( "not equal: ", 3, appended.size() );
assertEquals( "not equal: ", "a", appended.get( 0 ) );
assertEquals( "not equal: ", 1, appended.get( 1 ) );
assertEquals( "not equal: ", 2, appended.get( 2 ) );
}
public void testRename()
{
Fields fields = new Fields( "a", "b", "c", "d" );
Fields from = new Fields( "a", "b" );
Fields to = new Fields( "A", "B" );
Fields renamed = fields.rename( from, to );
assertEquals( "not equal: ", 4, renamed.size() );
assertEquals( "not equal: ", "A", renamed.get( 0 ) );
assertEquals( "not equal: ", "B", renamed.get( 1 ) );
assertEquals( "not equal: ", "c", renamed.get( 2 ) );
assertEquals( "not equal: ", "d", renamed.get( 3 ) );
}
public void testRename2()
{
Fields fields = new Fields( "a", "b", "c", "d" );
Fields from = new Fields( 0, 1 );
Fields to = new Fields( "A", "B" );
Fields renamed = fields.rename( from, to );
assertEquals( "not equal: ", 4, renamed.size() );
assertEquals( "not equal: ", "A", renamed.get( 0 ) );
assertEquals( "not equal: ", "B", renamed.get( 1 ) );
assertEquals( "not equal: ", "c", renamed.get( 2 ) );
assertEquals( "not equal: ", "d", renamed.get( 3 ) );
}
public void testRename3()
{
Fields fields = new Fields( "a", "b", "c", "d" );
Fields from = new Fields( "a", "b" );
Fields to = new Fields( 0, 1 );
Fields renamed = fields.rename( from, to );
assertTrue( "not isOrdered", renamed.isOrdered() );
assertEquals( "not equal: ", 4, renamed.size() );
assertEquals( "not equal: ", 0, renamed.get( 0 ) );
assertEquals( "not equal: ", 1, renamed.get( 1 ) );
assertEquals( "not equal: ", "c", renamed.get( 2 ) );
assertEquals( "not equal: ", "d", renamed.get( 3 ) );
}
public void testRename4()
{
Fields fields = new Fields( "a", "b", "c", "d" );
Fields from = new Fields( "a", "b" );
Fields to = new Fields( 3, 4 );
Fields renamed = fields.rename( from, to );
assertTrue( "isOrdered", !renamed.isOrdered() );
assertEquals( "not equal: ", 4, renamed.size() );
assertEquals( "not equal: ", 3, renamed.get( 0 ) );
assertEquals( "not equal: ", 4, renamed.get( 1 ) );
assertEquals( "not equal: ", "c", renamed.get( 2 ) );
assertEquals( "not equal: ", "d", renamed.get( 3 ) );
}
public void testDiff()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( "a" );
Fields diff = fieldA.subtract( fieldB );
assertEquals( "not equal: ", 1, diff.size() );
assertEquals( "not equal: ", "b", diff.get( 0 ) );
}
// public void testDiffDupe()
// {
// Fields fieldA = new Fields( "a", "b" );
// Fields fieldB = new Fields( "a", "a" );
//
// Fields diff = fieldA.minus( fieldB );
//
// assertEquals( "not equal: ", 1, diff.size() );
// assertEquals( "not equal: ", "b", diff.get( 0 ) );
// }
public void testDiffSame()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( "b", "a" );
Fields diff = fieldA.subtract( fieldB );
assertEquals( "not equal: ", 0, diff.size() );
}
public void testDiffIndex()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( 0 );
Fields diff = fieldA.subtract( fieldB );
assertEquals( "not equal: ", 1, diff.size() );
assertEquals( "not equal: ", "b", diff.get( 0 ) );
}
public void testDiffIndex2()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( 1 );
Fields diff = fieldA.subtract( fieldB );
assertEquals( "not equal: ", 1, diff.size() );
assertEquals( "not equal: ", "a", diff.get( 0 ) );
}
public void testDiff3()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( 0, 4 );
try
{
Fields diff = fieldA.subtract( fieldB );
fail( "did not throw exception" );
}
catch( Exception exception )
{
// ignore
}
}
/**
* step -> step -> step
* dec(sel) -> dec(sel)
* a,b -> c,d -> d,f -> d,f,g
* <p/>
* the result of a select is always a field declaration
*/
public void testSelect()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( "a", "b" );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
}
public void testSelect2()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( "b", "a" );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
assertEquals( "not equal: ", "a", got.get( 1 ) );
}
public void testSelectPos()
{
Fields declarationA = new Fields( 0, 1 );
Fields selectA = new Fields( 0, 1 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", 0, got.get( 0 ) );
assertEquals( "not equal: ", 1, got.get( 1 ) );
}
/**
* this test is reverted from original. we don't want to do the following comment
* ~~this one is funky. regardless of the input, positions are always monotonically increasing~~
*/
public void testSelectPos2()
{
Fields declarationA = new Fields( 0, 1 );
Fields selectA = new Fields( 1, 0 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", 1, got.get( 0 ) );
assertEquals( "not equal: ", 0, got.get( 1 ) );
}
public void testSelectMixed()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( 0, 1 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
}
public void testSelectMixed2()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( 1, 0 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
assertEquals( "not equal: ", "a", got.get( 1 ) );
}
public void testSelectMixed3()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields selectA = new Fields( 1, 0, 2, 3 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 4, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
assertEquals( "not equal: ", "a", got.get( 1 ) );
assertEquals( "not equal: ", 2, got.get( 2 ) );
assertEquals( "not equal: ", 3, got.get( 3 ) );
}
public void testSelectMixed4()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields selectA = new Fields( 2, 3, "a", "b" );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 4, got.size() );
assertEquals( "not equal: ", 2, got.get( 0 ) );
assertEquals( "not equal: ", 3, got.get( 1 ) );
assertEquals( "not equal: ", "a", got.get( 2 ) );
assertEquals( "not equal: ", "b", got.get( 3 ) );
}
public void testSelectMixedNeg()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( -2, -1 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
}
public void testSelectMixedNeg2()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = new Fields( -1, -2 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
assertEquals( "not equal: ", "a", got.get( 1 ) );
}
public void testSelectMixedNeg3()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields selectA = new Fields( 1, 0, -2, -1 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 4, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
assertEquals( "not equal: ", "a", got.get( 1 ) );
assertEquals( "not equal: ", 2, got.get( 2 ) );
assertEquals( "not equal: ", 3, got.get( 3 ) );
}
public void testSelectMixedNeg4()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields selectA = new Fields( -2, -1, "a", "b" );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 4, got.size() );
assertEquals( "not equal: ", 2, got.get( 0 ) );
assertEquals( "not equal: ", 3, got.get( 1 ) );
assertEquals( "not equal: ", "a", got.get( 2 ) );
assertEquals( "not equal: ", "b", got.get( 3 ) );
}
public void testSelectMixedNeg5()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields selectA = new Fields( -4, -3, -2, -1 );
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 4, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
assertEquals( "not equal: ", 2, got.get( 2 ) );
assertEquals( "not equal: ", 3, got.get( 3 ) );
}
public void testResolveIndexOnly()
{
Fields declarationA = new Fields( 0, 1 );
Fields declarationB = new Fields( 0, 1 );
Fields selectA = new Fields( 0 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", 0, got.get( 0 ) );
}
public void testResolveIndexOnly2()
{
Fields declarationA = new Fields( 0, 1 );
Fields declarationB = new Fields( 0, 1 );
Fields selectA = new Fields( 1 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", 1, got.get( 0 ) );
}
public void testResolveIndexOnly3()
{
Fields declarationA = new Fields( 0, 1 );
Fields declarationB = new Fields( 0, 1 );
Fields selectA = new Fields( 2 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", 2, got.get( 0 ) );
}
public void testResolveIndexOnly4()
{
Fields declarationA = new Fields( 0, 1 );
Fields declarationB = new Fields( 0, 1 );
Fields selectA = new Fields( 3 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", 3, got.get( 0 ) );
}
public void testResolveIndexAppended()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( 0 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
}
public void testResolveIndexAppended2()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( 1 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
}
public void testResolveIndexAppended3()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( 2 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "c", got.get( 0 ) );
}
public void testResolveIndexAppended4()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( 3 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "d", got.get( 0 ) );
}
public void testResolveAppended()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( "a" );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
}
public void testResolveAppended2()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( "b" );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "b", got.get( 0 ) );
}
public void testResolveAppended3()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( "c" );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "c", got.get( 0 ) );
}
public void testResolveAppended4()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( "d" );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 1, got.size() );
assertEquals( "not equal: ", "d", got.get( 0 ) );
}
public void testResolveAppended5()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = new Fields( "c", "d" );
Fields selectA = new Fields( "a", "d" );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "d", got.get( 1 ) );
}
public void testResolveAppendedComplex()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields declarationB = new Fields( "c", "d", 2, 3 );
Fields selectA = new Fields( -4, -3, -2, -1, 0, 1, 2, 3 );
Fields got = Fields.resolve( selectA, declarationA, declarationB );
assertEquals( "not equal: ", 8, got.size() );
assertEquals( "not equal: ", "c", got.get( 0 ) );
assertEquals( "not equal: ", "d", got.get( 1 ) );
assertEquals( "not equal: ", -2, got.get( 2 ) );
assertEquals( "not equal: ", -1, got.get( 3 ) );
assertEquals( "not equal: ", "a", got.get( 4 ) );
assertEquals( "not equal: ", "b", got.get( 5 ) );
assertEquals( "not equal: ", 2, got.get( 6 ) );
assertEquals( "not equal: ", 3, got.get( 7 ) );
}
public void testResolveAppendedFail()
{
Fields declarationA = new Fields( "a", "b", 2, 3 );
Fields declarationB = new Fields( "c", "d", 2, 3 );
Fields selectA = new Fields( -4, -3, "a", -1, 0, 1, 2, 3 );
try
{
Fields.resolve( selectA, declarationA, declarationB );
fail( "did not throw exception" );
}
catch( Exception exception )
{
}
}
/** This must fail, no way the dec is a declaration */
public void testSelectFail()
{
Fields declarationA = new Fields( 2, "a", "b", 3 );
Fields selectA = new Fields( 2, 3, "a", "b" );
try
{
declarationA.select( selectA );
fail( "did not catch invalid field" );
}
catch( Exception exception )
{
// ignore
}
}
public void testSelectWildcard()
{
Fields declarationA = new Fields( "a", "b" );
Fields selectA = Fields.ALL;
Fields got = declarationA.select( selectA );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
}
public void testSelectComplex()
{
Fields declarationA = new Fields( "movie", "name1", "movie1", "rate1", "name2", "movie2", "rate2" );
Fields selectA = new Fields( "movie", "name1", "rate1", "name2", "rate2" );
int[] got = declarationA.getPos( selectA );
assertEquals( "not equal: ", 5, got.length );
assertEquals( "not equal: ", 0, got[ 0 ] );
assertEquals( "not equal: ", 1, got[ 1 ] );
assertEquals( "not equal: ", 3, got[ 2 ] );
assertEquals( "not equal: ", 4, got[ 3 ] );
assertEquals( "not equal: ", 6, got[ 4 ] );
}
public void testUnknown()
{
Fields declarationA = new Fields( "a", "b" );
Fields declarationB = Fields.UNKNOWN;
doTestUnknown( declarationA, declarationB );
doTestUnknown( declarationB, declarationA );
}
private void doTestUnknown( Fields declarationA, Fields declarationB )
{
Fields got = declarationA.append( declarationB );
assertEquals( "not equal: ", 2, got.size() );
assertEquals( "not equal: ", "a", got.get( 0 ) );
assertEquals( "not equal: ", "b", got.get( 1 ) );
assertEquals( "not equal: ", 0, got.getPos( new Fields( "a" ) )[ 0 ] );
assertEquals( "not equal: ", 1, got.getPos( new Fields( "b" ) )[ 0 ] );
assertEquals( "not equal: ", 3, got.getPos( new Fields( 3 ) )[ 0 ] );
try
{
got.getPos( new Fields( "c" ) );
fail( "did not throw failure" );
}
catch( Exception exception )
{
// ignore
}
}
public void testSelectNegative()
{
Fields declarationA = new Fields( "movie", "name1", "movie1", "rate1", "name2", "movie2", "rate2" );
Fields selectA = new Fields( -1 );
int[] got = declarationA.getPos( selectA );
assertEquals( "not equal: ", 1, got.length );
assertEquals( "not equal: ", 6, got[ 0 ] );
Fields selectB = new Fields( -8 );
try
{
got = declarationA.getPos( selectB );
fail( "did not throw failure" );
}
catch( Exception exception )
{
// ignore
}
}
public void testJoin()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( "c", "d" );
Fields join = Fields.join( fieldA, fieldB );
assertEquals( "not equal: ", 4, join.size() );
assertEquals( "not equal: ", "a", join.get( 0 ) );
assertEquals( "not equal: ", "b", join.get( 1 ) );
assertEquals( "not equal: ", "c", join.get( 2 ) );
assertEquals( "not equal: ", "d", join.get( 3 ) );
}
public void testNestedFieldsFail()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( "c", "d" );
try
{
new Fields( fieldA, fieldB );
fail( "did not throw exception" );
}
catch( IllegalArgumentException exception )
{
// ignore
}
}
public void testNullFieldsFail()
{
try
{
new Fields( "foo", 1, null );
fail( "did not throw exception" );
}
catch( IllegalArgumentException exception )
{
// ignore
}
}
public void testMergeFields()
{
Fields fieldA = new Fields( "a", "b" );
Fields fieldB = new Fields( "c", "d" );
Fields join = Fields.merge( fieldA, fieldB );
assertEquals( "not equal: ", 4, join.size() );
assertEquals( "not equal: ", "a", join.get( 0 ) );
assertEquals( "not equal: ", "b", join.get( 1 ) );
assertEquals( "not equal: ", "c", join.get( 2 ) );
assertEquals( "not equal: ", "d", join.get( 3 ) );
fieldA = new Fields( "a", "b" );
fieldB = new Fields( "a", "d" );
join = Fields.merge( fieldA, fieldB );
assertEquals( "not equal: ", 3, join.size() );
assertEquals( "not equal: ", "a", join.get( 0 ) );
assertEquals( "not equal: ", "b", join.get( 1 ) );
assertEquals( "not equal: ", "d", join.get( 2 ) );
fieldA = Fields.size( 2 );
fieldB = new Fields( "a", "d" );
join = Fields.merge( fieldA, fieldB );
assertEquals( "not equal: ", 4, join.size() );
assertEquals( "not equal: ", 0, join.get( 0 ) );
assertEquals( "not equal: ", 1, join.get( 1 ) );
assertEquals( "not equal: ", "a", join.get( 2 ) );
assertEquals( "not equal: ", "d", join.get( 3 ) );
}
}