/**
 * 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.hcatalog.mapreduce;

import org.apache.hadoop.hive.metastore.MetaStoreUtils;

import java.io.Serializable;
import java.util.List;
import java.util.Properties;

/** The class used to serialize and store the information read from the metadata server */
public class InputJobInfo implements Serializable {

    /** The serialization version */
    private static final long serialVersionUID = 1L;

    /** The db and table names. */
    private final String databaseName;
    private final String tableName;

    /** meta information of the table to be read from */
    private HCatTableInfo tableInfo;

    /** The partition filter */
    private String filter;

    /** The list of partitions matching the filter. */
    private List<PartInfo> partitions;

    /** implementation specific job properties */
    private Properties properties;

    /**
     * Initializes a new InputJobInfo
     * for reading data from a table.
     * @param databaseName the db name
     * @param tableName the table name
     * @param filter the partition filter
     */

    public static InputJobInfo create(String databaseName,
                                      String tableName,
                                      String filter) {
        return new InputJobInfo(databaseName, tableName, filter);
    }


    private InputJobInfo(String databaseName,
                         String tableName,
                         String filter) {
        this.databaseName = (databaseName == null) ?
            MetaStoreUtils.DEFAULT_DATABASE_NAME : databaseName;
        this.tableName = tableName;
        this.filter = filter;
        this.properties = new Properties();
    }

    /**
     * Gets the value of databaseName
     * @return the databaseName
     */
    public String getDatabaseName() {
        return databaseName;
    }

    /**
     * Gets the value of tableName
     * @return the tableName
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * Gets the table's meta information
     * @return the HCatTableInfo
     */
    public HCatTableInfo getTableInfo() {
        return tableInfo;
    }

    /**
     * set the tablInfo instance
     * this should be the same instance
     * determined by this object's DatabaseName and TableName
     * @param tableInfo
     */
    void setTableInfo(HCatTableInfo tableInfo) {
        this.tableInfo = tableInfo;
    }

    /**
     * Gets the value of partition filter
     * @return the filter string
     */
    public String getFilter() {
        return filter;
    }

    /**
     * @return partition info
     */
    public List<PartInfo> getPartitions() {
        return partitions;
    }

    /**
     * @return partition info  list
     */
    void setPartitions(List<PartInfo> partitions) {
        this.partitions = partitions;
    }

    /**
     * Set/Get Property information to be passed down to *StorageHandler implementation
     * put implementation specific storage handler configurations here
     * @return the implementation specific job properties
     */
    public Properties getProperties() {
        return properties;
    }
}
