Author: simoneg
Date: Wed May 25 15:42:44 2011
New Revision: 1127562

URL: http://svn.apache.org/viewvc?rev=1127562&view=rev
Log:
Better implementation of cascade and delete orphans

Modified:
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
    
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
    
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/BasicDirtyTest.java
    
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.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/domain/F1Team.java

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityFindMains.aj
 Wed May 25 15:42:44 2011
@@ -3,6 +3,7 @@ package org.apache.magma.database.mongo;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -14,38 +15,30 @@ import org.apache.magma.beans.BeanData;
 import org.apache.magma.beans.BeanHandler;
 import org.apache.magma.beans.PropertyInfo;
 
+import com.mongodb.util.IdentitySet;
+
 public aspect MongoEntityFindMains {
 
-       // JPA cascades
-       public Set<MongoEntity> MongoEntity.findMainEntities(CascadeType 
cascade) {
-               return findMainEntities(cascade, true);
+       public enum MainState {
+               CASCADED,
+               ORPHAN,
+               DELETEORPHAN
        }
        
-       public Set<MongoEntity> MongoEntity.findMainEntities(CascadeType 
cascade, boolean mainonly) {
-               Set<MongoEntity> ret = new HashSet<MongoEntity>();
-               Set<MongoEntity> stack = new HashSet<MongoEntity>();
-               if (cascade.equals(CascadeType.PERSIST)) {
-                       this.findMainEntities(cascade, ret, true, true, 
mainonly, stack);
-               } else if (cascade.equals(CascadeType.REMOVE)) {
-                       this.findMainEntities(cascade, ret, false, false, 
mainonly, stack);                     
-               } else if (cascade.equals(CascadeType.REFRESH)) {
-                       this.findMainEntities(cascade, ret, true, false, 
mainonly, stack);                      
-               }
+       public Map<MongoEntity,MainState> 
MongoEntity.findMainEntities(CascadeType cascade) {
+               Map<MongoEntity,MainState> ret = new 
IdentityHashMap<MongoEntity,MainState>();
+               Map<MongoEntity,String> stack = new 
IdentityHashMap<MongoEntity,String>();
+               this.findMainEntities(cascade, ret, MainState.CASCADED, stack);
                return ret;
        }
        
-       private void MongoEntity.findMainEntities(CascadeType cascade, 
Set<MongoEntity> set, boolean loadedOnly, boolean dirtyOnly, boolean mainOnly, 
Set<MongoEntity> stack) {
-               if (stack.contains(this)) return;
-               stack.add(this);
+       private void MongoEntity.findMainEntities(CascadeType cascade, 
Map<MongoEntity,MainState> set, MainState state, Map<MongoEntity,String> dones) 
{
+               if (dones.containsKey(this)) return;
+               dones.put(this,"a");
+               boolean loadedOnly = !cascade.equals(CascadeType.REMOVE);
                BeanData bd = this.beanData();
-               if ((mainOnly && !bd.isJpaSubEntity()) || !mainOnly) {
-                       if (dirtyOnly) {
-                               if (this.isDirty()) {
-                                       set.add(this);
-                               }
-                       } else {
-                               set.add(this);                  
-                       }
+               if (!bd.isJpaSubEntity()) {
+                       set.put(this,state);
                }
                BeanHandler bh = this.handler();
                List<PropertyInfo> rels = bd.getJpaRelationFields();
@@ -60,12 +53,15 @@ public aspect MongoEntityFindMains {
                                        continue;
                        }
                        if (this.isLoaded(pi.getName()) || !loadedOnly) {
+                               Set loadeds = new 
HashSet(this.getLoaded(pi.getName()));
                                if (pi.isCollection()) {
                                        Class<? extends MongoEntity> oth = 
pi.getCollectionClass();
                                        Collection c = (Collection) 
bh.getValue(pi.getName());
                                        for (Object val : c) {
-                                               if (val != null) 
((MongoEntity)val).findMainEntities(cascade, set, loadedOnly, dirtyOnly, 
mainOnly, stack);                                             
+                                               if (val != null) 
((MongoEntity)val).findMainEntities(cascade, set,state,dones);
+                                               loadeds.remove(val);
                                        }
+                                       
                                } else if (pi.isMap()) {
                                        Class mk = pi.getMapKeyClass();
                                        BeanData kbd = BeanData.getFor(mk);
@@ -77,18 +73,28 @@ public aspect MongoEntityFindMains {
                                                        Map.Entry entry = 
(Entry) entryobj;
                                                        if (kbd.isJpaClass()) {
                                                                Object obj = 
entry.getKey();
-                                                               if (obj != 
null) ((MongoEntity)obj).findMainEntities(cascade, set, loadedOnly, dirtyOnly, 
mainOnly, stack);
+                                                               if (obj != 
null) ((MongoEntity)obj).findMainEntities(cascade, set, state, dones);
+                                                               
loadeds.remove(obj);
                                                        }
                                                        if (vbd.isJpaClass()) {
                                                                Object obj = 
entry.getValue();
-                                                               if (obj != 
null) ((MongoEntity)obj).findMainEntities(cascade, set, loadedOnly, dirtyOnly, 
mainOnly, stack);                                                             
+                                                               if (obj != 
null) ((MongoEntity)obj).findMainEntities(cascade, set, state, dones);
+                                                               
loadeds.remove(obj);                                                            
                                                        }
                                                }
                                        }
                                } else {
                                        Class<? extends MongoEntity> oth = 
pi.getType();
                                        MongoEntity val = (MongoEntity) 
bh.getValue(pi.getName());
-                                       if (val != null) 
val.findMainEntities(cascade, set, loadedOnly, dirtyOnly, mainOnly, stack);
+                                       if (val != null) 
val.findMainEntities(cascade, set, state, dones);
+                                       loadeds.remove(val);                    
                
+                               }
+                               for (Object object : loadeds) {
+                                       if (pi.isJpaDeleteOrphans()) {
+                                               
((MongoEntity)object).findMainEntities(CascadeType.REMOVE, set, 
MainState.DELETEORPHAN, dones);
+                                       } else {
+                                               
((MongoEntity)object).findMainEntities(cascade, set, MainState.ORPHAN, dones);
+                                       }
                                }
                        }
                }

Modified: 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/main/java/org/apache/magma/database/mongo/MongoEntityLazyRelations.aj
 Wed May 25 15:42:44 2011
@@ -43,6 +43,8 @@ public aspect MongoEntityLazyRelations {
                
                if (collection instanceof ListeningCollectionWrapper) return 
collection;
                
+               if (!pi.isWriteable()) throw new MagmaException("Cannot replace 
a collection on {0}.{1} cause property is not writable", bean.getClass(), 
pi.getName());
+               
                Class<? extends Collection> collectionClass = pi.getType();
                if (collection == null) {
                        if (List.class.isAssignableFrom(collectionClass)) {
@@ -95,7 +97,7 @@ public aspect MongoEntityLazyRelations {
                BeanHandler bh = bean.handler();
                bh.setValue(pi.getName(), ret);
                bh.commit();                    
-
+               
                if (dynamic) {
                        bean.loaded(pi.getName(), collection);
                } else {

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=1127562&r1=1127561&r2=1127562&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
 Wed May 25 15:42:44 2011
@@ -6,6 +6,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -26,6 +27,7 @@ import org.apache.magma.beans.BeanHandle
 import org.apache.magma.beans.PropertyInfo;
 import org.apache.magma.database.Database;
 import org.apache.magma.database.InstallIdByDefault.WithDefaultId;
+import org.apache.magma.database.mongo.MongoEntityFindMains.MainState;
 import 
org.apache.magma.database.openjpa.InstallVersionByDefault.WithDefaultVersion;
 import org.bson.BSONObject;
 
@@ -45,6 +47,7 @@ public class Transaction {
        private WriteConcern writeConcern;
        private List<MongoCursor> cursors = new ArrayList<MongoCursor>();
        private Set<MongoEntity> confirmedSave = new HashSet<MongoEntity>();
+       private Set<MongoEntity> confirmedDelete = new HashSet<MongoEntity>();
        
        private boolean fastSecondPhase = true;
        
@@ -194,32 +197,34 @@ public class Transaction {
 
        public void save(MongoEntity mpbean) {
                mpbean.prepareForDb(this);
-               Set<MongoEntity> mains = 
mpbean.findMainEntities(CascadeType.PERSIST, false);
-               for (MongoEntity entity : mains) {
+               confirmedSave.add(mpbean);
+               Map<MongoEntity,MainState> mains = 
mpbean.findMainEntities(CascadeType.PERSIST);
+               for (MongoEntity entity : mains.keySet()) {
                        entity.prepareForDb(this);
                        entity.setOnDb(true);
                        addEntity(entity);
-                       confirmedSave.add(entity);
                        if (entity.isFromDb()) {
                                entity.fireJpaHandlers(PreUpdate.class);        
                        
                        } else {
                                entity.fireJpaHandlers(PrePersist.class);
                        }
                }               
+               
        }
 
 
        public void delete(MongoEntity mpbean) {
                mpbean.prepareForDb(this);
-               Set<MongoEntity> mains = 
mpbean.findMainEntities(CascadeType.REMOVE, false);
-               for (MongoEntity entity : mains) {
+               mpbean.dirtied();
+               confirmedDelete.add(mpbean);
+               Map<MongoEntity,MainState> mains = 
mpbean.findMainEntities(CascadeType.REMOVE);
+               for (MongoEntity entity : mains.keySet()) {
                        entity.prepareForDb(this);
                        entity.setOnDb(false);                  
                        TransactionPart entpart = addEntity(entity);
                        entpart.deleted();
-                       confirmedSave.add(entity);
                        entity.fireJpaHandlers(PreRemove.class);                
                
-               }
+               }               
        }
 
 
@@ -344,53 +349,49 @@ 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>();
                
-               for (MongoEntity ent : this.confirmedSave) {
-                       if (!ent.isDirty()) continue;
+               Set<MongoEntity> tosave = new HashSet<MongoEntity>();
+               Set<MongoEntity> todelete = new HashSet<MongoEntity>();
+
+               for (MongoEntity ent : this.confirmedDelete) {
                        TransactionPart part = ent.getPart();
                        if (part == null) continue;
-                       reallySaving.add(ent);
+                       Map<MongoEntity,MainState> mains = 
ent.findMainEntities(CascadeType.REMOVE);
+                       todelete.addAll(mains.keySet());
                }
                
-               // TODO this should be acycle, what if a dirty loaded is inside 
another dirty loaded and so on?
-               // Add dirty loadeds of really saving entities and orphans to 
delete
-               Set<MongoEntity> discovereds = new HashSet<MongoEntity>();
-               for (MongoEntity ent : reallySaving) {
-                       Set<Map.Entry<String, Set<MongoEntity>>> loadeds = 
ent.getLoadedsEntry();
-                       for (Map.Entry<String, Set<MongoEntity>> loaded : 
loadeds) {
-                               Set<MongoEntity> oldents = loaded.getValue();
-                               if (oldents == null || oldents.size() == 0) 
continue;
-                               PropertyInfo loadedpi = 
ent.beanData().getProperty(loaded.getKey());
-                               if (loadedpi.isMongoPersisted()) {
-                                       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);
-                                       }
+               for (MongoEntity ent : this.confirmedSave) {
+                       TransactionPart part = ent.getPart();
+                       if (part == null) continue;
+                       Map<MongoEntity,MainState> mains = 
ent.findMainEntities(CascadeType.PERSIST);
+                       for (Map.Entry<MongoEntity, MainState> entry : 
mains.entrySet()) {
+                               if 
(entry.getValue().equals(MainState.DELETEORPHAN)) {
+                                       todelete.add(entry.getKey());
+                               } else {
+                                       todelete.remove(entry.getKey());
+                                       tosave.add(entry.getKey());
                                }
                        }
-               }       
-               reallySaving.addAll(discovereds);
-               orphans.removeAll(reallySaving);
-               
-               // 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);
+                       
+               }
+               
+               for (MongoEntity deleting : todelete) {
+                       deleting.getPart().deleted();
+                       deleting.dirtied();
+                       tosave.add(deleting);
+               }
+               
+               for (Iterator iterator = tosave.iterator(); 
iterator.hasNext();) {
+                       MongoEntity saving = (MongoEntity) iterator.next();
+                       if (saving.isFromDb() && !saving.isDirty())
+                               iterator.remove();
                }
-               // 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;
+               if (tosave.size() == 0) return;
                
                BasicDBObject entlist = new BasicDBObject();
                
-               for (MongoEntity ent : reallySaving) {
+               for (MongoEntity ent : tosave) {
                        MongoCollection coll = getCollection(ent.getClass());
                        String id = MongoUtils.getMongoId(ent);
                        
@@ -412,7 +413,7 @@ public class Transaction {
                this.checkResult(trcoll.insert(mydbo, writeConcern), true, 
null);
                
                try {
-                       for (MongoEntity ent : reallySaving) {
+                       for (MongoEntity ent : tosave) {
                                TransactionPart part = ent.getPart();
                                MongoCollection coll = 
getCollection(ent.getClass());
                                String id = MongoUtils.getMongoId(ent);
@@ -502,8 +503,9 @@ public class Transaction {
                        }
                }
                
-               this.confirmedSave.removeAll(reallySaving);
-               for (MongoEntity ent : reallySaving) {
+               this.confirmedSave.removeAll(tosave);
+               this.confirmedDelete.removeAll(todelete);
+               for (MongoEntity ent : tosave) {
                        ent.clearDirty();
                        if (ent.isFromDb()) {
                                ent.fireJpaHandlers(PostUpdate.class);

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/BasicDirtyTest.java
 Wed May 25 15:42:44 2011
@@ -5,10 +5,12 @@ import static org.hamcrest.CoreMatchers.
 import static org.junit.Assert.*;
 import static org.junit.matchers.JUnitMatchers.*;
 
+import java.util.Map;
 import java.util.Set;
 
 import javax.persistence.CascadeType;
 
+import org.apache.magma.database.mongo.MongoEntityFindMains.MainState;
 import org.apache.magma.database.mongo.test.domain.Address;
 import org.apache.magma.database.mongo.test.domain.Person;
 import org.apache.magma.database.mongo.test.domain.ToDo;
@@ -93,11 +95,11 @@ public class BasicDirtyTest extends Mong
                
                assertThat(p.isLoaded("addresses"), equalTo(true));
 
-               Set<MongoEntity> persist = 
p.findMainEntities(CascadeType.PERSIST);
+               Map<MongoEntity, MainState> persist = 
p.findMainEntities(CascadeType.PERSIST);
                
                assertThat(persist.size(), equalTo(2));
-               assertThat(persist.contains(p), equalTo(true));
-               assertThat(persist.contains(a), equalTo(true));
+               assertThat(persist.get(p), equalTo(MainState.CASCADED));
+               assertThat(persist.get(a), equalTo(MainState.CASCADED));
                
                assertThat(p.isFromDb(), equalTo(false));
                assertThat(p.isOnDb(), equalTo(false));
@@ -115,9 +117,9 @@ public class BasicDirtyTest extends Mong
                persist = p.findMainEntities(CascadeType.PERSIST);
 
                assertThat(persist.size(), equalTo(3));
-               assertThat(persist.contains(p), equalTo(true));
-               assertThat(persist.contains(a), equalTo(true));
-               assertThat(persist.contains(td), equalTo(true));
+               assertThat(persist.get(p), equalTo(MainState.CASCADED));
+               assertThat(persist.get(a), equalTo(MainState.CASCADED));
+               assertThat(persist.get(td), equalTo(MainState.CASCADED));
                
                assertThat(p.isFromDb(), equalTo(false));
                assertThat(p.isOnDb(), equalTo(false));
@@ -127,4 +129,5 @@ public class BasicDirtyTest extends Mong
                assertThat(td.isOnDb(), equalTo(false));
        }
        
+       
 }

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/ReadingTest.java
 Wed May 25 15:42:44 2011
@@ -217,5 +217,6 @@ public class ReadingTest extends MongoDb
        
        // TODO test lazy map loading
        
+       // TODO test for list order
        
 }

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=1127562&r1=1127561&r2=1127562&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
 Wed May 25 15:42:44 2011
@@ -11,6 +11,7 @@ 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.domain.Settings;
 import org.apache.magma.database.mongo.test.utils.MongoTestCollection.Expect;
 import org.hamcrest.Matcher;
 import org.junit.Test;
@@ -18,6 +19,7 @@ import org.junit.Test;
 import com.mongodb.BasicDBList;
 import com.mongodb.DBObject;
 import com.mongodb.DummyResultFactory;
+import com.mongodb.util.JSON;
 
 
 public class TransactionPartWritingTest extends MongoDbTestBase {
@@ -327,7 +329,149 @@ public class TransactionPartWritingTest 
                db.commit();
                
                mdb.checkAll();
-               assertThat(mdb.getCollection("test", "car").getExpect().size(), 
equalTo(0));
+               assertThat(mdb.getCollection("test", 
"car").getExpect().toString(), mdb.getCollection("test", 
"car").getExpect().size(), equalTo(0));
+       }
+       
+       
+       @Test
+       public void deleteOrphansCollection() throws Exception {
+               DBObject cloneDbo = 
cloneDbo((DBObject)JSON.parse("{\"_id\":\"123abcdef\",\"fans\":[\"" + 
BSONPieces.simplePersonId + "\",\"" + BSONPieces.complexPersonId +"\"]}"));
+               
+               mdb.getCollection("test", "f1team")
+                       .expectFindOne(dbObject("{'_id':'123abcdef'}"), 
cloneDbo);
+               
+               F1Team f1t = db.load(F1Team.class, "123abcdef");
+               assertThat(f1t.getId(), equalTo(Long.parseLong("123abcdef", 
16)));
+               
+               mdb.checkAll();
+
+               mdb.getCollection("test", "person")
+                       .expectFind(dbObject("{'_id':{'$in':['" + 
BSONPieces.simplePersonId+ "','" + BSONPieces.complexPersonId + "']}}"), 
cloneDbo(BSONPieces.simplePerson),cloneDbo(BSONPieces.complexPerson));
+       
+               List<Person> fans = f1t.getFans();
+
+               mdb.checkAll();
+               assertThat(fans.size(), equalTo(2));
+               
+               Person other = new Person();
+               other.setName("Other");
+               fans.add(other);
+               
+               assertThat(fans.size(), equalTo(3));
+               
+               Person rem = fans.remove(0);
+               Person keep = fans.get(0);
+               
+               assertThat(fans.size(), equalTo(2));
+               
+               db.save(f1t);
+               
+               mdb.getCollection("test", "f1team")
+                       .expectUpdate(dbObject("{'_id':'123abcdef'}"), 
dbObject("{'$push':{'__transactions':{'fans':['" + 
Long.toHexString(keep.getId()) + "','" + Long.toHexString(other.getId()) + 
"']}}}"));
+       
+               mdb.getCollection("test", "person")
+                       .addExpectation(new Expect("update", new Matcher[] { 
dbObject("{'_id':'" + Long.toHexString(rem.getId()) + "'}"),dbObject("{'$push' 
: {'__transactions':{'__deleted':true}}}"),anything(), anything(), anything() 
}, DummyResultFactory.ok(1), true, false))
+                       .addExpectation(new Expect("insert", new Matcher[] { 
dbObject("{'_id':'" + Long.toHexString(other.getId()) + "'}"), notNullValue() 
}, DummyResultFactory.ok(1), true, false));
+               
+               db.commit();
+               
+               mdb.checkAll();
+               assertThat(mdb.getCollection("test", 
"person").getExpect().toString(), mdb.getCollection("test", 
"person").getExpect().size(), equalTo(0));
+               
+       }
+       
+       @Test
+       public void dontDeleteNotOrphans() 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);
+
+               p.setName("Test");
+               
+               db.save(p);
+               
+               mdb.getCollection("test", "person")
+                       .expectUpdate(dbObject("{'_id':'" + 
BSONPieces.simplePersonId + "'}"), anything());
+       
+               db.commit();
+               
+               mdb.checkAll();
+       }
+       
+       @Test
+       public void dontDeleteDirtyNotOrphans() 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 + 
"'}"), cloneDbo(BSONPieces.car));
+               
+               Car car = p.getCar();
+               
+               mdb.checkAll();
+               BSONPieces.assertCarLoaded(car);
+
+               p.setName("Test");
+               car.setName("Test");
+               
+               db.save(p);
+               
+               mdb.getCollection("test", "person")
+                       .expectUpdate(dbObject("{'_id':'" + 
BSONPieces.simplePersonId + "'}"), anything());
+               mdb.getCollection("test", "car")
+                       .expectUpdate(dbObject("{'_id':'" + BSONPieces.carId + 
"'}"), anything());
+       
+               db.commit();
+               
+               mdb.checkAll();
+       }
+
+       @Test
+       public void dontDeleteUnloadedNotOrphans() 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);
+
+               p.setName("Test");
+               
+               db.save(p);
+               
+               mdb.getCollection("test", "person")
+                       .expectUpdate(dbObject("{'_id':'" + 
BSONPieces.simplePersonId + "'}"), anything());
+       
+               db.commit();
+               
+               mdb.checkAll();
        }
        
        // TODO test delete orphans

Modified: 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java?rev=1127562&r1=1127561&r2=1127562&view=diff
==============================================================================
--- 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
 (original)
+++ 
labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/F1Team.java
 Wed May 25 15:42:44 2011
@@ -1,15 +1,21 @@
 package org.apache.magma.database.mongo.test.domain;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.persistence.Entity;
+import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 
 import org.apache.magma.beans.MagmaBean;
+import org.apache.openjpa.persistence.ElementDependent;
 
 @Entity
 @MagmaBean
 public class F1Team {
 
        private Car car = new Car();
+       private List<Person> fans = new ArrayList<Person>();
        
        public F1Team() {}
        
@@ -28,6 +34,15 @@ public class F1Team {
        public Car hiddenGetCar() {
                return car;
        }
-       
+
+       @OneToMany
+       @ElementDependent
+       public List<Person> getFans() {
+               return fans;
+       }
+
+       public void setFans(List<Person> fans) {
+               this.fans = fans;
+       }
        
 }



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

Reply via email to