Search in sources :

Example 11 with Row

use of org.hsqldb_voltpatches.Row in project voltdb by VoltDB.

the class IndexAVL method findNode.

/**
     * Finds a match with a row from a different table
     *
     * @param rowdata array containing data for the index columns
     * @param rowColMap map of the data to columns
     * @param first true if the first matching node is required, false if any node
     * @return matching node or null
     */
private NodeAVL findNode(Session session, PersistentStore store, Object[] rowdata, int[] rowColMap, int fieldCount) {
    readLock.lock();
    try {
        NodeAVL x = getAccessor(store);
        NodeAVL n;
        NodeAVL result = null;
        while (x != null) {
            int i = this.compareRowNonUnique(rowdata, rowColMap, x.getRow(store).getData(), fieldCount);
            if (i == 0) {
                result = x;
                n = x.getLeft(store);
            } else if (i > 0) {
                n = x.getRight(store);
            } else {
                n = x.getLeft(store);
            }
            if (n == null) {
                break;
            }
            x = n;
        }
        // MVCC 190
        if (session == null) {
            return result;
        }
        while (result != null) {
            Row row = result.getRow(store);
            if (compareRowNonUnique(rowdata, rowColMap, row.getData(), fieldCount) != 0) {
                result = null;
                break;
            }
            if (session.database.txManager.canRead(session, row)) {
                break;
            }
            result = next(store, result);
        }
        return result;
    } finally {
        readLock.unlock();
    }
}
Also used : Row(org.hsqldb_voltpatches.Row)

Example 12 with Row

use of org.hsqldb_voltpatches.Row in project voltdb by VoltDB.

the class IndexAVL method insert.

/**
     * Insert a node into the index
     */
@Override
public void insert(Session session, PersistentStore store, Row row) {
    NodeAVL n;
    NodeAVL x;
    boolean isleft = true;
    int compare = -1;
    writeLock.lock();
    try {
        n = getAccessor(store);
        x = n;
        if (n == null) {
            store.setAccessor(this, ((RowAVL) row).getNode(position));
            return;
        }
        while (true) {
            Row currentRow = n.getRow(store);
            compare = compareRowForInsertOrDelete(session, row, currentRow);
            if (compare == 0) {
                throw Error.error(ErrorCode.X_23505);
            }
            isleft = compare < 0;
            x = n;
            n = child(store, x, isleft);
            if (n == null) {
                break;
            }
        }
        x = set(store, x, isleft, ((RowAVL) row).getNode(position));
        balance(store, x, isleft);
    } finally {
        writeLock.unlock();
    }
}
Also used : Row(org.hsqldb_voltpatches.Row) RowAVL(org.hsqldb_voltpatches.RowAVL)

Example 13 with Row

use of org.hsqldb_voltpatches.Row in project voltdb by VoltDB.

the class RowStoreAVLMemory method reindex.

/**
     * for result tables
     */
void reindex(Session session, Index index) {
    setAccessor(index, null);
    RowIterator it = table.rowIterator(session);
    while (it.hasNext()) {
        Row row = it.getNextRow();
        // may need to clear the node before insert
        index.insert(session, this, row);
    }
}
Also used : RowIterator(org.hsqldb_voltpatches.navigator.RowIterator) Row(org.hsqldb_voltpatches.Row)

Example 14 with Row

use of org.hsqldb_voltpatches.Row in project voltdb by VoltDB.

the class RowStoreAVLMemory method insertIndexNodes.

boolean insertIndexNodes(Index primaryIndex, Index newIndex) {
    int position = newIndex.getPosition();
    RowIterator it = primaryIndex.firstRow(this);
    int rowCount = 0;
    HsqlException error = null;
    try {
        while (it.hasNext()) {
            Row row = it.getNextRow();
            ((RowAVL) row).insertNode(position);
            // count before inserting
            rowCount++;
            newIndex.insert(null, this, row);
        }
        return true;
    } catch (java.lang.OutOfMemoryError e) {
        error = Error.error(ErrorCode.OUT_OF_MEMORY);
    } catch (HsqlException e) {
        error = e;
    }
    // backtrack on error
    // rowCount rows have been modified
    it = primaryIndex.firstRow(this);
    for (int i = 0; i < rowCount; i++) {
        Row row = it.getNextRow();
        NodeAVL backnode = ((RowAVL) row).getNode(0);
        int j = position;
        while (--j > 0) {
            backnode = backnode.nNext;
        }
        backnode.nNext = backnode.nNext.nNext;
    }
    throw error;
}
Also used : NodeAVL(org.hsqldb_voltpatches.index.NodeAVL) RowIterator(org.hsqldb_voltpatches.navigator.RowIterator) Row(org.hsqldb_voltpatches.Row) RowAVL(org.hsqldb_voltpatches.RowAVL) HsqlException(org.hsqldb_voltpatches.HsqlException)

Example 15 with Row

use of org.hsqldb_voltpatches.Row in project voltdb by VoltDB.

the class RowStoreAVLMemory method dropIndexFromRows.

void dropIndexFromRows(Index primaryIndex, Index oldIndex) {
    RowIterator it = primaryIndex.firstRow(this);
    int position = oldIndex.getPosition() - 1;
    while (it.hasNext()) {
        Row row = it.getNextRow();
        int i = position - 1;
        NodeAVL backnode = ((RowAVL) row).getNode(0);
        while (i-- > 0) {
            backnode = backnode.nNext;
        }
        backnode.nNext = backnode.nNext.nNext;
    }
}
Also used : NodeAVL(org.hsqldb_voltpatches.index.NodeAVL) RowIterator(org.hsqldb_voltpatches.navigator.RowIterator) Row(org.hsqldb_voltpatches.Row) RowAVL(org.hsqldb_voltpatches.RowAVL)

Aggregations

Row (org.hsqldb_voltpatches.Row)20 RowAVL (org.hsqldb_voltpatches.RowAVL)5 RowIterator (org.hsqldb_voltpatches.navigator.RowIterator)4 HsqlException (org.hsqldb_voltpatches.HsqlException)3 RowAVLDisk (org.hsqldb_voltpatches.RowAVLDisk)2 SchemaObject (org.hsqldb_voltpatches.SchemaObject)2 NodeAVL (org.hsqldb_voltpatches.index.NodeAVL)2 RowAVLDiskData (org.hsqldb_voltpatches.RowAVLDiskData)1