java.lang.Object
org.aksw.jena_sparql_api.algebra.utils.OpUtils

public class OpUtils extends Object
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static VarUsage
    analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current)
     
    static VarUsage
    analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, Set<org.apache.jena.sparql.core.Var> availableVars)
     
    static VarUsage
    analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, VarUsageAnalyzerVisitor visitor)
    Maybe we need to change the method to is compatible(Tree tree, Op op, Set vars, boolean distinct) Analyze a node of a tree for which of its variables are required for evaluation in other portions of the query.
    static org.apache.jena.sparql.algebra.Op
    applyExtendProject(org.apache.jena.sparql.algebra.Op result, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.expr.Expr> map)
    Apply project and extend as needed
    static org.apache.jena.sparql.algebra.Op
    copy(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps)
     
    static org.apache.jena.sparql.algebra.Op
    copyOnChange(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps)
     
    static org.apache.jena.sparql.algebra.op.OpTable
    createEmptyTableUnionVars(org.apache.jena.sparql.algebra.Op... subOps)
     
    static org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op>
    createTree(org.apache.jena.sparql.algebra.Op rootOp)
     
    static org.apache.jena.sparql.algebra.Op
    extendWithVarMap(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.core.Var> oldToNew)
    Low level function that simply turns a var-map into an project(extend()) expression.
    org.apache.jena.sparql.algebra.Op
    factorize(org.apache.jena.sparql.algebra.Op op, com.google.common.collect.BiMap<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.algebra.Op> cxt, org.apache.jena.sparql.core.VarAlloc varAlloc, org.aksw.commons.util.algebra.ExprFilter<org.apache.jena.sparql.algebra.Op> isBlocker)
    Allocate a single variable for every unique expression.
    static org.aksw.commons.collections.generator.Generator<org.apache.jena.sparql.core.Var>
    freshVars(org.apache.jena.sparql.algebra.Op op)
     
    static String
     
     
    static List<org.apache.jena.sparql.algebra.Op>
    getSubOps(org.apache.jena.sparql.algebra.Op op)
     
    static List<org.apache.jena.sparql.algebra.Op>
    getUnionMembers(org.apache.jena.sparql.algebra.Op op)
     
    static Stream<org.apache.jena.sparql.algebra.Op>
    inOrderSearch(org.apache.jena.sparql.algebra.Op op, Predicate<org.apache.jena.sparql.algebra.Op> predicate)
     
    static boolean
    isEquivalent(org.apache.jena.sparql.algebra.Op a, org.apache.jena.sparql.algebra.Op b)
     
    static boolean
    isNoPattern(org.apache.jena.sparql.algebra.Op op)
    Test whether the given Op is an empty BGP or a unit table.
    static boolean
    isPatternFree(org.apache.jena.sparql.algebra.Op op)
    Traverses an op structure in order to determine whether it contains any concrete triple or quad patterns.
    static boolean
    isServiceFree(org.apache.jena.sparql.algebra.Op op)
     
    static boolean
    isServiceWithIri(org.apache.jena.sparql.algebra.Op op, String iri)
    Return true iff op is an OpService with the given iri
    static boolean
    isUnitTable(org.apache.jena.sparql.algebra.Op op)
     
    static Stream<org.apache.jena.sparql.algebra.Op>
    linearizePrefix(org.apache.jena.sparql.algebra.Op op)
     
    static Map<org.apache.jena.sparql.algebra.Op,org.apache.jena.sparql.algebra.Op>
    parentMap(org.apache.jena.sparql.algebra.Op rootOp)
    Traverse an op structure and create a map from each subOp to its immediate parent NOTE It must be ensured that common sub expressions are different objects, since we are using an identity hash map for mapping children to parents
    static org.apache.jena.sparql.algebra.Op
    project(org.apache.jena.sparql.algebra.Op op, Iterable<org.apache.jena.sparql.core.Var> vars)
     
    long
    size(org.apache.jena.sparql.algebra.Op op)
    Count the number of operators in an op expression TODO Add versions that support a predicate on whether to descend into an op, such as SERVICE
    static org.apache.jena.sparql.algebra.Op
    substitute(org.apache.jena.sparql.algebra.Op op, boolean descendIntoSubst, Function<? super org.apache.jena.sparql.algebra.Op,? extends org.apache.jena.sparql.algebra.Op> transformFn)
    Perform a top-down substitution
    static org.apache.jena.sparql.algebra.Op
    substitute(org.apache.jena.sparql.algebra.Op op, org.apache.jena.sparql.algebra.Op searchNode, org.apache.jena.sparql.algebra.Op newNode)
    In the expression op, find the node searchNode and replace it with newNode
    static org.apache.jena.sparql.algebra.Op
    toOp(Iterable<org.apache.jena.sparql.core.Quad> quads, BiFunction<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern,org.apache.jena.sparql.algebra.Op> opFactory)
    Suggested arguments for opFactory: OpQuadPattern::new OpUtils::toOpGraphTriples
    static org.apache.jena.sparql.algebra.Op
    toOp(Map<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern> map, BiFunction<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern,org.apache.jena.sparql.algebra.Op> opFactory)
     
    static org.apache.jena.sparql.algebra.Op
     
    static org.apache.jena.sparql.algebra.Op
     
    static org.apache.jena.sparql.algebra.Op
     
    static org.apache.jena.sparql.algebra.Op
    toOpGraphTriples(org.apache.jena.graph.Node graphNode, org.apache.jena.sparql.core.BasicPattern bgp)
     
    static Set<org.apache.jena.sparql.core.Var>
    visibleNamedVars(org.apache.jena.sparql.algebra.Op op)
    Like OpVars.visibleVars, but filters out non-named vars Filter out non-named vars
    static org.apache.jena.sparql.algebra.Op
    wrapWithProjection(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.core.Var> oldToNew)
    safe version of extend with varMap - renames any colliding var names Select (?o As ?s) (?s As ?o) { ?s ?p ?o } -> Select (?o as ?v1) (?s As ?v2) { ?s ?p ?o } -> Select (?v1 As ?s) (?v2 As ?o) { { Select (?o as ?v1) ...

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • OpUtils

      public OpUtils()
  • Method Details

    • getOpOps

      public static OpUtils.OpOps getOpOps()
    • createEmptyTableUnionVars

      public static org.apache.jena.sparql.algebra.op.OpTable createEmptyTableUnionVars(org.apache.jena.sparql.algebra.Op... subOps)
    • isNoPattern

      public static boolean isNoPattern(org.apache.jena.sparql.algebra.Op op)
      Test whether the given Op is an empty BGP or a unit table. Code copied / factored out from TransformQuadGraph
    • visibleNamedVars

      public static Set<org.apache.jena.sparql.core.Var> visibleNamedVars(org.apache.jena.sparql.algebra.Op op)
      Like OpVars.visibleVars, but filters out non-named vars Filter out non-named vars
      Parameters:
      op -
      Returns:
    • getUnionMembers

      public static List<org.apache.jena.sparql.algebra.Op> getUnionMembers(org.apache.jena.sparql.algebra.Op op)
    • extendWithVarMap

      public static org.apache.jena.sparql.algebra.Op extendWithVarMap(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.core.Var> oldToNew)
      Low level function that simply turns a var-map into an project(extend()) expression. It is recommended to use wrapWithProjection which deals with variable name clashes in the renaming.
      Parameters:
      subOp -
      oldToNew -
      Returns:
    • wrapWithProjection

      public static org.apache.jena.sparql.algebra.Op wrapWithProjection(org.apache.jena.sparql.algebra.Op subOp, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.core.Var> oldToNew)
      safe version of extend with varMap - renames any colliding var names Select (?o As ?s) (?s As ?o) { ?s ?p ?o } -> Select (?o as ?v1) (?s As ?v2) { ?s ?p ?o } -> Select (?v1 As ?s) (?v2 As ?o) { { Select (?o as ?v1) ... } }
      Parameters:
      subOp -
      oldToNew -
      Returns:
    • applyExtendProject

      public static org.apache.jena.sparql.algebra.Op applyExtendProject(org.apache.jena.sparql.algebra.Op result, Map<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.expr.Expr> map)
      Apply project and extend as needed
      Parameters:
      subOp -
      map -
      Returns:
    • size

      public long size(org.apache.jena.sparql.algebra.Op op)
      Count the number of operators in an op expression TODO Add versions that support a predicate on whether to descend into an op, such as SERVICE
      Parameters:
      op -
      Returns:
    • linearizePrefix

      public static Stream<org.apache.jena.sparql.algebra.Op> linearizePrefix(org.apache.jena.sparql.algebra.Op op)
    • freshVars

      public static org.aksw.commons.collections.generator.Generator<org.apache.jena.sparql.core.Var> freshVars(org.apache.jena.sparql.algebra.Op op)
    • substitute

      public static org.apache.jena.sparql.algebra.Op substitute(org.apache.jena.sparql.algebra.Op op, boolean descendIntoSubst, Function<? super org.apache.jena.sparql.algebra.Op,? extends org.apache.jena.sparql.algebra.Op> transformFn)
      Perform a top-down substitution
      Parameters:
      op -
      descendIntoSubst -
      opToSubst -
      Returns:
    • substitute

      public static org.apache.jena.sparql.algebra.Op substitute(org.apache.jena.sparql.algebra.Op op, org.apache.jena.sparql.algebra.Op searchNode, org.apache.jena.sparql.algebra.Op newNode)
      In the expression op, find the node searchNode and replace it with newNode
      Parameters:
      op -
      descendIntoSubst -
      searchNode -
      Returns:
    • getClassLabel

      public static String getClassLabel(Object o)
    • isEquivalent

      public static boolean isEquivalent(org.apache.jena.sparql.algebra.Op a, org.apache.jena.sparql.algebra.Op b)
    • parentMap

      public static Map<org.apache.jena.sparql.algebra.Op,org.apache.jena.sparql.algebra.Op> parentMap(org.apache.jena.sparql.algebra.Op rootOp)
      Traverse an op structure and create a map from each subOp to its immediate parent NOTE It must be ensured that common sub expressions are different objects, since we are using an identity hash map for mapping children to parents
      Parameters:
      op -
      Returns:
    • createTree

      public static org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> createTree(org.apache.jena.sparql.algebra.Op rootOp)
    • copyOnChange

      public static org.apache.jena.sparql.algebra.Op copyOnChange(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps)
    • copy

      public static org.apache.jena.sparql.algebra.Op copy(org.apache.jena.sparql.algebra.Op op, List<org.apache.jena.sparql.algebra.Op> subOps)
    • getSubOps

      public static List<org.apache.jena.sparql.algebra.Op> getSubOps(org.apache.jena.sparql.algebra.Op op)
    • isPatternFree

      public static boolean isPatternFree(org.apache.jena.sparql.algebra.Op op)
      Traverses an op structure in order to determine whether it contains any concrete triple or quad patterns. If no such pattern is found, the query is independent of a dataset and hence it can be evaluated e.g. against an empty in-memory model. TODO Maybe rephrase the condition as: An op is pattern free if there is no OpService and all leaf nodes are OpTable.
      Parameters:
      op -
      Returns:
    • inOrderSearch

      public static Stream<org.apache.jena.sparql.algebra.Op> inOrderSearch(org.apache.jena.sparql.algebra.Op op, Predicate<org.apache.jena.sparql.algebra.Op> predicate)
    • isServiceFree

      public static boolean isServiceFree(org.apache.jena.sparql.algebra.Op op)
    • isServiceWithIri

      public static boolean isServiceWithIri(org.apache.jena.sparql.algebra.Op op, String iri)
      Return true iff op is an OpService with the given iri
    • analyzeVarUsage

      public static VarUsage analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, VarUsageAnalyzerVisitor visitor)
      Maybe we need to change the method to is compatible(Tree tree, Op op, Set vars, boolean distinct) Analyze a node of a tree for which of its variables are required for evaluation in other portions of the query. Also keep track of which set of variables is affected by the first parent distinct operation. Note: A projection does not imply reference of a variable: A variable is only referenced if it is required for evaluating an expression or join, or if it is part of the final result. Scoping: If we have Extend(?x := ?o * 2, { ?s ?p ?o }) Then a reference of ?x implies a use of ?o So we can do bookkeeping with a multimap that maps each (possibly newly introduced) variable to the set of referenced original variables Goal: Given: View Query: Select Distinct ?s { ?s a Foo } User Query: Select Distinct ?s { { ?s a Foo } UNION { ?s a Bar } } support injecting the view query into the user query: Select Distinct ?s { viewRef(viewId, {?s}) UNION { ?s a Bar } } Note: If the User Query was without Distinct, there would be no match Distinct ( Project(?s ?o, Union ( BGP(?s a Foo), // As only ?s is projected and ?o is unbound, the distinct ?s trivially satisfies distinct ?s ?o BGP(?s ?p ?o), ) ) ) Variables that are used in aggregate expressions must not be distinct - unless there is an appropriate distinct sub op We could have: Select (?s as ?o) (?o As ?s) { ?s ?p ?o } (virtuoso 7.2 accepts this, but gets it wrong) In this case we would get the dependencies: { ?o -> { ?s }, ?s -> { ?o } } The thing we have to take care of is, that the extend node may 'kill' prior variable definitions
      Parameters:
      tree -
      current -
      Returns:
    • analyzeVarUsage

      public static VarUsage analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current)
    • analyzeVarUsage

      public static VarUsage analyzeVarUsage(org.aksw.commons.collections.trees.Tree<org.apache.jena.sparql.algebra.Op> tree, org.apache.jena.sparql.algebra.Op current, Set<org.apache.jena.sparql.core.Var> availableVars)
    • toOp

      public static org.apache.jena.sparql.algebra.Op toOp(QuadFilterPattern qfp)
    • toOp

      public static org.apache.jena.sparql.algebra.Op toOp(QuadFilterPatternCanonical qfpc)
    • project

      public static org.apache.jena.sparql.algebra.Op project(org.apache.jena.sparql.algebra.Op op, Iterable<org.apache.jena.sparql.core.Var> vars)
    • toOp

      public static org.apache.jena.sparql.algebra.Op toOp(ProjectedQuadFilterPattern pqfp)
    • toOpGraphTriples

      public static org.apache.jena.sparql.algebra.Op toOpGraphTriples(org.apache.jena.graph.Node graphNode, org.apache.jena.sparql.core.BasicPattern bgp)
    • toOp

      public static org.apache.jena.sparql.algebra.Op toOp(Map<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern> map, BiFunction<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern,org.apache.jena.sparql.algebra.Op> opFactory)
    • toOp

      public static org.apache.jena.sparql.algebra.Op toOp(Iterable<org.apache.jena.sparql.core.Quad> quads, BiFunction<org.apache.jena.graph.Node,org.apache.jena.sparql.core.BasicPattern,org.apache.jena.sparql.algebra.Op> opFactory)
      Suggested arguments for opFactory: OpQuadPattern::new OpUtils::toOpGraphTriples
      Parameters:
      quads -
      opFactory -
      Returns:
    • factorize

      public org.apache.jena.sparql.algebra.Op factorize(org.apache.jena.sparql.algebra.Op op, com.google.common.collect.BiMap<org.apache.jena.sparql.core.Var,org.apache.jena.sparql.algebra.Op> cxt, org.apache.jena.sparql.core.VarAlloc varAlloc, org.aksw.commons.util.algebra.ExprFilter<org.apache.jena.sparql.algebra.Op> isBlocker)
      Allocate a single variable for every unique expression. Main use case is common sub expression elimination.
    • isUnitTable

      public static boolean isUnitTable(org.apache.jena.sparql.algebra.Op op)