/*
* 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.HashSet;
import java.util.Set;
/**
* A tuple expression that matches a statement pattern against an RDF graph.
* Statement patterns can be targeted at one of three context scopes: all
* contexts, null context only, or named contexts only.
*/
public class StatementPattern extends QueryModelNodeBase implements TupleExpr {
/*------------*
* enum Scope *
*------------*/
/**
* Indicates the scope of the statement pattern.
*/
public enum Scope {
/**
* Scope for patterns that should be matched against statements from the
* default contexts.
*/
DEFAULT_CONTEXTS,
/**
* Scope for patterns that should be matched against statements from named
* contexts only.
*/
NAMED_CONTEXTS
}
/*-----------*
* Variables *
*-----------*/
private Scope scope;
private Var subjectVar;
private Var predicateVar;
private Var objectVar;
private Var contextVar;
/*--------------*
* Constructors *
*--------------*/
public StatementPattern() {
}
/**
* Creates a statement pattern that matches a subject-, predicate- and object
* variable against statements from all contexts.
*/
public StatementPattern(Var subject, Var predicate, Var object) {
this(Scope.DEFAULT_CONTEXTS, subject, predicate, object);
}
/**
* Creates a statement pattern that matches a subject-, predicate- and object
* variable against statements from the specified context scope.
*/
public StatementPattern(Scope scope, Var subject, Var predicate, Var object) {
this(scope, subject, predicate, object, null);
}
/**
* Creates a statement pattern that matches a subject-, predicate-, object-
* and context variable against statements from all contexts.
*/
public StatementPattern(Var subject, Var predicate, Var object, Var context) {
this(Scope.DEFAULT_CONTEXTS, subject, predicate, object, context);
}
/**
* Creates a statement pattern that matches a subject-, predicate-, object-
* and context variable against statements from the specified context scope.
*/
public StatementPattern(Scope scope, Var subjVar, Var predVar, Var objVar, Var conVar) {
setScope(scope);
setSubjectVar(subjVar);
setPredicateVar(predVar);
setObjectVar(objVar);
setContextVar(conVar);
}
/*---------*
* Methods *
*---------*/
/**
* Gets the context scope for the statement pattern.
*/
public Scope getScope() {
return scope;
}
/**
* Sets the context scope for the statement pattern.
*/
public void setScope(Scope scope) {
assert scope != null : "scope must not be null";
this.scope = scope;
}
public Var getSubjectVar() {
return subjectVar;
}
public void setSubjectVar(Var subject) {
assert subject != null : "subject must not be null";
subject.setParentNode(this);
subjectVar = subject;
}
public Var getPredicateVar() {
return predicateVar;
}
public void setPredicateVar(Var predicate) {
assert predicate != null : "predicate must not be null";
predicate.setParentNode(this);
predicateVar = predicate;
}
public Var getObjectVar() {
return objectVar;
}
public void setObjectVar(Var object) {
assert object != null : "object must not be null";
object.setParentNode(this);
objectVar = object;
}
/**
* Returns the context variable, if available.
*
* @return
*/
public Var getContextVar() {
return contextVar;
}
public void setContextVar(Var context) {
if (context != null) {
context.setParentNode(this);
}
contextVar = context;
}
public Set<String> getBindingNames() {
Set<String> bindingNames = new HashSet<String>(8);
if (subjectVar != null) {
bindingNames.add(subjectVar.getName());
}
if (predicateVar != null) {
bindingNames.add(predicateVar.getName());
}
if (objectVar != null) {
bindingNames.add(objectVar.getName());
}
if (contextVar != null) {
bindingNames.add(contextVar.getName());
}
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 (subjectVar != null) {
subjectVar.visit(visitor);
}
if (predicateVar != null) {
predicateVar.visit(visitor);
}
if (objectVar != null) {
objectVar.visit(visitor);
}
if (contextVar != null) {
contextVar.visit(visitor);
}
super.visitChildren(visitor);
}
@Override
public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) {
if (subjectVar == current) {
setSubjectVar((Var)replacement);
}
else if (predicateVar == current) {
setPredicateVar((Var)replacement);
}
else if (objectVar == current) {
setObjectVar((Var)replacement);
}
else if (contextVar == current) {
setContextVar((Var)replacement);
}
else {
super.replaceChildNode(current, replacement);
}
}
@Override
public String getSignature() {
StringBuilder sb = new StringBuilder(128);
sb.append(super.getSignature());
if (scope == Scope.NAMED_CONTEXTS) {
sb.append(" FROM NAMED CONTEXT");
}
return sb.toString();
}
@Override
public StatementPattern clone() {
StatementPattern clone = (StatementPattern)super.clone();
clone.setSubjectVar(getSubjectVar().clone());
clone.setPredicateVar(getPredicateVar().clone());
clone.setObjectVar(getObjectVar().clone());
if (getContextVar() != null) {
clone.setContextVar(getContextVar().clone());
}
return clone;
}
}