001/*
002 * Copyright (c) 2016-2017 Chris K Wensel <chris@wensel.net>. All Rights Reserved.
003 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
004 *
005 * Project and contact information: http://www.cascading.org/
006 *
007 * This file is part of the Cascading project.
008 *
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 *     http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 */
021
022package cascading.pipe.joiner;
023
024import java.beans.ConstructorProperties;
025import java.util.Iterator;
026
027import cascading.tuple.Fields;
028import cascading.tuple.Tuple;
029
030/**
031 * Class RightJoin will return an {@link Iterator} that will iterate over a given {@link Joiner} and return tuples that represent
032 * a left outer, right inner join of the CoGrouper internal grouped tuple collections.
033 * <p>
034 * Note only the farthest left tuple stream will be used as the outer join. All following joins to the right will
035 * be inner joins. See {@link MixedJoin} for more flexibility.
036 * <p>
037 * Joins perform based on the equality of the join keys. In the case of null values, Java treats two
038 * null values as equivalent. SQL does not treat null values as equal. To produce SQL like results in a given
039 * join, a new {@link java.util.Comparator} will need to be used on the joined values to prevent null from
040 * equaling null. As a convenience, see the {@link cascading.util.NullNotEquivalentComparator} class.
041 *
042 * @see MixedJoin
043 */
044public class RightJoin extends BaseJoiner
045  {
046  public RightJoin()
047    {
048    }
049
050  @ConstructorProperties({"fieldDeclaration"})
051  public RightJoin( Fields fieldDeclaration )
052    {
053    super( fieldDeclaration );
054    }
055
056  public Iterator<Tuple> getIterator( JoinerClosure closure )
057    {
058    return new JoinIterator( closure );
059    }
060
061  public int numJoins()
062    {
063    return -1;
064    }
065
066  public static class JoinIterator extends OuterJoin.JoinIterator
067    {
068    public JoinIterator( JoinerClosure closure )
069      {
070      super( closure );
071      }
072
073    @Override
074    protected boolean isOuter( int i )
075      {
076      return i == 0 && super.isOuter( i );
077      }
078    }
079  }