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

import java.util.List;
import java.util.Map;

import org.apache.hcatalog.common.HCatException;
import org.apache.hcatalog.data.schema.HCatSchema;

/**
 * Abstract class exposing get and set semantics for basic record usage.
 * Note :
 *   HCatRecord is designed only to be used as in-memory representation only.
 *   Don't use it to store data on the physical device.
 */
public abstract class HCatRecord implements HCatRecordable {

    public abstract Object get(String fieldName, HCatSchema recordSchema) throws HCatException;

    public abstract void set(String fieldName, HCatSchema recordSchema, Object value) throws HCatException;

    public abstract void remove(int idx) throws HCatException;

    public abstract void copy(HCatRecord r) throws HCatException;

    protected Object get(String fieldName, HCatSchema recordSchema, Class clazz) throws HCatException {
        // TODO : if needed, verify that recordschema entry for fieldname matches appropriate type.
        return get(fieldName, recordSchema);
    }

    public Boolean getBoolean(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (Boolean) get(fieldName, recordSchema, Boolean.class);
    }

    public void setBoolean(String fieldName, HCatSchema recordSchema, Boolean value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public byte[] getByteArray(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (byte[]) get(fieldName, recordSchema, byte[].class);
    }

    public void setByteArray(String fieldName, HCatSchema recordSchema, byte[] value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Byte getByte(String fieldName, HCatSchema recordSchema) throws HCatException {
        //TINYINT
        return (Byte) get(fieldName, recordSchema, Byte.class);
    }

    public void setByte(String fieldName, HCatSchema recordSchema, Byte value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Short getShort(String fieldName, HCatSchema recordSchema) throws HCatException {
        // SMALLINT
        return (Short) get(fieldName, recordSchema, Short.class);
    }

    public void setShort(String fieldName, HCatSchema recordSchema, Short value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Integer getInteger(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (Integer) get(fieldName, recordSchema, Integer.class);
    }

    public void setInteger(String fieldName, HCatSchema recordSchema, Integer value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Long getLong(String fieldName, HCatSchema recordSchema) throws HCatException {
        // BIGINT
        return (Long) get(fieldName, recordSchema, Long.class);
    }

    public void setLong(String fieldName, HCatSchema recordSchema, Long value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Float getFloat(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (Float) get(fieldName, recordSchema, Float.class);
    }

    public void setFloat(String fieldName, HCatSchema recordSchema, Float value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Double getDouble(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (Double) get(fieldName, recordSchema, Double.class);
    }

    public void setDouble(String fieldName, HCatSchema recordSchema, Double value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public String getString(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (String) get(fieldName, recordSchema, String.class);
    }

    public void setString(String fieldName, HCatSchema recordSchema, String value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    @SuppressWarnings("unchecked")
    public List<? extends Object> getStruct(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (List<? extends Object>) get(fieldName, recordSchema, List.class);
    }

    public void setStruct(String fieldName, HCatSchema recordSchema, List<? extends Object> value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public List<?> getList(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (List<?>) get(fieldName, recordSchema, List.class);
    }

    public void setList(String fieldName, HCatSchema recordSchema, List<?> value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

    public Map<?, ?> getMap(String fieldName, HCatSchema recordSchema) throws HCatException {
        return (Map<?, ?>) get(fieldName, recordSchema, Map.class);
    }

    public void setMap(String fieldName, HCatSchema recordSchema, Map<?, ?> value) throws HCatException {
        set(fieldName, recordSchema, value);
    }

}
