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 }