private TupleBuilder makeJoinedBuilder( final Fields[] joinFields ) { final Fields[] fields = isSelfJoin() ? new Fields[ size() ] : joinFields; if( isSelfJoin() ) Arrays.fill( fields, 0, fields.length, joinFields[ 0 ] ); return new TupleBuilder() { Tuple result = TupleViews.createComposite( fields ); @Override public Tuple makeResult( Tuple[] tuples ) { return TupleViews.reset( result, tuples ); } }; } }
public MemoryCoGroupClosure( FlowProcess flowProcess, int numSelfJoins, Fields[] groupingFields, Fields[] valueFields ) { super( flowProcess, groupingFields, valueFields ); this.numSelfJoins = numSelfJoins; this.emptyTuple = Tuple.size( groupingFields[ 0 ].size() ); this.joinedTuplesArray = new Tuple[ size() ]; this.joinedBuilder = makeJoinedBuilder( groupingFields ); }
private void push( Collection<Tuple>[] collections, Tuple keysTuple ) { closure.reset( collections ); keyEntry.setTuple( closure.getGroupTuple( keysTuple ) ); // create Closure type here tupleEntryIterator.reset( splice.getJoiner().getIterator( closure ) ); next.receive( this, 0, grouping ); } }
private void performJoinWith( Tuple keyTuple ) { // never replace the first array, pos == 0 for( int i = 1; i < keyValues.length; i++ ) { // if key does not exist, #get will create an empty array list, // and store the key, which is not a copy if( keyValues[ i ].containsKey( keyTuple ) ) collections[ i ] = keyValues[ i ].get( keyTuple ); else collections[ i ] = Collections.EMPTY_LIST; } closure.reset( collections ); keyEntry.setTuple( keyTuple ); tupleEntryIterator.reset( splice.getJoiner().getIterator( closure ) ); next.receive( this, 0, grouping ); }
@Override public void prepare() { super.prepare(); keyValues = createKeyValuesArray(); closure = new MemoryCoGroupClosure( flowProcess, splice.getNumSelfJoins(), keyFields, valuesFields ); if( grouping != null && splice.getJoinDeclaredFields() != null && splice.getJoinDeclaredFields().isNone() ) grouping.joinerClosure = closure; }