001/*
002 * Copyright (c) 2007-2016 Concurrent, 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.operation;
022
023import java.beans.ConstructorProperties;
024
025import cascading.flow.FlowProcess;
026import cascading.management.annotation.Property;
027import cascading.management.annotation.PropertyDescription;
028import cascading.management.annotation.Visibility;
029import cascading.tuple.Fields;
030import cascading.tuple.Tuple;
031
032/** Class Insert adds literal values to the Tuple stream. */
033public class Insert extends BaseOperation implements Function
034  {
035  /** Field values */
036  private final Tuple values;
037
038  /**
039   * Constructor Insert creates a new Insert instance with the given fields and values.
040   *
041   * @param fieldDeclaration of type Fields
042   * @param values           of type Object...
043   */
044  @ConstructorProperties({"fieldDeclaration", "values"})
045  public Insert( Fields fieldDeclaration, Object... values )
046    {
047    super( 0, fieldDeclaration );
048    this.values = new Tuple( values );
049
050    if( !fieldDeclaration.isSubstitution() && fieldDeclaration.size() != values.length )
051      throw new IllegalArgumentException( "fieldDeclaration must be the same size as the given values" );
052    }
053
054  @Property(name = "values", visibility = Visibility.PRIVATE)
055  @PropertyDescription("The values to insert.")
056  public Tuple getValues()
057    {
058    return new Tuple( values );
059    }
060
061  /** @see Function#operate(cascading.flow.FlowProcess, FunctionCall) */
062  public void operate( FlowProcess flowProcess, FunctionCall functionCall )
063    {
064    functionCall.getOutputCollector().add( values );
065    }
066
067  @Override
068  public boolean equals( Object object )
069    {
070    if( this == object )
071      return true;
072    if( !( object instanceof Insert ) )
073      return false;
074    if( !super.equals( object ) )
075      return false;
076
077    Insert insert = (Insert) object;
078
079    if( values != null ? !values.equals( insert.values ) : insert.values != null )
080      return false;
081
082    return true;
083    }
084
085  @Override
086  public int hashCode()
087    {
088    int result = super.hashCode();
089    result = 31 * result + ( values != null ? values.hashCode() : 0 );
090    return result;
091    }
092  }