/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 2008.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.sail.rdbms.algebra.base;
import org.openrdf.query.algebra.QueryModelNode;
import org.openrdf.query.algebra.QueryModelVisitor;
import org.openrdf.query.algebra.helpers.QueryModelTreePrinter;
import org.openrdf.sail.rdbms.optimizers.SqlConstantOptimizer;
/**
* An abstract binary sql operator with two arguments.
*
* @author James Leigh
*
*/
public abstract class BinarySqlOperator extends RdbmsQueryModelNodeBase implements SqlExpr {
private SqlExpr leftArg;
private SqlExpr rightArg;
public BinarySqlOperator() {
super();
}
public BinarySqlOperator(SqlExpr leftArg, SqlExpr rightArg) {
super();
setLeftArg(leftArg);
setRightArg(rightArg);
}
public SqlExpr getLeftArg() {
return leftArg;
}
public void setLeftArg(SqlExpr leftArg) {
this.leftArg = leftArg;
leftArg.setParentNode(this);
}
public SqlExpr getRightArg() {
return rightArg;
}
public void setRightArg(SqlExpr rightArg) {
this.rightArg = rightArg;
rightArg.setParentNode(this);
}
@Override
public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor)
throws X
{
leftArg.visit(visitor);
rightArg.visit(visitor);
}
@Override
public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) {
if (leftArg == current) {
setLeftArg((SqlExpr)replacement);
}
else if (rightArg == current) {
setRightArg((SqlExpr)replacement);
}
else {
super.replaceChildNode(current, replacement);
}
}
@Override
public BinarySqlOperator clone() {
BinarySqlOperator clone = (BinarySqlOperator)super.clone();
clone.setLeftArg(leftArg.clone());
clone.setRightArg(rightArg.clone());
return clone;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((leftArg == null) ? 0 : leftArg.hashCode());
result = prime * result + ((rightArg == null) ? 0 : rightArg.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final BinarySqlOperator other = (BinarySqlOperator)obj;
if (leftArg == null) {
if (other.leftArg != null)
return false;
}
else if (!leftArg.equals(other.leftArg))
return false;
if (rightArg == null) {
if (other.rightArg != null)
return false;
}
else if (!rightArg.equals(other.rightArg))
return false;
return true;
}
@Override
public String toString() {
QueryModelTreePrinter treePrinter = new QueryModelTreePrinter();
BinarySqlOperator clone = this.clone();
UnarySqlOperator parent = new UnarySqlOperator(clone) {
@Override
public <X extends Exception> void visit(RdbmsQueryModelVisitorBase<X> visitor)
throws X
{
visitor.meetOther(this);
}
};
new SqlConstantOptimizer().optimize(clone);
parent.getArg().visit(treePrinter);
return treePrinter.getTreeString();
}
}