com.questdb.iter.PartitionBufferedIterator Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of questdb-core Show documentation
Show all versions of questdb-core Show documentation
QuestDB is High Performance Time Series Database
/*******************************************************************************
* ___ _ ____ ____
* / _ \ _ _ ___ ___| |_| _ \| __ )
* | | | | | | |/ _ \/ __| __| | | | _ \
* | |_| | |_| | __/\__ \ |_| |_| | |_) |
* \__\_\\__,_|\___||___/\__|____/|____/
*
* Copyright (C) 2014-2016 Appsicle
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
******************************************************************************/
package com.questdb.iter;
import com.questdb.Journal;
import com.questdb.Partition;
import com.questdb.ex.JournalException;
import com.questdb.ex.JournalRuntimeException;
import com.questdb.std.AbstractImmutableIterator;
public class PartitionBufferedIterator extends AbstractImmutableIterator implements JournalIterator, PeekingIterator {
private final long hi;
private final long lo;
private final T obj;
private final Partition partition;
private long cursor;
public PartitionBufferedIterator(Partition partition, long lo, long hi) {
this.lo = lo;
this.cursor = lo;
this.hi = hi;
this.obj = partition.getJournal().newObject();
this.partition = partition;
}
@Override
public Journal getJournal() {
return partition.getJournal();
}
@Override
public boolean hasNext() {
return cursor <= hi;
}
@Override
public T next() {
return get(cursor++);
}
@Override
public boolean isEmpty() {
return cursor > hi;
}
@Override
public T peekFirst() {
return get(lo);
}
@Override
public T peekLast() {
return get(hi);
}
private T get(long localRowID) {
try {
if (!partition.isOpen()) {
partition.open();
}
partition.read(localRowID, obj);
return obj;
} catch (JournalException e) {
throw new JournalRuntimeException("Cannot read partition " + partition + " at " + localRowID, e);
}
}
}