@Override public ZeroLengthPath clone() { ZeroLengthPath clone = (ZeroLengthPath)super.clone(); clone.setSubjectVar(getSubjectVar().clone()); clone.setObjectVar(getObjectVar().clone()); if (getContextVar() != null) { clone.setContextVar(getContextVar().clone()); } return clone; } }
@Override public Set<String> getBindingNames() { return getAssuredBindingNames(); }
@Override public boolean equals(Object other) { if (other instanceof ZeroLengthPath) { ZeroLengthPath o = (ZeroLengthPath)other; return subjectVar.equals(o.getSubjectVar()) && objectVar.equals(o.getObjectVar()) && nullEquals(contextVar, o.getContextVar()) && scope.equals(o.getScope()); } return false; }
/** * Creates a zero-length path that matches a subject-, predicate-, object- and context variable against * statements from the specified context scope. */ public ZeroLengthPath(Scope scope, Var subjVar, Var objVar, Var conVar) { setScope(scope); setSubjectVar(subjVar); setObjectVar(objVar); setContextVar(conVar); }
@Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { if (subjectVar == current) { setSubjectVar((Var)replacement); } else if (objectVar == current) { setObjectVar((Var)replacement); } else if (contextVar == current) { setContextVar((Var)replacement); } else { super.replaceChildNode(current, replacement); } }
@Override public void meet(ZeroLengthPath node) { Var subjVar = node.getSubjectVar(); Var objVar = node.getObjectVar(); if ((subjVar != null && subjVar.hasValue()) || (objVar != null && objVar.hasValue())) { // subj = obj cardinality = 1.0; } else { // actual cardinality = count(union(subjs, objs)) // but cost is equivalent to ?s ?p ?o ?c (impl scans all statements) // so due to the lower actual cardinality we value it in preference to a fully unbound statement pattern. cardinality = getSubjectCardinality(subjVar) * getObjectCardinality(objVar) * getContextCardinality(node.getContextVar()); } }
/** * Check whether any solution for the {@link StatementPattern} could be derived from * reflexive property inference, and if so, replace the pattern with a union of itself and the * reflexive solution. */ @Override protected void meetSP(StatementPattern node) throws Exception { // Only applies when the predicate is defined and reflexive final Var predVar = node.getPredicateVar(); if (predVar.getValue() != null && inferenceEngine.isReflexiveProperty((IRI) predVar.getValue())) { final StatementPattern originalSP = node.clone(); // The reflexive solution is a ZeroLengthPath between subject and // object: they can be matched to one another, whether constants or // variables. final Var subjVar = node.getSubjectVar(); final Var objVar = node.getObjectVar(); final ZeroLengthPath reflexiveSolution = new ZeroLengthPath(subjVar, objVar); node.replaceWith(new InferUnion(originalSP, reflexiveSolution)); } } }
public List<Var> getVarList() { return getVars(new ArrayList<>(4)); }
cardinalityMap.put(tupleExpr, statistics.getCardinality(tupleExpr)); if (tupleExpr instanceof ZeroLengthPath) { varsMap.put(tupleExpr, ((ZeroLengthPath)tupleExpr).getVarList());
@Override public void meet(ZeroLengthPath node) { Var subjVar = node.getSubjectVar(); Var objVar = node.getObjectVar(); if ((subjVar != null && subjVar.hasValue()) || (objVar != null && objVar.hasValue())) { // subj = obj cardinality = 1.0; } else { // actual cardinality = count(union(subjs, objs)) // but cost is equivalent to ?s ?p ?o ?c (impl scans all statements) // so due to the lower actual cardinality we value it in preference to a fully unbound statement pattern. cardinality = getSubjectCardinality(subjVar) * getObjectCardinality(objVar) * getContextCardinality(node.getContextVar()); } }
return new ZeroLengthPath(scope, subjVar, endVar, contextVar); return new ZeroLengthPath(scope, subjVar, endVar, contextVar);
/** * Creates a zero-length path that matches a subject-, predicate-, object- and context variable against * statements from the specified context scope. */ public ZeroLengthPath(Scope scope, Var subjVar, Var objVar, Var conVar) { setScope(scope); setSubjectVar(subjVar); setObjectVar(objVar); setContextVar(conVar); }
@Override public void replaceChildNode(QueryModelNode current, QueryModelNode replacement) { if (subjectVar == current) { setSubjectVar((Var)replacement); } else if (objectVar == current) { setObjectVar((Var)replacement); } else if (contextVar == current) { setContextVar((Var)replacement); } else { super.replaceChildNode(current, replacement); } }
public List<Var> getVarList() { return getVars(new ArrayList<Var>(4)); }
cardinalityMap.put(tupleExpr, statistics.getCardinality(tupleExpr)); if (tupleExpr instanceof ZeroLengthPath) { varsMap.put(tupleExpr, ((ZeroLengthPath)tupleExpr).getVarList());
public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(ZeroLengthPath zlp, final BindingSet bindings) throws QueryEvaluationException { final Var subjectVar = zlp.getSubjectVar(); final Var objVar = zlp.getObjectVar(); final Var contextVar = zlp.getContextVar(); Value subj = null; try { subj = evaluate(subjectVar, bindings); } catch (QueryEvaluationException e) { } Value obj = null; try { obj = evaluate(objVar, bindings); } catch (QueryEvaluationException e) { } if (subj != null && obj != null) { if (!subj.equals(obj)) { return new EmptyIteration<BindingSet, QueryEvaluationException>(); } } return getZeroLengthPathIterator(bindings, subjectVar, objVar, contextVar, subj, obj); }
@Override public ZeroLengthPath clone() { ZeroLengthPath clone = (ZeroLengthPath)super.clone(); clone.setSubjectVar(getSubjectVar().clone()); clone.setObjectVar(getObjectVar().clone()); if (getContextVar() != null) { clone.setContextVar(getContextVar().clone()); } return clone; } }
@Override public boolean equals(Object other) { if (other instanceof ZeroLengthPath) { ZeroLengthPath o = (ZeroLengthPath)other; return subjectVar.equals(o.getSubjectVar()) && objectVar.equals(o.getObjectVar()) && nullEquals(contextVar, o.getContextVar()) && scope.equals(o.getScope()); } return false; }
return new ZeroLengthPath(scope, subjVar, endVar, contextVar); return new ZeroLengthPath(scope, subjVar, endVar, contextVar);
public Set<String> getBindingNames() { return getAssuredBindingNames(); }