/* * 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 SQL operator with one argument. * * @author James Leigh * */ public abstract class UnarySqlOperator extends RdbmsQueryModelNodeBase implements SqlExpr { private SqlExpr arg; public UnarySqlOperator() { super(); } public UnarySqlOperator(SqlExpr arg) { super(); setArg(arg); } public SqlExpr getArg() { return arg; } public void setArg(SqlExpr arg) { this.arg = arg; arg.setParentNode(this); } @Override public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor) throws X { arg.visit(visitor); } @Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { if (arg == current) { setArg((SqlExpr)replacement); } else { super.replaceChildNode(current, replacement); } } @Override public UnarySqlOperator clone() { UnarySqlOperator clone = (UnarySqlOperator)super.clone(); clone.setArg(arg.clone()); return clone; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((arg == null) ? 0 : arg.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 UnarySqlOperator other = (UnarySqlOperator)obj; if (arg == null) { if (other.arg != null) return false; } else if (!arg.equals(other.arg)) return false; return true; } @Override public String toString() { QueryModelTreePrinter treePrinter = new QueryModelTreePrinter(); UnarySqlOperator 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(); } }