/** * Determines whether a sort condition is valid in terms of this optimizer * * @param cond * Sort Condition * @param projectVars * Project Variables * @return True if valid, false otherwise */ private boolean isValidSortCondition(SortCondition cond, List<Var> projectVars) { if (cond.getExpression().isVariable()) { return projectVars.contains(cond.getExpression().asVar()); } else { for (Var v : cond.getExpression().getVarsMentioned()) { if (!projectVars.contains(v)) return false; } return true; } } }
/** * Determines whether a sort condition is valid in terms of this optimizer * * @param cond * Sort Condition * @param projectVars * Project Variables * @return True if valid, false otherwise */ private boolean isValidSortCondition(SortCondition cond, Collection<Var> projectVars, Set<Var> seenVars) { if (cond.getExpression().isVariable()) { if (projectVars.contains(cond.getExpression().asVar())) { seenVars.add(cond.getExpression().asVar()); return true; } return false; } else { for (Var v : cond.getExpression().getVarsMentioned()) { if (!projectVars.contains(v)) return false; seenVars.add(v); } return true; } } }
public void addGroupBy(Var v, Expr expr) { if ( v == null ) v = allocInternVar() ; if ( expr.isVariable() && v.isAllocVar() ) { // It was (?x) with no AS - keep the name by adding by variable. addGroupBy(expr.asVar()) ; return ; } groupVars.add(v, expr) ; }
public void addGroupBy(Var v, Expr expr) { if ( v == null ) v = allocInternVar() ; if ( expr.isVariable() && v.isAllocVar() ) { // It was (?x) with no AS - keep the name by adding by variable. addGroupBy(expr.asVar()) ; return ; } groupVars.add(v, expr) ; }
private static Pair<Var, Var> preprocess(Op opLeft, Op opRight, Expr e) { if (!(e instanceof E_Equals) && !(e instanceof E_SameTerm)) return null; ExprFunction2 eq = (ExprFunction2) e; // An equals or same term implicit join Expr left = eq.getArg1(); Expr right = eq.getArg2(); if (!left.isVariable() || !right.isVariable()) { return null; } if (left.equals(right)) { return null; } // If neither variable is visible in RHS optimization does not apply Collection<Var> rhsVars = OpVars.visibleVars(opRight); if (!rhsVars.contains(left.asVar()) && !rhsVars.contains(right.asVar())) return null; if (e instanceof E_Equals) { // Is a safe equals for this optimization? Tuple<Set<Var>> varsByPosition = OpVars.mentionedVarsByPosition(opLeft, opRight); if (!isSafeEquals(varsByPosition, left.asVar(), right.asVar())) return null; } return Pair.create(left.asVar(), right.asVar()); }
private static Pair<Var, Var> preprocess(Op subOp, Expr e) { // TODO Should also handle the case of && as TransformImplicitLeftJoin // is already capable of doing if (!(e instanceof E_Equals) && !(e instanceof E_SameTerm)) return null; ExprFunction2 eq = (ExprFunction2) e; Expr left = eq.getArg1(); Expr right = eq.getArg2(); if (!left.isVariable() || !right.isVariable()) { return null; } if (left.equals(right)) { return null; } if (e instanceof E_Equals) { // Is a safe equals for this optimization? Tuple<Set<Var>> varsByPosition = OpVars.mentionedVarsByPosition(subOp); if (!isSafeEquals(varsByPosition, left.asVar(), right.asVar())) return null; } return Pair.create(left.asVar(), right.asVar()); }
private static Pair<Var, NodeValue> preprocess(Expr e) { if (!(e instanceof E_NotEquals)) return null; ExprFunction2 eq = (ExprFunction2) e; Expr left = eq.getArg1(); Expr right = eq.getArg2(); Var var = null; NodeValue constant = null; if (left.isVariable() && right.isConstant()) { var = left.asVar(); constant = right.getConstant(); } else if (right.isVariable() && left.isConstant()) { var = right.asVar(); constant = left.getConstant(); } if (var == null || constant == null) return null; // Final check for "!=" where a FILTER != can do value matching when the // graph does not. // Value based? if (!ARQ.isStrictMode() && constant.isLiteral()) return null; return Pair.create(var, constant); }
if ( expression.isVariable() || expression instanceof E_Function )
if ( expression.isVariable() || expression instanceof E_Function )
public void visit(ElementFilter el) { out.print("FILTER ") ; Expr expr = el.getExpr() ; FmtExpr v = new FmtExpr(out, context) ; // This assumes that complex expressions are bracketted // (parens) as necessary except for some cases: // Plain variable or constant boolean addParens = false ; if ( expr.isVariable() ) addParens = true ; if ( expr.isConstant() ) addParens = true ; if ( addParens ) out.print("( ") ; v.format(expr) ; if ( addParens ) out.print(" )") ; }
@Override public void visit(ElementFilter el) { out.print("FILTER ") ; Expr expr = el.getExpr() ; FmtExprSPARQL v = new FmtExprSPARQL(out, context) ; // This assumes that complex expressions are bracketted // (parens) as necessary except for some cases: // Plain variable or constant boolean addParens = false ; if ( expr.isVariable() ) addParens = true ; if ( expr.isConstant() ) addParens = true ; if ( addParens ) out.print("( ") ; v.format(expr) ; if ( addParens ) out.print(" )") ; }
NodeValue constant = null; if (left.isVariable() && right.isConstant()) { var = left.asVar(); constant = right.getConstant(); } else if (right.isVariable() && left.isConstant()) { var = right.asVar(); constant = left.getConstant();
NodeValue constant = null ; if ( left.isVariable() && right.isConstant() ) else if ( right.isVariable() && left.isConstant() )
@Override public QueryIterator exec(Binding binding, Node name, ExprList args, ExecutionContext execCxt) { // Eval if possible. ExprList evalArgs = new ExprList() ; for (Expr e : args) { if ( e.isVariable() ) { Var v = e.getExprVar().asVar() ; // Special case - allow unevaluated variables. if ( binding.contains(v) ) evalArgs.add(e.eval(binding, execCxt)) ; else evalArgs.add(e) ; } else { NodeValue x = e.eval(binding, execCxt) ; evalArgs.add(x) ; } } return execEval(binding, evalArgs, execCxt) ; }
@Override public QueryIterator exec(Binding binding, Node name, ExprList args, ExecutionContext execCxt) { // Eval if possible. ExprList evalArgs = new ExprList() ; for (Expr e : args) { if ( e.isVariable() ) { Var v = e.getExprVar().asVar() ; // Special case - allow unevaluated variables. if ( binding.contains(v) ) evalArgs.add(e.eval(binding, execCxt)) ; else evalArgs.add(e) ; } else { NodeValue x = e.eval(binding, execCxt) ; evalArgs.add(x) ; } } return execEval(binding, evalArgs, execCxt) ; }
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) ; } }
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) ; } }
SortCondition scBuilder(Item item) { int direction = Query.ORDER_DEFAULT ; if ( item.isTagged("asc") || item.isTagged("desc") ) { BuilderLib.checkList(item) ; BuilderLib.checkLength(2, item.getList(), "Direction corrupt") ; if ( item.isTagged("asc") ) direction = Query.ORDER_ASCENDING ; else direction = Query.ORDER_DESCENDING ; item = item.getList().get(1) ; } Expr expr = BuilderExpr.buildExpr(item) ; if ( expr.isVariable() ) return new SortCondition(expr.getExprVar().asVar(), direction) ; else return new SortCondition(expr, direction) ; }
SortCondition scBuilder(Item item) { int direction = Query.ORDER_DEFAULT ; if ( item.isTagged("asc") || item.isTagged("desc") ) { BuilderLib.checkList(item) ; BuilderLib.checkLength(2, item.getList(), "Direction corrupt") ; if ( item.isTagged("asc") ) direction = Query.ORDER_ASCENDING ; else direction = Query.ORDER_DESCENDING ; item = item.getList().get(1) ; } Expr expr = BuilderExpr.buildExpr(item) ; if ( expr.isVariable() ) return new SortCondition(expr.getExprVar().asVar(), direction) ; else return new SortCondition(expr, direction) ; }
else if ( expr.isVariable() ) needParens = false ;