/* * Copyright 2008-2012 LinkedIn, Inc * * Licensed 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 voldemort.store; import java.util.List; import java.util.NoSuchElementException; import voldemort.utils.ByteArray; import voldemort.utils.ClosableIterator; import voldemort.utils.Pair; import voldemort.utils.Utils; import voldemort.versioning.Versioned; /** * Iterator that uses efficient partition scan to iterate across a list of * supplied partitions * */ public class PartitionListIterator implements ClosableIterator<Pair<ByteArray, Versioned<byte[]>>> { StorageEngine<ByteArray, byte[], byte[]> storageEngine; List<Integer> partitionsToFetch; ClosableIterator<Pair<ByteArray, Versioned<byte[]>>> partitionIterator; int currentIndex; public PartitionListIterator(StorageEngine<ByteArray, byte[], byte[]> storageEngine, List<Integer> partitionsToFetch) { Utils.notNull(partitionsToFetch); this.storageEngine = storageEngine; this.partitionsToFetch = partitionsToFetch; this.currentIndex = 0; } public boolean hasNext() { // do we have more elements in the current partition we are serving? if(this.partitionIterator != null && this.partitionIterator.hasNext()) return true; // if not, find the next non empty partition while((currentIndex < partitionsToFetch.size())) { // close the previous iterator if(this.partitionIterator != null) this.partitionIterator.close(); // advance to the next partition this.partitionIterator = storageEngine.entries(this.partitionsToFetch.get(currentIndex)); currentIndex++; if(this.partitionIterator.hasNext()) return true; } return false; } public Pair<ByteArray, Versioned<byte[]>> next() { if(!hasNext()) throw new NoSuchElementException("End of partition entries stream"); return this.partitionIterator.next(); } public void remove() { throw new UnsupportedOperationException("Removal not supported"); } @Override protected final void finalize() { close(); } public void close() { if(partitionIterator != null) { partitionIterator.close(); } } }