You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/03/13 18:27:49 UTC
[03/16] jena git commit: Remove separate AccumulatorDistinctExpr.
Remove separate AccumulatorDistinctExpr.
Move functionality into AccumulatorExpr.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/375b38ef
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/375b38ef
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/375b38ef
Branch: refs/heads/master
Commit: 375b38efee3e78ca0508e500a051b8d57a465dd9
Parents: 085f2ef
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Mar 10 10:54:30 2016 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Mar 13 17:17:30 2016 +0000
----------------------------------------------------------------------
.../expr/aggregate/AccumulatorDistinctExpr.java | 75 --------------------
.../sparql/expr/aggregate/AccumulatorExpr.java | 22 +++++-
.../jena/sparql/expr/aggregate/AggAvg.java | 2 +-
.../sparql/expr/aggregate/AggAvgDistinct.java | 6 +-
.../jena/sparql/expr/aggregate/AggCountVar.java | 2 +-
.../expr/aggregate/AggCountVarDistinct.java | 10 +--
.../sparql/expr/aggregate/AggGroupConcat.java | 2 +-
.../expr/aggregate/AggGroupConcatDistinct.java | 10 +--
.../jena/sparql/expr/aggregate/AggMaxBase.java | 2 +-
.../jena/sparql/expr/aggregate/AggMinBase.java | 2 +-
.../jena/sparql/expr/aggregate/AggSample.java | 3 +-
.../expr/aggregate/AggSampleDistinct.java | 6 +-
.../jena/sparql/expr/aggregate/AggSum.java | 2 +-
.../sparql/expr/aggregate/AggSumDistinct.java | 6 +-
.../org/apache/jena/sparql/api/TestAPI.java | 4 +-
15 files changed, 48 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorDistinctExpr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorDistinctExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorDistinctExpr.java
deleted file mode 100644
index e5e10ba..0000000
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorDistinctExpr.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.sparql.expr.aggregate;
-
-import java.util.HashSet ;
-import java.util.Set ;
-
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.expr.Expr ;
-import org.apache.jena.sparql.expr.ExprEvalException ;
-import org.apache.jena.sparql.expr.NodeValue ;
-import org.apache.jena.sparql.function.FunctionEnv ;
-
-/** Accumulator that only passes down unique values of an expression (the first encountered) */
-abstract class AccumulatorDistinctExpr implements Accumulator
-{
- // Better?? record a large hash.
- private final Set<NodeValue> values = new HashSet<>() ;
- private long errorCount = 0 ;
- private long count = 0 ;
- private final Expr expr ;
-
- protected AccumulatorDistinctExpr(Expr expr)
- {
- this.expr = expr ;
- }
-
- @Override
- final public void accumulate(Binding binding, FunctionEnv functionEnv)
- {
- try {
- NodeValue nv = expr.eval(binding, functionEnv) ;
- if ( values.contains(nv) )
- return ;
- values.add(nv) ;
- accumulateDistinct(nv, binding, functionEnv) ;
- count++ ;
- } catch (ExprEvalException ex)
- {
- errorCount++ ;
- accumulateError(binding, functionEnv) ;
- }
- }
-
- // Count(DISTINCT ?v) is different
- @Override
- public NodeValue getValue()
- {
- if ( errorCount == 0 )
- return getAccValue() ;
- return null ;
- }
-
- protected long getErrorCount() { return errorCount ; }
-
- protected abstract NodeValue getAccValue() ;
- protected abstract void accumulateDistinct(NodeValue nv, Binding binding, FunctionEnv functionEnv) ;
- protected abstract void accumulateError(Binding binding, FunctionEnv functionEnv) ;
-}
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
index 3c9d87a..43a6844 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AccumulatorExpr.java
@@ -18,6 +18,9 @@
package org.apache.jena.sparql.expr.aggregate;
+import java.util.HashSet ;
+import java.util.Set ;
+
import org.apache.jena.sparql.engine.binding.Binding ;
import org.apache.jena.sparql.expr.Expr ;
import org.apache.jena.sparql.expr.ExprEvalException ;
@@ -28,18 +31,29 @@ import org.apache.jena.sparql.function.FunctionEnv ;
/** Accumulator that passes down every value of an expression */
public abstract class AccumulatorExpr implements Accumulator
{
+ private final Set<NodeValue> values ;
private long accCount = 0 ;
protected long errorCount = 0 ;
private final Expr expr ;
+ private final boolean makeDistinct;
- protected AccumulatorExpr(Expr expr) {
+ protected AccumulatorExpr(Expr expr, boolean makeDistinct) {
this.expr = expr;
+ // Not all subclsses use th wmachinary here to handled DISTINCT.
+ // SAMPLE(DISTINCT) and COUNT(DISTINCT *) are different.
+ this.makeDistinct = makeDistinct ;
+ this.values = makeDistinct ? new HashSet<>() : null ;
}
@Override
final public void accumulate(Binding binding, FunctionEnv functionEnv) {
NodeValue nv = ExprLib.evalOrNull(expr, binding, functionEnv);
if ( nv != null ) {
+ if ( makeDistinct ) {
+ if ( values.contains(nv) )
+ return ;
+ values.add(nv) ;
+ }
try {
accumulate(nv, binding, functionEnv);
accCount++;
@@ -52,8 +66,10 @@ public abstract class AccumulatorExpr implements Accumulator
errorCount++;
}
- // COUNT(?v) is different : errors of the expression/variable do not cause an aggregate eval error.
- // SAMPLE is different : it treats errors as "just another value" and tries to return a defined value if any have been seen.
+ // COUNT(?v) and COUNT(DISTINCT ?v) are different
+ // errors of the expression/variable do not cause an aggregate eval error.
+ // SAMPLE, SAMPLE(DISTINCT) are different
+ // treat errors as "just another value" and tries to return a defined value if any have been seen.
@Override
public NodeValue getValue() {
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvg.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvg.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvg.java
index 57c32c7..8c5ff59 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvg.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvg.java
@@ -68,7 +68,7 @@ public class AggAvg extends AggregatorBase
static final boolean DEBUG = false ;
- public AccAvg(Expr expr) { super(expr) ; }
+ public AccAvg(Expr expr) { super(expr, false) ; }
@Override
protected void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvgDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvgDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvgDistinct.java
index 126f516..5e3c538 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvgDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggAvgDistinct.java
@@ -61,7 +61,7 @@ public class AggAvgDistinct extends AggregatorBase
// ---- Accumulator
- class AccAvgDistinct extends AccumulatorDistinctExpr
+ class AccAvgDistinct extends AccumulatorExpr
{
// Non-empty case but still can be nothing because the expression may be undefined.
private NodeValue total = noValuesToAvg ;
@@ -69,10 +69,10 @@ public class AggAvgDistinct extends AggregatorBase
static final boolean DEBUG = false ;
- public AccAvgDistinct(Expr expr) { super(expr) ; }
+ public AccAvgDistinct(Expr expr) { super(expr, true) ; }
@Override
- protected void accumulateDistinct(NodeValue nv, Binding binding, FunctionEnv functionEnv)
+ protected void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
{
if ( nv.isNumber() )
{
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVar.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVar.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVar.java
index 50b2eff..5652c71 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVar.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVar.java
@@ -59,7 +59,7 @@ public class AggCountVar extends AggregatorBase
private static class AccCountVar extends AccumulatorExpr
{
private long count = 0 ;
- public AccCountVar(Expr expr) { super(expr) ; }
+ public AccCountVar(Expr expr) { super(expr, false) ; }
@Override
public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVarDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVarDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVarDistinct.java
index 57df9be..9035ae8 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVarDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggCountVarDistinct.java
@@ -56,21 +56,21 @@ public class AggCountVarDistinct extends AggregatorBase
}
// ---- Accumulator
- class AccCountVarDistinct extends AccumulatorDistinctExpr
+ class AccCountVarDistinct extends AccumulatorExpr
{
private long count = 0 ;
- public AccCountVarDistinct() { super(getExpr()) ; }
- // The group key part of binding will be the same for all elements of the group.
+ public AccCountVarDistinct() { super(getExpr(), true) ; }
+
@Override
- public void accumulateDistinct(NodeValue nv, Binding binding, FunctionEnv functionEnv)
+ public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
{ count++ ; }
+ // Ignore errors.
@Override
protected void accumulateError(Binding binding, FunctionEnv functionEnv)
{}
- // Ignore errors.
@Override
public NodeValue getValue()
{ return getAccValue() ; }
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcat.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcat.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcat.java
index c8fc4a2..b4391d5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcat.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcat.java
@@ -141,7 +141,7 @@ public class AggGroupConcat extends AggregatorBase
private final String separator ;
public AccGroupConcat(Expr expr, String sep)
- { super(expr) ; this.separator = sep ; }
+ { super(expr, false) ; this.separator = sep ; }
@Override
protected void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcatDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcatDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcatDistinct.java
index 3e20fcd..249a0c0 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcatDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggGroupConcatDistinct.java
@@ -86,17 +86,19 @@ public class AggGroupConcatDistinct extends AggregatorBase
}
// ---- Accumulator
- static class AccGroupConcatDistinct extends AccumulatorDistinctExpr
+ static class AccGroupConcatDistinct extends AccumulatorExpr
{
private StringBuilder stringSoFar = new StringBuilder() ;
private boolean first = true ;
private final String separator ;
- public AccGroupConcatDistinct(Expr expr, String sep)
- { super(expr) ; this.separator = sep ; }
+ public AccGroupConcatDistinct(Expr expr, String sep) {
+ super(expr, true);
+ this.separator = sep;
+ }
@Override
- public void accumulateDistinct(NodeValue nv, Binding binding, FunctionEnv functionEnv)
+ public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
{
String str = nv.asString() ;
if ( ! first )
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMaxBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMaxBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMaxBase.java
index 7430590..c3d6ce6 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMaxBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMaxBase.java
@@ -45,7 +45,7 @@ abstract class AggMaxBase extends AggregatorBase
// Non-empty case but still can be nothing because the expression may be undefined.
private NodeValue maxSoFar = null ;
- public AccMax(Expr expr) { super(expr) ; }
+ public AccMax(Expr expr) { super(expr, false) ; }
static final boolean DEBUG = false ;
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMinBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMinBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMinBase.java
index 71b6e4b..a7aefbe 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMinBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggMinBase.java
@@ -45,7 +45,7 @@ abstract class AggMinBase extends AggregatorBase
// Non-empty case but still can be nothing because the expression may be undefined.
private NodeValue minSoFar = null ;
- public AccMin(Expr expr) { super(expr) ; }
+ public AccMin(Expr expr) { super(expr, false) ; }
static final boolean DEBUG = false ;
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
index e889cab..5110836 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSample.java
@@ -61,7 +61,8 @@ public class AggSample extends AggregatorBase
// Sample: first evaluation of the expression that is not an error.
private NodeValue sampleSoFar = null ;
- public AccSample(Expr expr) { super(expr) ; }
+ // SAMPLE is different : it treats errors as "just another value" and tries to return a defined value if any have been seen.
+ public AccSample(Expr expr) { super(expr, false) ; }
@Override
public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv) {
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
index e2623ef..b5797b6 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSampleDistinct.java
@@ -55,11 +55,11 @@ public class AggSampleDistinct extends AggregatorBase
// ---- Accumulator
private static class AccSampleDistict extends AccumulatorExpr
{
- // NOT AccumulatorDistinctExpr - avoid "distinct" overheads.
- // For sample, DISTINCT is a no-op - this code is picks the last element.
+ // For sample, DISTINCT is a no-op - this code is picks the last element.
+ // it does not need the group to made made distinct.
private NodeValue sampleSoFar = null ;
- public AccSampleDistict(Expr expr) { super(expr) ; }
+ public AccSampleDistict(Expr expr) { super(expr, false) ; }
@Override
public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv) {
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSum.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSum.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSum.java
index deb3e61..8f71af8 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSum.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSum.java
@@ -64,7 +64,7 @@ public class AggSum extends AggregatorBase
// Non-empty case but still can be nothing because the expression may be undefined.
private NodeValue total = null ;
- public AccSum(Expr expr) { super(expr) ; }
+ public AccSum(Expr expr) { super(expr, false) ; }
@Override
protected void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSumDistinct.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSumDistinct.java b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSumDistinct.java
index ca28de3..dc5ba24 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSumDistinct.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/expr/aggregate/AggSumDistinct.java
@@ -59,15 +59,15 @@ public class AggSumDistinct extends AggregatorBase
public Node getValueEmpty() { return NodeValue.toNode(noValuesToSum) ; }
// ---- Accumulator
- class AccSumDistinct extends AccumulatorDistinctExpr
+ class AccSumDistinct extends AccumulatorExpr
{
// Non-empty case but still can be nothing because the expression may be undefined.
private NodeValue total = null ;
- public AccSumDistinct(Expr expr) { super(expr) ; }
+ public AccSumDistinct(Expr expr) { super(expr, true) ; }
@Override
- public void accumulateDistinct(NodeValue nv, Binding binding, FunctionEnv functionEnv)
+ public void accumulate(NodeValue nv, Binding binding, FunctionEnv functionEnv)
{
if ( nv.isNumber() )
{
http://git-wip-us.apache.org/repos/asf/jena/blob/375b38ef/jena-arq/src/test/java/org/apache/jena/sparql/api/TestAPI.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/api/TestAPI.java b/jena-arq/src/test/java/org/apache/jena/sparql/api/TestAPI.java
index d8b51ca..9d387fc 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/api/TestAPI.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/api/TestAPI.java
@@ -252,14 +252,12 @@ public class TestAPI extends BaseTest
assertEquals(3, count) ;
}
-
@Test public void testReuseQueryObject2()
{
- String queryString = "SELECT (count(?s) AS ?c) {?s ?p ?o} GROUP BY ?s";
+ String queryString = "SELECT (count(?o) AS ?c) {?s ?p ?o} GROUP BY ?s";
Query q = QueryFactory.create(queryString) ;
try(QueryExecution qExec = QueryExecutionFactory.create(q, m)) {
-
ResultSet rs = qExec.execSelect() ;
QuerySolution qs = rs.nextSolution() ;
assertEquals(3, qs.getLiteral("c").getInt()) ;