Repository: marmotta Updated Branches: refs/heads/develop 4bc783a95 -> 048994403
SPARQL: - implementation of SameTerm - implementation of BNodeGenerator and IRIFunction - empty literal results have no language Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/04899440 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/04899440 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/04899440 Branch: refs/heads/develop Commit: 048994403681d6141fadcc110cb9d88acf983426 Parents: 4bc783a Author: Sebastian Schaffert <[email protected]> Authored: Wed Nov 5 13:25:12 2014 +0100 Committer: Sebastian Schaffert <[email protected]> Committed: Wed Nov 5 13:25:12 2014 +0100 ---------------------------------------------------------------------- .../marmotta/kiwi/sparql/builder/OPTypes.java | 2 +- .../kiwi/sparql/builder/ProjectionType.java | 2 +- .../kiwi/sparql/builder/SQLBuilder.java | 68 ++++++++++++++++-- .../marmotta/kiwi/sparql/builder/SQLClause.java | 5 +- .../kiwi/sparql/builder/SQLFragment.java | 10 +-- .../kiwi/sparql/builder/VariableFinder.java | 23 ++---- .../evaluation/KiWiEvaluationStrategyImpl.java | 12 ++++ .../persistence/KiWiSparqlConnection.java | 58 +++++++++------ .../sparql/sail/KiWiSparqlSailConnection.java | 8 ++- .../services/sparql/SparqlServiceImpl.java | 76 +++++--------------- 10 files changed, 147 insertions(+), 117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypes.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypes.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypes.java index db307b2..858dcde 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypes.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypes.java @@ -23,5 +23,5 @@ package org.apache.marmotta.kiwi.sparql.builder; * @author Sebastian Schaffert ([email protected]) */ public enum OPTypes { - STRING, DOUBLE, INT, DATE, BOOL, VALUE, ANY, URI + STRING, DOUBLE, INT, DATE, BOOL, VALUE, ANY, TERM, URI, BNODE } http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ProjectionType.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ProjectionType.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ProjectionType.java index 134b5c2..eff7798 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ProjectionType.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ProjectionType.java @@ -23,5 +23,5 @@ package org.apache.marmotta.kiwi.sparql.builder; * @author Sebastian Schaffert ([email protected]) */ public enum ProjectionType { - NODE, URI, STRING, INT, DOUBLE, DATE, NONE + NODE, URI, BNODE, STRING, INT, DOUBLE, DATE, NONE } http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java index fd01c1a..46f601c 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java @@ -120,6 +120,9 @@ public class SQLBuilder { // a prefix for naming table aliases (needed in case this is a subquery) private String prefix; + // used by BNodeGenerator + private static Random anonIdGenerator = new Random(); + /** * Create a new SQLBuilder for the given query, initial bindings, dataset, and * @param query @@ -195,17 +198,38 @@ public class SQLBuilder { // find extensions (BIND) extensions = new ExtensionFinder(query).elements; + int variableCount = 0; + + + // find all variables that have been bound already, even if they do not appear in a pattern + for(Var v : new VariableFinder(query).variables) { + if(v.hasValue() && !v.getName().startsWith("-const")) { + SQLVariable sv = variables.get(v.getName()); + if(sv == null) { + sv = new SQLVariable("V" + (++variableCount), v.getName()); + + // select those variables that are really projected and not only needed in a grouping construct + if(projectedVars.contains(sv.getSparqlName()) || new SQLProjectionFinder(query,v.getName()).found) { + sv.setProjectionType(ProjectionType.NODE); + } + + sv.getExpressions().add(""+ converter.convert(v.getValue()).getId()); + + addVariable(sv); + } + } + } + // find all variables occurring in the patterns and create a map to map them to // field names in the database query; each variable will have one or several field names, // one for each pattern it occurs in; field names are constructed automatically by a counter // and the pattern name to ensure the name is a valid HQL identifier - int variableCount = 0; for(SQLFragment f : fragments) { for (SQLPattern p : f.getPatterns()) { // build pattern Var[] fields = p.getFields(); for (int i = 0; i < fields.length; i++) { - if (fields[i] != null && !fields[i].hasValue()) { + if (fields[i] != null && (!fields[i].hasValue() || !fields[i].getName().startsWith("-const"))) { Var v = fields[i]; SQLVariable sv = variables.get(v.getName()); @@ -299,7 +323,7 @@ public class SQLBuilder { // build pattern Var[] fields = p.getFields(); for (int i = 0; i < fields.length; i++) { - if (fields[i] != null && !fields[i].hasValue()) { + if (fields[i] != null && (!fields[i].hasValue() || !fields[i].getName().startsWith("-const"))) { Var v = fields[i]; SQLVariable sv = variables.get(v.getName()); @@ -767,12 +791,31 @@ public class SQLBuilder { // get value of argument and express it as string return evaluateExpression(str.getArg(), OPTypes.STRING); + } else if(expr instanceof BNodeGenerator) { + BNodeGenerator str = (BNodeGenerator)expr; + + if(str.getNodeIdExpr() != null) { + // get value of argument and express it as string + return evaluateExpression(str.getNodeIdExpr(), OPTypes.STRING); + } else { + return "\"" + Long.toHexString(System.currentTimeMillis())+Integer.toHexString(anonIdGenerator.nextInt(1000)) + "\""; + } + } else if(expr instanceof IRIFunction) { + IRIFunction str = (IRIFunction)expr; + + // get value of argument and express it as string + return evaluateExpression(str.getArg(), OPTypes.STRING); } else if(expr instanceof Lang) { Lang lang = (Lang)expr; if(lang.getArg() instanceof Var) { return variables.get(((Var) lang.getArg()).getName()).getAlias() + ".lang"; } + } else if(expr instanceof SameTerm) { + SameTerm cmp = (SameTerm)expr; + + // covered by value binding in variables + return evaluateExpression(cmp.getLeftArg(), OPTypes.TERM) + " = " + evaluateExpression(cmp.getRightArg(), OPTypes.TERM); } else if(expr instanceof Compare) { Compare cmp = (Compare)expr; @@ -791,7 +834,7 @@ public class SQLBuilder { throw new IllegalArgumentException("operation "+cmp.getOperator()+" is not supported on strings"); } } else { - if(ot == OPTypes.ANY) { + if(ot == OPTypes.ANY || ot == OPTypes.TERM) { ot = OPTypes.DOUBLE; } @@ -860,7 +903,7 @@ public class SQLBuilder { ValueExpr arg = ((UnaryValueOperator)expr).getArg(); // operator must be a variable or a constant - if(arg instanceof ValueConstant) { + if (arg instanceof ValueConstant) { return Boolean.toString(((ValueConstant) arg).getValue() instanceof Literal); } else if(arg instanceof Var) { String var = variables.get(((Var) arg).getName()).getAlias(); @@ -903,6 +946,14 @@ public class SQLBuilder { return var + ".svalue"; case URI: return var + ".svalue"; + case TERM: + if(var == null) { + // might happen in case the variable has been bound to a constant value and not + // joined in a pattern query + return sv.getExpressions().get(0); + } else { + return var + ".id"; + } case ANY: return var + ".id"; } @@ -924,6 +975,7 @@ public class SQLBuilder { case DATE: return "'" + sqlDateFormat.format(DateUtils.parseDate(val)) + "'"; // in this case we should return a node ID and also need to make sure it actually exists + case TERM: case ANY: KiWiNode n = converter.convert(((ValueConstant) expr).getValue()); return "" + n.getId(); @@ -1155,7 +1207,11 @@ public class SQLBuilder { protected ProjectionType getProjectionType(ValueExpr expr) { - if(expr instanceof FunctionCall) { + if(expr instanceof BNodeGenerator) { + return ProjectionType.BNODE; + } else if(expr instanceof IRIFunction) { + return ProjectionType.URI; + } else if(expr instanceof FunctionCall) { return opTypeToProjection(functionRegistry.get(((FunctionCall) expr).getURI()).getReturnType()); } else if(expr instanceof NAryValueOperator) { return getProjectionType(((NAryValueOperator) expr).getArguments().get(0)); http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java index 15164ba..66f0d0f 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java @@ -64,10 +64,11 @@ public abstract class SQLClause { StringBuilder onClause = new StringBuilder(); for(Iterator<String> cit = conditions.iterator(); cit.hasNext(); ) { - if(onClause.length() > 0) { + String next = cit.next(); + if(onClause.length() > 0 && next.length() > 0) { onClause.append("\n AND "); } - onClause.append(cit.next()); + onClause.append(next); } return onClause.toString(); http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java index 552f08b..b2d1fac 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java @@ -110,10 +110,11 @@ public class SQLFragment extends SQLClause { if(conditionPosition == ConditionPosition.JOIN && !it.hasNext()) { // if this is the last pattern of the fragment, add the filter conditions for(Iterator<String> cit = getConditions().iterator(); cit.hasNext(); ) { - if(conditionClause.length() > 0) { + String next = cit.next(); + if(conditionClause.length() > 0 && next.length() > 0) { conditionClause.append("\n AND "); } - conditionClause.append(cit.next()); + conditionClause.append(next); } } @@ -173,10 +174,11 @@ public class SQLFragment extends SQLClause { // in case the pattern is the last of the fragment, also add the filter conditions of the fragment // if this is the last pattern of the fragment, add the filter conditions for(Iterator<String> cit = getConditions().iterator(); cit.hasNext(); ) { - if(conditionClause.length() > 0) { + String next = cit.next(); + if(conditionClause.length() > 0 && next.length() > 0) { conditionClause.append("\n AND "); } - conditionClause.append(cit.next()); + conditionClause.append(next); } } http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java index ab3dbb9..d9161a8 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java @@ -17,7 +17,9 @@ package org.apache.marmotta.kiwi.sparql.builder; -import org.openrdf.query.algebra.*; +import org.openrdf.query.algebra.Projection; +import org.openrdf.query.algebra.TupleExpr; +import org.openrdf.query.algebra.Var; import org.openrdf.query.algebra.helpers.QueryModelVisitorBase; import java.util.HashSet; @@ -30,7 +32,7 @@ import java.util.Set; */ public class VariableFinder extends QueryModelVisitorBase<RuntimeException> { - Set<String> variableNames = new HashSet<>(); + Set<Var> variables = new HashSet<>(); public VariableFinder(TupleExpr expr) { expr.visit(this); @@ -39,27 +41,12 @@ public class VariableFinder extends QueryModelVisitorBase<RuntimeException> { @Override public void meet(Var node) throws RuntimeException { - variableNames.add(node.getName()); - } - - @Override - public void meet(ExtensionElem node) throws RuntimeException { - variableNames.add(node.getName()); - // don't recurse to the children, as this would project non-grouped elements - } - - @Override - public void meet(Group node) throws RuntimeException { - variableNames.addAll(node.getGroupBindingNames()); - // don't recurse to the children, as this would project non-grouped elements + variables.add(node); } @Override public void meet(Projection node) throws RuntimeException { - for(ProjectionElem elem : node.getProjectionElemList().getElements()) { - variableNames.add(elem.getSourceName()); - } // stop at projection, subquery } http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java index 14e69d8..9737463 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java @@ -83,6 +83,8 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{ supportedConstructs.add(Var.class); supportedConstructs.add(Str.class); supportedConstructs.add(Label.class); + supportedConstructs.add(BNodeGenerator.class); + supportedConstructs.add(IRIFunction.class); supportedConstructs.add(IsResource.class); supportedConstructs.add(IsURI.class); supportedConstructs.add(IsBNode.class); @@ -317,6 +319,8 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{ return isSupported(((Sum) expr).getArg()); } else if(expr instanceof Compare) { return isSupported(((Compare) expr).getLeftArg()) && isSupported(((Compare) expr).getRightArg()); + } else if(expr instanceof SameTerm) { + return isSupported(((SameTerm) expr).getLeftArg()) && isSupported(((SameTerm) expr).getRightArg()); } else if(expr instanceof MathExpr) { return isSupported(((MathExpr) expr).getLeftArg()) && isSupported(((MathExpr) expr).getRightArg()); } else if(expr instanceof And) { @@ -335,6 +339,14 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{ return isAtomic(((Str) expr).getArg()); } else if(expr instanceof Label) { return isAtomic(((UnaryValueOperator) expr).getArg()); + } else if(expr instanceof BNodeGenerator) { + if(((BNodeGenerator) expr).getNodeIdExpr() != null) { + return isAtomic(((BNodeGenerator) expr).getNodeIdExpr()); + } else { + return true; + } + } else if(expr instanceof IRIFunction) { + return isAtomic(((UnaryValueOperator) expr).getArg()); } else if(expr instanceof Bound) { return true; } else if(expr instanceof IsResource) { http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java index 7d91d6b..c352e0f 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java @@ -32,8 +32,8 @@ import org.apache.marmotta.kiwi.sparql.builder.ProjectionType; import org.apache.marmotta.kiwi.sparql.builder.SQLBuilder; import org.apache.marmotta.kiwi.sparql.builder.SQLVariable; import org.apache.marmotta.kiwi.sparql.exception.UnsatisfiableQueryException; -import org.openrdf.model.Literal; import org.openrdf.model.URI; +import org.openrdf.model.impl.BNodeImpl; import org.openrdf.model.impl.LiteralImpl; import org.openrdf.model.impl.URIImpl; import org.openrdf.query.Binding; @@ -146,6 +146,11 @@ public class KiWiSparqlConnection { if(svalue != null) resultRow.addBinding(sv.getSparqlName(), new URIImpl(svalue)); break; + case BNODE: + svalue = row.getString(sv.getName()); + if(svalue != null) + resultRow.addBinding(sv.getSparqlName(), new BNodeImpl(svalue)); + break; case INT: if(row.getObject(sv.getName()) != null) { svalue = Integer.toString(row.getInt(sv.getName())); @@ -164,31 +169,38 @@ public class KiWiSparqlConnection { if(svalue != null) { - // retrieve optional type and language information - String lang = null; - URI type = null; - try { - lang = row.getString(sv.getName() + "_LANG"); - } catch (SQLException ex) { - } + if (svalue.length() > 0) { + // retrieve optional type and language information, because string functions + // need to preserve this in certain cases, even when constructing new literals + String lang = null; + URI type = null; + try { + lang = row.getString(sv.getName() + "_LANG"); + } catch (SQLException ex) { + } + + try { + long typeId = row.getLong(sv.getName() + "_TYPE"); + if (typeId > 0) + type = (URI) parent.loadNodeById(typeId); + } catch (SQLException ex) { + } + + if (lang != null) { + resultRow.addBinding(sv.getSparqlName(), new LiteralImpl(svalue, lang)); + } else if (type != null) { + if(type.stringValue().equals(XSD.String.stringValue())) { + // string functions on other datatypes than string should yield no binding + resultRow.addBinding(sv.getSparqlName(), new LiteralImpl(svalue, type)); + } + } else { + resultRow.addBinding(sv.getSparqlName(), new LiteralImpl(svalue)); + } - try { - long typeId = row.getLong(sv.getName() + "_TYPE"); - if (typeId > 0) - type = (URI) parent.loadNodeById(typeId); - } catch (SQLException ex) { - } - - Literal v; - if(lang != null) { - v = new LiteralImpl(svalue,lang); - } else if(type != null) { - v = new LiteralImpl(svalue,type); } else { - v = new LiteralImpl(svalue); + // string functions that return empty literal should yield no type or language + resultRow.addBinding(sv.getSparqlName(), new LiteralImpl("")); } - - resultRow.addBinding(sv.getSparqlName(), v); } break; } http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java index bb634af..74ddb8d 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java @@ -76,8 +76,12 @@ public class KiWiSparqlSailConnection extends NotifyingSailConnectionWrapper { new ConstantOptimizer(strategy).optimize(tupleExpr, dataset, bindings); new CompareOptimizer().optimize(tupleExpr, dataset, bindings); new ConjunctiveConstraintSplitter().optimize(tupleExpr, dataset, bindings); - new DisjunctiveConstraintOptimizer().optimize(tupleExpr, dataset, bindings); - new SameTermFilterOptimizer().optimize(tupleExpr, dataset, bindings); + + // these are better handled by SQL directly + //new DisjunctiveConstraintOptimizer().optimize(tupleExpr, dataset, bindings); + //new SameTermFilterOptimizer().optimize(tupleExpr, dataset, bindings); + + new QueryModelNormalizer().optimize(tupleExpr, dataset, bindings); new QueryJoinOptimizer(new KiWiEvaluationStatistics()).optimize(tupleExpr, dataset, bindings); new IterativeEvaluationOptimizer().optimize(tupleExpr, dataset, bindings); http://git-wip-us.apache.org/repos/asf/marmotta/blob/04899440/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java ---------------------------------------------------------------------- diff --git a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java index ac5d5cd..4da7e31 100644 --- a/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java +++ b/platform/marmotta-sparql/src/main/java/org/apache/marmotta/platform/sparql/services/sparql/SparqlServiceImpl.java @@ -18,28 +18,6 @@ package org.apache.marmotta.platform.sparql.services.sparql; import info.aduna.lang.FileFormat; - -import java.io.IOException; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; - import org.apache.commons.lang3.StringUtils; import org.apache.marmotta.commons.vocabulary.SPARQL_SD; import org.apache.marmotta.platform.core.api.config.ConfigurationService; @@ -52,51 +30,26 @@ import org.apache.marmotta.platform.sparql.api.sparql.SparqlService; import org.apache.marmotta.platform.sparql.services.sparqlio.rdf.SPARQLGraphResultWriter; import org.apache.marmotta.platform.sparql.services.sparqlio.sparqlhtml.SPARQLHTMLSettings; import org.apache.marmotta.platform.sparql.webservices.SparqlWebService; -import org.openrdf.model.BNode; -import org.openrdf.model.Resource; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; +import org.openrdf.model.*; import org.openrdf.model.impl.ValueFactoryImpl; import org.openrdf.model.vocabulary.RDF; -import org.openrdf.query.Binding; -import org.openrdf.query.BindingSet; -import org.openrdf.query.BooleanQuery; -import org.openrdf.query.GraphQuery; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.Query; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.QueryLanguage; -import org.openrdf.query.QueryResultHandlerException; -import org.openrdf.query.TupleQuery; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.query.TupleQueryResultHandlerException; -import org.openrdf.query.Update; -import org.openrdf.query.UpdateExecutionException; -import org.openrdf.query.parser.ParsedBooleanQuery; -import org.openrdf.query.parser.ParsedGraphQuery; -import org.openrdf.query.parser.ParsedQuery; -import org.openrdf.query.parser.ParsedTupleQuery; -import org.openrdf.query.parser.QueryParser; -import org.openrdf.query.parser.QueryParserUtil; -import org.openrdf.query.resultio.BooleanQueryResultFormat; -import org.openrdf.query.resultio.BooleanQueryResultWriter; -import org.openrdf.query.resultio.QueryResultFormat; -import org.openrdf.query.resultio.QueryResultIO; -import org.openrdf.query.resultio.QueryResultWriter; -import org.openrdf.query.resultio.TupleQueryResultFormat; -import org.openrdf.query.resultio.TupleQueryResultWriter; +import org.openrdf.query.*; +import org.openrdf.query.parser.*; +import org.openrdf.query.resultio.*; import org.openrdf.repository.RepositoryConnection; import org.openrdf.repository.RepositoryException; import org.openrdf.repository.RepositoryResult; -import org.openrdf.rio.RDFFormat; -import org.openrdf.rio.RDFHandlerException; -import org.openrdf.rio.RDFWriter; -import org.openrdf.rio.RDFWriterRegistry; -import org.openrdf.rio.Rio; -import org.openrdf.rio.UnsupportedRDFormatException; +import org.openrdf.rio.*; import org.slf4j.Logger; +import javax.annotation.PostConstruct; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStream; +import java.util.*; +import java.util.concurrent.*; + /** * Sparql Service implementation * @@ -244,6 +197,7 @@ public class SparqlServiceImpl implements SparqlService { throw new TimeoutException("SPARQL query execution aborted due to timeout (" + configurationService.getIntConfiguration("sparql.timeout",60)+"s)"); } catch (ExecutionException e) { log.info("SPARQL query execution aborted due to exception"); + log.debug("exception details",e); if(e.getCause() instanceof MarmottaException) { throw (MarmottaException)e.getCause(); } else if(e.getCause() instanceof MalformedQueryException) { @@ -308,6 +262,7 @@ public class SparqlServiceImpl implements SparqlService { throw new TimeoutException("SPARQL query execution aborted due to timeout (" + timeoutInSeconds+"s)"); } catch (ExecutionException e) { log.info("SPARQL query execution aborted due to exception"); + log.debug("exception details", e); if(e.getCause() instanceof MarmottaException) { throw (MarmottaException)e.getCause(); } else if(e.getCause() instanceof MalformedQueryException) { @@ -372,6 +327,7 @@ public class SparqlServiceImpl implements SparqlService { throw new TimeoutException("SPARQL query execution aborted due to timeout (" + configurationService.getIntConfiguration("sparql.timeout",60)+"s)"); } catch (ExecutionException e) { log.info("SPARQL query execution aborted due to exception"); + log.debug("exception details", e); if(e.getCause() instanceof MarmottaException) { throw (MarmottaException)e.getCause(); } else if(e.getCause() instanceof MalformedQueryException) {
