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

import java.io.Serializable;
import java.util.Map;


/**
 * The class HCatTableSnapshot represents a snapshot of a hcatalog table.
 * This class is intended to be opaque. This class would used only by the
 * record readers to obtain knowledge about the revisions of a
 * column to be filtered.
 */
public class HCatTableSnapshot implements Serializable {

    private static final long serialVersionUID = 1L;
    private String tableName;
    private String databaseName;
    private Map<String, Long> columnMap;
    private long latestRevision;

    HCatTableSnapshot(String databaseName, String tableName, Map<String, Long> columnMap, long latestRevision) {
        this.tableName = tableName;
        this.databaseName = databaseName;
        this.columnMap = columnMap;
        this.latestRevision = latestRevision;
    }

    /**
     * @return The name of the table in the snapshot.
     */
    public String getTableName() {
        return this.tableName;
    }

    /**
     * @return The name of the database to which the table snapshot belongs.
     */
    public String getDatabaseName() {
        return this.databaseName;
    }

    /**
     * @return The revision number of a column in a snapshot.
     */
    long getRevision(String column) {
        if (columnMap.containsKey(column))
            return this.columnMap.get(column);
        return latestRevision;
    }

    /**
     * The method checks if the snapshot contains information about a data column.
     *
     * @param column The data column of the table
     * @return true, if successful
     */
    boolean containsColumn(String column) {
        return this.columnMap.containsKey(column);
    }

    /**
     * @return latest committed revision when snapshot was taken
     */
    long getLatestRevision() {
        return latestRevision;
    }

    @Override
    public String toString() {
        String snapshot = " Database Name: " + this.databaseName + " Table Name : " + tableName +
            "Latest Revision: " + latestRevision + " Column revision : " + columnMap.toString();
        return snapshot;
    }
}
