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();
}
}
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();
}
}
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);
}
}
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;
}
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;
}
}
Aggregations