com.questdb.query.spi.QueryAllImpl 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.query.spi;
import com.questdb.Journal;
import com.questdb.Partition;
import com.questdb.ex.JournalException;
import com.questdb.ex.JournalRuntimeException;
import com.questdb.iter.*;
import com.questdb.misc.Interval;
import com.questdb.misc.Rows;
import com.questdb.query.OrderedResultSet;
import com.questdb.query.OrderedResultSetBuilder;
import com.questdb.query.api.QueryAll;
import com.questdb.query.api.QueryAllBuilder;
import com.questdb.std.ObjList;
import java.util.Iterator;
public class QueryAllImpl implements QueryAll {
private final Journal journal;
public QueryAllImpl(Journal journal) {
this.journal = journal;
}
@Override
public OrderedResultSet asResultSet() throws JournalException {
return journal.iteratePartitions(new OrderedResultSetBuilder() {
@Override
public void read(long lo, long hi) throws JournalException {
result.ensureCapacity((int) (hi - lo + 1));
for (long i = lo; i < hi + 1; i++) {
result.add(Rows.toRowID(partition.getPartitionIndex(), i));
}
}
});
}
@Override
public JournalPeekingIterator bufferedIterator() {
return new JournalBufferedIterator<>(journal, createRanges());
}
@Override
public JournalPeekingIterator bufferedIterator(Interval interval) {
return new JournalBufferedIterator<>(journal, createRanges(interval));
}
@Override
public JournalPeekingIterator bufferedIterator(long rowid) {
return new JournalBufferedIterator<>(journal, createRanges(rowid));
}
@Override
public JournalConcurrentIterator concurrentIterator() {
return new JournalConcurrentIterator<>(journal, createRanges(), 1024);
}
@Override
public JournalConcurrentIterator concurrentIterator(Interval interval) {
return new JournalConcurrentIterator<>(journal, createRanges(interval), 1024);
}
@Override
public JournalConcurrentIterator concurrentIterator(long rowid) {
return new JournalConcurrentIterator<>(journal, createRanges(rowid), 1024);
}
@Override
public JournalPeekingIterator incrementBufferedIterator() {
try {
long lo = journal.getMaxRowID();
journal.refresh();
return new JournalBufferedIterator<>(journal, createRanges(journal.incrementRowID(lo)));
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
}
@Override
public JournalPeekingIterator incrementIterator() {
try {
long lo = journal.getMaxRowID();
journal.refresh();
return new JournalIteratorImpl<>(journal, createRanges(journal.incrementRowID(lo)));
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
}
@Override
public JournalIterator iterator(Interval interval) {
return new JournalIteratorImpl<>(journal, createRanges(interval));
}
@Override
public JournalPeekingIterator iterator(long rowid) {
return new JournalIteratorImpl<>(journal, createRanges(rowid));
}
@Override
public long size() {
try {
return journal.size();
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
}
@Override
public QueryAllBuilder withKeys(String... values) {
return withSymValues(journal.getMetadata().getKeyColumn(), values);
}
@Override
public QueryAllBuilder withSymValues(String symbol, String... values) {
QueryAllBuilderImpl result = new QueryAllBuilderImpl<>(journal);
result.setSymbol(symbol, values);
return result;
}
@Override
public Iterator iterator() {
return new JournalIteratorImpl<>(journal, createRanges());
}
private ObjList createRanges() {
final int partitionCount = journal.getPartitionCount();
ObjList ranges = new ObjList<>(partitionCount);
try {
for (int i = 0; i < partitionCount; i++) {
Partition p = journal.getPartition(i, true);
long size = p.size();
if (size > 0) {
ranges.add(new JournalIteratorRange(p.getPartitionIndex(), 0, size - 1));
}
}
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
return ranges;
}
private ObjList createRanges(Interval interval) {
final ObjList ranges = new ObjList<>();
try {
journal.iteratePartitions(new OrderedResultSetBuilder(interval) {
@Override
public void read(long lo, long hi) throws JournalException {
ranges.add(new JournalIteratorRange(partition.getPartitionIndex(), lo, hi));
}
});
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
return ranges;
}
private ObjList createRanges(long lo) {
ObjList ranges = new ObjList<>();
int loPartitionID = Rows.toPartitionIndex(lo);
long loLocalRowID = Rows.toLocalRowID(lo);
try {
int count = journal.getPartitionCount();
for (int i = loPartitionID; i < count; i++) {
long localRowID = 0;
if (i == loPartitionID) {
localRowID = loLocalRowID;
}
Partition p = journal.getPartition(i, true);
long size = p.size();
if (size > 0) {
ranges.add(new JournalIteratorRange(p.getPartitionIndex(), localRowID, size - 1));
}
}
return ranges;
} catch (JournalException e) {
throw new JournalRuntimeException(e);
}
}
}