/*
* Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2007.
*
* Licensed under the Aduna BSD-style license.
*/
package org.openrdf.query.algebra;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* The LeftJoin operator, as defined in <a
* href="http://www.w3.org/TR/rdf-sparql-query/#algLeftJoin">SPARQL Query
* Language for RDF</a>.
*
* @author Arjohn Kampman
*/
public class LeftJoin extends BinaryTupleOperator {
/*-----------*
* Variables *
*-----------*/
private ValueExpr condition;
/*--------------*
* Constructors *
*--------------*/
public LeftJoin() {
}
public LeftJoin(TupleExpr leftArg, TupleExpr rightArg) {
super(leftArg, rightArg);
}
public LeftJoin(TupleExpr leftArg, TupleExpr rightArg, ValueExpr condition) {
this(leftArg, rightArg);
setCondition(condition);
}
/*---------*
* Methods *
*---------*/
public ValueExpr getCondition() {
return condition;
}
public void setCondition(ValueExpr condition) {
if (condition != null) {
condition.setParentNode(this);
}
this.condition = condition;
}
public boolean hasCondition() {
return condition != null;
}
public Set<String> getBindingNames() {
Set<String> bindingNames = new LinkedHashSet<String>(16);
bindingNames.addAll(getLeftArg().getBindingNames());
bindingNames.addAll(getRightArg().getBindingNames());
return bindingNames;
}
public <X extends Exception> void visit(QueryModelVisitor<X> visitor)
throws X
{
visitor.meet(this);
}
@Override
public <X extends Exception> void visitChildren(QueryModelVisitor<X> visitor)
throws X
{
if (condition != null) {
condition.visit(visitor);
}
super.visitChildren(visitor);
}
@Override
public void replaceChildNode(QueryModelNode current, QueryModelNode replacement)
{
if (condition == current) {
setCondition((ValueExpr)replacement);
}
else {
super.replaceChildNode(current, replacement);
}
}
@Override
public LeftJoin clone() {
LeftJoin clone = (LeftJoin)super.clone();
if (hasCondition()) {
clone.setCondition(getCondition().clone());
}
return clone;
}
}