You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2011/05/18 14:46:06 UTC

svn commit: r1124229 [3/3] - in /labs/magma/trunk/database-mongodb: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/magma/ src/main/java/org/apache/magma/database/ src/main/java/org/apache/magma/da...

Added: 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=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionPartWritingTest.java Wed May 18 12:46:03 2011
@@ -0,0 +1,184 @@
+package org.apache.magma.database.mongo;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+import static org.apache.magma.database.mongo.test.utils.DBObjectMatcher.*;
+
+import org.apache.magma.database.mongo.test.domain.Address;
+import org.apache.magma.database.mongo.test.domain.Car;
+import org.apache.magma.database.mongo.test.domain.Person;
+import org.apache.magma.database.mongo.test.domain.Person.PersonType;
+import org.junit.Test;
+
+
+public class TransactionPartWritingTest extends MongoDbTestBase {
+
+	@Test
+	public void writeBasic() throws Exception {
+		Person p = new Person();
+		p.setName("Simone");
+		
+		db.save(p);
+
+		mdb.checkAll();
+		
+		mdb.getCollection("test", "person")
+			.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'name' :'Simone', '_jcl':'Person'}]}"));
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+			
+	
+		
+		db.commit();
+		mdb.checkAll();
+		
+	}
+	
+	// TODO test and implement exception cases
+	
+	@Test
+	public void writeUpdate() throws Exception {
+		
+		mdb.getCollection("test", "person")
+			.expectFindOne(dbObject("{'_id':'" + BSONPieces.simplePersonId + "'}"), cloneDbo(BSONPieces.simplePerson));
+		
+		Person p = db.load(Person.class, BSONPieces.simplePersonId);
+		
+		mdb.checkAll();
+		BSONPieces.assertSimplePersonLoaded(p);
+
+		
+		p.setName("Mario");
+		
+		db.save(p);
+
+		mdb.checkAll();
+		
+		mdb.getCollection("test", "person")
+			.expectUpdate(
+				dbObject("{'_id':'" + BSONPieces.simplePersonId + "', 'version' : 1}"),
+				dbObject("{'$push' : {'__transactions': {'__transactionId' : '" + tr.getId() + "', 'name' :'Mario'} }, '$set' : {'version': 2}}")
+			);
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+	
+		
+		db.commit();
+		mdb.checkAll();
+	}
+	
+	@Test
+	public void writeCascade() throws Exception {
+		
+		Person p = new Person();
+		p.setName("Simone");
+		
+		Car c = new Car();
+		p.setCar(c);
+
+		c.setName("Buggy");
+		
+
+		db.save(p);
+		mdb.checkAll();
+		
+		mdb.getCollection("test", "person")
+		.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'name' :'Simone', 'car' : '" + MongoUtils.getMongoId(c) + "', '_jcl':'Person'}]}"));
+
+		mdb.getCollection("test", "car")
+		.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'name' :'Buggy', '_jcl':'Car'}]}"));
+		
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "'], 'car' : ['" + Long.toHexString(c.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+
+		db.commit();
+		
+		mdb.checkAll();
+
+	}
+	
+	@Test
+	public void cascadeList() throws Exception {
+		Person p = new Person();
+		p.setName("Simone");
+		
+		Address a = new Address();
+		p.getAddresses().add(a);
+
+		a.setAddress("Via tiburtina 1238");
+				
+		db.save(p);
+		
+		mdb.getCollection("test", "person")
+		.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'name' :'Simone', 'addresses': [ '" + MongoUtils.getMongoId(a) + "' ], '_jcl':'Person'}]}"));
+
+		mdb.getCollection("test", "address")
+		.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'address' :'Via tiburtina 1238', '_jcl':'Address'}]}"));
+		
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "'], 'address' : ['" + Long.toHexString(a.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+
+		db.commit();
+		
+		mdb.checkAll();
+	}
+
+	@Test
+	public void writeBoolean() throws Exception {
+		Person p = new Person();
+		p.setBool(true);
+		
+		assertThat(p.isFromDb(), equalTo(false));
+		assertThat(p.isOnDb(), equalTo(false));
+		db.save(p);
+		assertThat(p.isFromDb(), equalTo(false));
+		assertThat(p.isOnDb(), equalTo(true));
+
+		mdb.checkAll();
+		
+		mdb.getCollection("test", "person")
+			.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'isBool' :true, '_jcl':'Person'}]}"));
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+			
+		db.commit();
+		mdb.checkAll();
+		
+	}
+	
+	@Test
+	public void writeEnum() throws Exception {
+		Person p = new Person();
+		p.setType(PersonType.FRIENDLY);
+		
+		db.save(p);
+
+		mdb.checkAll();
+		
+		mdb.getCollection("test", "person")
+			.expectInsert(dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'type' :'FRIENDLY', '_jcl':'Person'}]}"));
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+			
+		db.commit();
+		mdb.checkAll();
+		
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionSecondPhaseTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionSecondPhaseTest.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionSecondPhaseTest.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/TransactionSecondPhaseTest.java Wed May 18 12:46:03 2011
@@ -0,0 +1,195 @@
+package org.apache.magma.database.mongo;
+
+import static org.apache.magma.database.mongo.test.utils.DBObjectMatcher.dbObject;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.matchers.JUnitMatchers.*;
+import static org.junit.Assert.*;
+
+import org.apache.magma.database.mongo.TransactionSecondPhaseThread.Logger;
+import org.apache.magma.database.mongo.test.domain.Person;
+import org.apache.magma.database.mongo.test.utils.DBObjectMatcher;
+import org.apache.magma.database.mongo.test.utils.MongoTestCursor;
+import org.bson.BSONObject;
+import org.junit.Test;
+
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+import com.mongodb.util.JSON;
+
+
+public class TransactionSecondPhaseTest extends MongoDbTestBase {
+
+	
+	@Test
+	public void newEntity() throws Exception {
+		Person p = new Person();
+		p.setName("Simone");
+		
+		db.save(p);
+
+		mdb.checkAll();
+
+		DBObjectMatcher matchInsert = dbObject("{'version': 1, '__transactions': [{'__transactionId' : '" + tr.getId() + "', 'name' :'Simone', '_jcl':'Person'}]}");
+		mdb.getCollection("test", "person")
+			.expectInsert(matchInsert);
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R','entities' : {'person': ['" + Long.toHexString(p.getId()) + "'] } }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+			
+	
+		
+		db.commit();
+		mdb.checkAll();
+
+		DBObject personInsert = matchInsert.getObtained();
+		
+		TransactionSecondPhaseThread th = new TransactionSecondPhaseThread(mdb, "test");
+		
+		try {
+			
+		mdb.getCollection("test", "transactions")
+			.expectRemove(dbObject("{'cstate':'D'}"))
+			.expectFind(new MongoTestCursor((DBObject)JSON.parse(("{'_id' : '" + tr.getId() + "', 'state':'D', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }").replace('\'', '"'))))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'C'}}"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'D'}}"));
+		
+		mdb.getCollection("test", "person")
+			.expectFind(dbObject("{'_id': {'$in' : ['" + Long.toHexString(p.getId()) + "']}}"), personInsert)
+			.expectUpdate(
+					dbObject("{'_id':'" + Long.toHexString(p.getId()) + "', 'version' : 1}"),
+					dbObject("{'_id':'" + Long.toHexString(p.getId()) + "', 'version' : 2, 'name':'Simone','__transactions' : '_empty_'}")
+					);
+		
+		th.poll();
+		Logger pollres = th.getLogger();
+		assertThat("Got errors : " + pollres.errors, pollres.errors, nullValue());
+		assertThat("Got warnings : " + pollres.warnings, pollres.warnings, nullValue());
+		assertThat(pollres.done, equalTo(1));
+		assertThat(pollres.waiting, equalTo(0));
+		assertThat(pollres.entitiesDone, equalTo(1));
+		assertThat(pollres.entitiesSkip, equalTo(0));
+		
+		mdb.checkAll();
+		
+		} finally {
+			System.out.println(th.getLogger());
+		}
+	}
+	
+	@Test
+	public void updateEntity() throws Exception {
+		mdb.getCollection("test", "person")
+			.expectFindOne(dbObject("{'_id':'" + BSONPieces.simplePersonId + "'}"), cloneDbo(BSONPieces.simplePerson));
+		
+		Person p = db.load(Person.class, BSONPieces.simplePersonId);
+		
+		mdb.checkAll();
+		BSONPieces.assertSimplePersonLoaded(p);
+		p.setName("Mario");
+		p.setBirthday(null);
+		
+		db.save(p);
+	
+		mdb.checkAll();
+		
+		DBObjectMatcher matchUpd = dbObject("{'$push' : {'__transactions': {'__transactionId' : '" + tr.getId() + "', 'name' :'Mario', 'birthday':'__NULL__'} }, '$set' : {'version': 2}}");
+		
+		mdb.getCollection("test", "person")
+			.expectUpdate(
+				dbObject("{'_id':'" + BSONPieces.simplePersonId + "', 'version' : 1}"),
+				matchUpd
+			);
+	
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectInsert(dbObject("{'_id' : '" + tr.getId() + "', 'state':'R','entities' : {'person': ['" + Long.toHexString(p.getId()) + "']} }"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'state':'D'}}"));
+	
+		
+		db.commit();
+		mdb.checkAll();
+
+		DBObject personupd = matchUpd.getObtained();
+		
+		DBObject personbson = cloneDbo(p.checkGetBson());
+		personbson.putAll((BSONObject) personupd.get("$set"));
+		BasicDBList trlist = new BasicDBList();
+		trlist.add(((BSONObject)personupd.get("$push")).get("__transactions"));
+		personbson.put("__transactions", trlist);
+		
+		TransactionSecondPhaseThread th = new TransactionSecondPhaseThread(mdb, "test");
+		
+		mdb.getCollection("test", "transactions")
+			.expectRemove(dbObject("{'cstate':'D'}"))		
+			.expectFind(new MongoTestCursor((DBObject)JSON.parse(("{'_id' : '" + tr.getId() + "', 'state':'D', 'entities' : {'person' : ['" + Long.toHexString(p.getId()) + "']} }").replace('\'', '"'))))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'C'}}"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'D'}}"));
+		
+		mdb.getCollection("test", "person")
+			.expectFind(dbObject("{'_id': {'$in' : ['" + Long.toHexString(p.getId()) + "']}}"), personbson)
+			.expectUpdate(
+					dbObject("{'_id':'" + Long.toHexString(p.getId()) + "', 'version' : 2}"),
+					dbObject("{'_id':'" + Long.toHexString(p.getId()) + "', 'version' : 3, 'name':'Mario', 'birthday':'__NOTPRESENT__','__transactions' : '_empty_'}")
+					);
+		
+		th.poll();
+		Logger pollres = th.getLogger();		
+		assertThat("Got errors : " + pollres.errors, pollres.errors, nullValue());
+		assertThat("Got warnings : " + pollres.warnings, pollres.warnings, nullValue());
+		assertThat(pollres.done, equalTo(1));
+		assertThat(pollres.waiting, equalTo(0));
+		assertThat(pollres.entitiesDone, equalTo(1));
+		assertThat(pollres.entitiesSkip, equalTo(0));
+		
+		mdb.checkAll();
+	}
+	
+	// TODO check multiple entities
+	
+	@Test
+	public void deleteEntity() throws Exception {
+		BasicDBObject personInsert = new BasicDBObject();
+		personInsert.putAll(BSONPieces.simplePerson);
+		personInsert.putAll((BSONObject)JSON.parse(("{" +
+				"  '__transactions': [ {" +
+				"    '__transactionId': '" + tr.getId() + "'," +
+				"    '__deleted' : true" +
+				"   }]" +
+				"}").replace('\'', '"')));
+		
+		TransactionSecondPhaseThread th = new TransactionSecondPhaseThread(mdb, "test");
+		
+		mdb.getCollection("test", "transactions")
+			.clearExpectations()
+			.expectRemove(dbObject("{'cstate':'D'}"))			
+			.expectFind(new MongoTestCursor((DBObject)JSON.parse(("{'_id' : '" + tr.getId() + "', 'state':'D', 'entities' : {'person' : ['" + BSONPieces.simplePersonId + "']} }").replace('\'', '"'))))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'C'}}"))
+			.expectUpdate(dbObject("{'_id' : '" + tr.getId() + "'}"),dbObject("{'$set': {'cstate':'D'}}"));
+		
+		mdb.getCollection("test", "person")
+			.expectFind(dbObject("{'_id': {'$in' : ['" + BSONPieces.simplePersonId + "']}}"), personInsert)
+			.expectRemove(dbObject("{'_id':'" + BSONPieces.simplePersonId + "', 'version' : 1}"));
+		
+		th.poll();
+		Logger pollres = th.getLogger();		
+		assertThat("Got errors : " + pollres.errors, pollres.errors, nullValue());
+		assertThat("Got warnings : " + pollres.warnings, pollres.warnings, nullValue());
+		assertThat(pollres.done, equalTo(1));
+		assertThat(pollres.waiting, equalTo(0));
+		assertThat(pollres.entitiesDone, equalTo(1));
+		assertThat(pollres.entitiesSkip, equalTo(0));
+		
+		mdb.checkAll();
+	}
+	
+	// TODO check a failed transaction removal
+	
+	// TODO check one done transaction, one running and one failed
+	// first should apply, second should skip, third should be removed
+	
+	// TODO check the same in different order, what if the done one is the last one?
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Address.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Address.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Address.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Address.java Wed May 18 12:46:03 2011
@@ -0,0 +1,40 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+@Entity
+public class Address {
+
+	private String address;
+	private City city;
+	private List<Address> neighborhood = new ArrayList<Address>();
+	
+	public String getAddress() {
+		return address;
+	}
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+	@ManyToOne
+	public City getCity() {
+		return city;
+	}
+	public void setCity(City city) {
+		this.city = city;
+	}
+	
+	@OneToMany
+	public List<Address> getNeighborhood() {
+		return neighborhood;
+	}
+	public void setNeighborhood(List<Address> neighborhood) {
+		this.neighborhood = neighborhood;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Car.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Car.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Car.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Car.java Wed May 18 12:46:03 2011
@@ -0,0 +1,34 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+
+import org.apache.magma.database.LogicallyNamed;
+
+@Entity
+public class Car implements LogicallyNamed {
+
+	private String name;
+	private Person owner;
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@OneToOne(mappedBy="car")
+	public Person getOwner() {
+		return owner;
+	}
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}
+	
+	public String computeLogicalName() {
+		return this.getName();
+	}
+	
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/City.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/City.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/City.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/City.java Wed May 18 12:46:03 2011
@@ -0,0 +1,28 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Entity;
+
+@Entity
+public class City {
+
+	private String name;
+	private List<String> notes = new ArrayList<String>();
+	
+	
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public List<String> getNotes() {
+		return notes;
+	}
+	public void setNotes(List<String> notes) {
+		this.notes = notes;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ImportantPerson.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ImportantPerson.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ImportantPerson.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ImportantPerson.java Wed May 18 12:46:03 2011
@@ -0,0 +1,102 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.Entity;
+
+@Entity
+public class ImportantPerson extends Person {
+
+	private String importantBecause;
+	
+	private Map<String,Integer> scores;
+	private Map<Car,Long> garage;
+	private Map<Car,Person> drivers;
+	private Map<Date,City> travels;
+	private Map<String,Address> houses;
+	
+	public enum CCType {
+		AMEX,
+		VISA,
+		MASTERCARD
+	}
+	
+	private CCType mainCard;
+	private List<CCType> creditCards;
+	private Map<CCType,String> bonuses;
+
+	public void setImportantBecause(String importantBecause) {
+		this.importantBecause = importantBecause;
+	}
+
+	public String getImportantBecause() {
+		return importantBecause;
+	}
+
+	public Map<String, Integer> getScores() {
+		return scores;
+	}
+
+	public void setScores(Map<String, Integer> scores) {
+		this.scores = scores;
+	}
+
+	public Map<Car, Long> getGarage() {
+		return garage;
+	}
+
+	public void setGarage(Map<Car, Long> garage) {
+		this.garage = garage;
+	}
+
+	public Map<Car, Person> getDrivers() {
+		return drivers;
+	}
+
+	public void setDrivers(Map<Car, Person> drivers) {
+		this.drivers = drivers;
+	}
+
+	public Map<Date, City> getTravels() {
+		return travels;
+	}
+
+	public void setTravels(Map<Date, City> travels) {
+		this.travels = travels;
+	}
+
+	public Map<String, Address> getHouses() {
+		return houses;
+	}
+
+	public void setHouses(Map<String, Address> houses) {
+		this.houses = houses;
+	}
+
+	public CCType getMainCard() {
+		return mainCard;
+	}
+
+	public void setMainCard(CCType mainCard) {
+		this.mainCard = mainCard;
+	}
+
+	public List<CCType> getCreditCards() {
+		return creditCards;
+	}
+
+	public void setCreditCards(List<CCType> creditCards) {
+		this.creditCards = creditCards;
+	}
+
+	public Map<CCType, String> getBonuses() {
+		return bonuses;
+	}
+
+	public void setBonuses(Map<CCType, String> bonuses) {
+		this.bonuses = bonuses;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/NoDefaultId.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/NoDefaultId.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/NoDefaultId.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/NoDefaultId.java Wed May 18 12:46:03 2011
@@ -0,0 +1,24 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+// FIXME currently a mongo _id is not given to entities not implementing WithDefaultId, it should be done for those with @GeneratedValue
+@Entity
+public class NoDefaultId {
+
+	private long id;
+
+	@Id
+	@GeneratedValue
+	public long getId() {
+		return id;
+	}
+	public void setId(long id) {
+		this.id = id;
+	}
+	
+	
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Person.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Person.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Person.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Person.java Wed May 18 12:46:03 2011
@@ -0,0 +1,143 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Transient;
+
+import org.apache.magma.database.LogicallyNamed;
+
+@Entity
+public class Person implements LogicallyNamed {
+
+	private String name;
+	private Date birthday;
+	private double height;
+	private long qi;
+	private boolean bool;
+	
+	private String cachedData;
+
+	private Car car;
+	private Settings settings;
+	private Set<Person> friends = new HashSet<Person>();
+	private List<Address> addresses = new ArrayList<Address>();
+	private List<ToDo> todos = new ArrayList<ToDo>();
+	
+	public enum PersonType {
+		FRIENDLY,
+		HATEFUL
+	}
+	
+	private PersonType type;
+
+
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+
+
+	public Date getBirthday() {
+		return birthday;
+	}
+	public void setBirthday(Date birthday) {
+		this.birthday = birthday;
+	}
+
+
+	public double getHeight() {
+		return height;
+	}
+	public void setHeight(double height) {
+		this.height = height;
+	}
+
+
+	@Column(name="intelligence")
+	public long getQi() {
+		return qi;
+	}
+	public void setQi(long qi) {
+		this.qi = qi;
+	}
+
+
+	@Transient
+	public String getCachedData() {
+		return cachedData;
+	}
+	public void setCachedData(String cachedData) {
+		this.cachedData = cachedData;
+	}
+
+
+	@OneToMany(cascade=CascadeType.PERSIST)
+	public Set<Person> getFriends() {
+		return friends;
+	}
+	public void setFriends(Set<Person> friends) {
+		this.friends = friends;
+	}
+	
+	@OneToOne(cascade={CascadeType.PERSIST, CascadeType.REMOVE})
+	public Car getCar() {
+		return car;
+	}
+	public void setCar(Car car) {
+		this.car = car;
+	}
+	
+	@OneToMany
+	public List<Address> getAddresses() {
+		return addresses;
+	}
+	public void setAddresses(List<Address> addresses) {
+		this.addresses = addresses;
+	}
+	
+	@OneToOne
+	public Settings getSettings() {
+		return settings;
+	}
+	public void setSettings(Settings settings) {
+		this.settings = settings;
+	}
+	public String computeLogicalName() {
+		return this.getName();
+	}
+	
+	@OneToMany(cascade=CascadeType.ALL)
+	public List<ToDo> getTodos() {
+		return todos;
+	}
+	public void setTodos(List<ToDo> todos) {
+		this.todos = todos;
+	}
+	
+	@Column(name="isBool")
+	public boolean getBool() {
+		return bool;
+	}
+	public void setBool(boolean bool) {
+		this.bool = bool;
+	}
+	
+	public PersonType getType() {
+		return type;
+	}
+	public void setType(PersonType type) {
+		this.type = type;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Settings.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Settings.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Settings.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/Settings.java Wed May 18 12:46:03 2011
@@ -0,0 +1,24 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import javax.persistence.Entity;
+
+@Entity
+public class Settings {
+
+	private boolean likesCoffee;
+	private String greeting;
+	
+	public boolean isLikesCoffee() {
+		return likesCoffee;
+	}
+	public void setLikesCoffee(boolean likesCoffee) {
+		this.likesCoffee = likesCoffee;
+	}
+	public String getGreeting() {
+		return greeting;
+	}
+	public void setGreeting(String greeting) {
+		this.greeting = greeting;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ToDo.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ToDo.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ToDo.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/domain/ToDo.java Wed May 18 12:46:03 2011
@@ -0,0 +1,27 @@
+package org.apache.magma.database.mongo.test.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+@Entity
+public class ToDo {
+
+	private String text;
+	private Person owner;
+	
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+	}
+	
+	@ManyToOne
+	public Person getOwner() {
+		return owner;
+	}
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/DBObjectMatcher.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/DBObjectMatcher.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/DBObjectMatcher.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/DBObjectMatcher.java Wed May 18 12:46:03 2011
@@ -0,0 +1,159 @@
+package org.apache.magma.database.mongo.test.utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.AssertionFailedError;
+
+import org.bson.BSONObject;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
+
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+import com.mongodb.util.JSON;
+
+public class DBObjectMatcher extends BaseMatcher<DBObject> {
+
+	private DBObject model;
+	private DBObject obtained;
+	private String error = "";
+	
+	public DBObjectMatcher(DBObject model) {
+		this.model = model;
+	}
+
+	public boolean matches(Object item) {
+		if (item == null) {
+			throw new AssertionFailedError("Was expecting a DBObject got null");			
+		}
+		if (!(item instanceof DBObject)) {
+			throw new AssertionFailedError("Was expecting a DBObject got " + item.getClass().getName());
+		}
+		DBObject dbo = (DBObject) item;
+		this.obtained = new BasicDBObject();
+		this.obtained.putAll(dbo);
+		return recurseCheck(model, dbo);
+	}
+	
+	public DBObject getObtained() {
+		return obtained;
+	}
+	
+	private boolean report(String msg) {
+		this.error += msg + "\n";
+		return false;
+	}
+
+	private boolean recurseCheck(DBObject m, DBObject dbo) {
+		Set<String> ks = m.keySet();
+		for (String string : ks) {
+			Object v = m.get(string);
+			if (!dbo.containsField(string)) {
+				if (v.equals("__NOTPRESENT__")) continue;
+				return report(string + " is not present");
+			} 			
+			if (v != null && v.equals("__NOTPRESENT__")) 
+				return report(string + " is present while should not be there");
+
+			Object dbv = dbo.get(string);
+			if (dbv == null && v != null && !v.equals("__NULL__")) 
+				return report(string + " is null");
+			if ((v == null || v.equals("__NULL__")) && dbv != null) 
+				return report(string + " is not null");
+			if (v == null && dbv == null) continue;
+			if (dbv == null && v != null && v.equals("__NULL__")) continue;
+			if (v instanceof DBObject && !(v instanceof List)) {
+				if (!(dbv instanceof DBObject)) 
+					return report(string + " is not a db object");
+				if (!recurseCheck((DBObject)v, (DBObject)dbv)) { 
+					return report("document " + string + " does not match");
+				} else {
+					continue;
+				}
+			}
+			if (!checkEquals(v, dbv))
+				return report(string + " has different value");
+		}
+		return true;
+	}
+
+	private boolean checkEquals(Object v, Object dbv) {
+		if (v instanceof Number) {
+			// Normalize them if they are numbers
+			v = ((Number)v).doubleValue();
+			if (dbv instanceof Number) { 
+				dbv = ((Number)dbv).doubleValue();
+				return v.equals(dbv);
+			} else {
+				return report("not a number");
+			}
+		} else if (v instanceof String) {
+			if (v.equals("_empty_")) {
+				if (!(dbv instanceof Collection)) 
+					return report("not a collection");
+				if (((Collection)dbv).size() != 0) 
+					return report("not empty collection");
+				return true;
+			}
+			if (!(dbv instanceof String)) 
+				dbv = dbv.toString();
+			if (((String) v).startsWith("_regexp_")) {
+				v = ((String)v).substring(8);
+				if (!((String)dbv).matches((String)v)) {
+					return report("does not match regex");					
+				} else {
+					return true;
+				}
+			} else {
+				return v.equals(dbv);
+			}
+		} else if (v instanceof List) {
+			// Lists are evaluated, as fields, as valid if they contain at least the given elements
+			// Elements are evaluated as other BSONObjects
+			if (!(dbv instanceof Collection)) 
+				return report("not a collection");
+			for (Object vo : (List)v) {
+				boolean found = false;
+				for (Object dbvo : (Collection)dbv) {
+					if (vo instanceof BSONObject) {
+						if (!(dbvo instanceof BSONObject)) 
+							continue;
+						if (!recurseCheck((DBObject)vo, (DBObject)dbvo))
+							continue;
+					} else {
+						if (!checkEquals(vo, dbvo))
+							continue;
+					}
+					found = true;
+					break;
+				}
+				if (!found) 
+					return report("not found '" + vo + "'");
+			}
+			return true;
+		}
+		return v.equals(dbv);
+	}
+
+	public void describeTo(Description description) {
+		if (this.error.length() > 0) description.appendText(error);
+		description.appendValue(model);
+	}
+	
+	@Factory
+	public static DBObjectMatcher dbObject(DBObject model) {
+		return new DBObjectMatcher(model);
+	}
+	
+	@Factory
+	public static DBObjectMatcher dbObject(String model) {
+		model = model.replace('\'', '"');
+		return new DBObjectMatcher((DBObject) JSON.parse(model));
+	}
+
+}

Added: 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=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCollection.java Wed May 18 12:46:03 2011
@@ -0,0 +1,244 @@
+package org.apache.magma.database.mongo.test.utils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.AssertionFailedError;
+
+import org.apache.magma.database.mongo.MongoCollection;
+import org.apache.magma.database.mongo.MongoCursor;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.StringDescription;
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.*;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.DummyResultFactory;
+import com.mongodb.WriteConcern;
+import com.mongodb.WriteResult;
+
+public class MongoTestCollection extends MongoCollection {
+
+	private String dbname;
+	private String collname;
+	
+	public static class Expect {
+		public String methodName;
+		public Matcher[] args;
+		public Object retVal;
+		public boolean optional = false;
+		public boolean multiple = false;
+		public boolean happened = false;
+		
+		
+		public Expect(String methodName, Matcher[] args, Object retVal) {
+			this.methodName = methodName;
+			this.args = args;
+			this.retVal = retVal;
+		}
+		// XXX optional is currently not supported
+		public Expect(String methodName, Matcher[] args, Object retVal, boolean optional, boolean multiple) {
+			this(methodName, args, retVal);
+			this.multiple = multiple;
+			this.optional = optional;
+		}
+
+		public void checkArgs(Object... received) {
+			this.happened = true;
+			StringDescription sd = new StringDescription();
+			if (received.length > this.args.length) {
+				throw new AssertionFailedError("Expected call " + methodName + " with " + this.args.length + " params, got " + received.length + " params.");
+			}
+			for (int i = 0; i < this.args.length; i++) {
+				Object acval = null;
+				if (i < received.length) {
+					acval = received[i];
+				}
+				assertThat("Check parameter " + i + " of " + this, acval, this.args[i]);
+			}
+		}
+		
+		@Override
+		public String toString() {
+			String ret = "Call to " + methodName + " with params [";
+			for (Matcher<?> match : this.args) {
+				ret += StringDescription.toString(match);
+			}
+			ret += "]";
+			return ret;
+		}
+	}
+	
+	private List<Expect> expect = new ArrayList<Expect>();
+	
+	public MongoTestCollection clearExpectations() {
+		this.expect.clear();
+		return this;
+	}
+	
+	public MongoTestCollection addExpectation(Expect exp) {
+		this.expect.add(exp);
+		return this;
+	}
+	
+	public void check() {
+		if (this.expect.size() > 0) {
+			boolean haserror = false;
+			String err = "Unsatisfied expect on " + this.dbname + ":" + this.collname + " : \n";
+			for (Expect exp : this.expect) {
+				if (!exp.happened && !exp.optional) {
+					haserror = true;
+					err += exp.toString() + "\n";
+				}
+			}
+			if (haserror)
+				throw new AssertionFailedError(err);
+		}
+	}
+	
+	public MongoTestCollection(String dbname, String collname) {
+		super(null);
+		this.dbname = dbname;
+		this.collname = collname;
+	}
+
+	private <T> T checkExpect(String name, Object... params) {
+		boolean fail = this.expect.size() == 0;
+		Expect exp = null;
+		int i = 0;
+		while (!fail) {
+			// Get an expectation
+			exp = this.expect.get(i);
+			// Check the name
+			fail =  !(exp.methodName.equals(name));
+			// If the name is correct, check parameters
+			if (!fail) {
+				// Will throw exception is parameters are not correct
+				exp.checkArgs(params);
+			}
+			// If we get here, either everything is okay, or this call was not the one expected
+			// If the expectation was the right one, and is not multiple, remove it
+			if (!fail && !exp.multiple) { 
+				this.expect.remove(i);
+			}
+			// If it was the right one, break
+			if (!fail) break;
+			// Unless it was optional, break here
+			if (!exp.optional) {
+				break;
+			}
+			// If it was optional, then try the next one
+			i++;
+			// If we reached the end, we failed
+			if (i >= this.expect.size()) {
+				fail = true;
+			} else {
+				fail = false;
+			}
+		}
+		if (fail) {
+			throw new AssertionFailedError("Unexpected call in " + this.dbname + ":" + this.collname + " : " + name + " " + Arrays.toString(params));
+		}
+		return (T)exp.retVal;
+	}
+	
+	@Override
+	public DBObject findOne(DBObject query) {
+		return checkExpect("findOne", query);
+	}
+	public DBObject findOne(DBObject query, DBObject fields) {
+		return checkExpect("findOne", query, fields);		
+	}	
+	public MongoTestCollection expectFindOne(Matcher<? super DBObject> query, Matcher<? super DBObject> fields, DBObject ret) {
+		addExpectation(new Expect("findOne", new Matcher[]{query, fields}, ret));
+		return this;
+	}
+	public MongoTestCollection expectFindOne(Matcher<? super DBObject> query, DBObject ret) {
+		return expectFindOne(query, anything(), ret);
+	}	
+	@Override
+	public MongoCursor find(DBObject query) {
+		return checkExpect("find", query);
+	}
+	public MongoTestCollection expectFind(Matcher<? super DBObject> query, MongoTestCursor ret) {
+		addExpectation(new Expect("find", new Matcher[]{query}, ret));
+		return this;
+	}
+	public MongoTestCollection expectFind(Matcher<? super DBObject> query, DBObject... objects) {
+		return expectFind(query, new MongoTestCursor(objects));
+	}
+	
+	
+	@Override
+	public MongoCursor find() {
+		return checkExpect("find");
+	}
+	public MongoTestCollection expectFind(MongoTestCursor ret) {
+		addExpectation(new Expect("find", new Matcher[0], ret));
+		return this;
+	}
+	public MongoTestCollection expectFind(DBObject... ret) {
+		return expectFind(new MongoTestCursor(ret));
+	}
+
+	@Override
+	public String getFullName() {
+		return this.dbname + "." + this.collname;
+	}
+
+	public String getName() {
+		return this.collname;
+	}
+	
+	
+	@Override
+	public WriteResult update(DBObject search, DBObject data, boolean upsert, boolean multi, WriteConcern writeConcern) {
+		return checkExpect("update", search, data, upsert, multi, writeConcern);
+	}
+	
+	public MongoTestCollection expectUpdate(Matcher<? super DBObject> search, Matcher<? super DBObject> data, Matcher<? super WriteConcern> concern, WriteResult ret) {
+		addExpectation(new Expect("update", new Matcher[] {search, data, anything(), anything(), concern}, ret));
+		return this;
+	}
+	public MongoTestCollection expectUpdate(Matcher<? super DBObject> search, Matcher<? super DBObject> data) {
+		return expectUpdate(search, data, anything(), DummyResultFactory.ok(1));
+	}
+	public MongoTestCollection expectUpdate(Matcher<? super DBObject> data) {
+		return expectUpdate(anything(), data, anything(), DummyResultFactory.ok(1));
+	}
+
+	@Override
+	public WriteResult insert(DBObject data, WriteConcern writeConcern) {
+		return checkExpect("insert", data, writeConcern);
+	}
+	
+	public MongoTestCollection expectInsert(Matcher<? super DBObject> data, Matcher<? super WriteConcern> concern, WriteResult ret) {
+		addExpectation(new Expect("insert", new Matcher[] {data, concern}, ret));
+		return this;
+	}
+	public MongoTestCollection expectInsert(Matcher<? super DBObject> data) {
+		return expectInsert(data,notNullValue(), DummyResultFactory.ok(1));
+	}
+	
+	@Override
+	public WriteResult remove(BasicDBObject search, WriteConcern writeConcern) {
+		return checkExpect("remove", search, writeConcern);
+	}
+	
+	public MongoTestCollection expectRemove(Matcher<? super DBObject> search, Matcher<? super WriteConcern> concern, WriteResult ret) {
+		addExpectation(new Expect("remove", new Matcher[] {search, concern}, ret));
+		return this;
+	}
+	public MongoTestCollection expectRemove(Matcher<? super DBObject> search, WriteResult ret) {
+		return expectRemove(search, anything(), ret);		
+	}	
+	public MongoTestCollection expectRemove(Matcher<? super DBObject> search) {
+		return expectRemove(search, anything(), DummyResultFactory.ok(1));
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCursor.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCursor.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCursor.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestCursor.java Wed May 18 12:46:03 2011
@@ -0,0 +1,67 @@
+package org.apache.magma.database.mongo.test.utils;
+
+import junit.framework.AssertionFailedError;
+
+import org.apache.magma.database.mongo.MongoCursor;
+
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+
+public class MongoTestCursor extends MongoCursor {
+
+	private DBObject[] objects;
+	private int index = 0;
+	private int min = 0;
+	private int max = 0;
+	private boolean closed;
+
+	public MongoTestCursor(DBObject... objects) {
+		super(null);
+		this.objects = objects;
+		this.max = objects.length;
+	}
+
+	@Override
+	public boolean hasNext() {
+		if (closed) throw new AssertionFailedError("Called hasNext on a closed cursor");
+		return index < max && index < objects.length;
+	}
+
+	@Override
+	public DBObject next() {
+		if (closed) throw new AssertionFailedError("Called next on a closed cursor");
+		if (!hasNext()) throw new AssertionFailedError("Called next but all objects already sent");
+		return objects[index++];
+	}
+
+	@Override
+	public void close() {
+		this.closed = true;
+	}
+
+	@Override
+	public int count() {
+		return objects.length;
+	}
+
+	@Override
+	public void skip(int from) {
+		index = from;
+		min = from;
+	}
+
+	@Override
+	public void limit(int page) {
+		this.max = index + page;
+	}
+
+	@Override
+	public int size() {
+		return this.max - this.min;
+	}
+	
+	@Override
+	public void sort(DBObject sort) {
+	}
+	
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestDB.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestDB.java?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestDB.java (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/org/apache/magma/database/mongo/test/utils/MongoTestDB.java Wed May 18 12:46:03 2011
@@ -0,0 +1,38 @@
+package org.apache.magma.database.mongo.test.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.magma.database.mongo.MongoDB;
+
+public class MongoTestDB extends MongoDB {
+
+	public MongoTestDB() {
+		super(null);
+	}
+
+	private Map<String, MongoTestCollection> collections = new HashMap<String, MongoTestCollection>();
+	
+	@Override
+	public MongoTestCollection getCollection(String dbname, String collectionName) {
+		MongoTestCollection ret = collections.get(dbname + "__" + collectionName);
+		if (ret == null) {
+			ret = new MongoTestCollection(dbname, collectionName);
+			collections.put(dbname + "__" + collectionName, ret);
+		}
+		return ret;
+	}
+	
+	public void checkAll() {
+		for (MongoTestCollection coll : collections.values()) {
+			coll.check();
+		}
+	}
+	
+	public void clearAllExpectations() {
+		for (MongoTestCollection coll : collections.values()) {
+			coll.clearExpectations();
+		}		
+	}
+
+}

Added: labs/magma/trunk/database-mongodb/src/test/java/performanceTests/00_baseFunctions.js
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/performanceTests/00_baseFunctions.js?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/performanceTests/00_baseFunctions.js (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/performanceTests/00_baseFunctions.js Wed May 18 12:46:03 2011
@@ -0,0 +1,74 @@
+var idprefix = 'AD12312ASD123';
+var reqdelay = 0;
+var smallsInBig = 100;
+
+print("Deleting old objects");
+db.perfTest.remove();
+db.runCommand({fsync:1});
+
+function request() {
+	sleep(reqdelay);
+}
+
+function idSmall(i) {
+	return idprefix + 'S' + i;
+}
+
+function makeSmallObj(i) {
+	return {_id:idSmall(i), name: "Simone", surname:"Gianni", type:"Small"};
+}
+
+function idBig(i) {
+	return idprefix + 'B' + i;
+}
+
+function makeBigObj(i) {
+	var bigdoc = {_id:idSmall(i),name:"Test", type:"Big",_beans:[]};
+	for (var i = 0;i < smallsInBig; i++) {
+		bigdoc._beans.push(makeSmallObj(i));
+	}
+	return bigdoc;
+}
+
+var start;
+
+function starting() {
+	start = new Date();
+}
+
+function elapsed(minus) {
+	var acd = new Date();
+	var elaps = acd.getTime() - start.getTime();
+	elaps -= minus;
+	return elaps;
+}
+
+function timeReport(count, minusEach, fn) {
+	return timeReportFull(count, minusEach,fn)/count;
+}
+
+function timeReportFull(count, minusEach, fn) {
+	starting();
+	for (var i = 0; i < count; i++) {
+		fn(i);
+	}
+	db.runCommand({fsync:1});	
+	var elaps = elapsed(minusEach * count);
+	print( "Finished, took " + elaps + "ms, that is " + (elaps/count) + "ms each");	
+	return elaps;
+}
+
+print( "Calculating generation time for big objects");
+starting();
+var bigOver = timeReport(5000, 0, function() {
+	makeBigObj(100);
+});
+
+print( "Calculating generation time for small objects");
+starting();
+var smallOver = timeReport(5000, 0, function() {
+	makeSmallObj(100);
+});
+
+
+

Added: labs/magma/trunk/database-mongodb/src/test/java/performanceTests/01_bigVsSmallCreate.js
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/performanceTests/01_bigVsSmallCreate.js?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/performanceTests/01_bigVsSmallCreate.js (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/performanceTests/01_bigVsSmallCreate.js Wed May 18 12:46:03 2011
@@ -0,0 +1,28 @@
+
+/*
+
+This test compare performances in creating a single big document vs creating many small ones.
+
+*/
+(function() {
+	print("---------------------------------------------------------------");
+	print(" 01 - big documents vs small ones - creation");
+	print("---------------------------------------------------------------");
+	print( "Start of big document test, inserting 10000 big documents");
+	starting();
+	var bigs = timeReportFull(10000, bigOver, function(i) {
+		request();
+		db.perfTest.save(makeBigObj(i));
+	});
+	
+	print( "Start of big document test, inserting " + (10000 * smallsInBig) + " small documents");
+	starting();
+	var smalls = timeReportFull((10000 * smallsInBig), smallOver, function(i) {
+		request();
+		db.perfTest.save(makeSmallObj(i));
+	});
+	
+	print("Ratio : smalls takes " + (smalls/bigs) + " of the bigs time" );
+})();
+
+

Added: labs/magma/trunk/database-mongodb/src/test/java/performanceTests/02_bigVsSmallIdQuery.js
URL: http://svn.apache.org/viewvc/labs/magma/trunk/database-mongodb/src/test/java/performanceTests/02_bigVsSmallIdQuery.js?rev=1124229&view=auto
==============================================================================
--- labs/magma/trunk/database-mongodb/src/test/java/performanceTests/02_bigVsSmallIdQuery.js (added)
+++ labs/magma/trunk/database-mongodb/src/test/java/performanceTests/02_bigVsSmallIdQuery.js Wed May 18 12:46:03 2011
@@ -0,0 +1,50 @@
+(function() {
+	print("---------------------------------------------------------------");
+	print(" 02 - big documents vs small ones - id query");
+	print("---------------------------------------------------------------");
+	print( "Start of big document test, searching randomly 1000 documents");
+	starting();
+	var bigs = timeReportFull(1000, 0, function(i) {
+		var ri = Math.floor(Math.random() * 10000);
+		request();
+		db.perfTest.findOne({_id:idBig(ri)});
+	});
+	
+	print( "Start of small document test, searching randomly 1000 documents");
+	starting();
+	var smalls = timeReportFull(1000, 0, function(i) {
+		var ri = Math.floor(Math.random() * (10000 * smallsInBig));
+		request();
+		db.perfTest.findOne({_id:idSmall(ri)});
+	});
+	print("Ratio : smalls takes " + (smalls/bigs) + " of the bigs time" );
+	
+	function getRandomSmallIds(cnt) {
+		var ret = new Array();
+		for (var j = 0; j < cnt; j++) {
+			var ri = Math.floor(Math.random() * (10000 * smallsInBig));
+			ret.push(idSmall(ri));
+		}		
+		var dbo = {_id: { '$in' : ret}};
+		return dbo;
+	}
+	
+	print( "Determining overhead of random ids generation");
+	starting();	
+	var idsovr = timeReport(5000,0,function(i) {
+		getRandomSmallIds(10);
+	});
+	
+	print( "Start of multiple small documents test, searching 1000 blocks of 10 small documents");
+	starting();
+	var smalls = timeReportFull(1000, idsovr, function(i) {
+		request();
+		var q = getRandomSmallIds(10);
+		request();
+		var res = db.perfTest.find(q);
+		while (res.hasNext()) {
+			res.next();
+		}
+	});
+	print("Ratio : smalls takes " + (smalls/bigs) + " of the bigs time" );
+})();
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org