You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2014/11/06 16:49:31 UTC

[2/2] git commit: SPARQL: - structure SPARQL builder into packages

SPARQL:
- structure SPARQL builder into packages


Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo
Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/8c62e913
Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/8c62e913
Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/8c62e913

Branch: refs/heads/develop
Commit: 8c62e9133def502688bc487a7cd93dd501be9176
Parents: d11b8e0
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Thu Nov 6 16:50:08 2014 +0100
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Thu Nov 6 16:50:08 2014 +0100

----------------------------------------------------------------------
 .../kiwi/sparql/builder/ConditionFinder.java    |  78 -------
 .../kiwi/sparql/builder/DistinctFinder.java     |  55 -----
 .../kiwi/sparql/builder/ExtensionFinder.java    |  66 ------
 .../kiwi/sparql/builder/GroupFinder.java        |  58 -----
 .../kiwi/sparql/builder/LimitFinder.java        |  58 -----
 .../builder/LiteralTypeExpressionFinder.java    |  68 ------
 .../kiwi/sparql/builder/OPTypeFinder.java       | 134 ------------
 .../kiwi/sparql/builder/OrderFinder.java        |  56 -----
 .../kiwi/sparql/builder/PatternCollector.java   | 108 ---------
 .../sparql/builder/SQLAbstractSubquery.java     |  81 -------
 .../kiwi/sparql/builder/SQLBuilder.java         |   7 +-
 .../marmotta/kiwi/sparql/builder/SQLClause.java |  81 -------
 .../kiwi/sparql/builder/SQLFragment.java        | 193 ----------------
 .../kiwi/sparql/builder/SQLPattern.java         | 196 -----------------
 .../sparql/builder/SQLProjectionFinder.java     |  88 --------
 .../kiwi/sparql/builder/SQLSubQuery.java        | 101 ---------
 .../marmotta/kiwi/sparql/builder/SQLUnion.java  | 215 ------------------
 .../kiwi/sparql/builder/SQLVariable.java        | 196 -----------------
 .../kiwi/sparql/builder/VariableFinder.java     |  53 -----
 .../kiwi/sparql/builder/VariableMapping.java    |  62 ------
 .../sparql/builder/collect/ConditionFinder.java |  78 +++++++
 .../sparql/builder/collect/DistinctFinder.java  |  55 +++++
 .../sparql/builder/collect/ExtensionFinder.java |  66 ++++++
 .../sparql/builder/collect/GroupFinder.java     |  58 +++++
 .../sparql/builder/collect/LimitFinder.java     |  58 +++++
 .../collect/LiteralTypeExpressionFinder.java    |  69 ++++++
 .../sparql/builder/collect/OPTypeFinder.java    | 135 ++++++++++++
 .../sparql/builder/collect/OrderFinder.java     |  56 +++++
 .../builder/collect/PatternCollector.java       | 113 ++++++++++
 .../builder/collect/SQLProjectionFinder.java    |  88 ++++++++
 .../sparql/builder/collect/VariableFinder.java  |  53 +++++
 .../builder/model/SQLAbstractSubquery.java      | 124 +++++++++++
 .../kiwi/sparql/builder/model/SQLClause.java    |  81 +++++++
 .../kiwi/sparql/builder/model/SQLFragment.java  | 193 ++++++++++++++++
 .../kiwi/sparql/builder/model/SQLPattern.java   | 196 +++++++++++++++++
 .../kiwi/sparql/builder/model/SQLSubQuery.java  | 103 +++++++++
 .../kiwi/sparql/builder/model/SQLUnion.java     | 218 +++++++++++++++++++
 .../kiwi/sparql/builder/model/SQLVariable.java  | 197 +++++++++++++++++
 .../persistence/KiWiSparqlConnection.java       |   2 +-
 39 files changed, 1948 insertions(+), 1949 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ConditionFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ConditionFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ConditionFinder.java
deleted file mode 100644
index 7b0c8f6..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ConditionFinder.java
+++ /dev/null
@@ -1,78 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-/**
- * Check if a variable is used as a condition somewhere and therefore needs to be resolved.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class ConditionFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    boolean found = false;
-
-    private String varName;
-
-    public ConditionFinder(String varName, TupleExpr expr) {
-        this.varName = varName;
-
-        expr.visit(this);
-    }
-
-    public ConditionFinder(String varName, ValueExpr expr) {
-        this.varName = varName;
-
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Var node) throws RuntimeException {
-        if(!found) {
-            found = node.getName().equals(varName);
-        }
-    }
-
-    @Override
-    public void meet(Count node) throws RuntimeException {
-        if(!found && node.getArg() == null) {
-            // special case: count(*), we need the variable
-            found = true;
-        } else {
-            super.meet(node);
-        }
-    }
-
-    @Override
-    public void meet(StatementPattern node) throws RuntimeException {
-        // stop, no condition
-    }
-
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop, subquery
-    }
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop, subquery
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/DistinctFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/DistinctFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/DistinctFinder.java
deleted file mode 100644
index efdf88a..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/DistinctFinder.java
+++ /dev/null
@@ -1,55 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-/**
-* Find distinct/reduced in a tuple expression.
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class DistinctFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    boolean distinct = false;
-
-    public DistinctFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Distinct node) throws RuntimeException {
-        distinct = true;
-    }
-
-    @Override
-    public void meet(Reduced node) throws RuntimeException {
-        distinct = true;
-    }
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ExtensionFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ExtensionFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ExtensionFinder.java
deleted file mode 100644
index 191a275..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/ExtensionFinder.java
+++ /dev/null
@@ -1,66 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
-* Find the offset and limit values in a tuple expression
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class ExtensionFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    private static Logger log = LoggerFactory.getLogger(ExtensionFinder.class);
-
-    List<ExtensionElem> elements = new ArrayList<>();
-
-    public ExtensionFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Extension node) throws RuntimeException {
-        // visit children before, as there might be dependencies
-        super.meet(node);
-
-        for(ExtensionElem elem : node.getElements()) {
-            if(elem.getExpr() instanceof Var && ((Var) elem.getExpr()).getName().equals(elem.getName())) {
-                log.debug("ignoring self-aliasing of variable {}", elem.getName());
-            } else {
-                elements.add(elem);
-            }
-        }
-    }
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop here, this is a subquery in SQL
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop here, this is a subquery in SQL
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/GroupFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/GroupFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/GroupFinder.java
deleted file mode 100644
index f492439..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/GroupFinder.java
+++ /dev/null
@@ -1,58 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
-* Find the offset and limit values in a tuple expression
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class GroupFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    Set<String>     bindings = new HashSet<>();
-    List<GroupElem> elements = new ArrayList<>();
-
-    public GroupFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Group node) throws RuntimeException {
-        bindings.addAll(node.getGroupBindingNames());
-        elements.addAll(node.getGroupElements());
-        super.meet(node);
-    }
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop at union, subquery
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LimitFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LimitFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LimitFinder.java
deleted file mode 100644
index dfe6715..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LimitFinder.java
+++ /dev/null
@@ -1,58 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.Slice;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-/**
-* Find the offset and limit values in a tuple expression
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class LimitFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    long limit = -1, offset = -1;
-
-    public LimitFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Slice node) throws RuntimeException {
-        if(node.hasLimit())
-            limit = node.getLimit();
-        if(node.hasOffset())
-            offset = node.getOffset();
-    }
-
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LiteralTypeExpressionFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LiteralTypeExpressionFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LiteralTypeExpressionFinder.java
deleted file mode 100644
index 020657b..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/LiteralTypeExpressionFinder.java
+++ /dev/null
@@ -1,68 +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.marmotta.kiwi.sparql.builder;
-
-import org.apache.marmotta.kiwi.sparql.function.NativeFunction;
-import org.apache.marmotta.kiwi.sparql.function.NativeFunctionRegistry;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-/**
- * Functions that return a string literal do so with the string literal of the same kind as the first
- * argument (simple literal, plain literal with same language tag, xsd:string). This visitor
- * tries finding the relevant subexpression in a complex value expression.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class LiteralTypeExpressionFinder  extends QueryModelVisitorBase<RuntimeException> {
-
-    protected Var expr = null;
-
-    public LiteralTypeExpressionFinder(ValueExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(FunctionCall node) throws RuntimeException {
-        NativeFunction nf = NativeFunctionRegistry.getInstance().get(node.getURI());
-        if(node.getArgs().size() > 0 && nf.getReturnType() == OPTypes.STRING) {
-            node.getArgs().get(0).visit(this);
-        }
-        // otherwise stop here, the function call hides the type and language anyways
-    }
-
-    @Override
-    public void meet(Var node) throws RuntimeException {
-        expr = node;
-    }
-
-    /**
-     * Method called by all of the other <tt>meet</tt> methods that are not
-     * overridden in subclasses. This method can be overridden in subclasses to
-     * define default behaviour when visiting nodes. The default behaviour of
-     * this method is to visit the node's children.
-     *
-     * @param node The node that is being visited.
-     */
-    @Override
-    protected void meetNode(QueryModelNode node) throws RuntimeException {
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypeFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypeFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypeFinder.java
deleted file mode 100644
index b10c322..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OPTypeFinder.java
+++ /dev/null
@@ -1,134 +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.marmotta.kiwi.sparql.builder;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.marmotta.commons.sesame.model.Namespaces;
-import org.apache.marmotta.kiwi.sparql.function.NativeFunction;
-import org.apache.marmotta.kiwi.sparql.function.NativeFunctionRegistry;
-import org.openrdf.model.Literal;
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Determine the operand type of a value expression. Get the coerced value by calling coerce().
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class OPTypeFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    List<OPTypes> optypes = new ArrayList<>();
-
-
-
-    public OPTypeFinder(ValueExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(ValueConstant node) throws RuntimeException {
-        if(node.getValue() instanceof Literal) {
-            Literal l = (Literal)node.getValue();
-            String type = l.getDatatype() != null ? l.getDatatype().stringValue() : null;
-
-            if(StringUtils.equals(Namespaces.NS_XSD + "double", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "float", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "decimal", type)) {
-                optypes.add(OPTypes.DOUBLE);
-            } else if(StringUtils.equals(Namespaces.NS_XSD + "integer", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "long", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "int", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "short", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "nonNegativeInteger", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "nonPositiveInteger", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "negativeInteger", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "positiveInteger", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "unsignedLong", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "unsignedShort", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "byte", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "unsignedByte", type)) {
-                optypes.add(OPTypes.INT);
-            } else if(StringUtils.equals(Namespaces.NS_XSD + "dateTime", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "date", type)
-                    || StringUtils.equals(Namespaces.NS_XSD + "time", type)) {
-                optypes.add(OPTypes.DATE);
-            } else {
-                optypes.add(OPTypes.STRING);
-            }
-        } else {
-            optypes.add(OPTypes.STRING);
-        }
-    }
-
-    @Override
-    public void meet(Str node) throws RuntimeException {
-        optypes.add(OPTypes.STRING);
-    }
-
-    @Override
-    public void meet(Lang node) throws RuntimeException {
-        optypes.add(OPTypes.STRING);
-    }
-
-    @Override
-    public void meet(LocalName node) throws RuntimeException {
-        optypes.add(OPTypes.STRING);
-    }
-
-    @Override
-    public void meet(Label node) throws RuntimeException {
-        optypes.add(OPTypes.STRING);
-    }
-
-
-    @Override
-    public void meet(FunctionCall fc) throws RuntimeException {
-        NativeFunction nf = NativeFunctionRegistry.getInstance().get(fc.getURI());
-
-        if (nf != null) {
-            optypes.add(nf.getReturnType());
-        }
-    }
-
-
-    public OPTypes coerce() {
-        OPTypes left = OPTypes.ANY;
-
-        for(OPTypes right : optypes) {
-            if(left == OPTypes.ANY) {
-                left = right;
-            } else if(right == OPTypes.ANY) {
-                // keep left
-            } else if(left == right) {
-                // keep left
-            } else if( (left == OPTypes.INT && right == OPTypes.DOUBLE) || (left == OPTypes.DOUBLE && right == OPTypes.INT)) {
-                left = OPTypes.DOUBLE;
-            } else if( (left == OPTypes.STRING) || (right == OPTypes.STRING)) {
-                left = OPTypes.STRING;
-            } else {
-                throw new IllegalArgumentException("unsupported type coercion: " + left + " and " + right);
-            }
-        }
-        return left;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OrderFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OrderFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OrderFinder.java
deleted file mode 100644
index 9e6cf34..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/OrderFinder.java
+++ /dev/null
@@ -1,56 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
-* Find the offset and limit values in a tuple expression
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class OrderFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    List<OrderElem> elements = new ArrayList<>();
-
-    public OrderFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(Order node) throws RuntimeException {
-        elements.addAll(node.getElements());
-    }
-
-
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/PatternCollector.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/PatternCollector.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/PatternCollector.java
deleted file mode 100644
index 5c81f6d..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/PatternCollector.java
+++ /dev/null
@@ -1,108 +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.marmotta.kiwi.sparql.builder;
-
-import org.apache.marmotta.kiwi.persistence.KiWiDialect;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-import java.util.LinkedList;
-import java.util.Set;
-
-/**
-* Collect all statement patterns in a tuple expression.
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class PatternCollector extends QueryModelVisitorBase<RuntimeException> {
-
-    LinkedList<SQLFragment> parts   = new LinkedList<>();
-
-    int counter = 0;
-
-
-    private BindingSet bindings;
-    private Dataset dataset;
-    private ValueConverter converter;
-    private KiWiDialect dialect;
-    private Set<String> projectedVars;
-    private String prefix;
-
-    public PatternCollector(TupleExpr expr, BindingSet bindings, Dataset dataset, ValueConverter converter, KiWiDialect dialect, Set<String> projectedVars, String prefix) {
-        this.bindings = bindings;
-        this.dataset = dataset;
-        this.converter = converter;
-        this.dialect = dialect;
-        this.projectedVars = projectedVars;
-        this.prefix  = prefix;
-
-        parts.push(new SQLFragment());
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(StatementPattern node) throws RuntimeException {
-        parts.getLast().getPatterns().add(new SQLPattern(prefix + "P" + (++counter), node));
-
-        super.meet(node);
-    }
-
-    @Override
-    public void meet(LeftJoin node) throws RuntimeException {
-        node.getLeftArg().visit(this);
-        parts.addLast(new SQLFragment());
-        if(node.hasCondition()) {
-            parts.getLast().getFilters().add(node.getCondition());
-        }
-        node.getRightArg().visit(this);
-
-    }
-
-
-    @Override
-    public void meet(Filter node) throws RuntimeException {
-        parts.getLast().getFilters().add(node.getCondition());
-
-        if(node.getArg() instanceof Group) {
-            parts.getLast().setConditionPosition(SQLFragment.ConditionPosition.HAVING);
-        }
-
-        super.meet(node);
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // unions are treated as subqueries, don't continue collection, but add the Union to the last part
-
-        parts.getLast().getSubqueries().add(new SQLUnion(prefix + "U" + (++counter),node, bindings, dataset, converter, dialect));
-    }
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // subqueries are represented with a projection inside a JOIN; we don't continue collection
-
-        parts.getLast().getSubqueries().add(new SQLSubQuery(prefix + "S" + (++counter), node, bindings, dataset, converter, dialect, projectedVars));
-    }
-
-    @Override
-    public void meet(Exists node) throws RuntimeException {
-        // stop at exists, it is treated as a subquery in the condition part
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java
deleted file mode 100644
index e57eeed..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java
+++ /dev/null
@@ -1,81 +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.marmotta.kiwi.sparql.builder;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Common fields and methods for all subqueries.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public abstract class SQLAbstractSubquery extends SQLClause {
-
-    protected String alias;
-
-
-    /**
-     * This set contains variable names describing those variables of the subquery that need to be joined with the NODES
-     * table. This is typically the case when there is a condition or function referring to the actual value of the node
-     * and not only the ID. The joined NODES table will be aliased with {alias}_{name}.
-     */
-    private Set<VariableMapping> joinFields = new HashSet<>();
-
-
-    public SQLAbstractSubquery(String alias) {
-        this.alias = alias;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-
-    public Set<VariableMapping> getJoinFields() {
-        return joinFields;
-    }
-
-    /**
-     * Return true when the pattern involves JOINs with the NODES table; in this case we need to enclose the
-     * FROM clause with parentheses before joining with previous clauses.
-     * @return
-     */
-    public boolean hasJoinFields() {
-        return joinFields.size() > 0;
-    }
-
-
-    /**
-     * Return true if the FROM clause requires parenthesis before
-     *
-     * @return
-     */
-    @Override
-    public boolean needsParentheses() {
-        return hasJoinFields();
-    }
-
-
-    /**
-     * Return the SQL variables used by the subquery; we need this to do proper mapping in the parent query.
-     * @return
-     */
-    public abstract Set<SQLVariable> getQueryVariables();
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/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 e8bce6a..34997c9 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
@@ -24,6 +24,11 @@ import org.apache.marmotta.commons.util.DateUtils;
 import org.apache.marmotta.kiwi.model.rdf.KiWiNode;
 import org.apache.marmotta.kiwi.persistence.KiWiDialect;
 import org.apache.marmotta.kiwi.sail.KiWiValueFactory;
+import org.apache.marmotta.kiwi.sparql.builder.collect.*;
+import org.apache.marmotta.kiwi.sparql.builder.model.SQLAbstractSubquery;
+import org.apache.marmotta.kiwi.sparql.builder.model.SQLFragment;
+import org.apache.marmotta.kiwi.sparql.builder.model.SQLPattern;
+import org.apache.marmotta.kiwi.sparql.builder.model.SQLVariable;
 import org.apache.marmotta.kiwi.sparql.exception.UnsatisfiableQueryException;
 import org.apache.marmotta.kiwi.sparql.function.NativeFunction;
 import org.apache.marmotta.kiwi.sparql.function.NativeFunctionRegistry;
@@ -533,7 +538,7 @@ public class SQLBuilder {
                     if(new ConditionFinder(sq_v.getSparqlName(),query).found && sq_v.getProjectionType() == ProjectionType.NODE) {
                         // this is needed in case we need to JOIN with the NODES table to retrieve values
                         SQLVariable sv = variables.get(sq_v.getSparqlName());  // fetch the name of the variable in the enclosing query
-                        sq.getJoinFields().add(new VariableMapping(sv.getName(), sq_v.getName()));
+                        sq.getJoinFields().add(new SQLAbstractSubquery.VariableMapping(sv.getName(), sq_v.getName()));
                     }
                 }
             }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/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
deleted file mode 100644
index 66f0d0f..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLClause.java
+++ /dev/null
@@ -1,81 +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.marmotta.kiwi.sparql.builder;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * Used to mark fragments that can be used to construct table-like FROM clauses in SQL queries (triple patterns,
- * subqueries, unions, ...)
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public abstract class SQLClause {
-
-    /**
-     * SQL conditions defined on this pattern; may only refer to previous or the current statement.
-     */
-    protected List<String> conditions;
-
-    public SQLClause() {
-        this.conditions = new ArrayList<>();
-    }
-
-    /**
-     * Build the query fragment that can be used in the FROM clause of a SQL query for representing this SPARQL construct.
-     * The fragment will be joined appropriately by the enclosing construct using CROSS JOIN, LEFT JOIN or normal JOIN.
-     *
-     * @return
-     */
-    public abstract String buildFromClause();
-
-    /**
-     * Return true if the FROM clause requires parenthesis before
-     * @return
-     */
-    public boolean needsParentheses() {
-        return false;
-    }
-
-    /**
-     * Build the condition clause for this statement to be used in the WHERE part or the ON part of a JOIN.
-     * @return
-     */
-    public String buildConditionClause() {
-        // the onClause consists of the filter conditions from the statement for joining/left joining with
-        // previous statements
-        StringBuilder onClause = new StringBuilder();
-
-        for(Iterator<String> cit = conditions.iterator(); cit.hasNext(); ) {
-            String next = cit.next();
-            if(onClause.length() > 0 && next.length() > 0) {
-                onClause.append("\n      AND ");
-            }
-            onClause.append(next);
-        }
-
-        return onClause.toString();
-    }
-
-
-    public List<String> getConditions() {
-        return conditions;
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/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
deleted file mode 100644
index 58350f6..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java
+++ /dev/null
@@ -1,193 +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.marmotta.kiwi.sparql.builder;
-
-import com.google.common.collect.Iterators;
-import org.openrdf.query.algebra.ValueExpr;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Random;
-
-/**
- * An SQL fragment is a part of the SQL query where all patterns are joinedwith  INNER JOINS and not LEFT JOINS. Several
- * patterns are then joined using a left join.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class SQLFragment extends SQLClause {
-
-    /**
-     * Indicate where the fragment's conditions should be placed (ON part of the JOIN clause or WHERE part of the query).
-     * This distinction is necessary when OPTIONAL constructs are used, i.e. the created SQL uses LEFT JOINs. We cannot
-     * always place it in JOIN conditions, because the first pattern will not have a JOIN.
-     */
-    public static enum ConditionPosition {
-        JOIN, WHERE, HAVING
-    };
-
-    private static Random singletonSetGenerator = new Random();
-
-    /**
-     * The patterns contained in this fragment. All patterns are joined using an INNER JOIN.
-     */
-    private List<SQLPattern> patterns;
-
-    private List<SQLAbstractSubquery> subqueries;
-
-    private List<ValueExpr> filters;
-
-    private ConditionPosition conditionPosition = ConditionPosition.JOIN;
-
-    public SQLFragment() {
-        super();
-        this.patterns   = new ArrayList<>();
-        this.filters    = new ArrayList<>();
-        this.subqueries = new ArrayList<>();
-    }
-
-    public List<SQLPattern> getPatterns() {
-        return patterns;
-    }
-
-    public List<ValueExpr> getFilters() {
-        return filters;
-    }
-
-    public List<SQLAbstractSubquery> getSubqueries() {
-        return subqueries;
-    }
-
-    /**
-     * Indicate where the fragment's conditions should be placed (ON part of the JOIN clause or WHERE part of the query).
-     * For the first fragment in a query this will always be WHERE, while for all other fragments it should be JOIN. Note
-     * that JOIN is strictly necessary for all fragments that are OPTIONAL.
-     */
-    public void setConditionPosition(ConditionPosition conditionPosition) {
-        this.conditionPosition = conditionPosition;
-    }
-
-    public ConditionPosition getConditionPosition() {
-        return conditionPosition;
-    }
-
-    /**
-     * Build the FROM clause by joining together all patterns appropriately and adding the filter conditions
-     * @return
-     */
-    public String buildFromClause() {
-        StringBuilder fromClause = new StringBuilder();
-
-        if(patterns.size() > 0 || subqueries.size() > 0) {
-            for (Iterator<SQLClause> it = Iterators.concat(patterns.iterator(), subqueries.iterator()); it.hasNext(); ) {
-
-                SQLClause p = it.next();
-
-
-                StringBuilder conditionClause = new StringBuilder();
-
-                // in case we add the condition to the JOIN, build first the conditions for the pattern; otherwise, the
-                // conditions for the pattern will be added to the WHERE clause
-                if (conditionPosition == ConditionPosition.JOIN) {
-                    conditionClause.append(p.buildConditionClause());
-                }
-
-
-                // in case the pattern is the last of the fragment, also add the filter conditions of the fragment (TODO: verify this does indeed the right thing)
-                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(); ) {
-                        String next = cit.next();
-                        if (conditionClause.length() > 0 && next.length() > 0) {
-                            conditionClause.append("\n       AND ");
-                        }
-                        conditionClause.append(next);
-                    }
-                }
-
-
-                // when the pattern builds a join with the nodes table and we have fragment-wide conditions, we need to
-                // wrap the pattern's from clause in parentheses
-                if (conditionClause.length() > 0) {
-                    if (p.needsParentheses())
-                        fromClause.append("(");
-                    fromClause.append(p.buildFromClause());
-                    if (p.needsParentheses())
-                        fromClause.append(")");
-                    fromClause.append(" ON (");
-                    fromClause.append(conditionClause);
-                    fromClause.append(")");
-
-                } else {
-                    fromClause.append(p.buildFromClause());
-                }
-
-
-                if (it.hasNext()) {
-                    if (conditionPosition == ConditionPosition.JOIN) {
-                        fromClause.append("\n JOIN \n  ");
-                    } else {
-                        fromClause.append("\n CROSS JOIN \n  ");
-                    }
-                }
-            }
-        } else {
-            fromClause.append("(SELECT true) AS _EMPTY"+singletonSetGenerator.nextInt(1000));
-        }
-
-        return fromClause.toString();
-    }
-
-    /**
-     * Build the combined condition clause for this fragment. This will be the empty string when the conditionPosition is JOIN.
-     * @return
-     */
-    @Override
-    public String buildConditionClause() {
-        StringBuilder conditionClause = new StringBuilder();
-
-        if(conditionPosition == ConditionPosition.WHERE || conditionPosition == ConditionPosition.HAVING) {
-            for (Iterator<SQLClause> it = Iterators.concat(patterns.iterator(), subqueries.iterator()); it.hasNext(); ) {
-                SQLClause p = it.next();
-
-                // in case we add the condition to the JOIN, build first the conditions for the pattern; otherwise, the
-                // conditions for the pattern will be added to the WHERE clause
-                if (conditionClause.length() > 0) {
-                    conditionClause.append("\n       AND ");
-                }
-                conditionClause.append(p.buildConditionClause());
-
-            }
-        }
-
-        if(conditionPosition == ConditionPosition.WHERE) {
-            // 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(); ) {
-                String next = cit.next();
-                if(conditionClause.length() > 0 && next.length() > 0) {
-                    conditionClause.append("\n       AND ");
-                }
-                conditionClause.append(next);
-            }
-        }
-
-        return conditionClause.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLPattern.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLPattern.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLPattern.java
deleted file mode 100644
index c88f1bd..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLPattern.java
+++ /dev/null
@@ -1,196 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.model.Resource;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-
-import java.util.EnumMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A statement pattern translated to SQL consists of a named reference to the triple table, an indicator giving the
- * join type (JOIN or LEFT JOIN), and any number of filter conditions
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class SQLPattern extends SQLClause {
-
-
-    /**
-     * Describe the different columns of the triple table that we might need to join with
-     */
-    public static enum TripleColumns {
-        SUBJECT  ("subject"),
-        PREDICATE("predicate"),
-        OBJECT   ("object"),
-        CONTEXT  ("context");
-
-        TripleColumns(String fieldName) {
-            this.fieldName = fieldName;
-        }
-
-        private final String fieldName;
-
-        public String getFieldName() {
-            return fieldName;
-        }
-    };
-
-    /**
-     * This map contains mappings from column to variable names. If for a given column an entry is contained in the
-     * map, the statement requires to join the TRIPLE table on this field with the NODES table. This is typically
-     * the case when there is a condition or function referring to the actual value of the node and not only the ID.
-     * The joined NODES table will be aliased with the variable name contained as value for the field.
-     */
-    private EnumMap<TripleColumns, String> joinFields = new EnumMap<>(TripleColumns.class);
-
-    /**
-     * A map containing references to the variables used in the triple fields.
-     */
-    private EnumMap<TripleColumns, Var> tripleFields = new EnumMap<>(TripleColumns.class);
-
-    /**
-     * Maps triple patterns from SPARQL WHERE to SQL aliases for the TRIPLES table in the FROM part. Used
-     * to join one instance of the triples table for each triple pattern occurring in the query.
-     */
-    private String name;
-
-    /**
-     * A reference to the SPARQL statement pattern represented by this SQLPattern
-     */
-    private StatementPattern sparqlPattern;
-
-    /**
-     * Alternative context values for each variable used in the context part of a pattern
-     */
-    private List<Resource> variableContexts;
-
-    public SQLPattern(String name, StatementPattern sparqlPattern) {
-        super();
-        this.name = name;
-        this.conditions.add(name + ".deleted = false");
-        this.sparqlPattern = sparqlPattern;
-
-        tripleFields.put(TripleColumns.SUBJECT,   sparqlPattern.getSubjectVar());
-        tripleFields.put(TripleColumns.PREDICATE, sparqlPattern.getPredicateVar());
-        tripleFields.put(TripleColumns.OBJECT,    sparqlPattern.getObjectVar());
-        tripleFields.put(TripleColumns.CONTEXT,   sparqlPattern.getContextVar());
-    }
-
-    /**
-     * Set the variable name (alias for the NODES table) for the given column to "varName".
-     * @param col
-     * @param varName
-     */
-    public void setJoinField(TripleColumns col, String varName) {
-        joinFields.put(col,varName);
-    }
-
-    /**
-     * Return true when the pattern involves JOINs with the NODES table; in this case we need to enclose the
-     * FROM clause with parentheses before joining with previous clauses.
-     * @return
-     */
-    public boolean hasJoinFields() {
-        return joinFields.size() > 0;
-    }
-
-
-    /**
-     * Return true if the FROM clause requires parenthesis before
-     *
-     * @return
-     */
-    @Override
-    public boolean needsParentheses() {
-        return hasJoinFields();
-    }
-
-    public Var[] getFields() {
-        return new Var[] {
-                getSparqlPattern().getSubjectVar(),
-                getSparqlPattern().getPredicateVar(),
-                getSparqlPattern().getObjectVar(),
-                getSparqlPattern().getContextVar()
-        };
-    }
-
-    public EnumMap<TripleColumns, Var> getTripleFields() {
-        return tripleFields;
-    }
-
-    /**
-     * Create the clause to be used in the FROM part to represent this pattern and return it. The name and join fields
-     * need to be set before so this produces the correct output.
-     *
-     * This method works as follows:
-     * - for the statement pattern, it adds a reference to the TRIPLES table and aliases it with the pattern name
-     * - for each field of the pattern whose value is used in conditions or functions, an INNER JOIN with the NODES table
-     *   is added to retrieve the actual node with its values; the NODES table is aliased using the variable name set in
-     *   setJoinField()
-     *
-     * @return
-     */
-    public String buildFromClause() {
-        // the joinClause consists of a reference to the triples table and possibly inner joins with the
-        // nodes table in case we need to verify node values, e.g. in a filter
-        StringBuilder fromClause = new StringBuilder();
-
-
-        fromClause.append("triples " + name);
-
-
-        for(Map.Entry<TripleColumns,String> colEntry : joinFields.entrySet()) {
-            TripleColumns col = colEntry.getKey();
-            String        var = colEntry.getValue();
-
-            fromClause.append("\n    INNER JOIN nodes AS ");
-            fromClause.append(name + "_" + col.getFieldName() + "_" + var);
-
-            fromClause.append(" ON " + name + "." + col.getFieldName() + " = " + name + "_" + col.getFieldName() + "_" + var + ".id ");
-
-        }
-
-
-        return fromClause.toString();
-    }
-
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public StatementPattern getSparqlPattern() {
-        return sparqlPattern;
-    }
-
-    public List<Resource> getVariableContexts() {
-        return variableContexts;
-    }
-
-    public void setVariableContexts(List<Resource> variableContexts) {
-        this.variableContexts = variableContexts;
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLProjectionFinder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLProjectionFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLProjectionFinder.java
deleted file mode 100644
index cd47e50..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLProjectionFinder.java
+++ /dev/null
@@ -1,88 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
-* Find the offset and limit values in a tuple expression
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class SQLProjectionFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    private static Logger log = LoggerFactory.getLogger(SQLProjectionFinder.class);
-
-    List<ExtensionElem> elements = new ArrayList<>();
-
-    String needle;
-
-    boolean found = false;
-
-    public SQLProjectionFinder(TupleExpr expr, String needle) {
-        this.needle = needle;
-        expr.visit(this);
-    }
-
-    @Override
-    public void meet(ExtensionElem node) throws RuntimeException {
-        if(node.getName().equals(needle)) {
-            found = true;
-        }
-        // don't recurse to the children, as this would project non-grouped elements
-    }
-
-    @Override
-    public void meet(Group node) throws RuntimeException {
-        for(String g : node.getGroupBindingNames()) {
-            if(g.equals(needle)) {
-                found = true;
-            }
-        }
-        // don't recurse to the children, as this would project non-grouped elements
-    }
-
-    @Override
-    public void meet(Var node) throws RuntimeException {
-        if(node.getName().equals(needle)) {
-            found = true;
-        }
-    }
-
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        for(ProjectionElem elem : node.getProjectionElemList().getElements()) {
-            if(elem.getSourceName().equals(needle)) {
-                found = true;
-            }
-        }
-        // stop at projection, subquery
-    }
-
-    @Override
-    public void meet(Union node) throws RuntimeException {
-        // stop at union, subquery
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
deleted file mode 100644
index 08acda5..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
+++ /dev/null
@@ -1,101 +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.marmotta.kiwi.sparql.builder;
-
-import org.apache.marmotta.kiwi.persistence.KiWiDialect;
-import org.apache.marmotta.kiwi.sparql.exception.UnsatisfiableQueryException;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Representation of a simple SPARQL->SQL subquery (no union). We can use a new SQLBuilder to construct the subquery
- * and add appropriate variable mappings.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class SQLSubQuery extends SQLAbstractSubquery {
-
-    private SQLBuilder builder;
-
-    private Set<SQLVariable> variables = new HashSet<>();
-
-    public SQLSubQuery(String alias, Projection query, BindingSet bindings, Dataset dataset, ValueConverter converter, KiWiDialect dialect, Set<String> parentProjectedVars) throws UnsatisfiableQueryException {
-        super(alias);
-
-        Set<String> projectedVars = new HashSet<>(parentProjectedVars);
-        // count projected variables
-        for(ProjectionElem elem : query.getProjectionElemList().getElements()) {
-            projectedVars.add(elem.getSourceName());
-        }
-
-
-
-        // we build a full subquery for each of the UNION's arguments
-        builder = new SQLBuilder(query.getArg(), bindings, dataset, converter, dialect, projectedVars);
-
-        for(SQLVariable svl : builder.getVariables().values()) {
-            if(projectedVars.contains(svl.getSparqlName())) {
-                variables.add(svl);
-            }
-        }
-    }
-
-
-    /**
-     * Return the SQL variables used by the subquery; we need this to do proper mapping in the parent query.
-     *
-     * @return
-     */
-    @Override
-    public Set<SQLVariable> getQueryVariables() {
-        return variables;
-    }
-
-    /**
-     * Build the query fragment that can be used in the FROM clause of a SQL query for representing this SPARQL construct.
-     * The fragment will be joined appropriately by the enclosing construct using CROSS JOIN, LEFT JOIN or normal JOIN.
-     *
-     * @return
-     */
-    @Override
-    public String buildFromClause() {
-        StringBuilder fromClause = new StringBuilder();
-        fromClause
-                .append("(")
-                .append(builder.build())
-                .append(") AS ")
-                .append(alias);
-
-        for(VariableMapping var : getJoinFields()) {
-            fromClause.append(" LEFT JOIN nodes AS ");  // outer join because binding might be NULL
-            fromClause.append(alias).append("_").append(var.getParentName());
-
-            fromClause
-                    .append(" ON ").append(alias).append(".").append(var.getSubqueryName())
-                    .append(" = ").append(alias).append("_").append(var.getParentName()).append(".id ");
-        }
-
-        return fromClause.toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java
deleted file mode 100644
index 26b7775..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java
+++ /dev/null
@@ -1,215 +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.marmotta.kiwi.sparql.builder;
-
-import org.apache.marmotta.kiwi.persistence.KiWiDialect;
-import org.apache.marmotta.kiwi.sparql.exception.UnsatisfiableQueryException;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-
-/**
- * Represents a SPARQL UNION in SQL. Essentially, we translate a SPARQL UNION into a SQL subquery using UNION to
- * merge the different parts. Mostly, we can use a new SQLBuilder to construct the subquery. However, what needs to be
- * taken care of is that SQL UNIONS only work when all subqueries have the same columns, but in SPARQL this is not
- * always the case. Furthermore, we need to map variables from the subquery to variables in the enclosing query
- * (using the expressions mapping of our SQLVariable).
- *
- * TODO: proper variable mapping and conditions (in SQLBuilder)
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class SQLUnion extends SQLAbstractSubquery {
-
-    private static Logger log = LoggerFactory.getLogger(SQLUnion.class);
-
-    private SQLBuilder left, right;
-
-    private Set<SQLVariable> variables = new HashSet<>();
-
-    public SQLUnion(String alias, Union query, BindingSet bindings, Dataset dataset, ValueConverter converter, KiWiDialect dialect) throws UnsatisfiableQueryException {
-        super(alias);
-
-        Set<String> leftProjected = getProjectedVariables(query.getLeftArg());
-        Set<String> rightProjected = getProjectedVariables(query.getRightArg());
-
-        // we build a full subquery for each of the UNION's arguments
-        left  = new SQLBuilder(query.getLeftArg(), bindings, dataset, converter, dialect, leftProjected);
-        right = new SQLBuilder(query.getRightArg(), bindings, dataset, converter, dialect, rightProjected);
-
-        // next we make sure that both subqueries share the same SQL variables so the SQL UNION succeeds by
-        // adding NULL aliases for all variables present in one but not the other
-        int c = 0;
-        Map<String,SQLVariable> leftVars = new HashMap<>();
-        for(SQLVariable svl : left.getVariables().values()) {
-            if(leftProjected.size() == 0 || leftProjected.contains(svl.getSparqlName())) {
-                leftVars.put(svl.getSparqlName(), svl);
-            }
-        }
-
-        Map<String,SQLVariable> rightVars = new HashMap<>();
-        for(SQLVariable svr : right.getVariables().values()) {
-            if(rightProjected.size() == 0 || rightProjected.contains(svr.getSparqlName())) {
-                rightVars.put(svr.getSparqlName(), svr);
-            }
-        }
-
-        // we have to homogenize variable names in both subqueries and make sure they have the same number of columns
-        Map<String,String> sparqlToSQL = new HashMap<>();
-        for(SQLVariable svl : left.getVariables().values()) {
-            if(leftProjected.size() == 0 || leftProjected.contains(svl.getSparqlName())) {
-                if (sparqlToSQL.containsKey(svl.getSparqlName())) {
-                    svl.setName(sparqlToSQL.get(svl.getSparqlName()));
-                } else {
-                    svl.setName("U" + (++c));
-                    sparqlToSQL.put(svl.getSparqlName(), svl.getName());
-                }
-            }
-        }
-        for(SQLVariable svr : right.getVariables().values()) {
-            if(rightProjected.size() == 0 || rightProjected.contains(svr.getSparqlName())) {
-                if (sparqlToSQL.containsKey(svr.getSparqlName())) {
-                    svr.setName(sparqlToSQL.get(svr.getSparqlName()));
-                } else {
-                    svr.setName("U" + (++c));
-                    sparqlToSQL.put(svr.getSparqlName(), svr.getName());
-                }
-            }
-        }
-
-
-        for(SQLVariable svl : leftVars.values()) {
-            if(!rightVars.containsKey(svl.getSparqlName())) {
-                SQLVariable svr = new SQLVariable(svl.getName(), svl.getSparqlName());
-                svr.getExpressions().add("NULL");
-                svr.setProjectionType(ProjectionType.NODE);
-                right.getVariables().put(svl.getSparqlName(),svr);
-
-                if(rightProjected.size() > 0) {
-                    right.getProjectedVars().add(svl.getSparqlName());
-                }
-            }
-            variables.add(svl);
-        }
-
-        for(SQLVariable svr : rightVars.values()) {
-            if(!leftVars.containsKey(svr.getSparqlName())) {
-                SQLVariable svl = new SQLVariable(svr.getName(), svr.getSparqlName());
-                svl.getExpressions().add("NULL");
-                svl.setProjectionType(ProjectionType.NODE);
-                left.getVariables().put(svr.getSparqlName(),svl);
-
-                if(leftProjected.size() > 0) {
-                    left.getProjectedVars().add(svr.getSparqlName());
-                }
-            }
-            variables.add(svr);
-        }
-
-        log.debug("UNION variables: {}", variables);
-    }
-
-
-    /**
-     * Return the SQL variables used by the subquery; we need this to do proper mapping in the parent query.
-     *
-     * @return
-     */
-    @Override
-    public Set<SQLVariable> getQueryVariables() {
-        return variables;
-    }
-
-    /**
-     * Build the query fragment that can be used in the FROM clause of a SQL query for representing this SPARQL construct.
-     * The fragment will be joined appropriately by the enclosing construct using CROSS JOIN, LEFT JOIN or normal JOIN.
-     *
-     * @return
-     */
-    @Override
-    public String buildFromClause() {
-        StringBuilder fromClause = new StringBuilder();
-        fromClause
-                .append("((")
-                .append(left.build())
-                .append(") UNION (")
-                .append(right.build())
-                .append(")) AS ")
-                .append(alias);
-
-        for(VariableMapping var : getJoinFields()) {
-            fromClause.append(" LEFT JOIN nodes AS "); // outer join because binding might be NULL
-            fromClause.append(alias + "_" + var.getParentName());
-
-            fromClause.append(" ON " + alias + "." + var.getSubqueryName() + " = " + alias + "_" + var.getParentName() + ".id ");
-        }
-
-        return fromClause.toString();
-    }
-
-
-    private Set<String> getProjectedVariables(TupleExpr expr) {
-        if(expr instanceof Projection) {
-            Projection projection = (Projection)expr;
-            Set<String> projectedVars = new HashSet<>();
-            for (ProjectionElem elem : projection.getProjectionElemList().getElements()) {
-                projectedVars.add(elem.getSourceName());
-            }
-            return projectedVars;
-        } else {
-            return Collections.EMPTY_SET;
-        }
-    }
-}
-
-
-/*
-Example:
-
-PREFIX foaf: <http://xmlns.com/foaf/0.1/>
-
-SELECT ?p ?name ?likes WHERE {
-    ?p foaf:name ?name .
-    { ?p foaf:knows ?likes }
-    UNION
-    { ?p foaf:interest ?likes }
-
-}
-
-translated to:
-
-SELECT SUB1.V3 AS V3, P1.object AS V2, P1.subject AS V1
- FROM triples P1
- JOIN
- (
-  (SELECT P2.subject AS V1, P2.object AS V3, P2.predicate AS V2 FROM triples P2 WHERE P2.deleted=false AND P2.predicate = 512217739590426624)
- UNION
-  (SELECT P3.subject AS V1, P3.object AS V3, NULL AS V2 FROM triples P3 WHERE P3.deleted=false AND P3.predicate = 512217739326185472)
- ) AS SUB1 ON (P1.subject = SUB1.V1)
- WHERE P1.deleted = false
-      AND P1.predicate = 512217739124858880
-
-
- */

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLVariable.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLVariable.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLVariable.java
deleted file mode 100644
index 921a2f1..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLVariable.java
+++ /dev/null
@@ -1,196 +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.marmotta.kiwi.sparql.builder;
-
-import org.openrdf.query.algebra.ValueExpr;
-
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * Representation of a SPARQL variable in SQL. A SPARQL variable will always be translated into a column alias
- * for either a subject/predicate/object/context field of a triple or a more complex expression (e.g. function evaluation).
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class SQLVariable  implements Cloneable{
-
-    /**
-     * A map for mapping the SPARQL variable names to internal names used for constructing SQL aliases.
-     * Will look like { ?x -> "V1", ?y -> "V2", ... }
-     */
-    private String name;
-
-    private String sparqlName;
-
-    /**
-     * A map for mapping SPARQL variables to field names; each variable might have one or more field names,
-     * depending on the number of patterns it occurs in; will look like
-     * { ?x -> ["P1_V1", "P2_V1"], ?y -> ["P2_V2"], ... }
-     */
-    private String alias;
-
-
-    /**
-     * A map for mapping SPARQL variables to database expressions (e.g. node ID selectors). A node ID can occur either as
-     * primary key in the NODES table or in the subject, predicate, object and context fields of a pattern. An expression
-     * can be e.g. a function evaluation.
-     */
-    private List<String> expressions;
-
-    /**
-     * A list of value expressions bound to this variable; this is needed in case the variable is used in a filter or
-     * ORDER BY, because then we need to determine the type.
-     */
-    private List<ValueExpr> bindings;
-
-
-    /**
-     * Set to something else than NONE when this variable is contained in the SELECT part of the query, i.e. needs to be projected.
-     * Decides on how the variable will be projected (as node -> ID, as value -> string or numeric field)
-     */
-    private ProjectionType projectionType = ProjectionType.NONE;
-
-    /**
-     * The expression to project the type for the literal that will be bound to this variable, e.g. in case
-     * the main expression is a function call and the type should be preserved.
-     */
-    private String literalTypeExpression = null;
-
-    /**
-     * The expression to project the language for the literal that will be bound to this variable, e.g. in case
-     * the main expression is a function call and the language should be preserved.
-     */
-    private String literalLangExpression = null;
-
-    public SQLVariable(String name, String sparqlName) {
-        this.name = name;
-        this.sparqlName = sparqlName;
-
-        this.bindings = new ArrayList<>();
-        this.expressions = new ArrayList<>();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getSparqlName() {
-        return sparqlName;
-    }
-
-    public String getAlias() {
-        return alias;
-    }
-
-    public void setAlias(String alias) {
-        this.alias = alias;
-    }
-
-    public List<ValueExpr> getBindings() {
-        return bindings;
-    }
-
-    public List<String> getExpressions() {
-        return expressions;
-    }
-
-    public ProjectionType getProjectionType() {
-        return projectionType;
-    }
-
-    public void setProjectionType(ProjectionType projectionType) {
-        this.projectionType = projectionType;
-    }
-
-    public String getLiteralTypeExpression() {
-        return literalTypeExpression;
-    }
-
-    public void setLiteralTypeExpression(String literalTypeExpression) {
-        this.literalTypeExpression = literalTypeExpression;
-    }
-
-    public String getLiteralLangExpression() {
-        return literalLangExpression;
-    }
-
-    public void setLiteralLangExpression(String literalLangExpression) {
-        this.literalLangExpression = literalLangExpression;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        SQLVariable that = (SQLVariable) o;
-
-        if (!sparqlName.equals(that.sparqlName)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return sparqlName.hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "Variable{" +
-                "SQL name='" + name + '\'' +
-                ", SPARQL name=" + sparqlName +
-                ", alias=" + alias +
-                ", expressions=" + expressions +
-                ", projectionType=" + projectionType +
-                '}';
-    }
-
-
-    public static final Comparator<SQLVariable> sparqlNameComparator = new Comparator<SQLVariable>() {
-        @Override
-        public int compare(SQLVariable l, SQLVariable r) {
-            return Collator.getInstance().compare(l.getSparqlName(), r.getSparqlName());
-        }
-    };
-
-    public static final Comparator<SQLVariable> sqlNameComparator = new Comparator<SQLVariable>() {
-        @Override
-        public int compare(SQLVariable l, SQLVariable r) {
-            return Collator.getInstance().compare(l.getName(), r.getName());
-        }
-    };
-
-    @Override
-    protected Object clone() throws CloneNotSupportedException {
-        SQLVariable clone = new SQLVariable(getName(), getSparqlName());
-        clone.projectionType = projectionType;
-        clone.getExpressions().addAll(expressions);
-        clone.alias = alias;
-        clone.getBindings().addAll(bindings);
-
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/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
deleted file mode 100644
index d9161a8..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableFinder.java
+++ /dev/null
@@ -1,53 +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.marmotta.kiwi.sparql.builder;
-
-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;
-import java.util.Set;
-
-/**
-* Find distinct/reduced in a tuple expression.
-*
-* @author Sebastian Schaffert (sschaffert@apache.org)
-*/
-public class VariableFinder extends QueryModelVisitorBase<RuntimeException> {
-
-    Set<Var> variables = new HashSet<>();
-
-    public VariableFinder(TupleExpr expr) {
-        expr.visit(this);
-    }
-
-
-    @Override
-    public void meet(Var node) throws RuntimeException {
-        variables.add(node);
-    }
-
-
-    @Override
-    public void meet(Projection node) throws RuntimeException {
-        // stop at projection, subquery
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/8c62e913/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java
deleted file mode 100644
index fd5df18..0000000
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java
+++ /dev/null
@@ -1,62 +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.marmotta.kiwi.sparql.builder;
-
-/**
- * Mapping for a variable between its name in a subquery and its name in the parent query. Used for resolving join
- * fields in subqueries.
- *
- * @author Sebastian Schaffert (sschaffert@apache.org)
- */
-public class VariableMapping {
-
-    private String parentName, subqueryName;
-
-    public VariableMapping(String parentName, String subqueryName) {
-        this.parentName = parentName;
-        this.subqueryName = subqueryName;
-    }
-
-    public String getParentName() {
-        return parentName;
-    }
-
-    public String getSubqueryName() {
-        return subqueryName;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        VariableMapping that = (VariableMapping) o;
-
-        if (!parentName.equals(that.parentName)) return false;
-        if (!subqueryName.equals(that.subqueryName)) return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = parentName.hashCode();
-        result = 31 * result + subqueryName.hashCode();
-        return result;
-    }
-}