This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit a6abb2b21a2e31c262fbb6b675614258a1a3ffd1 Author: Andy Seaborne <[email protected]> AuthorDate: Sun Jan 12 12:21:10 2025 +0000 Re-org creation of ExecutionContexts --- .../org/apache/jena/sparql/core/VarExprList.java | 4 +- .../jena/sparql/engine/ExecutionContext.java | 102 ++++- .../jena/sparql/engine/iterator/QueryIterRoot.java | 13 +- .../apache/jena/sparql/engine/main/OpExecutor.java | 2 +- .../jena/sparql/engine/main/QueryEngineMain.java | 32 +- .../engine/main/iterator/QueryIterGraph.java | 2 +- .../jena/sparql/engine/ref/QueryEngineRef.java | 4 +- .../org/apache/jena/sparql/engine/ref/RefEval.java | 10 +- .../apache/jena/sparql/expr/ExprFunctionOp.java | 6 +- .../apache/jena/sparql/path/eval/PathEngine.java | 5 +- .../org/apache/jena/sparql/util/ExprUtils.java | 2 +- .../org/apache/jena/riot/out/TestNodeFmtLib.java | 1 - .../sparql/engine/iterator/TestCancelDistinct.java | 22 +- .../iterator/TestDistinctDataBagLimited.java | 2 +- .../sparql/engine/iterator/TestDistinctMem.java | 3 +- .../sparql/engine/iterator/TestQueryIterSort.java | 449 ++++++++++----------- .../iterator/TestSortedDataBagCancellation.java | 41 +- .../jena/sparql/engine/join/TestTableJoin.java | 34 +- .../org/apache/jena/sparql/expr/TestCastXSD.java | 14 +- .../java/org/apache/jena/sparql/path/TestPath.java | 137 ++++--- jena-cmds/src/main/java/arq/qexpr.java | 2 +- 21 files changed, 468 insertions(+), 419 deletions(-) diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java index f2b4336d83..4df9d91cbb 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/VarExprList.java @@ -124,6 +124,8 @@ public class VarExprList { } public void add(Var var) { + if ( var == null ) + throw new ARQInternalErrorException("Attempt to add a null variable"); // Checking here controls whether duplicate variables are allowed. // Duplicates with expressions are not allowed (add(Var, Expr)) // See ARQ.allowDuplicateSelectColumns @@ -140,8 +142,6 @@ public class VarExprList { return; } - if ( var == null ) - throw new ARQInternalErrorException("Attempt to add a named expression with a null variable"); if ( exprs.containsKey(var) ) throw new ARQInternalErrorException("Attempt to assign an expression again"); add(var); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ExecutionContext.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ExecutionContext.java index a79eea860b..ee35044470 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ExecutionContext.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ExecutionContext.java @@ -27,7 +27,7 @@ import org.apache.jena.atlas.iterator.Iter; import org.apache.jena.graph.Graph; import org.apache.jena.query.ARQ; import org.apache.jena.sparql.core.DatasetGraph; -import org.apache.jena.sparql.engine.main.OpExecutor; +import org.apache.jena.sparql.core.DatasetGraphFactory; import org.apache.jena.sparql.engine.main.OpExecutorFactory; import org.apache.jena.sparql.engine.main.QC; import org.apache.jena.sparql.function.FunctionEnv; @@ -49,6 +49,12 @@ public class ExecutionContext implements FunctionEnv private final AtomicBoolean cancelSignal; /** Clone */ + public static ExecutionContext copy(ExecutionContext other) { + return new ExecutionContext(other); + } + + /** @deprecated Use {@link #copy(ExecutionContext)} */ + @Deprecated public ExecutionContext(ExecutionContext other) { this.context = other.context; this.dataset = other.dataset; @@ -59,27 +65,105 @@ public class ExecutionContext implements FunctionEnv this.cancelSignal = other.cancelSignal; } + /** Create ExecutionContext from {@link FunctionEnv} */ + public static ExecutionContext fromFunctionEnv(FunctionEnv functionEnv) { + return new ExecutionContext(functionEnv); + } + + private ExecutionContext(FunctionEnv other) { + this.context = other.getContext(); + this.dataset = other.getDataset(); + this.openIterators = new ArrayList<>(); + if ( TrackAllIterators ) + this.allIterators = new ArrayList<>(); + else + this.allIterators = null; + this.activeGraph = other.getActiveGraph(); + this.executor = QC.getFactory(context); + this.cancelSignal = Context.getCancelSignal(context); + } + /** Clone and change active graph - shares tracking */ + public static ExecutionContext copyChangeActiveGraph(ExecutionContext other, Graph activeGraph) { + return new ExecutionContext(other, activeGraph); + } + + /** + * Clone and change active graph - shares tracking + * @deprecated Use {@link #copyChangeActiveGraph(ExecutionContext, Graph)}. + */ + @Deprecated public ExecutionContext(ExecutionContext other, Graph activeGraph) { this(other); this.activeGraph = activeGraph; } - /** Setup with defaults of global settings */ + /** + * ExecutionContext for normal execution over a dataset, with defaults for + * {@link Context} and {@link OpExecutorFactory}. + */ + public static ExecutionContext create(DatasetGraph dataset) { + Context cxt = ARQ.getContext().copy(); + return create(dataset, cxt); + } + + /** + * ExecutionContext for normal execution over a dataset, with defaults for + * {@link Context} and {@link OpExecutorFactory}. + */ + public static ExecutionContext create(DatasetGraph dataset, Context context) { + Graph dftGraph = (dataset == null) ? null : dataset.getDefaultGraph(); + return new ExecutionContext(context, + dftGraph, dataset, + QC.getFactory(context), + Context.getCancelSignal(context)); + } + + /** + * ExecutionContext for normal execution over a graph, with defaults for + * {@link Context} and {@link OpExecutorFactory}. + */ + public static ExecutionContext createForGraph(Graph graph) { + Context cxt = ARQ.getContext().copy(); + return createForGraph(graph, cxt); + } + + /** + * ExecutionContext for normal execution over a graph. + */ + public static ExecutionContext createForGraph(Graph graph, Context cxt) { + DatasetGraph dsg = (graph == null) ? null : DatasetGraphFactory.wrap(graph); + return create(dsg, cxt); + } + + // ---- Previous generation - constructors + + /** + * Setup with defaults of global settings + * @deprecated Use {@link #create(DatasetGraph)} + * */ + @Deprecated(forRemoval = true) public ExecutionContext(DatasetGraph dataset) { this(dataset, QC.getFactory(ARQ.getContext())); } - /** Setup with defaults of global settings but explicit {@link OpExecutor} factory. */ + /** Setup with defaults of global settings but explicit {@link OpExecutorFactory}. + * @deprecated Use {@link #create(DatasetGraph)} + */ + @Deprecated(forRemoval = true) public ExecutionContext(DatasetGraph dataset, OpExecutorFactory factory) { this(ARQ.getContext().copy(), dataset.getDefaultGraph(), dataset, factory); } + /** @deprecated Use a "create" function where possible. */ + @Deprecated public ExecutionContext(Context params, Graph activeGraph, DatasetGraph dataset, OpExecutorFactory factory) { this(params, activeGraph, dataset, factory, Context.getCancelSignal(params)); } - private ExecutionContext(Context params, Graph activeGraph, DatasetGraph dataset, OpExecutorFactory factory, AtomicBoolean cancelSignal) { + /** @deprecated This will be changed to be private. */ + @Deprecated + public ExecutionContext(Context params, Graph activeGraph, DatasetGraph dataset, OpExecutorFactory factory, AtomicBoolean cancelSignal) { this.context = params; this.dataset = dataset; this.openIterators = new ArrayList<>(); @@ -90,10 +174,16 @@ public class ExecutionContext implements FunctionEnv this.cancelSignal = cancelSignal; } + // ---- Previous generation - constructors + @Override - public Context getContext() { return context; } + public Context getContext() { + return context; + } - public AtomicBoolean getCancelSignal() { return cancelSignal; } + public AtomicBoolean getCancelSignal() { + return cancelSignal; + } public void openIterator(QueryIterator qIter) { openIterators.add(qIter); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java index 20cffdd9e0..2cee074fa9 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/iterator/QueryIterRoot.java @@ -25,18 +25,17 @@ import org.apache.jena.sparql.engine.binding.Binding ; import org.apache.jena.sparql.engine.binding.BindingRoot ; import org.apache.jena.sparql.serializer.SerializationContext ; -/** The root binding is one-row, usually no columns making it the join identity. - * It has columns only for an initial binding. +/** The root binding is one-row and has no columns making it the join identity. * It is useful to be able to spot it before having to activate a {@link QueryIterator}. - * Executing with a pre-set binding does not use QueryIterRoot. + * Executing with a pre-set binding does not use {@code QueryIterRoot}. */ -public class QueryIterRoot extends QueryIterYieldN +public class QueryIterRoot extends QueryIterYieldN // Not "extends QueryIterSingleton" so we don't get its factory statics. { - /** Create a root */ + /** Create a root */ public static QueryIterator create(ExecutionContext execCxt) { return create(BindingRoot.create(), execCxt) ; } - + /** Create a root with an initial binding */ public static QueryIterator create(Binding binding, ExecutionContext execCxt) { return new QueryIterRoot(binding, execCxt) ; } @@ -52,7 +51,7 @@ public class QueryIterRoot extends QueryIterYieldN else out.print("QueryIterRoot: "+binding); } - + @Override public boolean isJoinIdentity() { return binding.isEmpty(); } } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java index 8e015e7a9a..a659b6c4da 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java @@ -145,7 +145,7 @@ public class OpExecutor { // default graph and union graph. if ( Quad.isDefaultGraph(gn) ) { - ExecutionContext cxt2 = new ExecutionContext(execCxt, execCxt.getDataset().getDefaultGraph()); + ExecutionContext cxt2 = ExecutionContext.copyChangeActiveGraph(execCxt, execCxt.getDataset().getDefaultGraph()); return execute(subOp, input, cxt2); } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java index 34edd9f836..5297e05615 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java @@ -33,24 +33,24 @@ import org.apache.jena.sparql.util.Context ; public class QueryEngineMain extends QueryEngineBase { - static public QueryEngineFactory getFactory() { return factory ; } + static public QueryEngineFactory getFactory() { return factory ; } static public void register() { QueryEngineRegistry.addFactory(factory) ; } static public void unregister() { QueryEngineRegistry.removeFactory(factory) ; } public QueryEngineMain(Op op, DatasetGraph dataset, Binding input, Context context) { super(op, dataset, input, context) ; } - + public QueryEngineMain(Query query, DatasetGraph dataset, Binding input, Context context) - { + { super(query, dataset, input, context) ; } - + @Override public QueryIterator eval(Op op, DatasetGraph dsg, Binding input, Context context) { - ExecutionContext execCxt = new ExecutionContext(context, dsg.getDefaultGraph(), dsg, QC.getFactory(context)) ; - QueryIterator qIter1 = - ( input.isEmpty() ) ? QueryIterRoot.create(execCxt) + ExecutionContext execCxt = ExecutionContext.create(dsg, context); + QueryIterator qIter1 = + ( input.isEmpty() ) ? QueryIterRoot.create(execCxt) : QueryIterRoot.create(input, execCxt); QueryIterator qIter = QC.execute(op, qIter1, execCxt) ; // Wrap with something to check for closed iterators. @@ -60,27 +60,27 @@ public class QueryEngineMain extends QueryEngineBase qIter = QueryIteratorTiming.time(qIter) ; return qIter ; } - + @Override protected Op modifyOp(Op op) - { + { if ( context.isFalse(ARQ.optimization) ) return minimalModifyOp(op) ; return Algebra.optimize(op, super.context) ; } - + protected Op minimalModifyOp(Op op) { return Optimize.minimalOptimizationFactory.create(context).rewrite(op); } - + // -------- Factory - + private static QueryEngineFactory factory = new QueryEngineMainFactory() ; - + protected static class QueryEngineMainFactory implements QueryEngineFactory { @Override - public boolean accept(Query query, DatasetGraph dataset, Context context) + public boolean accept(Query query, DatasetGraph dataset, Context context) { return true ; } @Override @@ -89,9 +89,9 @@ public class QueryEngineMain extends QueryEngineBase QueryEngineMain engine = new QueryEngineMain(query, dataset, input, context) ; return engine.getPlan() ; } - + @Override - public boolean accept(Op op, DatasetGraph dataset, Context context) + public boolean accept(Op op, DatasetGraph dataset, Context context) { return true ; } @Override diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java index 2c3e52434e..4a089702d0 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java @@ -182,7 +182,7 @@ public class QueryIterGraph extends QueryIterRepeatApply return null ; //throw new ARQInternalErrorException(".containsGraph was true but .getGraph is null") ; - ExecutionContext cxt2 = new ExecutionContext(outerCxt, g) ; + ExecutionContext cxt2 = ExecutionContext.copyChangeActiveGraph(outerCxt, g) ; QueryIterator subInput = QueryIterSingleton.create(binding, cxt2) ; return QC.execute(opExec, subInput, cxt2) ; } diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/QueryEngineRef.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/QueryEngineRef.java index a8057a3f00..113278f7e9 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/QueryEngineRef.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/QueryEngineRef.java @@ -30,7 +30,6 @@ import org.apache.jena.sparql.engine.*; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingFactory; import org.apache.jena.sparql.engine.iterator.QueryIteratorCheck; -import org.apache.jena.sparql.engine.main.QC; import org.apache.jena.sparql.util.Context; /** "Reference" query engine - this simply executes the algebra expression as-is @@ -65,8 +64,7 @@ public class QueryEngineRef extends QueryEngineBase public QueryIterator eval(Op op, DatasetGraph dsg, Binding binding, Context context) { if ( binding.vars().hasNext() ) op = Substitute.substitute(op, binding); - - ExecutionContext execCxt = new ExecutionContext(context, dsg.getDefaultGraph(), dsg, QC.getFactory(context)); + ExecutionContext execCxt = ExecutionContext.create(dsg, context); Evaluator eval = EvaluatorFactory.create(execCxt); Table table = RefEval.eval(eval, op); QueryIterator qIter = table.iterator(execCxt); diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/RefEval.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/RefEval.java index 83ddfd4256..dafdcd30eb 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/RefEval.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/ref/RefEval.java @@ -98,7 +98,7 @@ public class RefEval { Graph graph = execCxt.getDataset().getGraph(opGraph.getNode()); if ( graph == null ) // But contains was true?!! throw new InternalErrorException("Graph was present, now it's not"); - ExecutionContext execCxt2 = new ExecutionContext(execCxt, graph); + ExecutionContext execCxt2 = ExecutionContext.copyChangeActiveGraph(execCxt, graph); Evaluator e2 = EvaluatorFactory.create(execCxt2); return eval(e2, opGraph.getSubOp()); } @@ -109,7 +109,7 @@ public class RefEval { for ( Iterator<Node> iter = execCxt.getDataset().listGraphNodes() ; iter.hasNext() ; ) { Node gn = iter.next(); Graph graph = execCxt.getDataset().getGraph(gn); - ExecutionContext execCxt2 = new ExecutionContext(execCxt, graph); + ExecutionContext execCxt2 = ExecutionContext.copyChangeActiveGraph(execCxt, graph); Evaluator e2 = EvaluatorFactory.create(execCxt2); Table tableVarURI = TableFactory.create(gVar, gn); @@ -150,13 +150,13 @@ public class RefEval { g = ds.getGraph(opQuad.getGraphNode()); if ( g == null ) return new TableEmpty(); - ExecutionContext cxt2 = new ExecutionContext(cxt, g); + ExecutionContext cxt2 = ExecutionContext.copyChangeActiveGraph(cxt, g); QueryIterator qIter = executeBGP(pattern, QueryIterRoot.create(cxt2), cxt2); return TableFactory.create(qIter); } else { // Variable. Var gVar = Var.alloc(opQuad.getGraphNode()); - // Or just just devolve to OpGraph and get OpUnion chain of OpJoin + // Or just devolve to OpGraph and get OpUnion chain of OpJoin QueryIterConcat concat = new QueryIterConcat(cxt); for ( Iterator<Node> graphNodes = cxt.getDataset().listGraphNodes() ; graphNodes.hasNext() ; ) { Node gn = graphNodes.next(); @@ -165,7 +165,7 @@ public class RefEval { Graph g = cxt.getDataset().getGraph(gn); Binding b = BindingFactory.binding(BindingRoot.create(), gVar, gn); - ExecutionContext cxt2 = new ExecutionContext(cxt, g); + ExecutionContext cxt2 = ExecutionContext.copyChangeActiveGraph(cxt, g); // Eval the pattern, eval the variable, join. // Pattern may be non-linear in the variable - do a pure execution. diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunctionOp.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunctionOp.java index 896e2679a5..f8edeed603 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunctionOp.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/ExprFunctionOp.java @@ -62,11 +62,7 @@ public abstract class ExprFunctionOp extends ExprFunction @Override public final NodeValue eval(Binding binding, FunctionEnv env) { - ExecutionContext execCxt = new ExecutionContext(env.getContext(), - env.getActiveGraph(), - env.getDataset(), - QC.getFactory(env.getContext()) - ); + ExecutionContext execCxt = ExecutionContext.fromFunctionEnv(env); QueryIterator qIter1 = QueryIterSingleton.create(binding, execCxt); QueryIterator qIter = QC.execute(op, qIter1, execCxt); // Wrap with something to check for closed iterators. diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java index eec7b1eff5..28ed40441d 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/path/eval/PathEngine.java @@ -205,13 +205,14 @@ abstract public class PathEngine return graph.find(s, p, o) ; } + /* As general as possible property function inclusion */ private Iterator<Triple> graphFindWorker(Graph graph, Node s, PropertyFunctionFactory f, Node p, Node o, Context context) { // Expensive? PropertyFunction pf = f.create(p.getURI()) ; PropFuncArg sv = arg(s, "S") ; PropFuncArg ov = arg(o, "O") ; - QueryIterator r = QueryIterRoot.create(new ExecutionContext(context, graph, null, null)) ; - QueryIterator qIter = pf.exec(r, sv, p, ov, new ExecutionContext(ARQ.getContext(), graph, null, null)) ; + QueryIterator r = QueryIterRoot.create(ExecutionContext.createForGraph(graph, context)); + QueryIterator qIter = pf.exec(r, sv, p, ov, ExecutionContext.createForGraph(graph, ARQ.getContext())); if ( ! qIter.hasNext() ) return Iter.nullIterator() ; List<Triple> array = new ArrayList<>() ; diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/ExprUtils.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/ExprUtils.java index 4ec322814e..dd746b3e91 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/util/ExprUtils.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/ExprUtils.java @@ -203,7 +203,7 @@ public class ExprUtils public static NodeValue eval(Expr expr, Binding binding) { Context context = ARQ.getContext().copy(); context.set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime()); - FunctionEnv env = new ExecutionContext(context, null, null, null); + FunctionEnv env = ExecutionContext.create(null, context); NodeValue r = expr.eval(binding, env); return r; } diff --git a/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmtLib.java b/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmtLib.java index 36715e49ed..539a3a0e88 100644 --- a/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmtLib.java +++ b/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmtLib.java @@ -22,7 +22,6 @@ import static org.junit.Assert.assertEquals; import org.apache.jena.graph.Node ; import org.apache.jena.graph.Triple; -import org.apache.jena.shared.PrefixMapping; import org.apache.jena.sparql.core.Quad; import org.apache.jena.sparql.sse.SSE; import org.apache.jena.sparql.util.NodeFactoryExtra ; diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestCancelDistinct.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestCancelDistinct.java index 155a056c98..ae929eba85 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestCancelDistinct.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestCancelDistinct.java @@ -17,25 +17,27 @@ */ package org.apache.jena.sparql.engine.iterator; -import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; +import org.junit.Test; + import org.apache.jena.atlas.data.DistinctDataBag; import org.apache.jena.atlas.io.IndentedWriter; -import org.apache.jena.graph.Graph; import org.apache.jena.query.ARQ; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.engine.ExecutionContext; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingFactory; -import org.apache.jena.sparql.engine.main.OpExecutorFactory; import org.apache.jena.sparql.serializer.SerializationContext; import org.apache.jena.sparql.util.Context; -import org.junit.Test; public class TestCancelDistinct { @@ -98,12 +100,8 @@ public class TestCancelDistinct { } final Context params = new Context(); - - final Graph activeGraph = null; final DatasetGraph dataset = null; - final OpExecutorFactory factory = null; - - final ExecutionContext c = new ExecutionContext(params, activeGraph, dataset, factory); + final ExecutionContext cxt = ExecutionContext.create(dataset, params); /** test that of a QueryIterDistinct with an active databag is @@ -113,7 +111,7 @@ public class TestCancelDistinct { params.set(ARQ.spillToDiskThreshold, 0); QueryIteratorBase base = new MockQueryIterator(BindingFactory.empty()); - QueryIterDistinct d = new QueryIterDistinct(base, null, c); + QueryIterDistinct d = new QueryIterDistinct(base, null, cxt); assertNull(d.db); @@ -132,7 +130,7 @@ public class TestCancelDistinct { params.set(ARQ.spillToDiskThreshold, 0); QueryIteratorBase base = new MockQueryIterator(BindingFactory.empty()); - QueryIterDistinct d = new QueryIterDistinct(base, null, c); + QueryIterDistinct d = new QueryIterDistinct(base, null, cxt); // when there is no databag, close leaves it null assertNull(d.db); @@ -144,7 +142,7 @@ public class TestCancelDistinct { params.set(ARQ.spillToDiskThreshold, 0); QueryIteratorBase base = new MockQueryIterator(BindingFactory.empty()); - QueryIterDistinct d = new QueryIterDistinct(base, null, c); + QueryIterDistinct d = new QueryIterDistinct(base, null, cxt); assertNull(d.db); Binding ignored = d.next(); diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctDataBagLimited.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctDataBagLimited.java index ca269db758..9309f2f384 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctDataBagLimited.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctDataBagLimited.java @@ -33,7 +33,7 @@ public class TestDistinctDataBagLimited extends AbstractTestDistinctReduced { QueryIterator qIter = QueryIterPlainWrapper.create(data.iterator()) ; Context cxt = new Context() ; cxt.set(ARQ.spillToDiskThreshold, 2L); - return new QueryIterDistinct(qIter, null, new ExecutionContext(cxt, null, null, null)) ; + return new QueryIterDistinct(qIter, null, ExecutionContext.create(null, cxt)); } } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctMem.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctMem.java index 726527d69a..78be84bcc4 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctMem.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestDistinctMem.java @@ -23,14 +23,13 @@ import java.util.List ; import org.apache.jena.sparql.engine.ExecutionContext ; import org.apache.jena.sparql.engine.QueryIterator ; import org.apache.jena.sparql.engine.binding.Binding ; -import org.apache.jena.sparql.util.Context ; public class TestDistinctMem extends AbstractTestDistinctReduced { @Override protected QueryIterator createQueryIter(List<Binding> data) { QueryIterator qIter = QueryIterPlainWrapper.create(data.iterator()) ; - return new QueryIterDistinctMem(qIter, new ExecutionContext(new Context(), null, null, null)) ; + return new QueryIterDistinctMem(qIter, ExecutionContext.createForGraph(null)) ; } } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestQueryIterSort.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestQueryIterSort.java index e6618d4dde..406b536d31 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestQueryIterSort.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestQueryIterSort.java @@ -23,122 +23,116 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.ArrayList ; -import java.util.Iterator ; -import java.util.List ; -import java.util.Random ; - -import org.apache.jena.atlas.data.DataBagExaminer ; -import org.apache.jena.atlas.io.IndentedWriter ; -import org.apache.jena.datatypes.xsd.XSDDatatype ; -import org.apache.jena.graph.Graph ; -import org.apache.jena.graph.NodeFactory ; -import org.apache.jena.query.ARQ ; -import org.apache.jena.query.Query ; -import org.apache.jena.query.QueryCancelledException ; -import org.apache.jena.query.SortCondition ; -import org.apache.jena.shared.PrefixMapping ; -import org.apache.jena.sparql.ARQNotImplemented ; -import org.apache.jena.sparql.core.DatasetGraph ; -import org.apache.jena.sparql.core.Var ; -import org.apache.jena.sparql.engine.ExecutionContext ; -import org.apache.jena.sparql.engine.QueryIterator ; -import org.apache.jena.sparql.engine.binding.Binding ; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +import org.junit.Before; +import org.junit.Test; + +import org.apache.jena.atlas.data.DataBagExaminer; +import org.apache.jena.atlas.io.IndentedWriter; +import org.apache.jena.datatypes.xsd.XSDDatatype; +import org.apache.jena.graph.NodeFactory; +import org.apache.jena.query.ARQ; +import org.apache.jena.query.Query; +import org.apache.jena.query.QueryCancelledException; +import org.apache.jena.query.SortCondition; +import org.apache.jena.shared.PrefixMapping; +import org.apache.jena.sparql.ARQNotImplemented; +import org.apache.jena.sparql.core.Var; +import org.apache.jena.sparql.engine.ExecutionContext; +import org.apache.jena.sparql.engine.QueryIterator; +import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingBuilder; -import org.apache.jena.sparql.engine.binding.BindingComparator ; -import org.apache.jena.sparql.engine.main.OpExecutorFactory ; -import org.apache.jena.sparql.expr.ExprVar ; -import org.apache.jena.sparql.serializer.SerializationContext ; -import org.apache.jena.sparql.util.Context ; -import org.junit.Before ; -import org.junit.Test ; +import org.apache.jena.sparql.engine.binding.BindingComparator; +import org.apache.jena.sparql.expr.ExprVar; +import org.apache.jena.sparql.serializer.SerializationContext; +import org.apache.jena.sparql.util.Context; public class TestQueryIterSort { - private static final String LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" ; - private Random random ; - private List<Binding> unsorted ; - private BindingComparator comparator ; - private CallbackIterator iterator ; + private static final String LETTERS = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; + private Random random; + private List<Binding> unsorted; + private BindingComparator comparator; + private CallbackIterator iterator; @Before - public void setup() - { + public void setup() { random = new Random(); Var[] vars = new Var[]{ + // @formatter:off Var.alloc("1"), Var.alloc("2"), Var.alloc("3"), Var.alloc("4"), Var.alloc("5"), Var.alloc("6"), - Var.alloc("7"), Var.alloc("8"), Var.alloc("9"), Var.alloc("0") + Var.alloc("7"), Var.alloc("8"), Var.alloc("9"), + Var.alloc("0") + // @formatter:on }; unsorted = new ArrayList<>(); - for(int i = 0; i < 500; i++){ + for ( int i = 0 ; i < 500 ; i++ ) { unsorted.add(randomBinding(vars)); } List<SortCondition> conditions = new ArrayList<>(); conditions.add(new SortCondition(new ExprVar("8"), Query.ORDER_ASCENDING)); comparator = new BindingComparator(conditions); - iterator = new CallbackIterator(unsorted.iterator(), 25, null); - iterator.setCallback(new Callback() { - @Override - public void call() { throw new QueryCancelledException() ; } + iterator.setCallback(() -> { + throw new QueryCancelledException(); }); } + private static ExecutionContext createExecutionContext(Context context) { + return ExecutionContext.create(null, context); + } + @Test - public void testNoSpill() - { - iterator.setCallback(()->{}); - //new Callback() { @Override - //public void call() { /* do nothing */ } }); + public void testNoSpill() { + iterator.setCallback(() -> {}); + // new Callback() { @Override + // public void call() { /* do nothing */ } }); assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - try - { - assertEquals(0, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.hasNext() ; - assertEquals(500, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - } - finally - { - qIter.close() ; + Context context = new Context(); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + try { + assertEquals(0, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.hasNext(); + assertEquals(500, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + } finally { + qIter.close(); } } @Test - public void testCleanAfterClose() - { - iterator.setCallback(()->{}); // Do nothing. + public void testCleanAfterClose() { + iterator.setCallback(() -> {}); // Do nothing. assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - context.set(ARQ.spillToDiskThreshold, 10L) ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - try - { - assertEquals(0, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.hasNext() ; - assertEquals(500, iterator.getReturnedElementCount()) ; - assertEquals(49, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - } - finally - { - qIter.close() ; + Context context = new Context(); + context.set(ARQ.spillToDiskThreshold, 10L); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + try { + assertEquals(0, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.hasNext(); + assertEquals(500, iterator.getReturnedElementCount()); + assertEquals(49, DataBagExaminer.countTemporaryFiles(qIter.db)); + } finally { + qIter.close(); } - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); } @Test public void testCloseClosesSourceIterator() { - Context context = new Context() ; - ExecutionContext ec = new ExecutionContext(context, (Graph) null, (DatasetGraph) null, (OpExecutorFactory) null); + Context context = new Context(); + ExecutionContext ec = createExecutionContext(context); QueryIterSort qis = new QueryIterSort(iterator, comparator, ec); qis.close(); assertTrue("source iterator should have been closed", iterator.isClosed()); @@ -147,20 +141,22 @@ public class TestQueryIterSort { @Test public void testExhaustionClosesSourceIterator() { iterator.setCallback(() -> {}); - Context context = new Context() ; - ExecutionContext ec = new ExecutionContext(context, (Graph) null, (DatasetGraph) null, (OpExecutorFactory) null); + Context context = new Context(); + ExecutionContext ec = createExecutionContext(context); QueryIterSort qis = new QueryIterSort(iterator, comparator, ec); - while (qis.hasNext()) qis.next(); + while (qis.hasNext()) + qis.next(); assertTrue("source iterator should have been closed", iterator.isClosed()); } @Test public void testCancelClosesSourceIterator() { - Context context = new Context() ; - ExecutionContext ec = new ExecutionContext(context, (Graph) null, (DatasetGraph) null, (OpExecutorFactory) null); + Context context = new Context(); + ExecutionContext ec = createExecutionContext(context); QueryIterSort qis = new QueryIterSort(iterator, comparator, ec); try { - while (qis.hasNext()) qis.next(); + while (qis.hasNext()) + qis.next(); fail("query should have been cancelled by trigger"); } catch (QueryCancelledException q) { assertTrue("source iterator should have been closed", iterator.isClosed()); @@ -168,122 +164,111 @@ public class TestQueryIterSort { } @Test - public void testCleanAfterExhaustion() - { + public void testCleanAfterExhaustion() { iterator.setCallback(() -> {}); assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - context.set(ARQ.spillToDiskThreshold, 10L) ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - - // Usually qIter should be in a try/finally block, but we are testing the case that the user forgot to do that. - // As a failsafe, QueryIteratorBase should close it when the iterator is exhausted. - assertEquals(0, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.hasNext() ; - assertEquals(500, iterator.getReturnedElementCount()) ; - assertEquals(49, DataBagExaminer.countTemporaryFiles(qIter.db)) ; + Context context = new Context(); + context.set(ARQ.spillToDiskThreshold, 10L); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + + // Usually qIter should be in a try/finally block, but we are testing the + // case that the user forgot to do that. + // As a failsafe, QueryIteratorBase should close it when the iterator is + // exhausted. + assertEquals(0, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.hasNext(); + assertEquals(500, iterator.getReturnedElementCount()); + assertEquals(49, DataBagExaminer.countTemporaryFiles(qIter.db)); while (qIter.hasNext()) qIter.next(); - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.close() ; + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.close(); } - @Test(expected=QueryCancelledException.class) - public void testCancelInterruptsInitialisation() - { + @Test(expected = QueryCancelledException.class) + public void testCancelInterruptsInitialisation() { assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - context.set(ARQ.spillToDiskThreshold, 10L) ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - try - { - assertEquals(0, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.cancel() ; - qIter.hasNext() ; // throws a QueryCancelledException - } - finally - { - assertTrue(iterator.isCanceled()) ; - assertEquals(0, iterator.getReturnedElementCount()) ; + Context context = new Context(); + context.set(ARQ.spillToDiskThreshold, 10L); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + try { + assertEquals(0, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.cancel(); + qIter.hasNext(); // throws a QueryCancelledException + } finally { + assertTrue(iterator.isCanceled()); + assertEquals(0, iterator.getReturnedElementCount()); assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); - qIter.close() ; + qIter.close(); } - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); } - @Test(expected=QueryCancelledException.class) - public void testCancelInterruptsExternalSortAfterStartingIteration() - { + @Test(expected = QueryCancelledException.class) + public void testCancelInterruptsExternalSortAfterStartingIteration() { assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - context.set(ARQ.spillToDiskThreshold, 10L) ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - try - { - assertEquals(0, iterator.getReturnedElementCount()) ; - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - qIter.hasNext() ; // throws a QueryCancelledException - } - catch ( QueryCancelledException e ) - { + Context context = new Context(); + context.set(ARQ.spillToDiskThreshold, 10L); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + try { + assertEquals(0, iterator.getReturnedElementCount()); + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + qIter.hasNext(); // throws a QueryCancelledException + } catch (QueryCancelledException e) { // expected - assertEquals(26, iterator.getReturnedElementCount()) ; - // This is zero because QueryIteratorBase will call close() before throwing the QueryCancelledException. - // It does this as a failsafe in case the user doesn't close the QueryIterator themselves. - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; - throw e ; - } - finally - { - qIter.close() ; + assertEquals(26, iterator.getReturnedElementCount()); + // This is zero because QueryIteratorBase will call close() before + // throwing the QueryCancelledException. + // It does this as a failsafe in case the user doesn't close the + // QueryIterator themselves. + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); + throw e; + } finally { + qIter.close(); } - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); } - @Test(expected=QueryCancelledException.class) - public void testCancelInterruptsExternalSortAtStartOfIteration() - { + @Test(expected = QueryCancelledException.class) + public void testCancelInterruptsExternalSortAtStartOfIteration() { iterator = new CallbackIterator(unsorted.iterator(), 25, null); - iterator.setCallback(()->{}); + iterator.setCallback(() -> {}); assertEquals(0, iterator.getReturnedElementCount()); - Context context = new Context() ; - context.set(ARQ.spillToDiskThreshold, 10L) ; - ExecutionContext executionContext = new ExecutionContext(context, (Graph)null, (DatasetGraph)null, (OpExecutorFactory)null) ; - QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext) ; - try - { - assertTrue(qIter.hasNext()) ; + Context context = new Context(); + context.set(ARQ.spillToDiskThreshold, 10L); + ExecutionContext executionContext = createExecutionContext(context); + QueryIterSort qIter = new QueryIterSort(iterator, comparator, executionContext); + try { + assertTrue(qIter.hasNext()); assertEquals(49, DataBagExaminer.countTemporaryFiles(qIter.db)); - assertNotNull(qIter.next()) ; - assertTrue(qIter.hasNext()) ; - qIter.cancel() ; - qIter.hasNext() ; // throws a QueryCancelledException - } - finally - { - //assertTrue(iterator.isCanceled()) ; - assertEquals(500, iterator.getReturnedElementCount()) ; + assertNotNull(qIter.next()); + assertTrue(qIter.hasNext()); + qIter.cancel(); + qIter.hasNext(); // throws a QueryCancelledException + } finally { + // assertTrue(iterator.isCanceled()) ; + assertEquals(500, iterator.getReturnedElementCount()); assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); - qIter.close() ; + qIter.close(); } - assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)) ; + assertEquals(0, DataBagExaminer.countTemporaryFiles(qIter.db)); } @Test public void testTopNCloseClosesSource() { long numItems = 3; boolean distinct = false; - Context context = new Context() ; - ExecutionContext ec = new ExecutionContext(context, (Graph) null, (DatasetGraph) null, (OpExecutorFactory) null); + Context context = new Context(); + ExecutionContext ec = createExecutionContext(context); QueryIterTopN tn = new QueryIterTopN(iterator, comparator, numItems, distinct, ec); tn.close(); assertTrue(iterator.isClosed()); @@ -294,16 +279,15 @@ public class TestQueryIterSort { iterator.setCallback(() -> {}); long numItems = 3; boolean distinct = false; - Context context = new Context() ; - ExecutionContext ec = new ExecutionContext(context, (Graph) null, (DatasetGraph) null, (OpExecutorFactory) null); + Context context = new Context(); + ExecutionContext ec = createExecutionContext(context); QueryIterTopN tn = new QueryIterTopN(iterator, comparator, numItems, distinct, ec); - while (tn.hasNext()) tn.next(); + while (tn.hasNext()) + tn.next(); assertTrue(iterator.isClosed()); } - - private Binding randomBinding(Var[] vars) - { + private Binding randomBinding(Var[] vars) { BindingBuilder builder = Binding.builder(); builder.add(vars[0], NodeFactory.createBlankNode()); builder.add(vars[1], NodeFactory.createURI(randomURI())); @@ -318,107 +302,106 @@ public class TestQueryIterSort { return builder.build(); } - private String randomURI() - { + private String randomURI() { return String.format("http://%s.example.com/%s", randomString(10), randomString(10)); } - private String randomString(int length) - { + private String randomString(int length) { StringBuilder builder = new StringBuilder(); - for(int i = 0; i < length; i++){ + for ( int i = 0 ; i < length ; i++ ) { builder.append(LETTERS.charAt(random.nextInt(LETTERS.length()))); } return builder.toString(); } - - private static class CallbackIterator implements QueryIterator - { - int elementsReturned = 0 ; - Callback callback ; - int trigger ; - Iterator<Binding> delegate ; - boolean canceled = false ; - boolean closed = false ; - - public CallbackIterator(Iterator<Binding> delegate, int trigger, Callback callback) - { - this.delegate = delegate ; - this.callback = callback ; - this.trigger = trigger ; + private static class CallbackIterator implements QueryIterator { + int elementsReturned = 0; + Callback callback; + int trigger; + Iterator<Binding> delegate; + boolean canceled = false; + boolean closed = false; + + public CallbackIterator(Iterator<Binding> delegate, int trigger, Callback callback) { + this.delegate = delegate; + this.callback = callback; + this.trigger = trigger; } - public void setCallback(Callback callback) - { - this.callback = callback ; + public void setCallback(Callback callback) { + this.callback = callback; } @Override - public boolean hasNext() - { - // self-closing - boolean has = delegate.hasNext() ; - if (has == false) closed = true; - return has ; + public boolean hasNext() { + // self-closing + boolean has = delegate.hasNext(); + if ( has == false ) + closed = true; + return has; } @Override - public Binding next() - { - if (elementsReturned++ >= trigger) - { - callback.call() ; + public Binding next() { + if ( elementsReturned++ >= trigger ) { + callback.call(); } - return delegate.next() ; + return delegate.next(); } @Override - public void remove() - { - delegate.remove() ; + public void remove() { + delegate.remove(); } - public int getReturnedElementCount() - { - return elementsReturned ; + public int getReturnedElementCount() { + return elementsReturned; } public boolean isClosed() { - return closed ; + return closed; } public boolean isCanceled() { - return canceled ; + return canceled; } @Override - public Binding nextBinding() - { - if (elementsReturned++ >= trigger) callback.call() ; - return delegate.next() ; + public Binding nextBinding() { + if ( elementsReturned++ >= trigger ) + callback.call(); + return delegate.next(); } @Override - public void cancel() { canceled = true ; } + public void cancel() { + canceled = true; + } @Override - public void close() { closed = true ; } + public void close() { + closed = true; + } @Override - public void output(IndentedWriter out, SerializationContext sCxt) { throw new ARQNotImplemented() ; } + public void output(IndentedWriter out, SerializationContext sCxt) { + throw new ARQNotImplemented(); + } @Override - public String toString(PrefixMapping pmap) { throw new ARQNotImplemented() ; } + public String toString(PrefixMapping pmap) { + throw new ARQNotImplemented(); + } @Override - public void output(IndentedWriter out) { throw new ARQNotImplemented() ; } + public void output(IndentedWriter out) { + throw new ARQNotImplemented(); + } } - public interface Callback - { - public void call() ; + public interface Callback { + public void call(); } } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestSortedDataBagCancellation.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestSortedDataBagCancellation.java index 5161a9bb14..fb5e60475b 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestSortedDataBagCancellation.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/iterator/TestSortedDataBagCancellation.java @@ -27,10 +27,10 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.junit.Test; + import org.apache.jena.atlas.io.IndentedWriter; -import org.apache.jena.graph.Graph; import org.apache.jena.graph.NodeFactory; -import org.apache.jena.graph.impl.GraphPlain ; import org.apache.jena.query.QueryCancelledException; import org.apache.jena.query.SortCondition; import org.apache.jena.sparql.core.DatasetGraph; @@ -40,19 +40,12 @@ import org.apache.jena.sparql.engine.ExecutionContext; import org.apache.jena.sparql.engine.binding.Binding; import org.apache.jena.sparql.engine.binding.BindingComparator; import org.apache.jena.sparql.engine.binding.BindingFactory; -import org.apache.jena.sparql.engine.main.OpExecutor; import org.apache.jena.sparql.engine.main.OpExecutorFactory; import org.apache.jena.sparql.serializer.SerializationContext; import org.apache.jena.sparql.util.Context; -import org.junit.Test; /* Test that a SortedDataBag used inside a QueryIterSort does indeed cut off when cancelled. - - This is horribly clunky because of the effort of - setting up. Maybe we should instead be content to - test the SortedDataBag correctly? - */ public class TestSortedDataBagCancellation { @@ -63,33 +56,25 @@ public class TestSortedDataBagCancellation { final Context params = new Context(); - final OpExecutorFactory factory = new OpExecutorFactory() { - - @Override - public OpExecutor create(ExecutionContext ec) { - throw new UnsupportedOperationException(); - } - }; - - final Graph activeGraph = GraphPlain.plain(); - - final DatasetGraph dataset = DatasetGraphFactory.create(); + final OpExecutorFactory factory = ec -> { throw new UnsupportedOperationException(); }; + final DatasetGraph dataset = DatasetGraphFactory.empty(); final List<SortCondition> conditions = new ArrayList<>(); - final ExecutionContext ec = new ExecutionContext(params, activeGraph, dataset, factory); + final ExecutionContext ec = ExecutionContext.create(dataset, params); final BindingComparator base_bc = new BindingComparator(conditions, ec); final SpecialBindingComparator bc = new SpecialBindingComparator(base_bc, ec); - QueryIteratorItems baseIter = new QueryIteratorItems(); + private QueryIteratorItems baseIter = createBaseIter(); - { - baseIter.bindings.add(b1); - baseIter.bindings.add(b2); - baseIter.bindings.add(b3); - baseIter.bindings.add(b4); - ; + private static QueryIteratorItems createBaseIter() { + QueryIteratorItems iter = new QueryIteratorItems(); + iter.bindings.add(b1); + iter.bindings.add(b2); + iter.bindings.add(b3); + iter.bindings.add(b4); + return iter; } QueryIterSort qs = new QueryIterSort(baseIter, bc, ec); diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/engine/join/TestTableJoin.java b/jena-arq/src/test/java/org/apache/jena/sparql/engine/join/TestTableJoin.java index bf88c8ea79..3b206254b1 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/engine/join/TestTableJoin.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/engine/join/TestTableJoin.java @@ -23,7 +23,8 @@ import static org.junit.Assert.assertTrue; import java.util.HashSet ; import java.util.Set ; -import org.apache.jena.query.ARQ ; +import org.junit.Test ; + import org.apache.jena.query.ResultSet ; import org.apache.jena.query.ResultSetFactory ; import org.apache.jena.sparql.algebra.Table ; @@ -36,16 +37,15 @@ import org.apache.jena.sparql.engine.ref.TableJoin; import org.apache.jena.sparql.expr.ExprList ; import org.apache.jena.sparql.resultset.ResultSetCompare ; import org.apache.jena.sparql.sse.SSE ; -import org.junit.Test ; -/** Tests on tables and the simple nest loop join (TableJoin) used by the reference query engine */ +/** Tests on tables and the simple nest loop join (TableJoin) used by the reference query engine */ public class TestTableJoin { - Table unit = new TableUnit() ; + Table unit = new TableUnit() ; Table zero = new TableEmpty() ; Table zeroData = SSE.parseTable("(table)") ; Table unitData = SSE.parseTable("(table (row))") ; - + Table data1 = SSE.parseTable("(table (row (?a 1) (?b 2)))") ; Table data2 = SSE.parseTable("(table (row (?a 1) (?c 3)) (row (?a 9) (?c 5)) )") ; Table data3 = SSE.parseTable("(table (row (?a 1) (?c 3)) (row (?a 1) (?c 4)) (row (?a 9) (?c 5)) )") ; @@ -53,9 +53,9 @@ public class TestTableJoin Table data1J2 = SSE.parseTable("(table (row (?a 1) (?b 2) (?c 3)) )") ; Table data1LJ2 = SSE.parseTable("(table (row (?a 1) (?b 2) (?c 3)) )") ; Table data2LJ1 = SSE.parseTable("(table (row (?a 1) (?b 2) (?c 3)) (row (?a 9) (?c 5)) )") ; - + Table data1J3 = SSE.parseTable("(table (row (?a 1) (?b 2) (?c 3)) (row (?a 1) (?b 2) (?c 4)) )") ; - + @Test public void table_01() { test(unit, zero, true, null, zero) ; } @Test public void table_02() { test(zero, unit, true, null, zero) ; } @Test public void table_03() { test(unit, zero, false, null, unit) ; } @@ -70,7 +70,7 @@ public class TestTableJoin @Test public void table_11() { test(zero, data1, true, null, zero) ; } @Test public void table_12() { test(data1, zero, false, null, data1) ; } @Test public void table_13() { test(zero, data1, false, null, zero) ; } - + @Test public void table_14() { test(data1, zeroData, true, null, zeroData) ; } @Test public void table_15() { test(zeroData, data1, true, null, zeroData) ; } @Test public void table_16() { test(data1, zeroData, false, null, data1) ; } @@ -78,28 +78,28 @@ public class TestTableJoin @Test public void table_18() { test(data2, unitData, true, null, data2) ; } @Test public void table_19() { test(unitData, data2, true, null, data2) ; } - + @Test public void table_20() { test(data1, data2, true, null, data1J2) ; } @Test public void table_21() { test(data2, data1, true, null, data1J2) ; } @Test public void table_22() { test(data1, data2, false, null, data1LJ2) ; } @Test public void table_23() { test(data2, data1, false, null, data2LJ1) ; } - + @Test public void table_24() { test(data1, data3, true, null, data1J3) ; } @Test public void table_25() { test(data3, data1, true, null, data1J3) ; } private void test(Table left, Table right, boolean normalJoin, ExprList exprs, Table expected) { - ExecutionContext execCxt = new ExecutionContext(ARQ.getContext(), null, null, null) ; + ExecutionContext execCxt = ExecutionContext.createForGraph(null) ; QueryIterator leftIter = left.iterator(execCxt) ; - QueryIterator qIter = normalJoin + QueryIterator qIter = normalJoin ? TableJoin.join(leftIter, right, exprs, execCxt) : TableJoin.leftJoin(leftIter, right, exprs, execCxt) ; - + // Order issues - + Set<String> vars1 = new HashSet<>() ; vars1.addAll(left.getVarNames()) ; vars1.addAll(right.getVarNames()) ; - + TableN results = new TableN(qIter) ; boolean b = TableCompare.equalsByTerm(expected, results) ; if ( !b ) { @@ -110,7 +110,7 @@ public class TestTableJoin } assertTrue(b) ; } - + static class TableCompare { public static boolean equalsByTerm(Table table1, Table table2) { ResultSet rs1 = ResultSetFactory.create(table1.iterator(null), table1.getVarNames()) ; @@ -118,5 +118,5 @@ public class TestTableJoin return ResultSetCompare.equalsByTerm(rs1, rs2) ; } } - + } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestCastXSD.java b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestCastXSD.java index 468b247ab7..fcde65b616 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestCastXSD.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/expr/TestCastXSD.java @@ -18,18 +18,20 @@ package org.apache.jena.sparql.expr; +import org.junit.AfterClass ; +import org.junit.Assert ; +import org.junit.BeforeClass ; +import org.junit.Test ; + import org.apache.jena.graph.Node ; import org.apache.jena.query.ARQ ; import org.apache.jena.sparql.ARQConstants ; import org.apache.jena.sparql.engine.ExecutionContext ; import org.apache.jena.sparql.function.FunctionEnv ; import org.apache.jena.sparql.sse.SSE ; +import org.apache.jena.sparql.util.Context; import org.apache.jena.sparql.util.ExprUtils ; import org.apache.jena.sparql.util.NodeFactoryExtra ; -import org.junit.AfterClass ; -import org.junit.Assert ; -import org.junit.BeforeClass ; -import org.junit.Test ; public class TestCastXSD { @@ -148,8 +150,8 @@ public class TestCastXSD { private NodeValue cast(String input$) { Expr input = ExprUtils.parse(input$) ; - ARQ.getContext().set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime()) ; - FunctionEnv env = new ExecutionContext(ARQ.getContext(), null, null, null) ; + Context cxt = ARQ.getContext().copy().set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime()) ; + FunctionEnv env = ExecutionContext.create(null, cxt); return input.eval(null, env) ; } } diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/path/TestPath.java b/jena-arq/src/test/java/org/apache/jena/sparql/path/TestPath.java index c4dd4ea76e..7bcc873fc5 100644 --- a/jena-arq/src/test/java/org/apache/jena/sparql/path/TestPath.java +++ b/jena-arq/src/test/java/org/apache/jena/sparql/path/TestPath.java @@ -28,6 +28,9 @@ import java.util.Arrays ; import java.util.Iterator ; import java.util.List ; +import org.junit.Assert ; +import org.junit.Test ; + import org.apache.jena.atlas.iterator.Iter ; import org.apache.jena.graph.Graph ; import org.apache.jena.graph.Node ; @@ -50,8 +53,6 @@ import org.apache.jena.sparql.sse.Item ; import org.apache.jena.sparql.sse.SSE ; import org.apache.jena.sparql.sse.builders.BuilderPath ; import org.apache.jena.sparql.sse.writers.WriterPath ; -import org.junit.Assert ; -import org.junit.Test ; public class TestPath { @@ -255,80 +256,79 @@ public class TestPath @Test public void path_34() { test(graph3, n1, ":p+", n2,n3,n4) ; } - private static List<Binding> eval(Graph graph, String start$, String pathStr, String finish$) - { - return eval(graph, SSE.parseNode(start$, pmap), pathStr, SSE.parseNode(finish$, pmap)) ; + private static List<Binding> eval(Graph graph, String start$, String pathStr, String finish$) { + return eval(graph, SSE.parseNode(start$, pmap), pathStr, SSE.parseNode(finish$, pmap)); } - private static List<Binding> eval(Graph graph, Node start, String pathStr, Node finish) - { - Path path = SSE.parsePath(pathStr, pmap) ; - QueryIterator qIter = PathLib.execTriplePath(BindingFactory.root(), start, path, finish, new ExecutionContext(ARQ.getContext(), graph, null, null)) ; - return Iter.toList(qIter) ; + private static List<Binding> eval(Graph graph, Node start, String pathStr, Node finish) { + Path path = SSE.parsePath(pathStr, pmap); + QueryIterator qIter = PathLib.execTriplePath(BindingFactory.root(), start, path, finish, + ExecutionContext.createForGraph(graph)); + return Iter.toList(qIter); } - @Test public void path_35() - { - List<Binding> x = eval(graph6, "?x", "(path+ :p)", "?y" ) ; - assertEquals(4, x.size()) ; + @Test + public void path_35() { + List<Binding> x = eval(graph6, "?x", "(path+ :p)", "?y"); + assertEquals(4, x.size()); } - @Test public void path_36() - { + @Test + public void path_36() { // Same end points. - List<Binding> x = eval(graph6, "?x", "(path+ :p)", "?x" ) ; - assertEquals(2, x.size()) ; + List<Binding> x = eval(graph6, "?x", "(path+ :p)", "?x"); + assertEquals(2, x.size()); } - @Test public void path_37() - { - List<Binding> x = eval(graph6, "?x", "(path* :p)", "?x" ) ; - assertEquals(2, x.size()) ; - Node node1 = x.get(0).get(Var.alloc("x")) ; - Node node2 = x.get(1).get(Var.alloc("x")) ; - assertFalse(node1.equals(node2)) ; - assertTrue(node1.equals(n1) || node1.equals(n2)) ; - assertTrue(node2.equals(n1) || node2.equals(n2)) ; + @Test + public void path_37() { + List<Binding> x = eval(graph6, "?x", "(path* :p)", "?x"); + assertEquals(2, x.size()); + Node node1 = x.get(0).get(Var.alloc("x")); + Node node2 = x.get(1).get(Var.alloc("x")); + assertFalse(node1.equals(node2)); + assertTrue(node1.equals(n1) || node1.equals(n2)); + assertTrue(node2.equals(n1) || node2.equals(n2)); } - @Test public void path_38() - { + @Test + public void path_38() { // Same end points. - List<Binding> x = eval(graph6, "?x", "(pathN+ :p)", "?x" ) ; - - assertEquals(2, x.size()) ; - Node node1 = x.get(0).get(Var.alloc("x")) ; - Node node2 = x.get(1).get(Var.alloc("x")) ; - assertFalse(node1.equals(node2)) ; - assertTrue(node1.equals(n1) || node1.equals(n2)) ; - assertTrue(node2.equals(n1) || node2.equals(n2)) ; + List<Binding> x = eval(graph6, "?x", "(pathN+ :p)", "?x"); + + assertEquals(2, x.size()); + Node node1 = x.get(0).get(Var.alloc("x")); + Node node2 = x.get(1).get(Var.alloc("x")); + assertFalse(node1.equals(node2)); + assertTrue(node1.equals(n1) || node1.equals(n2)); + assertTrue(node2.equals(n1) || node2.equals(n2)); } - @Test public void path_39() - { - List<Binding> x = eval(graph6, "?x", "(pathN* :p)", "?x" ) ; - assertEquals(2, x.size()) ; + @Test + public void path_39() { + List<Binding> x = eval(graph6, "?x", "(pathN* :p)", "?x"); + assertEquals(2, x.size()); } - @Test public void path_50() - { - List<Binding> x = eval(graph1, "?x", "(notoneof :DoesNotExist)", "<n4>" ) ; - assertEquals(1, x.size()) ; + @Test + public void path_50() { + List<Binding> x = eval(graph1, "?x", "(notoneof :DoesNotExist)", "<n4>"); + assertEquals(1, x.size()); } - @Test public void path_51() - { - List<Binding> x = eval(graph1, "?x", "(notoneof :DoesNotExist)", "?z" ) ; - assertEquals(3, x.size()) ; + @Test + public void path_51() { + List<Binding> x = eval(graph1, "?x", "(notoneof :DoesNotExist)", "?z"); + assertEquals(3, x.size()); } - @Test public void path_52() - { - List<Binding> x = eval(graph1, "<n1>", "(notoneof :DoesNotExist)", "?z" ) ; - assertEquals(1, x.size()) ; + @Test + public void path_52() { + List<Binding> x = eval(graph1, "<n1>", "(notoneof :DoesNotExist)", "?z"); + assertEquals(1, x.size()); } - // TODO Shortest path is not implemented yet. These also need to be verified that they are correct. + // Shortest path is not implemented. These also need to be verified that they are correct. // @Ignore @Test public void path_40() { test(graph1, n1, "shortest(:p*)", n1) ; } // @Ignore @Test public void path_41() { test(graph1, n1, "shortest(:p+)", n2) ; } // @Ignore @Test public void path_42() { test(graph2, n1, "shortest(:p*/:q)", n4) ; } @@ -338,27 +338,26 @@ public class TestPath // @Ignore @Test public void path_46() { test(graph5, n1, "shortest(:p*/:q)", n4, n5) ; } // ---- - private static void testOrdered(Graph graph, Node start, String string, Node... expectedNodes) { - test(graph, start, string, expectedNodes, true, true) ; + private static void testOrdered(Graph graph, Node start, String string, Node...expectedNodes) { + test(graph, start, string, expectedNodes, true, true); } - private static void test(Graph graph, Node start, String string, Node... expectedNodes) { - test(graph, start, string, expectedNodes, true, false) ; + private static void test(Graph graph, Node start, String string, Node...expectedNodes) { + test(graph, start, string, expectedNodes, true, false); } - private static void testReverseOrdered(Graph graph, Node start, String string, Node... expectedNodes) { - test(graph, start, string, expectedNodes, false, true) ; + private static void testReverseOrdered(Graph graph, Node start, String string, Node...expectedNodes) { + test(graph, start, string, expectedNodes, false, true); } - private static void test(Graph graph, Node start, String string, Node[] expectedNodes, - boolean directionForward, boolean ordered) { - Path p = PathParser.parse(string, pmap) ; - Iterator<Node> resultsIter = - directionForward ? PathEval.eval(graph, start, p, ARQ.getContext()) : PathEval.evalReverse(graph, start, p, ARQ.getContext()) ; - List<Node> results = Iter.toList(resultsIter) ; - List<Node> expected = Arrays.asList(expectedNodes) ; - Assert.assertTrue("expected:"+expected+", got:"+results, equalsUnordered(expected, results)) ; + private static void test(Graph graph, Node start, String string, Node[] expectedNodes, boolean directionForward, boolean ordered) { + Path p = PathParser.parse(string, pmap); + Iterator<Node> resultsIter = directionForward + ? PathEval.eval(graph, start, p, ARQ.getContext()) : PathEval.evalReverse(graph, start, p, ARQ.getContext()); + List<Node> results = Iter.toList(resultsIter); + List<Node> expected = Arrays.asList(expectedNodes); + Assert.assertTrue("expected:" + expected + ", got:" + results, equalsUnordered(expected, results)); if ( ordered ) - Assert.assertEquals("expected(ordered)", expected, results) ; + Assert.assertEquals("expected(ordered)", expected, results); } } diff --git a/jena-cmds/src/main/java/arq/qexpr.java b/jena-cmds/src/main/java/arq/qexpr.java index 74bde00486..7d230f9a13 100644 --- a/jena-cmds/src/main/java/arq/qexpr.java +++ b/jena-cmds/src/main/java/arq/qexpr.java @@ -180,7 +180,7 @@ public class qexpr { } else { // Default action ARQ.getContext().set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime()); - FunctionEnv env = new ExecutionContext(ARQ.getContext(), null, null, null); + FunctionEnv env = ExecutionContext.create(null, ARQ.getContext().copy()); NodeValue r = expr.eval(null, env); // System.out.println(r.asQuotedString()) ; Node n = r.asNode();
