You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by rm...@apache.org on 2012/10/17 16:46:22 UTC

svn commit: r1399282 - in /incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql: ./ src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/ src/main/java/org/apache/i...

Author: rmatthews
Date: Wed Oct 17 14:46:21 2012
New Revision: 1399282

URL: http://svn.apache.org/viewvc?rev=1399282&view=rev
Log:
ISIS-176 - upgraded mongo version and incorporated basic searching.

Modified:
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/pom.xml Wed Oct 17 14:46:21 2012
@@ -143,7 +143,7 @@
             <dependency>
                 <groupId>org.mongodb</groupId>
                 <artifactId>mongo-java-driver</artifactId>
-                <version>1.3</version>
+                <version>2.9.1</version>
             </dependency>
             <dependency>
                 <groupId>org.json</groupId>

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/NoSqlObjectStore.java Wed Oct 17 14:46:21 2012
@@ -48,6 +48,9 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.SaveObjectCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryBuiltIn;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindAllInstances;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByPattern;
+import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByTitle;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.IdentifierGenerator;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
@@ -122,17 +125,60 @@ public class NoSqlObjectStore implements
     public void execute(final List<PersistenceCommand> commands) {
         database.write(commands);
     }
-
+    
     @Override
     public List<ObjectAdapter> loadInstancesAndAdapt(final PersistenceQuery persistenceQuery) {
+        if (persistenceQuery instanceof PersistenceQueryFindByTitle) {
+            return getAllInstances((PersistenceQueryFindByTitle) persistenceQuery);
+        } else if (persistenceQuery instanceof PersistenceQueryFindAllInstances) {
+            return getAllInstances((PersistenceQueryFindAllInstances) persistenceQuery);
+        } else if (persistenceQuery instanceof PersistenceQueryFindByPattern) {
+            return findByPattern((PersistenceQueryFindByPattern) persistenceQuery);
+        } else {
+            return findDefaultr(persistenceQuery);
+        }
+    }
+
+    private List<ObjectAdapter> findDefaultr(PersistenceQuery persistenceQuery) {
+        final List<ObjectAdapter> instances = Lists.newArrayList();
         final ObjectSpecification specification = persistenceQuery.getSpecification();
+        final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId());
+        while (instanceData.hasNext()) {
+            final StateReader reader = instanceData.next();
+            final ObjectAdapter instance = objectReader.load(reader, versionCreator, availableDataEncrypters);
+            instances.add(instance);
+        }
+        return instances;
+    }
+
+    private List<ObjectAdapter> findByPattern(PersistenceQueryFindByPattern query) {
+        final ObjectSpecification specification = query.getSpecification();
         final List<ObjectAdapter> instances = Lists.newArrayList();
-        appendInstances(persistenceQuery, specification, instances);
+        appendPatternInstances(query, specification, instances);
         return instances;
     }
+    
+    private void appendPatternInstances(final PersistenceQueryFindByPattern persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {      
+        final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId(), persistenceQuery.getPattern());
+        while (instanceData.hasNext()) {
+            final StateReader reader = instanceData.next();
+            final ObjectAdapter instance = objectReader.load(reader, versionCreator, availableDataEncrypters);
+            instances.add(instance);
+        }
+        for (final ObjectSpecification spec : specification.subclasses()) {
+            appendPatternInstances(persistenceQuery, spec, instances);
+        }
+    }
 
-    private void appendInstances(final PersistenceQuery persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {
-        
+
+    private List<ObjectAdapter> getAllInstances(PersistenceQuery query) {
+        final ObjectSpecification specification = query.getSpecification();
+        final List<ObjectAdapter> instances = Lists.newArrayList();
+        appendInstances(query, specification, instances);
+        return instances;
+    }
+
+    private void appendInstances(final PersistenceQuery persistenceQuery, final ObjectSpecification specification, final List<ObjectAdapter> instances) {      
         final Iterator<StateReader> instanceData = database.instancesOf(specification.getSpecId());
         while (instanceData.hasNext()) {
             final StateReader reader = instanceData.next();
@@ -186,13 +232,7 @@ public class NoSqlObjectStore implements
     @Override
     public void resolveImmediately(final ObjectAdapter adapter) {
         final Oid oid = adapter.getOid();
-        ;
-        if (oid instanceof AggregatedOid) {
-            // throw new
-            // UnexpectedCallException("Aggregated objects should not need to be resolved: "
-            // +
-            // object);
-        } else {
+        if (!(oid instanceof AggregatedOid)) {
             final ObjectSpecification objectSpec = adapter.getSpecification();
             final String key = keyCreator.getIdentifierForPersistentRoot(oid);
             final StateReader reader = database.getInstance(key, objectSpec.getSpecId());

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/ObjectReader.java Wed Oct 17 14:46:21 2012
@@ -22,19 +22,16 @@ package org.apache.isis.runtimes.dflt.ob
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.core.commons.exceptions.UnexpectedCallException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
@@ -45,11 +42,12 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.nosql.keys.KeyCreatorDefault;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.versions.VersionCreator;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManagerSpi;
-import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.Persistor;
+import org.apache.log4j.Logger;
 
 public class ObjectReader {
+
+    private static final Logger LOG = Logger.getLogger(ObjectReader.class);
     
     private final KeyCreatorDefault keyCreator = new KeyCreatorDefault();
 
@@ -69,7 +67,7 @@ public class ObjectReader {
             }
             if (version.different(adapter.getVersion())) {
                 // TODO - do we need to CHECK version and update
-                throw new UnexpectedCallException();
+                LOG.warn("while reading data into " + oidStr + " version was " + version + " when existing adapter was already " + adapter.getVersion());
             }
             
         } else {
@@ -138,8 +136,6 @@ public class ObjectReader {
     }
 
     private ObjectAdapter restoreAggregatedObject(final StateReader aggregateReader, final AggregatedOid aggregatedOid, final DataEncryption dataEncrypter) {
-        final ObjectSpecification specification = getSpecificationLoader().lookupBySpecId(aggregatedOid.getObjectSpecId());
-
         final ObjectAdapter fieldObject = getAdapter(aggregatedOid);
         final ResolveState resolveState = ResolveState.RESOLVING;
         fieldObject.changeState(resolveState);
@@ -173,7 +169,6 @@ public class ObjectReader {
                 throw new NoSqlStoreException("Invalid reference field (an empty string) in data for " + association.getName() + "  in " + object);
             }
             final RootOid oid = keyCreator.unmarshal(ref);
-            final ObjectSpecification specification = keyCreator.specificationFromOidStr(ref);
             fieldObject = getAdapter(oid);
         }
         try {

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/NoSqlDataDatabase.java Wed Oct 17 14:46:21 2012
@@ -22,6 +22,7 @@ package org.apache.isis.runtimes.dflt.ob
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
 
@@ -38,6 +39,7 @@ public interface NoSqlDataDatabase {
     boolean hasInstances(ObjectSpecId objectSpecId);
     StateReader getInstance(String key, ObjectSpecId objectSpecId);
     Iterator<StateReader> instancesOf(ObjectSpecId objectSpecId);
+    Iterator<StateReader> instancesOf(ObjectSpecId specId, ObjectAdapter pattern);
 
     long nextSerialNumberBatch(ObjectSpecId objectSpecId, int batchSize);
 

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java Wed Oct 17 14:46:21 2012
@@ -27,8 +27,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.zip.CRC32;
 
-import org.apache.log4j.Logger;
-
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlCommandContext;
@@ -36,6 +36,7 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.NoSqlDataDatabase;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.StateReader;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
+import org.apache.log4j.Logger;
 
 public class FileServerDb implements NoSqlDataDatabase {
 
@@ -252,4 +253,9 @@ public class FileServerDb implements NoS
         returnConnection(connection);
         return hasInstances;
     }
+
+    public Iterator<StateReader> instancesOf(ObjectSpecId specId, ObjectAdapter pattern) {
+    	// TODO implement
+        throw new NotImplementedException();
+    }
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java?rev=1399282&r1=1399281&r2=1399282&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/mongo/MongoDb.java Wed Oct 17 14:46:21 2012
@@ -23,19 +23,9 @@ import java.net.UnknownHostException;
 import java.util.Iterator;
 import java.util.List;
 
-import com.mongodb.BasicDBObject;
-import com.mongodb.DB;
-import com.mongodb.DB.WriteConcern;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-import com.mongodb.Mongo;
-import com.mongodb.MongoException;
-import com.mongodb.ObjectId;
-
-import org.apache.log4j.Logger;
-
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlCommandContext;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlStoreException;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.NoSqlDataDatabase;
@@ -43,6 +33,16 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.StateWriter;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.keys.KeyCreatorDefault;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
+import org.apache.log4j.Logger;
+import org.bson.types.ObjectId;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DB;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.Mongo;
+import com.mongodb.MongoException;
 
 public class MongoDb implements NoSqlDataDatabase {
 
@@ -74,11 +74,14 @@ public class MongoDb implements NoSqlDat
     @Override
     public void open() {
         try {
-        	mongo = new Mongo(host, port);
-            db = mongo.getDB(dbName);
-            db.setWriteConcern(WriteConcern.STRICT);
-            
-            LOG.info("opened database (" + dbName + "): " + db);
+            if (mongo == null) {
+                mongo = new Mongo(host, port);
+                db = mongo.getDB(dbName);
+                db.setWriteConcern(com.mongodb.WriteConcern.SAFE);
+                LOG.info("opened database (" + dbName + "): " + mongo);
+            } else {
+                LOG.info(" using opened database " + db);
+            }
         } catch (final UnknownHostException e) {
             throw new NoSqlStoreException(e);
         } catch (final MongoException e) {
@@ -88,7 +91,6 @@ public class MongoDb implements NoSqlDat
 
     @Override
     public void close() {
-        // TODO is there a close mechanism?
     }
 
     public NoSqlCommandContext createTransactionContext() {
@@ -172,6 +174,43 @@ public class MongoDb implements NoSqlDat
 
         };
     }
+    
+    @Override
+    public Iterator<StateReader> instancesOf(ObjectSpecId objectSpecId, ObjectAdapter pattern) {
+        final DBCollection instances = db.getCollection(objectSpecId.asString());
+
+        // REVIEW check the right types are used in matches 
+        final BasicDBObject query = new BasicDBObject();
+        for ( ObjectAssociation association  : pattern.getSpecification().getAssociations()) {
+            ObjectAdapter field = association.get(pattern);
+            if (!association.isEmpty(pattern)) {
+                if (field.isValue()) {
+                    query.put(association.getIdentifier().getMemberName(), field.titleString());
+                } else if (association.isOneToOneAssociation()) {
+                    query.put(association.getIdentifier().getMemberName(), field.getOid());
+                }
+            }
+        }
+        final DBCursor cursor = instances.find(query);
+        LOG.info("searching for instances of: " + objectSpecId);
+        return new Iterator<StateReader>() {
+            @Override
+            public boolean hasNext() {
+                return cursor.hasNext();
+            }
+
+            @Override
+            public StateReader next() {
+                return new MongoStateReader(cursor.next());
+            }
+
+            @Override
+            public void remove() {
+                throw new NoSqlStoreException("Can't remove elements");
+            }
+
+        };
+    }
 
     @Override
     public StateReader getInstance(final String key, final ObjectSpecId objectSpecId) {