/*
This file is part of the PolePosition database benchmark
http://www.polepos.org
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
package org.zoodb.test.jdo.pole;
import java.util.Collection;
import java.util.Iterator;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.zoodb.test.jdo.pole.ListHolder.Procedure;
import org.zoodb.test.testutil.TestTools;
public class NestedListsJdo {
// # nestedlists
// #
// # [objects]: number of objects to store as leafs
// # [reuse]: number of objects to reuse from the total objects
// # [depth]: depth of the tree
// nestedlists.objects=50,50,50
// nestedlists.reuse=30,15,1
// nestedlists.depth=4,4,4
private final int depth = 4;
private PersistenceManager pm;
@BeforeClass
public static void setUp() {
TestTools.createDb();
TestTools.defineSchema(ListHolder.class);
TestTools.defineIndex(ListHolder.class, "_id", false);
TestTools.defineIndex(ListHolder.class, "_name", false);
}
@After
public void afterTest() {
TestTools.closePM();
}
@AfterClass
public static void tearDown() {
TestTools.removeDb();
}
@Test
public void test() {
run(4, 50, 30);
run(4, 50, 15);
run(4, 50, 1);
}
private void run(int depth, int objects, int reuse) {
open();
create(depth, objects, reuse);
close();
open();
read();
close();
open();
update();//", false, true, false));
close();
open();
delete();//", false, true, false));
close();
System.out.println("Checksum = " + mCheckSum);
}
public void create(int depth, int objects, int reuse) {
begin();
store(ListHolder.generate(depth, objects, reuse));
commit();
}
private static int n = 0;
public void read() {
begin();
ListHolder root = root();
root.accept(new Visitor<ListHolder>(){
public void visit(ListHolder listHolder){
addToCheckSum(listHolder);
n++;
}
});
System.out.println("nR=" + n);
commit();
}
private ListHolder root() {
Query query = db().newQuery(ListHolder.class, "this._name == '" + ListHolder.ROOT_NAME + "'");
@SuppressWarnings("unchecked")
Collection<ListHolder> result = (Collection<ListHolder>)query.execute();
if(result.size() != 1){
throw new IllegalStateException();
}
Iterator<ListHolder> it = result.iterator();
return it.next();
}
public void update() {
begin();
ListHolder root = root();
addToCheckSum(root.update(depth, new Procedure<ListHolder>() {
@Override
public void apply(ListHolder obj) {
store(obj);
}
}));
commit();
}
public void delete() {
begin();
ListHolder root = root();
n = 0;
addToCheckSum(root.delete(depth, new Procedure<ListHolder>() {
@Override
public void apply(ListHolder listHolder) {
delete(listHolder);
n++;
}
}));
System.out.println("nD=" + n);
commit();
}
private PersistenceManager db(){
return pm;
}
private void begin(){
db().currentTransaction().begin();
}
private void commit(){
db().currentTransaction().commit();
}
private void store(Object obj){
db().makePersistent(obj);
}
private void delete(Object obj) {
db().deletePersistent(obj);
}
private void open(){
pm = TestTools.openPM();
}
private void close(){
TestTools.closePM();
pm = null;
}
private long mCheckSum;
/**
* Collecting a checksum to make sure every team does a complete job
*/
private void addToCheckSum(long l){
mCheckSum += l;
}
private void addToCheckSum(CheckSummable checkSummable){
addToCheckSum(checkSummable.checkSum());
}
}