/*
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 java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.junit.BeforeClass;
import org.junit.Test;
import org.zoodb.test.testutil.TestTools;
/**
* TODO remove this test. It is identical to Test_075_QueryComplexHolder.
* @author Tilmann Zaeschke
*
*/
public class ComplexJdo { //extends JdoDriver implements Complex {
private Object _rootId;
//private long _checkSum;
private int nObjects;
private int nSelects;
private int depth;
private PersistenceManager pm;
@BeforeClass
public static void beforeClass() {
TestTools.removeDb();
TestTools.createDb();
TestTools.defineSchema(ComplexHolder0.class,
ComplexHolder1.class,
ComplexHolder2.class,
ComplexHolder3.class,
ComplexHolder4.class);
}
private void commit() {
pm.currentTransaction().commit();
}
private void begin() {
pm.currentTransaction().begin();
}
private PersistenceManager db() {
return pm;
}
private void store(Object pc) {
pm.makePersistent(pc);
}
private void delete(Object pc) {
pm.deletePersistent(pc);
}
public void addToCheckSum(CheckSummable checkSummable){
addToCheckSum(checkSummable.checkSum());
}
/**
* Collecting a checksum to make sure every team does a complete job
*/
private synchronized void addToCheckSum(long l){
//_checkSum += l;
}
private int objects() {
return nObjects;
}
private int selects() {
return nSelects;
}
private int depth() {
return depth;
}
private void open() {
pm = TestTools.openPM();
}
private void close() {
TestTools.closePM();
}
/**
* This failed with DataStreamCorrupted exception if makeDirty() was not called when setting
* attributes. In that case, the update() failed for most objects.
* It is unclear how this corrupted the database.
* -> Temporary fix: do not set objects clean in ClientSessionCache.postCommit().
*/
@Test
public void test() {
// # complex
// #
// # [objects]: number of objects to select from
// # [selects]: number of queries run against all objects
// complex.objects=1,2,3
// complex.depth=4,4,4
// complex.selects=50,50,50
//non-debug
// complex.objects=5,6,7
// complex.depth=6,6,6
// complex.selects=500,500,500
// run(1, 1, 4);
// run(1, 50, 4);
// run(2, 50, 4);
// run(3, 50, 4);
run(5, 500, 6);
run(6, 500, 6);
run(7, 500, 6);
}
private void run(int objects, int selects, int depth) {
nObjects = objects;
nSelects = selects;
this.depth = depth;
// System.out.println("write()");
open();
write();
close();
open();
// System.out.println("read()");
read();
close();
//
// open();
//// System.out.println("query()");
// query();
// close();
//
// open();
//// System.out.println("update()");
// update();
// close();
//
// open();
//// System.out.println("delete()");
// delete();
// close();
}
//@Override
public Object write() {
return write(false);
}
private Object write(boolean disjunctSpecial) {
begin();
ComplexHolder0 holder = ComplexHolder0.generate(depth(), objects(), disjunctSpecial);
addToCheckSum(holder);
store(holder);
_rootId = db().getObjectId(holder);
commit();
return _rootId;
}
//@Override
public void read() {
begin();
db().getFetchPlan().addGroup("array");
db().getFetchPlan().addGroup("children");
db().getFetchPlan().setMaxFetchDepth(-1);
ComplexHolder0 holder = read(_rootId);
addToCheckSum(holder);
db().getFetchPlan().clearGroups();
commit();
}
private ComplexHolder0 read(Object id) {
return (ComplexHolder0) db().getObjectById(id);
}
//@Override
public void query() {
begin();
int selectCount = selects();
int firstInt = objects() * objects() + objects();
int lastInt = firstInt + (objects() * objects() * objects()) - 1;
int currentInt = firstInt;
for (int run = 0; run < selectCount; run++) {
String filter = "this.i2 == param";
Query query = db().newQuery(db().getExtent(ComplexHolder2.class,true), filter);
query.declareParameters("int param");
Collection<?> result = (Collection<?>) query.execute(currentInt);
Iterator<?> it = result.iterator();
if(! it.hasNext()){
throw new IllegalStateException("no ComplexHolder2 found");
}
ComplexHolder2 holder = (ComplexHolder2) it.next();
if(it.hasNext()){
throw new IllegalStateException("more ComplexHolder2 found");
}
addToCheckSum(holder.ownCheckSum());
List<ComplexHolder0> children = holder.getChildren();
for (ComplexHolder0 child : children) {
addToCheckSum(child.ownCheckSum());
}
ComplexHolder0[] array = holder.getArray();
for (ComplexHolder0 arrayElement : array) {
addToCheckSum(arrayElement.ownCheckSum());
}
currentInt++;
if(currentInt > lastInt){
currentInt = firstInt;
}
}
commit();
}
//@Override
public void update() {
update(_rootId);
}
private void update(Object id) {
begin();
ComplexHolder0 holder = read(id);
holder.traverse(new NullVisitor<ComplexHolder0>(),
new Visitor<ComplexHolder0>() {
@Override
public void visit(ComplexHolder0 holder) {
addToCheckSum(holder.ownCheckSum());
holder.setName("updated");
List<ComplexHolder0> children = holder.getChildren();
ComplexHolder0[] array = new ComplexHolder0[children.size()];
for (int i = 0; i < array.length; i++) {
array[i] = children.get(i);
}
holder.setArray(array);
}
});
commit();
}
//@Override
public void delete() {
deleteById(_rootId);
}
private void deleteById(Object id) {
begin();
ComplexHolder0 holder = read(id);
holder.traverse(
new NullVisitor<ComplexHolder0>(),
new Visitor<ComplexHolder0>() {
@Override
public void visit(ComplexHolder0 holder) {
addToCheckSum(holder.ownCheckSum());
delete(holder);
}
});
commit();
}
}