public static Query asQuery(Op op) { Query query = QueryFactory.make() ; Converter v = new Converter(query) ; //OpWalker.walk(op, v) ; op.visit(v) ; List<Var> vars = v.projectVars; query.setQueryResultStar(vars.isEmpty()); // SELECT * unless we are projecting Iterator<Var> iter = vars.iterator(); for (; iter.hasNext();) { Var var = iter.next(); if (v.varExpression.containsKey(var)) query.addResultVar(var, v.varExpression.get(var)); else query.addResultVar(var); } ElementGroup eg = v.currentGroup ; query.setQueryPattern(eg) ; query.setQuerySelectType() ; query.setResultVars() ; return query ; }
public void visit(OpSequence opSequence) { ElementGroup g = currentGroup() ; boolean nestGroup = ! g.isEmpty() ; if ( nestGroup ) { startSubGroup() ; g = currentGroup() ; } Iterator<Op> iter = opSequence.iterator() ; for ( ; iter.hasNext() ; ) { Op op = iter.next() ; Element e = asElement(op) ; g.addElement(e) ; } if ( nestGroup ) endSubGroup() ; return ; }
Element asElement(Op op) { ElementGroup g = asElementGroup(op) ; if ( g.getElements().size() == 1 ) return g.getElements().get(0) ; return g ; }
if (inTopLevel()) { if (groupDepth == 0 || inGroupRecombine(opExtend)) { if (!inGroupRecombine(opExtend)) { } else { Element elt = new ElementBind(v, tr) ; ElementGroup g = currentGroup() ; g.addElement(elt); ElementGroup g = currentGroup() ; g.addElement(elt) ;
public void visit(OpAssign opAssign) { /** * Special case: group involves and internal assignment * e.g. (assign ((?.1 ?.0)) (group () ((?.0 (count))) * We attempt to intercept that here. */ if (opAssign.getSubOp() instanceof OpGroup) { Map<Var, Var> subs = new HashMap<Var, Var>(); Expr exp; for (Var v: opAssign.getVarExprList().getVars()) { exp = opAssign.getVarExprList().getExpr(v); if (exp.isVariable()) subs.put(exp.asVar(), v); else throw new ARQNotImplemented("Expected simple assignment for group"); } visit((OpGroup) opAssign.getSubOp(), subs); return; } opAssign.getSubOp().visit(this) ; for ( Var v : opAssign.getVarExprList().getVars() ) { Element elt = new ElementAssign(v, opAssign.getVarExprList().getExpr(v)) ; ElementGroup g = currentGroup() ; g.addElement(elt) ; } }
public void visit(OpExtend opExtend) { /** * Special case: group involves and internal assignment * e.g. (assign ((?.1 ?.0)) (group () ((?.0 (count))) * We attempt to intercept that here. */ if (opExtend.getSubOp() instanceof OpGroup) { Map<Var, Var> subs = new HashMap<Var, Var>(); Expr exp; for (Var v: opExtend.getVarExprList().getVars()) { exp = opExtend.getVarExprList().getExpr(v); if (exp.isVariable()) subs.put(exp.asVar(), v); else throw new ARQNotImplemented("Expected simple assignment for group"); } visit((OpGroup) opExtend.getSubOp(), subs); return; } opExtend.getSubOp().visit(this) ; for ( Var v : opExtend.getVarExprList().getVars() ) { Element elt = new ElementAssign(v, opExtend.getVarExprList().getExpr(v)) ; ElementGroup g = currentGroup() ; g.addElement(elt) ; } }
if (inTopLevel()) { if (!inGroupRecombine(opAssign)) { } else { Element elt = new ElementAssign(v, e) ; ElementGroup g = currentGroup() ; g.addElement(elt) ;
@Override public void visit(OpUnion opUnion) { Element eLeft = asElementGroup(opUnion.getLeft()) ; Element eRight = asElementGroup(opUnion.getRight()) ; if ( eLeft instanceof ElementUnion ) { ElementUnion elUnion = (ElementUnion)eLeft ; elUnion.addElement(eRight) ; return ; } // if ( eRight instanceof ElementUnion ) // { // ElementUnion elUnion = (ElementUnion)eRight ; // elUnion.getElements().add(0, eLeft) ; // return ; // } ElementUnion elUnion = new ElementUnion() ; elUnion.addElement(eLeft) ; elUnion.addElement(eRight) ; currentGroup().addElement(elUnion) ; }
@Override public void visit(OpProject opProject) { if (inProject) { // If we've already inside a project then we are reconstructing a sub-query // Create a new converter and call on the sub-op to get the sub-query Converter subConverter = new Converter(opProject); ElementSubQuery subQuery = new ElementSubQuery(subConverter.convert()); ElementGroup g = currentGroup(); g.addElement(subQuery); } else { // Defer adding result vars until the end. // OpGroup generates dupes otherwise this.projectVars = allocProjectVars() ; this.projectVars.addAll(opProject.getVars()); inProject = true; opProject.getSubOp().visit(this) ; inProject = false; } }
public void visit(OpUnion opUnion) { Element eLeft = asElementGroup(opUnion.getLeft()) ; Element eRight = asElementGroup(opUnion.getRight()) ; if ( eLeft instanceof ElementUnion ) { ElementUnion elUnion = (ElementUnion)eLeft ; elUnion.addElement(eRight) ; return ; } // if ( eRight instanceof ElementUnion ) // { // ElementUnion elUnion = (ElementUnion)eRight ; // elUnion.getElements().add(0, eLeft) ; // return ; // } ElementUnion elUnion = new ElementUnion() ; elUnion.addElement(eLeft) ; elUnion.addElement(eRight) ; currentGroup().addElement(elUnion) ; }
@Override public void visit(OpSequence opSequence) { ElementGroup g = currentGroup() ; boolean nestGroup = ! g.isEmpty() ; if ( nestGroup ) { startSubGroup() ; g = currentGroup() ; } for ( Op op : opSequence.getElements() ) { Element e = asElement(op) ; g.addElement(e) ; } if ( nestGroup ) endSubGroup() ; return ; }
@Override public void visit(OpQuadPattern quadPattern) { Node graphNode = quadPattern.getGraphNode(); if (graphNode.equals(Quad.defaultGraphNodeGenerated)) { currentGroup().addElement(process(quadPattern.getBasicPattern())) ; } else { startSubGroup(); Element e = asElement(new OpBGP(quadPattern.getBasicPattern())) ; endSubGroup(); //If not element group make it one if (!(e instanceof ElementGroup)) { ElementGroup g = new ElementGroup(); g.addElement(e); e = g; } Element graphElt = new ElementNamedGraph(graphNode, e) ; currentGroup().addElement(graphElt) ; } }
@Override public void visit(OpLeftJoin opLeftJoin) { Element eLeft = asElement(opLeftJoin.getLeft()) ; ElementGroup eRight = asElementGroup(opLeftJoin.getRight()) ; if ( opLeftJoin.getExprs() != null ) { for ( Expr expr : opLeftJoin.getExprs() ) { ElementFilter f = new ElementFilter(expr) ; eRight.addElement(f) ; } } ElementGroup g = currentGroup() ; if ( ! emptyGroup(eLeft) ) g.addElement(eLeft) ; ElementOptional opt = new ElementOptional(eRight) ; g.addElement(opt) ; }
public void visit(OpLeftJoin opLeftJoin) { Element eLeft = asElement(opLeftJoin.getLeft()) ; ElementGroup eRight = asElementGroup(opLeftJoin.getRight()) ; if ( opLeftJoin.getExprs() != null ) { for ( Expr expr : opLeftJoin.getExprs() ) { ElementFilter f = new ElementFilter(expr) ; eRight.addElement(f) ; } } ElementGroup g = currentGroup() ; if ( ! emptyGroup(eLeft) ) g.addElement(eLeft) ; ElementOptional opt = new ElementOptional(eRight) ; g.addElement(opt) ; }
@Override public void visit(OpFilter opFilter) { // (filter .. (filter ( ... )) (non-canonicalizing OpFilters) // Inner gets Grouped unnecessarily. Element e = asElement(opFilter.getSubOp()) ; if ( currentGroup() != e ) currentGroup().addElement(e) ; element = currentGroup() ; // Was cleared by asElement. ExprList exprs = opFilter.getExprs() ; for ( Expr expr : exprs ) { ElementFilter f = new ElementFilter(expr) ; currentGroup().addElement(f) ; } }
@Override public void visit(OpTable opTable) { // This will go in a group so simply forget it. if ( opTable.isJoinIdentity() ) return ; // Put in a VALUES // This may be related to the grpup of the overall query. ElementData el = new ElementData() ; el.getVars().addAll(opTable.getTable().getVars()) ; QueryIterator qIter = opTable.getTable().iterator(null) ; while(qIter.hasNext()) el.getRows().add(qIter.next()) ; qIter.close() ; currentGroup().addElement(el) ; }
public void visit(OpFilter opFilter) { // (filter .. (filter ( ... )) (non-canonicalizing OpFilters) // Inner gets Grouped unnecessarily. Element e = asElement(opFilter.getSubOp()) ; if ( currentGroup() != e ) currentGroup().addElement(e) ; element = currentGroup() ; // Was cleared by asElement. ExprList exprs = opFilter.getExprs() ; for ( Expr expr : exprs ) { ElementFilter f = new ElementFilter(expr) ; currentGroup().addElement(f) ; } }
public void visit(OpTriple opTriple) { currentGroup().addElement(process(opTriple.getTriple())) ; }
@Override public void visit(OpGraph opGraph) { startSubGroup() ; Element e = asElement(opGraph.getSubOp()) ; endSubGroup() ; //If not element group make it one if (!(e instanceof ElementGroup)) { ElementGroup g = new ElementGroup(); g.addElement(e); e = g; } Element graphElt = new ElementNamedGraph(opGraph.getNode(), e) ; currentGroup().addElement(graphElt) ; }
@Override public void visit(OpTriple opTriple) { currentGroup().addElement(process(opTriple.getTriple())) ; }