/**
 * 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.tajo.storage.parquet;

import com.google.common.base.Charsets;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.LocalFileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.tajo.catalog.Column;
import org.apache.tajo.catalog.Schema;
import org.apache.tajo.catalog.SchemaBuilder;
import org.apache.tajo.common.TajoDataTypes.Type;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.datum.DatumFactory;
import org.apache.tajo.datum.NullDatum;
import org.apache.tajo.storage.Tuple;
import org.apache.tajo.storage.VTuple;
import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

public class TestReadWrite {
  private static final String HELLO = "hello";

  private Path createTmpFile() throws IOException {
    File tmp = File.createTempFile(getClass().getSimpleName(), ".tmp");
    tmp.deleteOnExit();
    tmp.delete();

    // it prevents accessing HDFS namenode of TajoTestingCluster.
    LocalFileSystem localFS = LocalFileSystem.getLocal(new Configuration());
    return localFS.makeQualified(new Path(tmp.getPath()));
  }

  private Schema createAllTypesSchema() {
    List<Column> columns = new ArrayList<>();
    columns.add(new Column("myboolean", Type.BOOLEAN));
    columns.add(new Column("mychar", Type.CHAR));
    columns.add(new Column("myint2", Type.INT2));
    columns.add(new Column("myint4", Type.INT4));
    columns.add(new Column("myint8", Type.INT8));
    columns.add(new Column("myfloat4", Type.FLOAT4));
    columns.add(new Column("myfloat8", Type.FLOAT8));
    columns.add(new Column("mytext", Type.TEXT));
    columns.add(new Column("myblob", Type.BLOB));
    columns.add(new Column("mynull", Type.NULL_TYPE));
    Column[] columnsArray = new Column[columns.size()];
    columnsArray = columns.toArray(columnsArray);
    return SchemaBuilder.builder().addAll(columnsArray).build();
  }

  @Test
  public void testAll() throws Exception {
    Path file = createTmpFile();
    Schema schema = createAllTypesSchema();
    Tuple tuple = new VTuple(schema.size());
    tuple.put(0, DatumFactory.createBool(true));
    tuple.put(1, DatumFactory.createChar('t'));
    tuple.put(2, DatumFactory.createInt2((short)2048));
    tuple.put(3, DatumFactory.createInt4(4096));
    tuple.put(4, DatumFactory.createInt8(8192L));
    tuple.put(5, DatumFactory.createFloat4(0.2f));
    tuple.put(6, DatumFactory.createFloat8(4.1));
    tuple.put(7, DatumFactory.createText(HELLO));
    tuple.put(8, DatumFactory.createBlob(HELLO.getBytes(Charsets.UTF_8)));
    tuple.put(9, NullDatum.get());

    TajoParquetWriter writer = new TajoParquetWriter(file, schema);
    writer.write(tuple);
    writer.close();

    TajoParquetReader reader = new TajoParquetReader(new TajoConf(), file, schema, schema);
    tuple = reader.read();

    assertNotNull(tuple);
    assertEquals(true, tuple.getBool(0));
    assertTrue(String.valueOf('t').equals(String.valueOf(tuple.getChar(1))));
    assertEquals((short)2048, tuple.getInt2(2));
    assertEquals(4096, tuple.getInt4(3));
    assertEquals(8192L, tuple.getInt8(4));
    assertEquals(new Float(0.2f), new Float(tuple.getFloat4(5)));
    assertEquals(new Double(4.1), new Double(tuple.getFloat8(6)));
    assertTrue(HELLO.equals(tuple.getText(7)));
    assertArrayEquals(HELLO.getBytes(Charsets.UTF_8), tuple.getBytes(8));
    assertTrue(tuple.isBlankOrNull(9));
  }
}
