// This file is part of OpenTSDB.
// Copyright (C) 2015 The OpenTSDB Authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or (at your
// option) any later version. This program is distributed in the hope that it
// will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
// General Public License for more details. You should have received a copy
// of the GNU Lesser General Public License along with this program. If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.query.expression;
import net.opentsdb.utils.ByteSet;
/**
* An interface for expressions or queries that operate across time series
* and require point-by-point timestamp synchronization.
* @since 2.3
*/
public interface ITimeSyncedIterator {
/** @return true if any of the series in the set has another value */
public boolean hasNext();
/**
* @param timestamp The timestamp to fastforward to
* @return The data point array for the given timestamp. Implementations
* may throw an exception if the timestamp is invliad or they may return an
* empty array.
*/
public ExpressionDataPoint[] next(final long timestamp);
/**
* Determines whether the individual series in the {@link values} array has
* another value. This may be used for non-synchronous iteration.
* @param index The index of the series in the values array to check for
* @return True if the series has another value, false if not
*/
public boolean hasNext(final int index);
/**
* Fetches the next value for an individual series in the {@link values} array.
* @param index The index of the series in the values array to advance
*/
public void next(final int index);
/**
* @return the next timestamp available in this set.
*/
public long nextTimestamp();
/** @return the number of series in this set */
public int size();
/** @return an array of the emitters populated during iteration */
public ExpressionDataPoint[] values();
/** @param index the index to null. Nulls the given object so we don't use it
* in timestamps.
*/
public void nullIterator(final int index);
/** @return the index in the ExpressionIterator */
public int getIndex();
/** @param the index in the ExpressionIterator */
public void setIndex(final int index);
/** @return the ID of this set given by the user */
public String getId();
/** @return a set of unique tag key UIDs from the filter list. If no filters
* were defined then the set may be empty. */
public ByteSet getQueryTagKs();
/** @param A fill policy for the iterator. Iterators should implement a default */
public void setFillPolicy(final NumericFillPolicy policy);
/** @return the fill policy for the iterator */
public NumericFillPolicy getFillPolicy();
/** @return a copy of the iterator. This should return references to
* underlying data objects but not necessarily copy all of the underlying
* data (to avoid memory explosions). This is useful for creating other
* iterators that operate over the same data. */
public ITimeSyncedIterator getCopy();
}