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]