    001/*
    002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
    003 *
    004 * Project and contact information: http://www.cascading.org/
    005 *
    006 * This file is part of the Cascading project.
    007 *
    008 * Licensed under the Apache License, Version 2.0 (the "License");
    009 * you may not use this file except in compliance with the License.
    010 * You may obtain a copy of the License at
    011 *
    012 *     http://www.apache.org/licenses/LICENSE-2.0
    013 *
    014 * Unless required by applicable law or agreed to in writing, software
    015 * distributed under the License is distributed on an "AS IS" BASIS,
    016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    017 * See the License for the specific language governing permissions and
    018 * limitations under the License.
    019 */
    020
    021package cascading.tuple.io;
    022
    023import java.util.Arrays;
    024import java.util.List;
    025
    026import cascading.tuple.Tuple;
    027import cascading.tuple.util.Resettable2;
    028
    029/**
    030 * Class TuplePair is a utility class that is optimized to hold two Tuple instances for sorting and hashing of each
    031 * part independently.
    032 */
    033public class TuplePair extends Tuple implements Resettable2<Tuple, Tuple>
    034  {
    035  /** Field tuples */
    036  private final Tuple[] tuples = new Tuple[ 2 ];
    037
    038  /**
    039   * Returns a reference to the private tuples of the given TuplePark
    040   *
    041   * @param tuplePair of type Tuple[]
    042   * @return Tuple[]
    043   */
    044  public static Tuple[] tuples( TuplePair tuplePair )
    045    {
    046    return tuplePair.tuples;
    047    }
    048
    049  /** Constructor Tuple creates a new Tuple instance. */
    050  public TuplePair()
    051    {
    052    super( (List<Object>) null ); // bypass unnecessary List creation
    053    tuples[ 0 ] = new Tuple();
    054    tuples[ 1 ] = new Tuple();
    055    }
    056
    057  /**
    058   * Constructor TuplePair creates a new TuplePair instance.
    059   *
    060   * @param lhs of type Tuple
    061   * @param rhs of type Tuple
    062   */
    063  public TuplePair( Tuple lhs, Tuple rhs )
    064    {
    065    super( (List<Object>) null ); // bypass unnecessary List creation
    066    tuples[ 0 ] = lhs;
    067    tuples[ 1 ] = rhs;
    068
    069    if( lhs == null )
    070      throw new IllegalArgumentException( "lhs may not be null" );
    071
    072    if( rhs == null )
    073      throw new IllegalArgumentException( "rhs may not be null" );
    074    }
    075
    076  /**
    077   * Method getLhs returns the lhs of this TuplePair object.
    078   *
    079   * @return the lhs (type Tuple) of this TuplePair object.
    080   */
    081  public Tuple getLhs()
    082    {
    083    return tuples[ 0 ];
    084    }
    085
    086  /**
    087   * Method getRhs returns the rhs of this TuplePair object.
    088   *
    089   * @return the rhs (type Tuple) of this TuplePair object.
    090   */
    091  public Tuple getRhs()
    092    {
    093    return tuples[ 1 ];
    094    }
    095
    096  @Override
    097  public void reset( Tuple lhs, Tuple rhs )
    098    {
    099    tuples[ 0 ] = lhs;
    100    tuples[ 1 ] = rhs;
    101    }
    102
    103  @Override
    104  public boolean equals( Object object )
    105    {
    106    if( this == object )
    107      return true;
    108    if( object == null || getClass() != object.getClass() )
    109      return false;
    110
    111    TuplePair tuplePair = (TuplePair) object;
    112
    113    if( !Arrays.equals( tuples, tuplePair.tuples ) )
    114      return false;
    115
    116    return true;
    117    }
    118
    119  @Override
    120  public int hashCode()
    121    {
    122    return Arrays.hashCode( tuples );
    123    }
    124
    125  @Override
    126  public int compareTo( Object other )
    127    {
    128    if( other instanceof TuplePair )
    129      return compareTo( (TuplePair) other );
    130    else
    131      return -1;
    132    }
    133
    134  @Override
    135  public int compareTo( Tuple other )
    136    {
    137    if( other instanceof TuplePair )
    138      return compareTo( (TuplePair) other );
    139    else
    140      return -1;
    141    }
    142
    143  /**
    144   * Method compareTo compares this instance to the given TuplePair.
    145   *
    146   * @param tuplePair of type TuplePair
    147   * @return int
    148   */
    149  public int compareTo( TuplePair tuplePair )
    150    {
    151    int c = tuples[ 0 ].compareTo( tuplePair.tuples[ 0 ] );
    152
    153    if( c != 0 )
    154      return c;
    155
    156    c = tuples[ 1 ].compareTo( tuplePair.tuples[ 1 ] );
    157
    158    return c;
    159    }
    160
    161  @Override
    162  public String toString()
    163    {
    164    return tuples[ 0 ].print() + tuples[ 1 ].print();
    165    }
    166
    167  @Override
    168  public String print()
    169    {
    170    return tuples[ 0 ].print() + tuples[ 1 ].print();
    171    }
    172  }