/* * 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.pipe.cogroup; import java.util.Arrays; import java.util.Iterator; import cascading.tuple.Tuple; /** * Class MixedJoin will return an {@link java.util.Iterator} that will iterate over a given * {@link Joiner} and return tuples that represent a join as defined by the given boolean array. * <p/> * So if joining three streams, {@code boolean []{true,false,false}} will result in a 'inner', 'outer', 'outer' join. */ public class MixedJoin implements Joiner { /** Field INNER */ public static boolean INNER = true; /** Field OUTER */ public static boolean OUTER = false; boolean asInner[]; /** * Constructor MixedJoin creates a new MixedJoin instance. * * @param asInner of type boolean[] */ public MixedJoin( boolean[] asInner ) { this.asInner = Arrays.copyOf( asInner, asInner.length ); } /** @see Joiner#numJoins() */ public int numJoins() { return asInner.length - 1; } public Iterator<Tuple> getIterator( GroupClosure closure ) { return new JoinIterator( closure ); } protected class JoinIterator extends OuterJoin.JoinIterator { public JoinIterator( GroupClosure closure ) { super( closure ); } @Override protected boolean isOuter( int i ) { return !asInner[ i ] && super.isOuter( i ); } } }