/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.github.geophile.erdo.map.mergescan;
import java.io.IOException;
class MergeNode extends Node
{
public String toString()
{
return String.format("MergeNode(#%s)", position);
}
public void prime() throws IOException, InterruptedException
{
left.prime();
right.prime();
promote();
}
public void promote() throws IOException, InterruptedException
{
if (left.key != null && right.key != null) {
int c = left.key.compareTo(right.key);
if (!forward) {
c = -c;
}
if (c < 0) {
key = left.key;
record = left.record;
left.promote();
} else if (c > 0) {
key = right.key;
record = right.record;
right.promote();
} else {
Node keep = null;
switch (mergeCursor.merger.merge(left.key, right.key)) {
case LEFT:
keep = left;
break;
case RIGHT:
keep = right;
break;
}
key = keep.key;
record = keep.record;
left.promote();
right.promote();
}
} else if (left.key == null) {
key = right.key;
record = right.record;
right.promote();
} else {
key = left.key;
record = left.record;
left.promote();
}
}
@Override
protected void dump(int level)
{
super.dump(level);
left.dump(level + 1);
right.dump(level + 1);
}
public MergeNode(MergeCursor mergeCursor, int position, Node left, Node right, boolean forward)
{
super(position, forward);
this.mergeCursor = mergeCursor;
this.left = left;
this.right = right;
}
// Object state
private final MergeCursor mergeCursor;
private final Node left;
private final Node right;
}