blob: 7e0b387a6748a58524f6b87160d940c43b696284 [file] [log] [blame]
/*
* 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.druid.segment;
/**
* TransformableRowIterator tightens {@link RowIterator#getPointer()} contract, that allows to transform iterated
* rows without allocations on each iterations, and reuse the mechanics of the underlying iterator. See {@link
* IndexMerger#toMergedIndexRowIterator} for an example.
*/
public interface TransformableRowIterator extends RowIterator
{
/**
* Returns a pointer to the current row. This method _always returns the same object_, but pointing to
* different row after each {@link #moveToNext()} call that returns {@link true}.
*
* Other aspects of the behaviour of this method are the same as in the generic {@link RowIterator#getPointer()}
* contract.
*/
@Override
RowPointer getPointer();
/**
* Returns a pointer to the row, that was the current row when {@link #mark()} was called for the last time. This
* method always returns the same object, but pointing to different rows after each {@link #mark()} call.
*
* This method must not be called before ever calling to {@link #moveToNext()}. If the very first call to {@link
* #moveToNext()} returned {@code false}, the behaviour of this method is undefined (it may return a "wrong" pointer,
* null, throw an exception, etc.).
*
* This method could be called before the first call to {@link #mark()} (it should return the same object as it is
* required to return after all subsequent {@link #mark()} calls), but the data of the returned pointer should not
* be accessed before the first call to {@link #mark()}.
*
* This method is used in {@link RowCombiningTimeAndDimsIterator} implementation. getMarkedPointer() returns {@link
* TimeAndDimsPointer} instead of {@link RowPointer} (like {@link #getPointer()}) merely because {@link
* RowCombiningTimeAndDimsIterator} doesn't need this method to return anything more specific than {@link
* TimeAndDimsPointer}.
*/
TimeAndDimsPointer getMarkedPointer();
}