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