/**
 * 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 junit.framework.Assert;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.serde2.thrift.test.IntString;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.pig.ExecType;
import org.apache.pig.PigServer;
import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.schema.Schema;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TIOStreamTransport;
import org.junit.Before;
import org.junit.Test;

import java.io.ByteArrayOutputStream;
import java.util.Iterator;

public class TestHCatHiveThriftCompatibility extends HCatBaseTest {

  private boolean setUpComplete = false;
  private Path intStringSeq;

  @Before
  @Override
  public void setUp() throws Exception {
    super.setUp();
    if (setUpComplete) {
      return;
    }

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    TIOStreamTransport transport = new TIOStreamTransport(out);
    TBinaryProtocol protocol = new TBinaryProtocol(transport);

    IntString intString = new IntString(1, "one", 1);
    intString.write(protocol);
    BytesWritable bytesWritable = new BytesWritable(out.toByteArray());

    intStringSeq = new Path(TEST_DATA_DIR + "/data/intString.seq");
    LOG.info("Creating data file: " + intStringSeq);

    SequenceFile.Writer seqFileWriter = SequenceFile.createWriter(
        intStringSeq.getFileSystem(hiveConf), hiveConf, intStringSeq,
        NullWritable.class, BytesWritable.class);
    seqFileWriter.append(NullWritable.get(), bytesWritable);
    seqFileWriter.close();

    setUpComplete = true;
  }

  /**
   *  Create a table with no explicit schema and ensure its correctly
   *  discovered from the thrift struct.
   */
  @Test
  public void testDynamicCols() throws Exception {
    Assert.assertEquals(0, driver.run("drop table if exists test_thrift").getResponseCode());
    Assert.assertEquals(0, driver.run(
        "create external table test_thrift " +
            "partitioned by (year string) " +
            "row format serde 'org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer' " +
            "with serdeproperties ( " +
            "  'serialization.class'='org.apache.hadoop.hive.serde2.thrift.test.IntString', " +
            "  'serialization.format'='org.apache.thrift.protocol.TBinaryProtocol') " +
            "stored as" +
            "  inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat'" +
            "  outputformat 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'")
        .getResponseCode());
    Assert.assertEquals(0,
        driver.run("alter table test_thrift add partition (year = '2012') location '" +
            intStringSeq.getParent() + "'").getResponseCode());

    PigServer pigServer = new PigServer(ExecType.LOCAL);
    pigServer.registerQuery("A = load 'test_thrift' using org.apache.hcatalog.pig.HCatLoader();");

    Schema expectedSchema = new Schema();
    expectedSchema.add(new Schema.FieldSchema("myint", DataType.INTEGER));
    expectedSchema.add(new Schema.FieldSchema("mystring", DataType.CHARARRAY));
    expectedSchema.add(new Schema.FieldSchema("underscore_int", DataType.INTEGER));
    expectedSchema.add(new Schema.FieldSchema("year", DataType.CHARARRAY));

    Assert.assertEquals(expectedSchema, pigServer.dumpSchema("A"));

    Iterator<Tuple> iterator = pigServer.openIterator("A");
    Tuple t = iterator.next();
    Assert.assertEquals(1, t.get(0));
    Assert.assertEquals("one", t.get(1));
    Assert.assertEquals(1, t.get(2));
    Assert.assertEquals("2012", t.get(3));

    Assert.assertFalse(iterator.hasNext());
  }
}
