http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
 
b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
index c4db88e..647e3cc 100644
--- 
a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
+++ 
b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
@@ -33,7 +33,7 @@ import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoTestBase;
+import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.junit.Test;
 import org.openrdf.model.impl.LiteralImpl;
@@ -49,7 +49,7 @@ import org.openrdf.repository.sail.SailRepository;
 import org.openrdf.repository.sail.SailRepositoryConnection;
 import org.openrdf.sail.Sail;
 
-public class MongoStatementMetadataIT extends MongoTestBase {
+public class MongoStatementMetadataIT extends MongoITBase {
 
     private final String query1 = "prefix owl: 
<http://www.w3.org/2002/07/owl#> prefix ano: 
<http://www.w3.org/2002/07/owl#annotated> prefix rdf: 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode 
rdf:type owl:Annotation; ano:Source <http://Joe>; "
             + "ano:Property <http://worksAt>; ano:Target ?x; 
<http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
 
b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
new file mode 100644
index 0000000..cab6c35
--- /dev/null
+++ 
b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
@@ -0,0 +1,368 @@
+package org.apache.rya.indexing.statement.metadata;
+/*
+ * 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.
+ */
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.StatementMetadata;
+import 
org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
+import org.apache.rya.mongodb.MongoDBRdfConfiguration;
+import org.apache.rya.mongodb.MongoDBRyaDAO;
+import org.apache.rya.mongodb.MongoITBase;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.impl.LiteralImpl;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.model.vocabulary.XMLSchema;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.QueryEvaluationException;
+import org.openrdf.query.algebra.StatementPattern;
+import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.openrdf.query.algebra.helpers.StatementPatternCollector;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.sparql.SPARQLParser;
+
+import info.aduna.iteration.CloseableIteration;
+
+public class MongoStatementMetadataNodeIT extends MongoITBase {
+    private final String query = "prefix owl: <http://www.w3.org/2002/07/owl#> 
prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode 
rdf:type owl:Annotation; ano:Source <http://Joe>; "
+            + "ano:Property <http://worksAt>; ano:Target ?x; 
<http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";
+    private final String query2 = "prefix owl: 
<http://www.w3.org/2002/07/owl#> prefix ano: 
<http://www.w3.org/2002/07/owl#annotated> prefix rdf: 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode 
rdf:type owl:Annotation; ano:Source ?x; "
+            + "ano:Property <http://worksAt>; ano:Target ?y; 
<http://createdBy> ?x; <http://createdOn> \'2017-01-04\'^^xsd:date }";
+
+    @Before
+    public void init() throws Exception {
+        final Set<RyaURI> propertySet = new HashSet<RyaURI>(Arrays.asList(new 
RyaURI("http://createdBy";), new RyaURI("http://createdOn";)));
+        conf.setUseStatementMetadata(true);
+        conf.setStatementMetadataProperties(propertySet);
+    }
+
+    @Test
+    public void simpleQueryWithoutBindingSet() throws Exception {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
+
+            RyaStatement statement = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            dao.add(statement);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+
+            StatementMetadataNode<?> node = new 
StatementMetadataNode<>(spList, conf);
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(new QueryBindingSet());
+
+            QueryBindingSet bs = new QueryBindingSet();
+            bs.addBinding("x", new LiteralImpl("CoffeeShop"));
+            bs.addBinding("y", new LiteralImpl("Joe"));
+
+            List<BindingSet> bsList = new ArrayList<>();
+            while (iteration.hasNext()) {
+                bsList.add(iteration.next());
+            }
+
+            Assert.assertEquals(1, bsList.size());
+            Assert.assertEquals(bs, bsList.get(0));
+            dao.delete(statement, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+
+    /**
+     * Tests if results are filtered correctly using the metadata properties. 
In
+     * this case, the date for the ingested RyaStatement differs from the date
+     * specified in the query.
+     */
+    @Test
+    public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception 
{
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();        
+
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Doug"));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-02-15"));
+
+            RyaStatement statement = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            dao.add(statement);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(new QueryBindingSet());
+
+            List<BindingSet> bsList = new ArrayList<>();
+            while (iteration.hasNext()) {
+                bsList.add(iteration.next());
+            }
+            Assert.assertEquals(0, bsList.size());
+            dao.delete(statement, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+
+    @Test
+    public void simpleQueryWithBindingSet() throws Exception {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
+
+            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
+            dao.add(statement1);
+            dao.add(statement2);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
+
+            QueryBindingSet bsConstraint = new QueryBindingSet();
+            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
+            bsConstraint.addBinding("z", new LiteralImpl("Virginia"));
+
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsConstraint);
+
+            QueryBindingSet expected = new QueryBindingSet();
+            expected.addBinding("x", new LiteralImpl("CoffeeShop"));
+            expected.addBinding("y", new LiteralImpl("Joe"));
+            expected.addBinding("z", new LiteralImpl("Virginia"));
+
+            List<BindingSet> bsList = new ArrayList<>();
+            while (iteration.hasNext()) {
+                bsList.add(iteration.next());
+            }
+
+            Assert.assertEquals(1, bsList.size());
+            Assert.assertEquals(expected, bsList.get(0));
+
+            dao.delete(statement1, conf);
+            dao.delete(statement2, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+
+    /**
+     * Tests to see if correct result is passed back when a metadata statement
+     * is joined with a StatementPattern statement (i.e. a common variable
+     * appears in a StatementPattern statement and a metadata statement).
+     * StatementPattern statements have either rdf:subject, rdf:predicate, or
+     * rdf:object as the predicate while a metadata statement is any statement
+     * in the reified query whose predicate is not rdf:type and not a
+     * StatementPattern predicate.
+     */
+    @Test
+    public void simpleQueryWithBindingSetJoinPropertyToSubject() throws 
Exception {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaURI("http://Joe";));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
+
+            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Bob";), new RyaURI("http://worksAt";),
+                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
+            dao.add(statement1);
+            dao.add(statement2);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query2, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
+
+            List<BindingSet> bsCollection = new ArrayList<>();
+            QueryBindingSet bsConstraint1 = new QueryBindingSet();
+            bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop"));
+            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+
+            QueryBindingSet bsConstraint2 = new QueryBindingSet();
+            bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore"));
+            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+            bsCollection.add(bsConstraint1);
+            bsCollection.add(bsConstraint2);
+
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsCollection);
+
+            QueryBindingSet expected = new QueryBindingSet();
+            expected.addBinding("y", new LiteralImpl("CoffeeShop"));
+            expected.addBinding("x", new URIImpl("http://Joe";));
+            expected.addBinding("z", new LiteralImpl("Virginia"));
+
+            List<BindingSet> bsList = new ArrayList<>();
+            while (iteration.hasNext()) {
+                bsList.add(iteration.next());
+            }
+
+            Assert.assertEquals(1, bsList.size());
+            Assert.assertEquals(expected, bsList.get(0));
+
+            dao.delete(statement1, conf);
+            dao.delete(statement2, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+
+    /**
+     * Tests if the StatementMetadataNode joins BindingSet correctly for
+     * variables appearing in metadata statements. In this case, the metadata
+     * statements are (_:blankNode <http://createdOn 2017-01-04 ) and
+     * (_:blankNode <http://createdBy> ?y). The variable ?y appears as the
+     * object in the above metadata statement and its values are joined to the
+     * constraint BindingSets in the example below.
+     */
+    @Test
+    public void simpleQueryWithBindingSetJoinOnProperty() throws Exception {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
+
+            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            dao.add(statement1);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
+
+            QueryBindingSet bsConstraint = new QueryBindingSet();
+            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
+            bsConstraint.addBinding("y", new LiteralImpl("Doug"));
+
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsConstraint);
+
+            List<BindingSet> bsList = new ArrayList<>();
+            while (iteration.hasNext()) {
+                bsList.add(iteration.next());
+            }
+
+            Assert.assertEquals(0, bsList.size());
+            dao.delete(statement1, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+
+    /**
+     * Tests if StatementMetadataNode joins BindingSet values correctly for
+     * variables appearing as the object in one of the StatementPattern
+     * statements (in the case ?x appears as the Object in the statement
+     * _:blankNode rdf:object ?x). StatementPattern statements have either
+     * rdf:subject, rdf:predicate, or rdf:object as the predicate.
+     */
+    @Test
+    public void simpleQueryWithBindingSetCollection() throws Exception {
+        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        try {
+            dao.setConf(conf);
+            dao.init();
+            StatementMetadata metadata = new StatementMetadata();
+            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
+            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
+
+            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
+            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
+                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
+            dao.add(statement1);
+            dao.add(statement2);
+
+            SPARQLParser parser = new SPARQLParser();
+            ParsedQuery pq = parser.parseQuery(query, null);
+            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
+            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
+
+            List<BindingSet> bsCollection = new ArrayList<>();
+            QueryBindingSet bsConstraint1 = new QueryBindingSet();
+            bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
+            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+
+            QueryBindingSet bsConstraint2 = new QueryBindingSet();
+            bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
+            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+
+            QueryBindingSet bsConstraint3 = new QueryBindingSet();
+            bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
+            bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
+            bsCollection.add(bsConstraint1);
+            bsCollection.add(bsConstraint2);
+            bsCollection.add(bsConstraint3);
+
+            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsCollection);
+
+            Set<BindingSet> expected = new HashSet<>();
+            QueryBindingSet expected1 = new QueryBindingSet();
+            expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
+            expected1.addBinding("y", new LiteralImpl("Joe"));
+            expected1.addBinding("z", new LiteralImpl("Virginia"));
+
+            QueryBindingSet expected2 = new QueryBindingSet();
+            expected2.addBinding("x", new LiteralImpl("HardwareStore"));
+            expected2.addBinding("y", new LiteralImpl("Joe"));
+            expected2.addBinding("z", new LiteralImpl("Maryland"));
+            expected.add(expected1);
+            expected.add(expected2);
+
+            Set<BindingSet> bsSet = new HashSet<>();
+            while (iteration.hasNext()) {
+                bsSet.add(iteration.next());
+            }
+
+            Assert.assertEquals(expected, bsSet);
+
+            dao.delete(statement1, conf);
+            dao.delete(statement2, conf);
+        } finally {
+            dao.destroy();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java
----------------------------------------------------------------------
diff --git 
a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java
 
b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java
deleted file mode 100644
index a45197c..0000000
--- 
a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java
+++ /dev/null
@@ -1,368 +0,0 @@
-package org.apache.rya.indexing.statement.metadata;
-/*
- * 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.
- */
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.domain.StatementMetadata;
-import 
org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
-import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoTestBase;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-
-import info.aduna.iteration.CloseableIteration;
-
-public class MongoStatementMetadataNodeTest extends MongoTestBase {
-    private final String query = "prefix owl: <http://www.w3.org/2002/07/owl#> 
prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode 
rdf:type owl:Annotation; ano:Source <http://Joe>; "
-            + "ano:Property <http://worksAt>; ano:Target ?x; 
<http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";
-    private final String query2 = "prefix owl: 
<http://www.w3.org/2002/07/owl#> prefix ano: 
<http://www.w3.org/2002/07/owl#annotated> prefix rdf: 
<http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode 
rdf:type owl:Annotation; ano:Source ?x; "
-            + "ano:Property <http://worksAt>; ano:Target ?y; 
<http://createdBy> ?x; <http://createdOn> \'2017-01-04\'^^xsd:date }";
-
-    @Before
-    public void init() throws Exception {
-        final Set<RyaURI> propertySet = new HashSet<RyaURI>(Arrays.asList(new 
RyaURI("http://createdBy";), new RyaURI("http://createdOn";)));
-        conf.setUseStatementMetadata(true);
-        conf.setStatementMetadataProperties(propertySet);
-    }
-
-    @Test
-    public void simpleQueryWithoutBindingSet() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
-
-            RyaStatement statement = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            dao.add(statement);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-
-            StatementMetadataNode<?> node = new 
StatementMetadataNode<>(spList, conf);
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(new QueryBindingSet());
-
-            QueryBindingSet bs = new QueryBindingSet();
-            bs.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bs.addBinding("y", new LiteralImpl("Joe"));
-
-            List<BindingSet> bsList = new ArrayList<>();
-            while (iteration.hasNext()) {
-                bsList.add(iteration.next());
-            }
-
-            Assert.assertEquals(1, bsList.size());
-            Assert.assertEquals(bs, bsList.get(0));
-            dao.delete(statement, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-
-    /**
-     * Tests if results are filtered correctly using the metadata properties. 
In
-     * this case, the date for the ingested RyaStatement differs from the date
-     * specified in the query.
-     */
-    @Test
-    public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception 
{
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();        
-
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Doug"));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-02-15"));
-
-            RyaStatement statement = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            dao.add(statement);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(new QueryBindingSet());
-
-            List<BindingSet> bsList = new ArrayList<>();
-            while (iteration.hasNext()) {
-                bsList.add(iteration.next());
-            }
-            Assert.assertEquals(0, bsList.size());
-            dao.delete(statement, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-
-    @Test
-    public void simpleQueryWithBindingSet() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
-
-            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
-            dao.add(statement1);
-            dao.add(statement2);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
-
-            QueryBindingSet bsConstraint = new QueryBindingSet();
-            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint.addBinding("z", new LiteralImpl("Virginia"));
-
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsConstraint);
-
-            QueryBindingSet expected = new QueryBindingSet();
-            expected.addBinding("x", new LiteralImpl("CoffeeShop"));
-            expected.addBinding("y", new LiteralImpl("Joe"));
-            expected.addBinding("z", new LiteralImpl("Virginia"));
-
-            List<BindingSet> bsList = new ArrayList<>();
-            while (iteration.hasNext()) {
-                bsList.add(iteration.next());
-            }
-
-            Assert.assertEquals(1, bsList.size());
-            Assert.assertEquals(expected, bsList.get(0));
-
-            dao.delete(statement1, conf);
-            dao.delete(statement2, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-
-    /**
-     * Tests to see if correct result is passed back when a metadata statement
-     * is joined with a StatementPattern statement (i.e. a common variable
-     * appears in a StatementPattern statement and a metadata statement).
-     * StatementPattern statements have either rdf:subject, rdf:predicate, or
-     * rdf:object as the predicate while a metadata statement is any statement
-     * in the reified query whose predicate is not rdf:type and not a
-     * StatementPattern predicate.
-     */
-    @Test
-    public void simpleQueryWithBindingSetJoinPropertyToSubject() throws 
Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaURI("http://Joe";));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
-
-            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Bob";), new RyaURI("http://worksAt";),
-                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
-            dao.add(statement1);
-            dao.add(statement2);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query2, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
-
-            List<BindingSet> bsCollection = new ArrayList<>();
-            QueryBindingSet bsConstraint1 = new QueryBindingSet();
-            bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop"));
-            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
-
-            QueryBindingSet bsConstraint2 = new QueryBindingSet();
-            bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore"));
-            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
-            bsCollection.add(bsConstraint1);
-            bsCollection.add(bsConstraint2);
-
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsCollection);
-
-            QueryBindingSet expected = new QueryBindingSet();
-            expected.addBinding("y", new LiteralImpl("CoffeeShop"));
-            expected.addBinding("x", new URIImpl("http://Joe";));
-            expected.addBinding("z", new LiteralImpl("Virginia"));
-
-            List<BindingSet> bsList = new ArrayList<>();
-            while (iteration.hasNext()) {
-                bsList.add(iteration.next());
-            }
-
-            Assert.assertEquals(1, bsList.size());
-            Assert.assertEquals(expected, bsList.get(0));
-
-            dao.delete(statement1, conf);
-            dao.delete(statement2, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-
-    /**
-     * Tests if the StatementMetadataNode joins BindingSet correctly for
-     * variables appearing in metadata statements. In this case, the metadata
-     * statements are (_:blankNode <http://createdOn 2017-01-04 ) and
-     * (_:blankNode <http://createdBy> ?y). The variable ?y appears as the
-     * object in the above metadata statement and its values are joined to the
-     * constraint BindingSets in the example below.
-     */
-    @Test
-    public void simpleQueryWithBindingSetJoinOnProperty() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
-
-            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            dao.add(statement1);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
-
-            QueryBindingSet bsConstraint = new QueryBindingSet();
-            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint.addBinding("y", new LiteralImpl("Doug"));
-
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsConstraint);
-
-            List<BindingSet> bsList = new ArrayList<>();
-            while (iteration.hasNext()) {
-                bsList.add(iteration.next());
-            }
-
-            Assert.assertEquals(0, bsList.size());
-            dao.delete(statement1, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-
-    /**
-     * Tests if StatementMetadataNode joins BindingSet values correctly for
-     * variables appearing as the object in one of the StatementPattern
-     * statements (in the case ?x appears as the Object in the statement
-     * _:blankNode rdf:object ?x). StatementPattern statements have either
-     * rdf:subject, rdf:predicate, or rdf:object as the predicate.
-     */
-    @Test
-    public void simpleQueryWithBindingSetCollection() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
-        try {
-            dao.setConf(conf);
-            dao.init();
-            StatementMetadata metadata = new StatementMetadata();
-            metadata.addMetadata(new RyaURI("http://createdBy";), new 
RyaType("Joe"));
-            metadata.addMetadata(new RyaURI("http://createdOn";), new 
RyaType(XMLSchema.DATE, "2017-01-04"));
-
-            RyaStatement statement1 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("CoffeeShop"), new RyaURI("http://context";), 
"", metadata);
-            RyaStatement statement2 = new RyaStatement(new 
RyaURI("http://Joe";), new RyaURI("http://worksAt";),
-                    new RyaType("HardwareStore"), new 
RyaURI("http://context";), "", metadata);
-            dao.add(statement1);
-            dao.add(statement2);
-
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = 
StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new 
StatementMetadataNode<>(spList, conf);
-
-            List<BindingSet> bsCollection = new ArrayList<>();
-            QueryBindingSet bsConstraint1 = new QueryBindingSet();
-            bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
-
-            QueryBindingSet bsConstraint2 = new QueryBindingSet();
-            bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
-            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
-
-            QueryBindingSet bsConstraint3 = new QueryBindingSet();
-            bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-            bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
-            bsCollection.add(bsConstraint1);
-            bsCollection.add(bsConstraint2);
-            bsCollection.add(bsConstraint3);
-
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration 
= node.evaluate(bsCollection);
-
-            Set<BindingSet> expected = new HashSet<>();
-            QueryBindingSet expected1 = new QueryBindingSet();
-            expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-            expected1.addBinding("y", new LiteralImpl("Joe"));
-            expected1.addBinding("z", new LiteralImpl("Virginia"));
-
-            QueryBindingSet expected2 = new QueryBindingSet();
-            expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-            expected2.addBinding("y", new LiteralImpl("Joe"));
-            expected2.addBinding("z", new LiteralImpl("Maryland"));
-            expected.add(expected1);
-            expected.add(expected2);
-
-            Set<BindingSet> bsSet = new HashSet<>();
-            while (iteration.hasNext()) {
-                bsSet.add(iteration.next());
-            }
-
-            Assert.assertEquals(expected, bsSet);
-
-            dao.delete(statement1, conf);
-            dao.delete(statement2, conf);
-        } finally {
-            dao.destroy();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
 
b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
index cb34bd0..d74dca6 100644
--- 
a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
+++ 
b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
@@ -33,7 +33,7 @@ public interface GeoTemporalIndexer extends 
RyaSecondaryIndexer {
         * initialize after setting configuration.
         */
     @Override
-       public void init();  
+    public void init();
 
     /**
      * Creates the {@link EventStorage} that will be used by the indexer.

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
index fa2f52b..9f60e2e 100644
--- 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
+++ 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.rya.indexing.geotemporal;
 
+import static 
org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getQueryNode;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
 
@@ -26,7 +27,6 @@ import java.util.List;
 import org.apache.rya.indexing.GeoConstants;
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.apache.rya.indexing.geotemporal.GeoTemporalIndexSetProvider;
 import org.apache.rya.indexing.geotemporal.model.EventQueryNode;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.junit.Before;
@@ -36,7 +36,7 @@ import org.openrdf.model.Value;
 import org.openrdf.model.ValueFactory;
 import org.openrdf.model.impl.ValueFactoryImpl;
 
-public class GeoTemporalProviderTest extends GeoTemporalTestUtils {
+public class GeoTemporalProviderTest {
     private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
     private GeoTemporalIndexSetProvider provider;
     private EventStorage events;

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
index 23399c8..51b2ba0 100644
--- 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
+++ 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
@@ -45,10 +45,15 @@ import com.vividsolutions.jts.geom.Polygon;
 import com.vividsolutions.jts.geom.PrecisionModel;
 import com.vividsolutions.jts.geom.impl.PackedCoordinateSequence;
 
-public class GeoTemporalTestUtils {
+public final class GeoTemporalTestUtils {
     private static final GeometryFactory gf = new GeometryFactory(new 
PrecisionModel(), 4326);
 
     /**
+     * Private constructor to prevent initialization.
+     */
+    private GeoTemporalTestUtils() { }
+
+    /**
      * Make an uniform instant with given seconds.
      */
     public static TemporalInstant makeInstant(final int secondsMakeMeUnique) {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
index 9c28bf0..d629d04 100644
--- 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
+++ 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
@@ -36,7 +36,7 @@ import org.apache.rya.indexing.geotemporal.model.Event;
 import org.apache.rya.indexing.geotemporal.mongo.MongoGeoTemporalIndexer;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoTestBase;
+import org.apache.rya.mongodb.MongoITBase;
 import org.junit.Test;
 import org.openrdf.model.URI;
 import org.openrdf.model.Value;
@@ -50,7 +50,7 @@ import org.openrdf.repository.sail.SailRepository;
 import org.openrdf.repository.sail.SailRepositoryConnection;
 import org.openrdf.sail.Sail;
 
-public class MongoGeoTemporalIndexIT extends MongoTestBase {
+public class MongoGeoTemporalIndexIT extends MongoITBase {
     private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
 
     private static final ValueFactory VF = ValueFactoryImpl.getInstance();

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
new file mode 100644
index 0000000..9875091
--- /dev/null
+++ 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
@@ -0,0 +1,364 @@
+/**
+ * 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.rya.indexing.geotemporal.model;
+
+import static 
org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters;
+import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.indexing.IndexingExpr;
+import org.apache.rya.indexing.IndexingFunctionRegistry;
+import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
+import org.apache.rya.indexing.TemporalInstant;
+import org.apache.rya.indexing.TemporalInstantRfc3339;
+import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage;
+import org.apache.rya.indexing.geotemporal.storage.EventStorage;
+import org.apache.rya.mongodb.MongoITBase;
+import org.junit.Test;
+import org.openrdf.model.URI;
+import org.openrdf.model.Value;
+import org.openrdf.model.ValueFactory;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.model.impl.ValueFactoryImpl;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.QueryEvaluationException;
+import org.openrdf.query.algebra.FunctionCall;
+import org.openrdf.query.algebra.StatementPattern;
+import org.openrdf.query.algebra.ValueConstant;
+import org.openrdf.query.algebra.ValueExpr;
+import org.openrdf.query.algebra.Var;
+import org.openrdf.query.impl.MapBindingSet;
+
+import com.vividsolutions.jts.geom.Coordinate;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.geom.GeometryFactory;
+import com.vividsolutions.jts.geom.PrecisionModel;
+
+import info.aduna.iteration.CloseableIteration;
+
+/**
+ * Integration tests the methods of {@link EventQueryNode}.
+ */
+public class EventQueryNode2IT extends MongoITBase {
+    private static final GeometryFactory GF = new GeometryFactory(new 
PrecisionModel(), 4326);
+    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+
+    @Test(expected = IllegalStateException.class)
+    public void constructor_differentSubjects() throws Exception {
+        final Var geoSubj = new Var("point");
+        final Var geoPred = new 
Var("-const-http://www.opengis.net/ont/geosparql#asWKT";, 
ValueFactoryImpl.getInstance().createURI("http://www.opengis.net/ont/geosparql#asWKT";));
+        final Var geoObj = new Var("wkt");
+        final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, 
geoObj);
+
+        final Var timeSubj = new Var("time");
+        final Var timePred = new 
Var("-const-http://www.w3.org/2006/time#inXSDDateTime";, 
ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime";));
+        final Var timeObj = new Var("time");
+        final StatementPattern timeSP = new StatementPattern(timeSubj, 
timePred, timeObj);
+        // This will fail.
+        new EventQueryNode.EventQueryNodeBuilder()
+            .setStorage(mock(EventStorage.class))
+            .setGeoPattern(geoSP)
+            .setTemporalPattern(timeSP)
+            .setGeoFilters(new ArrayList<IndexingExpr>())
+            .setTemporalFilters(new ArrayList<IndexingExpr>())
+            .setUsedFilters(new ArrayList<>())
+            .build();
+    }
+
+    @Test(expected = IllegalStateException.class)
+    public void constructor_variablePredicate() throws Exception {
+        // A pattern that has a variable for its predicate.
+        final Var geoSubj = new Var("point");
+        final Var geoPred = new Var("geo");
+        final Var geoObj = new Var("wkt");
+        final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, 
geoObj);
+
+        final Var timeSubj = new Var("time");
+        final Var timePred = new 
Var("-const-http://www.w3.org/2006/time#inXSDDateTime";, 
ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime";));
+        final Var timeObj = new Var("time");
+        final StatementPattern timeSP = new StatementPattern(timeSubj, 
timePred, timeObj);
+        // This will fail.
+        new EventQueryNode.EventQueryNodeBuilder()
+        .setStorage(mock(EventStorage.class))
+        .setGeoPattern(geoSP)
+        .setTemporalPattern(timeSP)
+        .setGeoFilters(new ArrayList<IndexingExpr>())
+        .setTemporalFilters(new ArrayList<IndexingExpr>())
+        .setUsedFilters(new ArrayList<>())
+        .build();
+    }
+
+    @Test
+    public void evaluate_constantSubject() throws Exception {
+        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
+        RyaURI subject = new RyaURI("urn:event-1111");
+        final Geometry geo = GF.createPoint(new Coordinate(1, 1));
+        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
+        final Event event = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        subject = new RyaURI("urn:event-2222");
+        final Event otherEvent = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        storage.create(event);
+        storage.create(otherEvent);
+
+        final String query =
+                "PREFIX time: <http://www.w3.org/2006/time#> \n"
+              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
+              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
+              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
+              + "SELECT ?event ?time ?point ?wkt "
+              + "WHERE { "
+                + "  <urn:event-1111> time:atTime ?time . "
+                + "  <urn:event-1111> geo:asWKT ?wkt . "
+                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
+                + "  FILTER(tempo:equals(?time, \"" + temp.toString() + "\")) "
+              + "}";
+
+        final EventQueryNode node = buildNode(storage, query);
+        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(new MapBindingSet());
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("wkt", VF.createLiteral("POINT (1 1)"));
+        expected.addBinding("time", VF.createLiteral(temp.toString()));
+        int count = 0;
+        assertTrue(rez.hasNext());
+        while(rez.hasNext()) {
+            assertEquals(expected, rez.next());
+            count++;
+        }
+        assertEquals(1, count);
+    }
+
+    @Test
+    public void evaluate_variableSubject() throws Exception {
+        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
+        RyaURI subject = new RyaURI("urn:event-1111");
+        Geometry geo = GF.createPoint(new Coordinate(1, 1));
+        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
+        final Event event = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        subject = new RyaURI("urn:event-2222");
+        geo = GF.createPoint(new Coordinate(-1, -1));
+        final Event otherEvent = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        storage.create(event);
+        storage.create(otherEvent);
+
+        final String query =
+                "PREFIX time: <http://www.w3.org/2006/time#> \n"
+              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
+              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
+              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
+              + "SELECT ?event ?time ?point ?wkt "
+              + "WHERE { "
+                + "  ?event time:atTime ?time . "
+                + "  ?event geo:asWKT ?wkt . "
+                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
+                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
+              + "}";
+
+        final EventQueryNode node = buildNode(storage, query);
+        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(new MapBindingSet());
+        final MapBindingSet expected1 = new MapBindingSet();
+        expected1.addBinding("wkt", VF.createLiteral("POINT (1 1)"));
+        expected1.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
+        final MapBindingSet expected2 = new MapBindingSet();
+        expected2.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
+        expected2.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
+
+        final List<BindingSet> actual = new ArrayList<>();
+        while(rez.hasNext()) {
+            actual.add(rez.next());
+        }
+        assertEquals(expected1, actual.get(0));
+        assertEquals(expected2, actual.get(1));
+        assertEquals(2, actual.size());
+    }
+
+    @Test
+    public void evaluate_variableSubject_existingBindingset() throws Exception 
{
+        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
+        RyaURI subject = new RyaURI("urn:event-1111");
+        Geometry geo = GF.createPoint(new Coordinate(1, 1));
+        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
+        final Event event = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        subject = new RyaURI("urn:event-2222");
+        geo = GF.createPoint(new Coordinate(-1, -1));
+        final Event otherEvent = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        storage.create(event);
+        storage.create(otherEvent);
+
+        final String query =
+                "PREFIX time: <http://www.w3.org/2006/time#> \n"
+              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
+              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
+              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
+              + "SELECT ?event ?time ?point ?wkt "
+              + "WHERE { "
+                + "  ?event time:atTime ?time . "
+                + "  ?event geo:asWKT ?wkt . "
+                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
+                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
+              + "}";
+
+        final EventQueryNode node = buildNode(storage, query);
+        final MapBindingSet existingBindings = new MapBindingSet();
+        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
+        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(existingBindings);
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
+        expected.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
+
+        final List<BindingSet> actual = new ArrayList<>();
+        while(rez.hasNext()) {
+            actual.add(rez.next());
+        }
+        assertEquals(1, actual.size());
+        assertEquals(expected, actual.get(0));
+    }
+
+    @Test
+    public void evaluate_variableSubject_existingBindingsetWrongFilters() 
throws Exception {
+        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
+        RyaURI subject = new RyaURI("urn:event-1111");
+        Geometry geo = GF.createPoint(new Coordinate(1, 1));
+        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
+        final Event event = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        subject = new RyaURI("urn:event-2222");
+        geo = GF.createPoint(new Coordinate(-10, -10));
+        final Event otherEvent = Event.builder()
+            .setSubject(subject)
+            .setGeometry(geo)
+            .setTemporalInstant(temp)
+            .build();
+
+        storage.create(event);
+        storage.create(otherEvent);
+
+        final String query =
+                "PREFIX time: <http://www.w3.org/2006/time#> \n"
+              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
+              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
+              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
+              + "SELECT ?event ?time ?point ?wkt "
+              + "WHERE { "
+                + "  ?event time:atTime ?time . "
+                + "  ?event geo:asWKT ?wkt . "
+                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
+                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
+              + "}";
+
+        final EventQueryNode node = buildNode(storage, query);
+        final MapBindingSet existingBindings = new MapBindingSet();
+        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
+        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(existingBindings);
+        final MapBindingSet expected = new MapBindingSet();
+        expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
+        expected.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
+
+        assertFalse(rez.hasNext());
+    }
+
+    private EventQueryNode buildNode(final EventStorage store, final String 
query) throws Exception {
+        final List<IndexingExpr> geoFilters = new ArrayList<>();
+        final List<IndexingExpr> temporalFilters = new ArrayList<>();
+        final List<StatementPattern> sps = getSps(query);
+        final List<FunctionCall> filters = getFilters(query);
+        for(final FunctionCall filter : filters) {
+            final URI filterURI = new URIImpl(filter.getURI());
+            final Var objVar = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, 
filter.getArgs());
+            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), 
extractArguments(objVar.getName(), filter));
+            if(IndexingFunctionRegistry.getFunctionType(filterURI) == 
FUNCTION_TYPE.GEO) {
+                geoFilters.add(expr);
+            } else {
+                temporalFilters.add(expr);
+            }
+        }
+
+        final StatementPattern geoPattern = sps.get(1);
+        final StatementPattern temporalPattern = sps.get(0);
+
+        return new EventQueryNode.EventQueryNodeBuilder()
+            .setStorage(store)
+            .setGeoPattern(geoPattern)
+            .setTemporalPattern(temporalPattern)
+            .setGeoFilters(geoFilters)
+            .setTemporalFilters(temporalFilters)
+            .setUsedFilters(filters)
+            .build();
+    }
+
+    private Value[] extractArguments(final String matchName, final 
FunctionCall call) {
+        final Value args[] = new Value[call.getArgs().size() - 1];
+        int argI = 0;
+        for (int i = 0; i != call.getArgs().size(); ++i) {
+            final ValueExpr arg = call.getArgs().get(i);
+            if (argI == i && arg instanceof Var && 
matchName.equals(((Var)arg).getName())) {
+                continue;
+            }
+            if (arg instanceof ValueConstant) {
+                args[argI] = ((ValueConstant)arg).getValue();
+            } else if (arg instanceof Var && ((Var)arg).hasValue()) {
+                args[argI] = ((Var)arg).getValue();
+            } else {
+                throw new IllegalArgumentException("Query error: Found " + arg 
+ ", expected a Literal, BNode or URI");
+            }
+            ++argI;
+        }
+        return args;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java
deleted file mode 100644
index f0099c8..0000000
--- 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java
+++ /dev/null
@@ -1,364 +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.rya.indexing.geotemporal.model;
-
-import static 
org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters;
-import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.indexing.IndexingExpr;
-import org.apache.rya.indexing.IndexingFunctionRegistry;
-import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
-import org.apache.rya.indexing.TemporalInstant;
-import org.apache.rya.indexing.TemporalInstantRfc3339;
-import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage;
-import org.apache.rya.indexing.geotemporal.storage.EventStorage;
-import org.apache.rya.mongodb.MongoTestBase;
-import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.impl.MapBindingSet;
-
-import com.vividsolutions.jts.geom.Coordinate;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.geom.GeometryFactory;
-import com.vividsolutions.jts.geom.PrecisionModel;
-
-import info.aduna.iteration.CloseableIteration;
-
-/**
- * Unit tests the methods of {@link EventQueryNode}.
- */
-public class EventQueryNodeTest extends MongoTestBase {
-    private static final GeometryFactory GF = new GeometryFactory(new 
PrecisionModel(), 4326);
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
-
-    @Test(expected = IllegalStateException.class)
-    public void constructor_differentSubjects() throws Exception {
-        final Var geoSubj = new Var("point");
-        final Var geoPred = new 
Var("-const-http://www.opengis.net/ont/geosparql#asWKT";, 
ValueFactoryImpl.getInstance().createURI("http://www.opengis.net/ont/geosparql#asWKT";));
-        final Var geoObj = new Var("wkt");
-        final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, 
geoObj);
-
-        final Var timeSubj = new Var("time");
-        final Var timePred = new 
Var("-const-http://www.w3.org/2006/time#inXSDDateTime";, 
ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime";));
-        final Var timeObj = new Var("time");
-        final StatementPattern timeSP = new StatementPattern(timeSubj, 
timePred, timeObj);
-        // This will fail.
-        new EventQueryNode.EventQueryNodeBuilder()
-            .setStorage(mock(EventStorage.class))
-            .setGeoPattern(geoSP)
-            .setTemporalPattern(timeSP)
-            .setGeoFilters(new ArrayList<IndexingExpr>())
-            .setTemporalFilters(new ArrayList<IndexingExpr>())
-            .setUsedFilters(new ArrayList<>())
-            .build();
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void constructor_variablePredicate() throws Exception {
-        // A pattern that has a variable for its predicate.
-        final Var geoSubj = new Var("point");
-        final Var geoPred = new Var("geo");
-        final Var geoObj = new Var("wkt");
-        final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, 
geoObj);
-
-        final Var timeSubj = new Var("time");
-        final Var timePred = new 
Var("-const-http://www.w3.org/2006/time#inXSDDateTime";, 
ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime";));
-        final Var timeObj = new Var("time");
-        final StatementPattern timeSP = new StatementPattern(timeSubj, 
timePred, timeObj);
-        // This will fail.
-        new EventQueryNode.EventQueryNodeBuilder()
-        .setStorage(mock(EventStorage.class))
-        .setGeoPattern(geoSP)
-        .setTemporalPattern(timeSP)
-        .setGeoFilters(new ArrayList<IndexingExpr>())
-        .setTemporalFilters(new ArrayList<IndexingExpr>())
-        .setUsedFilters(new ArrayList<>())
-        .build();
-    }
-
-    @Test
-    public void evaluate_constantSubject() throws Exception {
-        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
-        RyaURI subject = new RyaURI("urn:event-1111");
-        final Geometry geo = GF.createPoint(new Coordinate(1, 1));
-        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
-        final Event event = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        subject = new RyaURI("urn:event-2222");
-        final Event otherEvent = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        storage.create(event);
-        storage.create(otherEvent);
-
-        final String query =
-                "PREFIX time: <http://www.w3.org/2006/time#> \n"
-              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
-              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
-              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
-              + "SELECT ?event ?time ?point ?wkt "
-              + "WHERE { "
-                + "  <urn:event-1111> time:atTime ?time . "
-                + "  <urn:event-1111> geo:asWKT ?wkt . "
-                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
-                + "  FILTER(tempo:equals(?time, \"" + temp.toString() + "\")) "
-              + "}";
-
-        final EventQueryNode node = buildNode(storage, query);
-        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(new MapBindingSet());
-        final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("wkt", VF.createLiteral("POINT (1 1)"));
-        expected.addBinding("time", VF.createLiteral(temp.toString()));
-        int count = 0;
-        assertTrue(rez.hasNext());
-        while(rez.hasNext()) {
-            assertEquals(expected, rez.next());
-            count++;
-        }
-        assertEquals(1, count);
-    }
-
-    @Test
-    public void evaluate_variableSubject() throws Exception {
-        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
-        RyaURI subject = new RyaURI("urn:event-1111");
-        Geometry geo = GF.createPoint(new Coordinate(1, 1));
-        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
-        final Event event = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        subject = new RyaURI("urn:event-2222");
-        geo = GF.createPoint(new Coordinate(-1, -1));
-        final Event otherEvent = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        storage.create(event);
-        storage.create(otherEvent);
-
-        final String query =
-                "PREFIX time: <http://www.w3.org/2006/time#> \n"
-              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
-              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
-              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
-              + "SELECT ?event ?time ?point ?wkt "
-              + "WHERE { "
-                + "  ?event time:atTime ?time . "
-                + "  ?event geo:asWKT ?wkt . "
-                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
-                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
-              + "}";
-
-        final EventQueryNode node = buildNode(storage, query);
-        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(new MapBindingSet());
-        final MapBindingSet expected1 = new MapBindingSet();
-        expected1.addBinding("wkt", VF.createLiteral("POINT (1 1)"));
-        expected1.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
-        final MapBindingSet expected2 = new MapBindingSet();
-        expected2.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
-        expected2.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
-
-        final List<BindingSet> actual = new ArrayList<>();
-        while(rez.hasNext()) {
-            actual.add(rez.next());
-        }
-        assertEquals(expected1, actual.get(0));
-        assertEquals(expected2, actual.get(1));
-        assertEquals(2, actual.size());
-    }
-
-    @Test
-    public void evaluate_variableSubject_existingBindingset() throws Exception 
{
-        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
-        RyaURI subject = new RyaURI("urn:event-1111");
-        Geometry geo = GF.createPoint(new Coordinate(1, 1));
-        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
-        final Event event = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        subject = new RyaURI("urn:event-2222");
-        geo = GF.createPoint(new Coordinate(-1, -1));
-        final Event otherEvent = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        storage.create(event);
-        storage.create(otherEvent);
-
-        final String query =
-                "PREFIX time: <http://www.w3.org/2006/time#> \n"
-              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
-              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
-              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
-              + "SELECT ?event ?time ?point ?wkt "
-              + "WHERE { "
-                + "  ?event time:atTime ?time . "
-                + "  ?event geo:asWKT ?wkt . "
-                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
-                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
-              + "}";
-
-        final EventQueryNode node = buildNode(storage, query);
-        final MapBindingSet existingBindings = new MapBindingSet();
-        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
-        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(existingBindings);
-        final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
-        expected.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
-
-        final List<BindingSet> actual = new ArrayList<>();
-        while(rez.hasNext()) {
-            actual.add(rez.next());
-        }
-        assertEquals(1, actual.size());
-        assertEquals(expected, actual.get(0));
-    }
-
-    @Test
-    public void evaluate_variableSubject_existingBindingsetWrongFilters() 
throws Exception {
-        final EventStorage storage = new 
MongoEventStorage(super.getMongoClient(), "testDB");
-        RyaURI subject = new RyaURI("urn:event-1111");
-        Geometry geo = GF.createPoint(new Coordinate(1, 1));
-        final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 
12, 00, 0);
-        final Event event = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        subject = new RyaURI("urn:event-2222");
-        geo = GF.createPoint(new Coordinate(-10, -10));
-        final Event otherEvent = Event.builder()
-            .setSubject(subject)
-            .setGeometry(geo)
-            .setTemporalInstant(temp)
-            .build();
-
-        storage.create(event);
-        storage.create(otherEvent);
-
-        final String query =
-                "PREFIX time: <http://www.w3.org/2006/time#> \n"
-              + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n"
-              + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>"
-              + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>"
-              + "SELECT ?event ?time ?point ?wkt "
-              + "WHERE { "
-                + "  ?event time:atTime ?time . "
-                + "  ?event geo:asWKT ?wkt . "
-                + "  FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 
-2, -3 -2))\"^^geo:wktLiteral)) "
-                + "  FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) "
-              + "}";
-
-        final EventQueryNode node = buildNode(storage, query);
-        final MapBindingSet existingBindings = new MapBindingSet();
-        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
-        final CloseableIteration<BindingSet, QueryEvaluationException> rez = 
node.evaluate(existingBindings);
-        final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
-        expected.addBinding("time", VF.createLiteral(new 
TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString()));
-
-        assertFalse(rez.hasNext());
-    }
-
-    private EventQueryNode buildNode(final EventStorage store, final String 
query) throws Exception {
-        final List<IndexingExpr> geoFilters = new ArrayList<>();
-        final List<IndexingExpr> temporalFilters = new ArrayList<>();
-        final List<StatementPattern> sps = getSps(query);
-        final List<FunctionCall> filters = getFilters(query);
-        for(final FunctionCall filter : filters) {
-            final URI filterURI = new URIImpl(filter.getURI());
-            final Var objVar = 
IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, 
filter.getArgs());
-            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), 
extractArguments(objVar.getName(), filter));
-            if(IndexingFunctionRegistry.getFunctionType(filterURI) == 
FUNCTION_TYPE.GEO) {
-                geoFilters.add(expr);
-            } else {
-                temporalFilters.add(expr);
-            }
-        }
-
-        final StatementPattern geoPattern = sps.get(1);
-        final StatementPattern temporalPattern = sps.get(0);
-
-        return new EventQueryNode.EventQueryNodeBuilder()
-            .setStorage(store)
-            .setGeoPattern(geoPattern)
-            .setTemporalPattern(temporalPattern)
-            .setGeoFilters(geoFilters)
-            .setTemporalFilters(temporalFilters)
-            .setUsedFilters(filters)
-            .build();
-    }
-
-    private Value[] extractArguments(final String matchName, final 
FunctionCall call) {
-        final Value args[] = new Value[call.getArgs().size() - 1];
-        int argI = 0;
-        for (int i = 0; i != call.getArgs().size(); ++i) {
-            final ValueExpr arg = call.getArgs().get(i);
-            if (argI == i && arg instanceof Var && 
matchName.equals(((Var)arg).getName())) {
-                continue;
-            }
-            if (arg instanceof ValueConstant) {
-                args[argI] = ((ValueConstant)arg).getValue();
-            } else if (arg instanceof Var && ((Var)arg).hasValue()) {
-                args[argI] = ((Var)arg).getValue();
-            } else {
-                throw new IllegalArgumentException("Query error: Found " + arg 
+ ", expected a Literal, BNode or URI");
-            }
-            ++argI;
-        }
-        return args;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
----------------------------------------------------------------------
diff --git 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
index 392d381..125a2e4 100644
--- 
a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
+++ 
b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
@@ -18,6 +18,10 @@ l * Licensed to the Apache Software Foundation (ASF) under 
one
  */
 package org.apache.rya.indexing.geotemporal.mongo;
 
+import static 
org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.assertEqualMongo;
+import static 
org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters;
+import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -28,7 +32,6 @@ import org.apache.rya.indexing.IndexingFunctionRegistry;
 import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
 import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.GeoPolicy;
 import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.TemporalPolicy;
-import org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils;
 import org.junit.Before;
 import org.junit.Test;
 import org.openrdf.model.Resource;
@@ -56,7 +59,7 @@ import com.mongodb.util.JSON;
  * @see TemporalPolicy Temporal Filter Functions
  * @see GeoPolicy Geo Filter Functions
  */
-public class GeoTemporalMongoDBStorageStrategyTest extends 
GeoTemporalTestUtils {
+public class GeoTemporalMongoDBStorageStrategyTest {
     private GeoTemporalMongoDBStorageStrategy adapter;
     @Before
     public void setup() {

Reply via email to