001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.hadoop.mapreduce.lib.join; 019 020 import java.io.IOException; 021 022 import org.apache.hadoop.classification.InterfaceAudience; 023 import org.apache.hadoop.classification.InterfaceStability; 024 import org.apache.hadoop.io.Writable; 025 026 /** 027 * This defines an interface to a stateful Iterator that can replay elements 028 * added to it directly. 029 * Note that this does not extend {@link java.util.Iterator}. 030 */ 031 @InterfaceAudience.Public 032 @InterfaceStability.Stable 033 public interface ResetableIterator<T extends Writable> { 034 035 public static class EMPTY<U extends Writable> 036 implements ResetableIterator<U> { 037 public boolean hasNext() { return false; } 038 public void reset() { } 039 public void close() throws IOException { } 040 public void clear() { } 041 public boolean next(U val) throws IOException { 042 return false; 043 } 044 public boolean replay(U val) throws IOException { 045 return false; 046 } 047 public void add(U item) throws IOException { 048 throw new UnsupportedOperationException(); 049 } 050 } 051 052 /** 053 * True if a call to next may return a value. This is permitted false 054 * positives, but not false negatives. 055 */ 056 public boolean hasNext(); 057 058 /** 059 * Assign next value to actual. 060 * It is required that elements added to a ResetableIterator be returned in 061 * the same order after a call to {@link #reset} (FIFO). 062 * 063 * Note that a call to this may fail for nested joins (i.e. more elements 064 * available, but none satisfying the constraints of the join) 065 */ 066 public boolean next(T val) throws IOException; 067 068 /** 069 * Assign last value returned to actual. 070 */ 071 public boolean replay(T val) throws IOException; 072 073 /** 074 * Set iterator to return to the start of its range. Must be called after 075 * calling {@link #add} to avoid a ConcurrentModificationException. 076 */ 077 public void reset(); 078 079 /** 080 * Add an element to the collection of elements to iterate over. 081 */ 082 public void add(T item) throws IOException; 083 084 /** 085 * Close datasources and release resources. Calling methods on the iterator 086 * after calling close has undefined behavior. 087 */ 088 // XXX is this necessary? 089 public void close() throws IOException; 090 091 /** 092 * Close datasources, but do not release internal resources. Calling this 093 * method should permit the object to be reused with a different datasource. 094 */ 095 public void clear(); 096 097 }