/**
 * 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.sqoop.mapreduce.netezza;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.InputFormat;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;

import org.apache.sqoop.config.ConfigurationHelper;

/**
 * InputFormat designed to take data-driven splits and use them in the netezza
 * external table import invocation running in the mapper.
 *
 * The key emitted by this mapper is the data slice id to for the Netezza
 * external table query.
 */
public class NetezzaExternalTableInputFormat extends
    InputFormat<Integer, NullWritable> {

  public static final Log LOG = LogFactory
      .getLog(NetezzaExternalTableInputFormat.class.getName());

  /**
   * A RecordReader that just takes the WHERE conditions from the DBInputSplit
   * and relates them to the mapper as a single input record.
   */
  public static class NetezzaExternalTableRecordReader extends
      RecordReader<Integer, NullWritable> {

    private boolean delivered;
    private InputSplit split;

    public NetezzaExternalTableRecordReader(InputSplit split) {
      initialize(split, null);
    }

    @Override
    public boolean nextKeyValue() {
      boolean hasNext = !delivered;
      delivered = true;
      return hasNext;
    }

    @Override
    public Integer getCurrentKey() {
      return ((NetezzaExternalTableInputSplit) this.split).getDataSliceId();
    }

    @Override
    public NullWritable getCurrentValue() {
      return NullWritable.get();
    }

    @Override
    public void close() {
    }

    @Override
    public float getProgress() {
      return delivered ? 1.0f : 0.0f;
    }

    @Override
    public void initialize(InputSplit s, TaskAttemptContext context) {
      this.split = s;
      this.delivered = false;
    }
  }

  public RecordReader<Integer, NullWritable> createRecordReader(
      InputSplit split, TaskAttemptContext context) {
    return new NetezzaExternalTableRecordReader(split);
  }

  @Override
  public List<InputSplit> getSplits(JobContext context) throws IOException,
      InterruptedException {
    int targetNumTasks = ConfigurationHelper.getJobNumMaps(context);
    List<InputSplit> splits = new ArrayList<InputSplit>(targetNumTasks);
    for (int i = 0; i < targetNumTasks; ++i) {
      splits.add(new NetezzaExternalTableInputSplit(i));
    }
    return splits;
  }

}
