/**
 * 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.tez.runtime.library.api;

import java.io.IOException;

import org.apache.tez.runtime.api.Reader;

/**
 * A key/value(s) pair based {@link Reader}.
 * 
 * Example usage
 * <code>
 * while (kvReader.next()) {
 *   KVRecord kvRecord = getCurrentKV();
 *   Object key =  kvRecord.getKey();
 *   Iterable values = kvRecord.getValues();
 * </code>
 *
 */
public interface KVReader extends Reader {

  /**
   * Moves to the next key/values(s) pair
   * 
   * @return true if another key/value(s) pair exists, false if there are no more.
   * @throws IOException
   *           if an error occurs
   */
  public boolean next() throws IOException;

  /**
   * Return the current key/value(s) pair. Use moveToNext() to advance.
   * @return
   * @throws IOException
   */
  public KVRecord getCurrentKV() throws IOException;
  
  // TODO NEWTEZ Move this to getCurrentKey and getCurrentValue independently. Otherwise usage pattern seems to be getCurrentKV.getKey, getCurrentKV.getValue
  
  // TODO NEWTEZ KVRecord which does not need to return a list!
  // TODO NEWTEZ Parameterize this
  /**
   * Represents a key and an associated set of values
   *
   */
  public static class KVRecord {

    private Object key;
    private Iterable<Object> values;

    public KVRecord(Object key, Iterable<Object> values) {
      this.key = key;
      this.values = values;
    }

    public Object getKey() {
      return this.key;
    }

    public Iterable<Object> getValues() {
      return this.values;
    }
  }
}
