/*
 * 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.carbondata.core.indexstore.row;

import org.apache.carbondata.core.indexstore.schema.CarbonRowSchema;
import org.apache.carbondata.core.metadata.datatype.DataTypes;

/**
 * Index row.
 */
public class IndexRowImpl extends IndexRow {

  private Object[] data;

  private int totalLengthInBytes;

  public IndexRowImpl(CarbonRowSchema[] schemas) {
    super(schemas);
    this.data = new Object[schemas.length];
  }

  @Override
  public byte[] getByteArray(int ordinal) {
    return (byte[]) data[ordinal];
  }

  @Override
  public int getLengthInBytes(int ordinal) {
    // if the segment data is written in tablepath
    // then the data[BlockletIndexRowIndexes.SUMMARY_INDEX_PATH] will be null.
    if (data[ordinal] == null) {
      return 0;
    }
    return ((byte[]) data[ordinal]).length;
  }

  @Override
  public void setBoolean(boolean value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.BOOLEAN);
    data[ordinal] = value;
  }

  @Override
  public boolean getBoolean(int ordinal) {
    return (boolean) data[ordinal];
  }

  @Override
  public IndexRow getRow(int ordinal) {
    return (IndexRow) data[ordinal];
  }

  @Override
  public void setByteArray(byte[] byteArray, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.BYTE_ARRAY);
    data[ordinal] = byteArray;
  }

  @Override
  public int getInt(int ordinal) {
    return (Integer) data[ordinal];
  }

  @Override
  public void setInt(int value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.INT);
    data[ordinal] = value;
  }

  @Override
  public void setByte(byte value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.BYTE);
    data[ordinal] = value;
  }

  @Override
  public byte getByte(int ordinal) {
    return (Byte) data[ordinal];
  }

  @Override
  public void setShort(short value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.SHORT);
    data[ordinal] = value;
  }

  @Override
  public short getShort(int ordinal) {
    return (Short) data[ordinal];
  }

  @Override
  public void setLong(long value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.LONG);
    data[ordinal] = value;
  }

  @Override
  public long getLong(int ordinal) {
    return (Long) data[ordinal];
  }

  @Override
  public void setFloat(float value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.FLOAT);
    data[ordinal] = value;
  }

  @Override
  public float getFloat(int ordinal) {
    return (Float) data[ordinal];
  }

  @Override
  public void setDouble(double value, int ordinal) {
    assert (schemas[ordinal].getDataType() == DataTypes.DOUBLE);
    data[ordinal] = value;
  }

  @Override
  public void setRow(IndexRow row, int ordinal) {
    assert (DataTypes.isStructType(schemas[ordinal].getDataType()));
    data[ordinal] = row;
  }

  @Override
  public double getDouble(int ordinal) {
    return (Double) data[ordinal];
  }

  public void setTotalLengthInBytes(int totalLengthInBytes) {
    this.totalLengthInBytes = totalLengthInBytes;
  }

  @Override
  public int getTotalSizeInBytes() {
    if (totalLengthInBytes > 0) {
      return totalLengthInBytes;
    } else {
      return super.getTotalSizeInBytes();
    }
  }
}
