Author: simoneg
Date: Thu May 19 03:43:21 2011
New Revision: 1124527

URL: http://svn.apache.org/viewvc?rev=1124527&view=rev
Log:
Implementation of delete orphans, works but still some work to do.

Modified:
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityDoc.aj
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoMetadata.java
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
    
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/MongoDbTestBase.java
    
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
    
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityDoc.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityDoc.aj?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityDoc.aj
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityDoc.aj
 Thu May 19 03:43:21 2011
@@ -121,6 +121,7 @@ public aspect MongoEntityDoc {
                                if (!prop.isReadable()) continue;
                                if (prop.isJpaId() || prop.isJpaVersion() || 
prop.isJpaTransient()) continue;
                                boolean read = prop.isBasicType() || 
(prop.isMongoPersisted() && !prop.isMap() && !prop.isCollection());
+                               // TODO is this the best way to do this? It 
takes a lot of time, and causes "property":null in the db
                                if (read) {
                                        bh.getValue(piname);
                                }

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoMetadata.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoMetadata.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoMetadata.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoMetadata.java
 Thu May 19 03:43:21 2011
@@ -84,6 +84,7 @@ public class MongoMetadata extends Basic
                                throw new MagmaException(e, "Error linking or 
initializing class {0}", clazz);
                        }
                }
+               this.dirty = false;
        }
        
        private DBObject getClassesDbo() {

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoUtils.java
 Thu May 19 03:43:21 2011
@@ -1,6 +1,10 @@
 package org.apache.magma.database.mongo;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
 
 import javax.persistence.PostLoad;
 
@@ -116,5 +120,35 @@ public class MongoUtils {
                return ret;
        }
        
+       public static <T> Iterable<T> merged(final Collection<T>... colls) {
+               return new Iterable<T>() {
+                       public Iterator<T> iterator() {
+                               return new Iterator<T>() {
+                                       private List<Iterator<T>> iters = new 
ArrayList<Iterator<T>>();
+                                       
+                                       {
+                                               for (Collection<T> coll : 
colls) {
+                                                       
iters.add(coll.iterator());
+                                               }
+                                       }
+
+                                       public boolean hasNext() {
+                                               if (iters.size() == 0) return 
false;
+                                               if (iters.get(0).hasNext()) 
return true;
+                                               iters.remove(0);
+                                               return hasNext();
+                                       }
+
+                                       public T next() {
+                                               return iters.get(0).next();
+                                       }
+
+                                       public void remove() {
+                                               iters.get(0).remove();
+                                       }
+                               };
+                       }
+               };
+       }
        
 }

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/Transaction.java
 Thu May 19 03:43:21 2011
@@ -344,6 +344,7 @@ public class Transaction {
         */
        public void commit() {
                MongoDB mdb = this.db.getDb();
+               // FIXME using identity sets here would be much safer
                Set<MongoEntity> reallySaving = new HashSet<MongoEntity>();
                Set<MongoEntity> orphans = new HashSet<MongoEntity>();
                
@@ -364,23 +365,31 @@ public class Transaction {
                                if (oldents == null || oldents.size() == 0) 
continue;
                                PropertyInfo loadedpi = 
ent.beanData().getProperty(loaded.getKey());
                                if (loadedpi.isMongoPersisted()) {
-                                       if (loadedpi.isJpaDeleteOrphans()) {
-                                               // FIXME list all orphans
-                                       } else {
-                                               for (MongoEntity oldent : 
oldents) {
-                                                       if (oldent.isFromDb())
-                                                               
discovereds.add(oldent);
-                                               }
+                                       Set<MongoEntity> tgt = discovereds;
+                                       if (loadedpi.isJpaDeleteOrphans())
+                                               tgt = orphans;
+                                       for (MongoEntity oldent : oldents) {
+                                               // FIXME only dirties should be 
saved here, except for orphans
+                                               if (oldent.isFromDb())
+                                                       tgt.add(oldent);
                                        }
                                }
                        }
                }       
                reallySaving.addAll(discovereds);
+               orphans.removeAll(reallySaving);
                
-               if (reallySaving.size() == 0) return;
+               // TODO this should also be in a cycle, deletin an orphan could 
lead to deletion of other entities 
+               for (MongoEntity ent : orphans) {
+                       this.delete(ent);
+               }
+               // TODO once this is in a big loop, adding orphans could be not 
necessary, cause they end up in confirmedSave
+               reallySaving.addAll(orphans);
                
+               if (reallySaving.size() == 0) return;
                
                BasicDBObject entlist = new BasicDBObject();
+               
                for (MongoEntity ent : reallySaving) {
                        MongoCollection coll = getCollection(ent.getClass());
                        String id = MongoUtils.getMongoId(ent);
@@ -392,7 +401,6 @@ public class Transaction {
                        }
                        colllist.add(id);
                }
-               // FIXME also add orphans to entlist
                
                MongoCollection trcoll = getCollection("transactions");
                BasicDBObject mydbo = new BasicDBObject();

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/MongoDbTestBase.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/MongoDbTestBase.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/MongoDbTestBase.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/MongoDbTestBase.java
 Thu May 19 03:43:21 2011
@@ -43,6 +43,11 @@ public class MongoDbTestBase {
                mdb.clearAllExpectations();
        }
        
+       protected void resetDb() {
+               closeMongoDb();
+               initMongoDb();
+       }
+       
        protected DBObject cloneDbo(BSONObject dbo) {
                BasicDBObject ret = new BasicDBObject();
                ret.putAll(dbo);

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java
 Thu May 19 03:43:21 2011
@@ -11,10 +11,13 @@ import org.apache.magma.database.mongo.t
 import org.apache.magma.database.mongo.test.domain.F1Team;
 import org.apache.magma.database.mongo.test.domain.Person;
 import org.apache.magma.database.mongo.test.domain.Person.PersonType;
+import org.apache.magma.database.mongo.test.utils.MongoTestCollection.Expect;
+import org.hamcrest.Matcher;
 import org.junit.Test;
 
 import com.mongodb.BasicDBList;
 import com.mongodb.DBObject;
+import com.mongodb.DummyResultFactory;
 
 
 public class TransactionPartWritingTest extends MongoDbTestBase {
@@ -106,7 +109,6 @@ public class TransactionPartWritingTest 
                db.commit();
                
                mdb.checkAll();
-               
        }
        
        @Test
@@ -288,6 +290,46 @@ public class TransactionPartWritingTest 
                mdb.checkAll();
        }
        
+       @Test
+       public void deleteOrphans() throws Exception {
+               DBObject cloneDbo = cloneDbo(BSONPieces.simplePerson);
+               cloneDbo.put("car", BSONPieces.carId);
+               
+               mdb.getCollection("test", "person")
+                       .expectFindOne(dbObject("{'_id':'" + 
BSONPieces.simplePersonId + "'}"), cloneDbo);
+               
+               Person p = db.load(Person.class, BSONPieces.simplePersonId);
+               
+               mdb.checkAll();
+               BSONPieces.assertSimplePersonLoaded(p);
+
+               mdb.getCollection("test", "car")
+                       .expectFindOne(dbObject("{'_id':'" + BSONPieces.carId + 
"'}"), BSONPieces.car);
+               
+               Car car = p.getCar();
+               
+               mdb.checkAll();
+               BSONPieces.assertCarLoaded(car);
+
+               Car c2 = new Car();
+               p.setCar(c2);
+               
+               db.save(p);
+               
+               mdb.getCollection("test", "person")
+                       .expectUpdate(dbObject("{'_id':'" + 
BSONPieces.simplePersonId + "'}"), anything());
+       
+               mdb.getCollection("test", "car")
+                       .addExpectation(new Expect("update", new Matcher[] { 
dbObject("{'_id':'" + BSONPieces.carId + "'}"),dbObject("{'$push' : 
{'__transactions':{'__deleted':true}}}"),anything(), anything(), anything() }, 
DummyResultFactory.ok(1), true, false))
+                       .addExpectation(new Expect("insert", new Matcher[] { 
dbObject("{'_id':'" + Long.toHexString(c2.getId()) + "'}"), notNullValue() }, 
DummyResultFactory.ok(1), true, false))
+                       ;
+               
+               db.commit();
+               
+               mdb.checkAll();
+               assertThat(mdb.getCollection("test", "car").getExpect().size(), 
equalTo(0));
+       }
+       
        // TODO test delete orphans
        
        // TODO test and implement exception cases

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java?rev=1124527&r1=1124526&r2=1124527&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java
 Thu May 19 03:43:21 2011
@@ -101,6 +101,10 @@ public class MongoTestCollection extends
                }
        }
        
+       public List<Expect> getExpect() {
+               return expect;
+       }
+       
        public MongoTestCollection(String dbname, String collname) {
                super(null);
                this.dbname = dbname;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to