org.h2.index.RangeIndex Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of h2 Show documentation
Show all versions of h2 Show documentation
base on h2database 1.4.196. for more information, see http://h2database.com/
/*
* Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.index;
import java.util.HashSet;
import org.h2.engine.Session;
import org.h2.message.DbException;
import org.h2.result.Row;
import org.h2.result.SearchRow;
import org.h2.result.SortOrder;
import org.h2.table.Column;
import org.h2.table.IndexColumn;
import org.h2.table.RangeTable;
import org.h2.table.TableFilter;
/**
* An index for the SYSTEM_RANGE table.
* This index can only scan through all rows, search is not supported.
*/
public class RangeIndex extends BaseIndex {
private final RangeTable rangeTable;
public RangeIndex(RangeTable table, IndexColumn[] columns) {
initBaseIndex(table, 0, "RANGE_INDEX", columns,
IndexType.createNonUnique(true));
this.rangeTable = table;
}
@Override
public void close(Session session) {
// nothing to do
}
@Override
public void add(Session session, Row row) {
throw DbException.getUnsupportedException("SYSTEM_RANGE");
}
@Override
public void remove(Session session, Row row) {
throw DbException.getUnsupportedException("SYSTEM_RANGE");
}
@Override
public Cursor find(Session session, SearchRow first, SearchRow last) {
long min = rangeTable.getMin(session), start = min;
long max = rangeTable.getMax(session), end = max;
long step = rangeTable.getStep(session);
try {
start = Math.max(min, first == null ? min : first.getValue(0).getLong());
} catch (Exception e) {
// error when converting the value - ignore
}
try {
end = Math.min(max, last == null ? max : last.getValue(0).getLong());
} catch (Exception e) {
// error when converting the value - ignore
}
return new RangeCursor(session, start, end, step);
}
@Override
public double getCost(Session session, int[] masks,
TableFilter[] filters, int filter, SortOrder sortOrder,
HashSet allColumnsSet) {
return 1;
}
@Override
public String getCreateSQL() {
return null;
}
@Override
public void remove(Session session) {
throw DbException.getUnsupportedException("SYSTEM_RANGE");
}
@Override
public void truncate(Session session) {
throw DbException.getUnsupportedException("SYSTEM_RANGE");
}
@Override
public boolean needRebuild() {
return false;
}
@Override
public void checkRename() {
throw DbException.getUnsupportedException("SYSTEM_RANGE");
}
@Override
public boolean canGetFirstOrLast() {
return true;
}
@Override
public Cursor findFirstOrLast(Session session, boolean first) {
long pos = first ? rangeTable.getMin(session) : rangeTable.getMax(session);
return new RangeCursor(session, pos, pos);
}
@Override
public long getRowCount(Session session) {
return rangeTable.getRowCountApproximation();
}
@Override
public long getRowCountApproximation() {
return rangeTable.getRowCountApproximation();
}
@Override
public long getDiskSpaceUsed() {
return 0;
}
}