/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.algebra.helpers;
import org.openrdf.query.algebra.BinaryTupleOperator;
import org.openrdf.query.algebra.BinaryValueOperator;
import org.openrdf.query.algebra.QueryModelNode;
import org.openrdf.query.algebra.Filter;
import org.openrdf.query.algebra.TupleExpr;
import org.openrdf.query.algebra.UnaryTupleOperator;
import org.openrdf.query.algebra.UnaryValueOperator;
import org.openrdf.query.algebra.ValueExpr;
public class QueryModelNodeReplacer extends QueryModelVisitorBase<RuntimeException> {
private QueryModelNode former;
private QueryModelNode replacement;
public void replaceChildNode(QueryModelNode parent, QueryModelNode former, QueryModelNode replacement) {
this.former = former;
this.replacement = replacement;
parent.visit(this);
}
public void replaceNode(QueryModelNode former, QueryModelNode replacement) {
replaceChildNode(former.getParentNode(), former, replacement);
}
public void removeChildNode(QueryModelNode parent, QueryModelNode former) {
replaceChildNode(parent, former, null);
}
public void removeNode(QueryModelNode former) {
replaceChildNode(former.getParentNode(), former, null);
}
@Override
public void meet(Filter node)
{
if (replacement == null) {
replaceNode(node, node.getArg());
}
else if (replacement instanceof ValueExpr) {
assert former == node.getCondition();
node.setCondition((ValueExpr)replacement);
}
else {
assert former == node.getArg();
node.setArg((TupleExpr)replacement);
}
}
@Override
protected void meetBinaryTupleOperator(BinaryTupleOperator node)
{
if (node.getLeftArg() == former) {
if (replacement == null) {
replaceNode(node, node.getRightArg());
}
else {
node.setLeftArg((TupleExpr)replacement);
}
}
else {
assert former == node.getRightArg();
if (replacement == null) {
replaceNode(node, node.getLeftArg());
}
else {
node.setRightArg((TupleExpr)replacement);
}
}
}
@Override
protected void meetBinaryValueOperator(BinaryValueOperator node)
{
if (former == node.getLeftArg()) {
if (replacement == null) {
replaceNode(node, node.getRightArg());
}
else {
node.setLeftArg((ValueExpr)replacement);
}
}
else {
assert former == node.getRightArg();
if (replacement == null) {
replaceNode(node, node.getLeftArg());
}
else {
node.setRightArg((ValueExpr)replacement);
}
}
}
@Override
protected void meetUnaryTupleOperator(UnaryTupleOperator node)
{
assert former == node.getArg();
if (replacement == null) {
removeNode(node);
}
else {
node.setArg((TupleExpr)replacement);
}
}
@Override
protected void meetUnaryValueOperator(UnaryValueOperator node)
{
assert former == node.getArg();
if (replacement == null) {
removeNode(node);
}
else {
node.setArg((ValueExpr)replacement);
}
}
@Override
protected void meetNode(QueryModelNode node)
{
throw new IllegalArgumentException("Unhandled Node: " + node);
}
}