/* * 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.cassandra.db.columniterator; import java.io.IOException; import org.apache.cassandra.db.ColumnFamily; import org.apache.cassandra.db.DecoratedKey; import org.apache.cassandra.db.OnDiskAtom; import org.apache.cassandra.db.RowIndexEntry; import org.apache.cassandra.db.filter.ColumnSlice; import org.apache.cassandra.io.sstable.SSTableReader; import org.apache.cassandra.io.util.FileDataInput; /** * A Column Iterator over SSTable */ public class SSTableSliceIterator implements OnDiskAtomIterator { private final OnDiskAtomIterator reader; private final DecoratedKey key; public SSTableSliceIterator(SSTableReader sstable, DecoratedKey key, ColumnSlice[] slices, boolean reversed) { this.key = key; RowIndexEntry indexEntry = sstable.getPosition(key, SSTableReader.Operator.EQ); this.reader = indexEntry == null ? null : createReader(sstable, indexEntry, null, slices, reversed); } /** * An iterator for a slice within an SSTable * @param sstable Keyspace for the CFS we are reading from * @param file Optional parameter that input is read from. If null is passed, this class creates an appropriate one automatically. * If this class creates, it will close the underlying file when #close() is called. * If a caller passes a non-null argument, this class will NOT close the underlying file when the iterator is closed (i.e. the caller is responsible for closing the file) * In all cases the caller should explicitly #close() this iterator. * @param key The key the requested slice resides under * @param slices the column slices * @param reversed Results are returned in reverse order iff reversed is true. * @param indexEntry position of the row */ public SSTableSliceIterator(SSTableReader sstable, FileDataInput file, DecoratedKey key, ColumnSlice[] slices, boolean reversed, RowIndexEntry indexEntry) { this.key = key; reader = createReader(sstable, indexEntry, file, slices, reversed); } private static OnDiskAtomIterator createReader(SSTableReader sstable, RowIndexEntry indexEntry, FileDataInput file, ColumnSlice[] slices, boolean reversed) { return slices.length == 1 && slices[0].start.remaining() == 0 && !reversed ? new SimpleSliceReader(sstable, indexEntry, file, slices[0].finish) : new IndexedSliceReader(sstable, indexEntry, file, slices, reversed); } public DecoratedKey getKey() { return key; } public ColumnFamily getColumnFamily() { return reader == null ? null : reader.getColumnFamily(); } public boolean hasNext() { return reader != null && reader.hasNext(); } public OnDiskAtom next() { return reader.next(); } public void remove() { throw new UnsupportedOperationException(); } public void close() throws IOException { if (reader != null) reader.close(); } }