/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.apex.malhar.lib.util;

import java.util.List;

import javax.validation.constraints.NotNull;

/**
 * @since 3.3.0
 */
public class TableInfo<T extends FieldInfo>
{
  //the row or id expression
  private String rowOrIdExpression;

  //this class should be used in configuration which don't support Generic.
  @NotNull
  private List<T> fieldsInfo;

  /**
   * expression for Row or Id
   * @since 3.0.0
 */
  public String getRowOrIdExpression()
  {
    return rowOrIdExpression;
  }

  /**
   * expression for Row or Id
   */
  public void setRowOrIdExpression(String rowOrIdExpression)
  {
    this.rowOrIdExpression = rowOrIdExpression;
  }

  /**
   * the field information. each field of the tuple related to on field info.
   */
  public List<T> getFieldsInfo()
  {
    return fieldsInfo;
  }

  /**
   * the field information. each field of the tuple related to on field info.
   */
  public void setFieldsInfo(List<T> fieldsInfo)
  {
    this.fieldsInfo = fieldsInfo;
  }


}
