blob: 7a99ff4e660def41f87b049a730054fa8392cc45 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.arq.querybuilder.rewriters;
import java.util.Iterator;
import java.util.Map;
import org.apache.jena.arq.querybuilder.AbstractQueryBuilder;
import org.apache.jena.graph.Node ;
import org.apache.jena.graph.Triple ;
import org.apache.jena.query.Query;
import org.apache.jena.sparql.core.TriplePath ;
import org.apache.jena.sparql.core.Var ;
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.syntax.* ;
/**
* A rewriter that implements an ElementVisitor
*
*/
public class ElementRewriter extends AbstractRewriter<Element> implements
ElementVisitor {
/**
* Constructor
* @param values The values to rewrite with.
*/
public ElementRewriter(Map<Var, Node> values) {
super(values);
}
@Override
public void visit(ElementTriplesBlock el) {
ElementTriplesBlock newBlock = new ElementTriplesBlock();
Iterator<Triple> tIter = el.patternElts();
while (tIter.hasNext()) {
newBlock.addTriple(rewrite(tIter.next()));
}
push(newBlock);
}
@Override
public void visit(ElementPathBlock el) {
ElementPathBlock newBlock = new ElementPathBlock();
Iterator<TriplePath> tIter = el.patternElts();
while (tIter.hasNext()) {
newBlock.addTriplePath(rewrite(tIter.next()));
}
push(newBlock);
}
@Override
public void visit(ElementFilter el) {
ExprRewriter exprRewriter = new ExprRewriter(values);
el.getExpr().visit(exprRewriter);
push(new ElementFilter(exprRewriter.getResult()));
}
@Override
public void visit(ElementAssign el) {
Node n = changeNode(el.getVar());
if (n.equals(el.getVar())) {
ExprRewriter exprRewriter = new ExprRewriter(values);
el.getExpr().visit(exprRewriter);
push(new ElementAssign(el.getVar(), exprRewriter.getResult()));
} else {
// push( new ElementAssign( el.getVar(), NodeValue.makeNode( n )) );
// no op
push(new ElementTriplesBlock());
}
}
@Override
public void visit(ElementBind el) {
Node n = changeNode(el.getVar());
if (n.equals(el.getVar())) {
ExprRewriter exprRewriter = new ExprRewriter(values);
el.getExpr().visit(exprRewriter);
push(new ElementBind(el.getVar(), exprRewriter.getResult()));
} else {
// push( new ElementBind( el.getVar(), NodeValue.makeNode( n )) );
// no op
push(new ElementTriplesBlock());
}
}
@Override
public void visit(ElementFind el) {
Node n = changeNode(el.getVar());
Triple triple = rewrite(el.getTriple());
if (n.equals(el.getVar())) {
push(new ElementFind(Var.alloc(n), triple));
} else {
ElementTriplesBlock etb = new ElementTriplesBlock();
etb.addTriple(triple);
push(etb);
}
}
@Override
public void visit(ElementData el) {
ElementData retval = new ElementData();
for (Var v : el.getVars()) {
retval.add(v);
}
for (Binding binding : el.getRows()) {
retval.add( binding );
}
push(retval);
}
@Override
public void visit(ElementUnion el) {
ElementUnion retval = new ElementUnion();
for (Element e : el.getElements()) {
e.visit(this);
retval.addElement(getResult());
}
push(retval);
}
@Override
public void visit(ElementOptional el) {
el.getOptionalElement().visit(this);
push(new ElementOptional(getResult()));
}
@Override
public void visit(ElementGroup el) {
ElementGroup retval = new ElementGroup();
for (Element e : el.getElements()) {
e.visit(this);
retval.addElement(getResult());
}
push(retval);
}
@Override
public void visit(ElementDataset el) {
Element pattern = null;
if (el.getElement() != null) {
el.getElement().visit(this);
pattern = getResult();
}
push(new ElementDataset(el.getDataset(), pattern));
}
@Override
public void visit(ElementNamedGraph el) {
Node n = el.getGraphNameNode();
if (n != null) {
n = changeNode(n);
}
el.getElement().visit(this);
push(new ElementNamedGraph(n, getResult()));
}
@Override
public void visit(ElementExists el) {
el.getElement().visit(this);
push(new ElementExists(getResult()));
}
@Override
public void visit(ElementNotExists el) {
el.getElement().visit(this);
push(new ElementNotExists(getResult()));
}
@Override
public void visit(ElementMinus el) {
el.getMinusElement().visit(this);
push(new ElementMinus(getResult()));
}
@Override
public void visit(ElementService el) {
el.getElement().visit(this);
push(new ElementService(changeNode(el.getServiceNode()), getResult(),
el.getSilent()));
}
@Override
public void visit(ElementSubQuery el) {
Query q = AbstractQueryBuilder.clone(el.getQuery());
push(new ElementSubQuery(AbstractQueryBuilder.rewrite(
q, values)));
}
}