You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by pu...@apache.org on 2016/07/21 13:10:34 UTC

incubator-rya git commit: RYA-130 Fixed Rya Mongo Multi Binding Set Join

Repository: incubator-rya
Updated Branches:
  refs/heads/develop 42895eac0 -> dbd46e7a7


RYA-130 Fixed Rya Mongo Multi Binding Set Join

Fixed bud in Mongo Query Engine; added test


Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/dbd46e7a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/dbd46e7a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/dbd46e7a

Branch: refs/heads/develop
Commit: dbd46e7a7f4bacdc59a7ffb3c1b29b082df0bd99
Parents: 42895ea
Author: Aaron Mihalik <mi...@alum.mit.edu>
Authored: Fri Jul 8 19:01:19 2016 -0400
Committer: pujav65 <pu...@gmail.com>
Committed: Thu Jul 21 08:56:02 2016 -0400

----------------------------------------------------------------------
 .../mvm/rya/mongodb/MongoDBQueryEngine.java     |   5 +-
 .../java/mvm/rya/mongodb/MongoDBRyaDAO.java     |   1 +
 .../RyaStatementBindingSetCursorIterator.java   |  59 +++++----
 .../mvm/rya/mongodb/MongoDBQueryEngineTest.java | 124 +++++++++++++++++++
 4 files changed, 167 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/dbd46e7a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
index dfaed00..afa0a77 100644
--- a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBQueryEngine.java
@@ -50,6 +50,9 @@ import mvm.rya.mongodb.iter.RyaStatementBindingSetCursorIterator;
 import mvm.rya.mongodb.iter.RyaStatementCursorIterable;
 import mvm.rya.mongodb.iter.RyaStatementCursorIterator;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
 /**
  * Date: 7/17/12
  * Time: 9:28 AM
@@ -105,7 +108,7 @@ public class MongoDBQueryEngine implements RyaQueryEngine<MongoDBRdfConfiguratio
             conf = configuration;
         }
         final Long maxResults = conf.getLimit();
-        final Map<DBObject, BindingSet> rangeMap = new HashMap<DBObject, BindingSet>();
+        final Multimap<DBObject, BindingSet> rangeMap = HashMultimap.create();
 
         //TODO: cannot span multiple tables here
         try {

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/dbd46e7a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
index 5695d8c..15537e5 100644
--- a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/MongoDBRyaDAO.java
@@ -72,6 +72,7 @@ public final class MongoDBRyaDAO implements RyaDAO<MongoDBRdfConfiguration>{
      * @throws RyaDAOException
      */
     public MongoDBRyaDAO(final MongoDBRdfConfiguration conf) throws RyaDAOException, NumberFormatException, UnknownHostException {
+        this.conf = conf;
         try {
             mongoClient = MongoConnectorFactory.getMongoClient(conf);
             conf.setMongoClient(mongoClient);

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/dbd46e7a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
index ce21ff7..d24cbdc 100644
--- a/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
+++ b/dao/mongodb.rya/src/main/java/mvm/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
@@ -22,8 +22,8 @@ package mvm.rya.mongodb.iter;
 
 import info.aduna.iteration.CloseableIteration;
 
+import java.util.Collection;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Map.Entry;
 
 import mvm.rya.api.RdfCloudTripleStoreUtils;
@@ -33,6 +33,7 @@ import mvm.rya.mongodb.dao.MongoDBStorageStrategy;
 
 import org.openrdf.query.BindingSet;
 
+import com.google.common.collect.Multimap;
 import com.mongodb.DBCollection;
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
@@ -40,15 +41,17 @@ import com.mongodb.DBObject;
 public class RyaStatementBindingSetCursorIterator implements CloseableIteration<Entry<RyaStatement, BindingSet>, RyaDAOException> {
 
 	private DBCollection coll;
-	private Map<DBObject, BindingSet> rangeMap;
+	private Multimap<DBObject, BindingSet> rangeMap;
 	private Iterator<DBObject> queryIterator;
 	private Long maxResults;
-	private DBCursor currentCursor;
-	private BindingSet currentBindingSet;
+	private DBCursor resultCursor;
+	private RyaStatement currentStatement;
+	private Collection<BindingSet> currentBindingSetCollection;
+	private Iterator<BindingSet> currentBindingSetIterator;
 	private MongoDBStorageStrategy strategy;
 
 	public RyaStatementBindingSetCursorIterator(DBCollection coll,
-			Map<DBObject, BindingSet> rangeMap, MongoDBStorageStrategy strategy) {
+			Multimap<DBObject, BindingSet> rangeMap, MongoDBStorageStrategy strategy) {
 		this.coll = coll;
 		this.rangeMap = rangeMap;
 		this.queryIterator = rangeMap.keySet().iterator();
@@ -57,37 +60,51 @@ public class RyaStatementBindingSetCursorIterator implements CloseableIteration<
 
 	@Override
 	public boolean hasNext() {
-		if (!currentCursorIsValid()) {
-			findNextValidCursor();
+		if (!currentBindingSetIteratorIsValid()) {
+			findNextResult();
 		}
-		return currentCursorIsValid();
+		return currentBindingSetIteratorIsValid();
 	}
 
 	@Override
 	public Entry<RyaStatement, BindingSet> next() {
-		if (!currentCursorIsValid()) {
-			findNextValidCursor();
+		if (!currentBindingSetIteratorIsValid()) {
+			findNextResult();
 		}
-		if (currentCursorIsValid()) {
-			// convert to Rya Statement
-			DBObject queryResult = currentCursor.next();
-			RyaStatement statement = strategy.deserializeDBObject(queryResult);
-			return new RdfCloudTripleStoreUtils.CustomEntry<RyaStatement, BindingSet>(statement, currentBindingSet);
+		if (currentBindingSetIteratorIsValid()) {
+			BindingSet currentBindingSet = currentBindingSetIterator.next();
+			return new RdfCloudTripleStoreUtils.CustomEntry<RyaStatement, BindingSet>(currentStatement, currentBindingSet);
 		}
 		return null;
 	}
 	
-	private void findNextValidCursor() {
+	private boolean currentBindingSetIteratorIsValid() {
+		return (currentBindingSetIterator != null) && currentBindingSetIterator.hasNext();
+	}
+
+	private void findNextResult() {
+		if (!currentResultCursorIsValid()) {
+			findNextValidResultCursor();
+		}
+		if (currentResultCursorIsValid()) {
+			// convert to Rya Statement
+			DBObject queryResult = resultCursor.next();
+			currentStatement = strategy.deserializeDBObject(queryResult);
+			currentBindingSetIterator = currentBindingSetCollection.iterator();
+		}
+	}
+
+	private void findNextValidResultCursor() {
 		while (queryIterator.hasNext()){
 			DBObject currentQuery = queryIterator.next();
-			currentCursor = coll.find(currentQuery);
-			currentBindingSet = rangeMap.get(currentQuery);
-			if (currentCursor.hasNext()) break;
+			resultCursor = coll.find(currentQuery);
+			currentBindingSetCollection = rangeMap.get(currentQuery);
+			if (resultCursor.hasNext()) return;
 		}
 	}
 	
-	private boolean currentCursorIsValid() {
-		return (currentCursor != null) && currentCursor.hasNext();
+	private boolean currentResultCursorIsValid() {
+		return (resultCursor != null) && resultCursor.hasNext();
 	}
 
 

http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/dbd46e7a/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBQueryEngineTest.java
----------------------------------------------------------------------
diff --git a/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBQueryEngineTest.java b/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBQueryEngineTest.java
new file mode 100644
index 0000000..870115c
--- /dev/null
+++ b/dao/mongodb.rya/src/test/java/mvm/rya/mongodb/MongoDBQueryEngineTest.java
@@ -0,0 +1,124 @@
+package mvm.rya.mongodb;
+
+/*
+ * 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.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import info.aduna.iteration.CloseableIteration;
+import mvm.rya.api.RdfCloudTripleStoreConfiguration;
+import mvm.rya.api.RdfCloudTripleStoreUtils;
+import mvm.rya.api.domain.RyaStatement;
+import mvm.rya.api.domain.RyaStatement.RyaStatementBuilder;
+import mvm.rya.api.domain.RyaURI;
+
+import org.apache.hadoop.conf.Configuration;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.openrdf.model.impl.URIImpl;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.impl.MapBindingSet;
+
+import com.google.common.collect.Lists;
+import com.mongodb.MongoClient;
+
+import de.flapdoodle.embed.mongo.distribution.Version;
+import de.flapdoodle.embed.mongo.tests.MongodForTestsFactory;
+
+public class MongoDBQueryEngineTest {
+
+    // private dao;
+    // private configuration;
+
+    private MongoDBQueryEngine engine;
+    private MongoDBRdfConfiguration configuration;
+
+    @Before
+    public void setUp() throws Exception {
+        // Set up Mongo/Rya
+        MongodForTestsFactory testsFactory = MongodForTestsFactory.with(Version.Main.PRODUCTION);
+        Configuration conf = new Configuration();
+        conf.set(MongoDBRdfConfiguration.USE_TEST_MONGO, "true");
+        conf.set(MongoDBRdfConfiguration.MONGO_DB_NAME, "test");
+        conf.set(MongoDBRdfConfiguration.MONGO_COLLECTION_PREFIX, "rya_");
+        conf.set(RdfCloudTripleStoreConfiguration.CONF_TBL_PREFIX, "rya_");
+        configuration = new MongoDBRdfConfiguration(conf);
+        MongoClient mongoClient = testsFactory.newMongo();
+        int port = mongoClient.getServerAddressList().get(0).getPort();
+        configuration.set(MongoDBRdfConfiguration.MONGO_INSTANCE_PORT, Integer.toString(port));
+
+        engine = new MongoDBQueryEngine(configuration, mongoClient);
+
+        // Add Data
+        MongoDBRyaDAO dao = new MongoDBRyaDAO(configuration, mongoClient);
+        dao.add(getStatement("u:a", "u:tt", "u:b"));
+        dao.add(getStatement("u:a", "u:tt", "u:c"));
+    }
+
+    private RyaStatement getStatement(String s, String p, String o) {
+        RyaStatementBuilder builder = new RyaStatementBuilder();
+        if (s != null)
+            builder.setSubject(new RyaURI(s));
+        if (p != null)
+            builder.setPredicate(new RyaURI(p));
+        if (o != null)
+            builder.setObject(new RyaURI(o));
+        return builder.build();
+    }
+
+    public int size(CloseableIteration<?, ?> iter) throws Exception {
+        int i = 0;
+        while (iter.hasNext()) {
+            i++;
+            iter.next();
+        }
+        return i;
+    }
+
+    @Test
+    public void statementQuery() throws Exception {
+        RyaStatement s = getStatement("u:a", null, null);
+        Assert.assertEquals(2, size(engine.query(s, configuration)));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void bindingSetsQuery() throws Exception {
+        RyaStatement s = getStatement("u:a", null, null);
+        
+        MapBindingSet bs1 = new MapBindingSet();
+        bs1.addBinding("foo", new URIImpl("u:x"));
+
+        Map.Entry<RyaStatement, BindingSet> e1 = new RdfCloudTripleStoreUtils.CustomEntry<RyaStatement, BindingSet>(s, bs1);
+        Collection<Entry<RyaStatement, BindingSet>> stmts1 = Lists.newArrayList(e1);
+        Assert.assertEquals(2, size(engine.queryWithBindingSet(stmts1, configuration)));
+
+        
+        MapBindingSet bs2 = new MapBindingSet();
+        bs2.addBinding("foo", new URIImpl("u:y"));
+
+        Map.Entry<RyaStatement, BindingSet> e2 = new RdfCloudTripleStoreUtils.CustomEntry<RyaStatement, BindingSet>(s, bs2);
+
+        Collection<Entry<RyaStatement, BindingSet>> stmts2 = Lists.newArrayList(e1, e2);
+        Assert.assertEquals(4, size(engine.queryWithBindingSet(stmts2, configuration)));
+}
+}