protected Element transformation(Element element, ElementTransform transform, ExprTransform exprTransform, ElementVisitor beforeVisitor, ElementVisitor afterVisitor) { ApplyElementTransformVisitor v = new ApplyElementTransformVisitor(transform, exprTransform) ; return transformation(v, element, beforeVisitor, afterVisitor) ; }
@Override public void visit(ElementNamedGraph el) { Node n = el.getGraphNameNode() ; Node n1 = transformNode(n) ; Element elt1 = pop() ; Element el2 = transform.transform(el, n1, elt1) ; push(el2) ; }
/** The primitive operation to apply a transformation to an Op */ protected Element applyTransformation(ApplyElementTransformVisitor transformApply, Element element, ElementVisitor beforeVisitor, ElementVisitor afterVisitor) { ElementWalker.walk(element, transformApply, beforeVisitor, afterVisitor) ; Element r = transformApply.result() ; return r ; }
@Override public void visit(ElementExists el) { Element elt = el.getElement() ; Element elt1 = subElement(elt) ; Element el2 = transform.transform(el, elt1) ; push(el2) ; }
@Override public void visit(ElementUnion el) { ElementUnion newElt = new ElementUnion() ; transformFromTo(el.getElements(), newElt.getElements()) ; Element el2 = transform.transform(el, newElt.getElements()) ; push(el2) ; }
@Override public void visit(ElementFilter el) { Expr expr = el.getExpr() ; Expr expr2 = transformExpr(expr, exprTransform) ; Element el2 = transform.transform(el, expr2) ; push(el2) ; }
@Override public void visit(ElementPathBlock el) { Element el2 = transform.transform(el) ; push(el2) ; }
private boolean transformFromTo(List<Element> elts, List<Element> elts2) { boolean changed = false ; for (Element elt : elts) { Element elt2 = pop() ; changed = (changed || (elt != elt2)) ; // Add reversed. elts2.add(0, elt2) ; } return changed ; }
@Override public void visit(ElementGroup el) { ElementGroup newElt = new ElementGroup() ; transformFromTo(el.getElements(), newElt.getElements()) ; Element el2 = transform.transform(el, newElt.getElements()) ; push(el2) ; }
@Override public void visit(ElementNotExists el) { Element elt = el.getElement() ; Element elt1 = subElement(elt) ; Element el2 = transform.transform(el, elt1) ; push(el2) ; }
@Override public void visit(ElementData el) { Element el2 = transform.transform(el) ; push(el2) ; }
private Element subElement(Element elt) { ElementWalker.walk(elt, this) ; Element elt1 = pop() ; return elt1 ; }
@Override public void visit(ElementService el) { Node n = el.getServiceNode() ; Node n1 = transformNode(n) ; Element elt1 = pop() ; Element el2 = transform.transform(el, n1, elt1) ; push(el2) ; }
@Override public void visit(ElementTriplesBlock el) { Element el2 = transform.transform(el) ; push(el2) ; }
final Element result() { if ( stack.size() != 1 ) Log.warn(this, "Stack is not aligned") ; return pop() ; }
@Override public void visit(ElementSubQuery el) { Query newQuery = QueryTransformOps.transform(el.getQuery(), transform, exprTransform) ; push(new ElementSubQuery(newQuery)) ; }
@Override public void visit(ElementBind el) { Var v = el.getVar() ; Var v1 = TransformElementLib.applyVar(v, exprTransform) ; Expr expr = el.getExpr() ; Expr expr1 = ExprTransformer.transform(exprTransform, expr) ; Element el2 = transform.transform(el, v1, expr1 ) ; push(el2) ; }