use of org.sirix.diff.DiffFactory.DiffType in project sirix by sirixdb.
the class DiffSunburstAxis method processFirstChild.
/**
* Process first child.
*
* @param pDepth
* depth of diff
* @param pNextDepth
* depth of next diff
* @return {@code true} if axis has more nodes, {@code false} otherwise
*/
private boolean processFirstChild(@Nonnegative final int pDepth, @Nonnegative final int pNextDepth) {
assert pDepth >= 0;
assert pNextDepth >= 0;
processLastItem(pNextDepth);
if (mModel.getIsPruned()) {
if (mDiff != DiffType.SAMEHASH) {
mPrunedNodes += mDescendantCount - 1;
}
final boolean isOldTransaction = (mDiff == DiffType.DELETED || mDiff == DiffType.MOVEDFROM || mDiff == DiffType.REPLACEDOLD);
final DiffDepth depthCont = mDiffCont.getDepth();
final int depth = isOldTransaction ? depthCont.getOldDepth() : depthCont.getNewDepth();
if (mIndex + mPrunedNodes + 1 < mSize) {
final DiffTuple nextDiffCont = mDiffs.get(mIndex + mPrunedNodes + 1);
final DiffType nextDiff = nextDiffCont.getDiff();
final boolean nextIsOldTransaction = (nextDiff == DiffType.DELETED || nextDiff == DiffType.MOVEDFROM || nextDiff == DiffType.REPLACEDOLD);
final DiffDepth nextDepthCont = nextDiffCont.getDepth();
final int nextDepth = nextIsOldTransaction ? nextDepthCont.getOldDepth() : nextDepthCont.getNewDepth();
if (depth == nextDepth) {
mAngle += mExtension;
mMoved = Moved.STARTRIGHTSIBL;
determineIfHasNext();
return true;
} else {
processStacks(depth, nextDepth);
mMoved = Moved.ANCHESTSIBL;
determineIfHasNext();
return true;
}
}
} else {
mDiffStack.push(mModificationCount);
mAngleStack.push(mAngle);
mExtensionStack.push(mExtension);
mParentStack.push(mIndex);
mDescendantsStack.push(mDescendantCount);
mDepth++;
mMoved = Moved.CHILD;
}
determineIfHasNext();
return true;
}
use of org.sirix.diff.DiffFactory.DiffType in project sirix by sirixdb.
the class DiffSunburstAxis method hasNext.
@Override
public boolean hasNext() {
if (getNext()) {
return true;
}
resetToLastKey();
// Fail if there is no node anymore.
if (!mHasNext) {
return false;
}
// Setup everything.
mDiffCont = mDiffs.get(mIndex + mPrunedNodes + 1);
mDiff = mDiffCont.getDiff();
final boolean isOldTransaction = (mDiff == DiffType.DELETED || mDiff == DiffType.MOVEDFROM || mDiff == DiffType.REPLACEDOLD);
final long nodeKey = isOldTransaction ? mDiffCont.getOldNodeKey() : mDiffCont.getNewNodeKey();
final DiffDepth depthCont = mDiffCont.getDepth();
mOrigDepth = isOldTransaction ? depthCont.getOldDepth() : depthCont.getNewDepth();
setTransaction(isOldTransaction ? mOldRtx : mNewRtx);
// Move to next key.
getTransaction().moveTo(nodeKey);
if (mDiff == DiffType.UPDATED) {
mOldRtx.moveTo(mDiffCont.getOldNodeKey());
}
if (mDiff == DiffType.REPLACEDOLD) {
mNewRtx.moveTo(mDiffCont.getNewNodeKey());
}
if (mIndex + mPrunedNodes + 2 < mSize) {
final DiffTuple nextDiffCont = mDiffs.get(mIndex + mPrunedNodes + 2);
final DiffType nextDiff = nextDiffCont.getDiff();
final boolean nextIsOldTransaction = (nextDiff == DiffType.DELETED || nextDiff == DiffType.MOVEDFROM || nextDiff == DiffType.REPLACEDOLD);
final DiffDepth nextDepthCont = nextDiffCont.getDepth();
final int nextDepth = nextIsOldTransaction ? nextDepthCont.getOldDepth() : nextDepthCont.getNewDepth();
// Always follow first child if there is one.
if (nextDepth > mOrigDepth) {
return processFirstChild(mOrigDepth, nextDepth);
}
// Then follow right sibling if there is one.
if (mOrigDepth == nextDepth) {
return processRightSibling(nextDepth);
}
// Then follow right sibling on stack.
if (nextDepth < mOrigDepth) {
return processNextFollowing(mOrigDepth, nextDepth);
}
}
// Then end.
processLastItem(1);
mHasNext = false;
return true;
}
use of org.sirix.diff.DiffFactory.DiffType in project sirix by sirixdb.
the class TraverseCompareTree method getDepth.
/**
* Get depth of a node from a {@link DiffTuple} instance.
*
* @param pDiffCont
* {@link DiffTuple} instance
* @return the {@code depth} of the node
*/
private int getDepth(final DiffTuple pDiffCont) {
int depth;
final DiffType diff = pDiffCont.getDiff();
if (diff == DiffType.DELETED || diff == DiffType.MOVEDFROM || diff == DiffType.REPLACEDOLD) {
depth = pDiffCont.getDepth().getOldDepth();
} else {
depth = pDiffCont.getDepth().getNewDepth();
}
return depth;
}
use of org.sirix.diff.DiffFactory.DiffType in project sirix by sirixdb.
the class TraverseCompareTree method diffListener.
@Override
public void diffListener(final DiffType diffType, @Nonnull final long newNodeKey, @Nonnull final long oldNodeKey, @Nonnull final DiffDepth depth) {
LOGWRAPPER.debug("kind of diff: " + diffType);
if (mPrune != Pruning.DIFF_WITHOUT_SAMEHASHES || (mPrune == Pruning.DIFF_WITHOUT_SAMEHASHES && diffType != DiffType.SAMEHASH) || mEntries == 0) {
final DiffTuple diffCont = new DiffTuple(diffType, newNodeKey, oldNodeKey, depth);
final DiffType diff = diffCont.getDiff();
if (!mHasUpdatedNodes && mLastNodeUpdated) {
// Has at least one diff, thus it's safe.
final DiffTuple oldCont = mDiffs.get(mEntries - 1);
final int oldDepth = getDepth(oldCont);
final int newDepth = getDepth(diffCont);
if (newDepth > oldDepth) {
mHasUpdatedNodes = true;
}
}
try {
mDiffQueue.put(diffCont);
} catch (final InterruptedException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
mDiffs.put(mEntries, diffCont);
switch(diff) {
case INSERTED:
mNewKeys.put(newNodeKey, mEntries);
mModifications++;
break;
case DELETED:
mOldKeys.put(oldNodeKey, mEntries);
mModifications++;
break;
case UPDATED:
mLastNodeUpdated = true;
mModifications++;
break;
case REPLACEDNEW:
case REPLACEDOLD:
mModifications++;
break;
default:
}
mEntries++;
if (mEntries % DIFF_THRESHOLD == 0) {
try {
// Works even if transactions are not enabled.
mRunner.run(new PopulateDatabase(mDiffDatabase, mDiffs, mDiffDatabase.getMap().size()));
} catch (final Exception e) {
LOGWRAPPER.error(e.getMessage(), e);
}
}
}
}
use of org.sirix.diff.DiffFactory.DiffType in project sirix by sirixdb.
the class TraverseCompareTree method getDepthMax.
/**
* Get the maximum depth in the tree of the nodes which haven't changed.
*
* @return {@code maximum depth} of unchanged nodes
*/
private int getDepthMax() {
int depthMax = 0;
for (boolean isNotEmpty = !mDiffQueue.isEmpty(); ((isNotEmpty = !mDiffQueue.isEmpty()) == true) || !mDone; ) {
if (isNotEmpty) {
final DiffTuple tuple = mDiffQueue.peek();
final DiffType diff = tuple.getDiff();
if (diff == DiffType.SAME || diff == DiffType.SAMEHASH) {
// Set depth max.
depthMax = Math.max(mDiffQueue.poll().getDepth().getOldDepth() - mDepth, depthMax);
} else {
mDiffQueue.poll();
}
}
}
mStart.countDown();
return depthMax;
}
Aggregations