Revision: 142
http://polepos.svn.sourceforge.net/polepos/?rev=142&view=rev
Author: carlrosenberger
Date: 2010-11-22 12:03:56 +0000 (Mon, 22 Nov 2010)
Log Message:
-----------
cr + frm: New 3.6 Hibernate version. NestedListsHibernate now works.
Modified Paths:
--------------
trunk/polepos/.classpath
trunk/polepos/lib/hibernate/hibernate3.jar
trunk/polepos/settings/Circuits.properties
trunk/polepos/settings/DebugCircuits.properties
trunk/polepos/src/org/polepos/Settings.java
trunk/polepos/src/org/polepos/data/ListHolder.java
trunk/polepos/src/org/polepos/framework/DriverBase.java
trunk/polepos/src/org/polepos/framework/IdGenerator.java
trunk/polepos/src/org/polepos/teams/db4o/Db4oDriver.java
trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java
trunk/polepos/src/org/polepos/teams/hibernate/HibernateCar.java
trunk/polepos/src/org/polepos/teams/hibernate/HibernateDriver.java
trunk/polepos/src/org/polepos/teams/hibernate/HibernateTeam.java
trunk/polepos/src/org/polepos/teams/jdbc/JdbcDriver.java
trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java
trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java
trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java
Added Paths:
-----------
trunk/polepos/lib/hibernate/javassist-3.12.0.GA.jar
trunk/polepos/src/org/polepos/teams/hibernate/NestedListsHibernate.java
trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.hbm.xml
trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.java
Modified: trunk/polepos/.classpath
===================================================================
--- trunk/polepos/.classpath 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/.classpath 2010-11-22 12:03:56 UTC (rev 142)
@@ -44,6 +44,7 @@
<classpathentry kind="lib" path="lib/jdo/jdo-api-3.0.jar"/>
<classpathentry kind="lib" path="lib/datanucleus/datanucleus-connectionpool-2.0.3-SNAPSHOT.jar"/>
<classpathentry kind="lib" path="lib/db4o/db4o-8.0.174.15231-all-java5.jar"/>
+ <classpathentry kind="lib" path="lib/hibernate/javassist-3.12.0.GA.jar"/>
<classpathentry kind="var" path="JUNIT_HOME/junit.jar" sourcepath="/ECLIPSE_HOME/plugins/org.eclipse.jdt.source_3.1.0/src/org.junit_3.8.1/junitsrc.zip"/>
<classpathentry kind="lib" path="lib/graph/gnujaxp.jar"/>
<classpathentry kind="lib" path="lib/graph/itext-1.2.jar"/>
Modified: trunk/polepos/lib/hibernate/hibernate3.jar
===================================================================
(Binary files differ)
Added: trunk/polepos/lib/hibernate/javassist-3.12.0.GA.jar
===================================================================
(Binary files differ)
Property changes on: trunk/polepos/lib/hibernate/javassist-3.12.0.GA.jar
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Modified: trunk/polepos/settings/Circuits.properties
===================================================================
--- trunk/polepos/settings/Circuits.properties 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/settings/Circuits.properties 2010-11-22 12:03:56 UTC (rev 142)
@@ -21,13 +21,13 @@
# nestedlists
#
-# [reuse]: number of objects to reuse
# [objects]: number of objects to store as leafs
+# [reuse]: number of objects to reuse from the total objects
# [updates]: number of updates and deletes to be run
# [depth]: depth of the tree
-nestedlists.reuse=1,5,15
-nestedlists.objects=30,30,30
-nestedlists.updates=10,10,10
+nestedlists.objects=50,50,50
+nestedlists.reuse=10,20,40
+nestedlists.updates=20,20,20
nestedlists.depth=4,4,4
# Settings for all circuits in the database benchmark.
Modified: trunk/polepos/settings/DebugCircuits.properties
===================================================================
--- trunk/polepos/settings/DebugCircuits.properties 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/settings/DebugCircuits.properties 2010-11-22 12:03:56 UTC (rev 142)
@@ -25,12 +25,13 @@
# [updates]: number of updates and deletes to be run
# [depth]: depth of the tree
nestedlists.reuse=1,2,3
-nestedlists.objects=10,20,30
-nestedlists.updates=2,2,2
-nestedlists.depth=2,2,2
+nestedlists.objects=5,5,5
+nestedlists.updates=1,1,1
+nestedlists.depth=4,4,4
+
# Settings for the database benchmark
# with short test runs for debugging only
# Results are not signifant
Modified: trunk/polepos/src/org/polepos/Settings.java
===================================================================
--- trunk/polepos/src/org/polepos/Settings.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/Settings.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -22,11 +22,7 @@
public class Settings {
- /**
- * This variable is not final, to prevent inlining by the compiler,
- * so it get's printed to System.out when it is accessed.
- */
- private static boolean DEBUG = true;
+ public static boolean DEBUG = true;
public static final String CIRCUIT = DEBUG ? "settings/DebugCircuits.properties" : "settings/Circuits.properties" ;
Modified: trunk/polepos/src/org/polepos/data/ListHolder.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ListHolder.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/data/ListHolder.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -28,7 +28,7 @@
public static final String ROOT_NAME = "root";
- private static IdGenerator _idGenerator;
+ private static IdGenerator _idGenerator = new IdGenerator();
private long _id;
@@ -38,6 +38,7 @@
public static ListHolder generate(int depth, int leafs, int reuse){
_idGenerator = new IdGenerator();
+
ListHolder root = generate(new ArrayList<ListHolder>(), depth, leafs, reuse);
root._name = ROOT_NAME;
return root;
@@ -59,6 +60,9 @@
for (int i = leafs -1; i >= 0; i--) {
if(i < reuse){
int indexInList = (flatList.size() - i) / 2;
+ if(indexInList < 0){
+ indexInList = 0;
+ }
listHolder._list.add(flatList.get(indexInList) );
} else {
ListHolder child = generate(flatList, childDepth, leafs, reuse);
@@ -94,8 +98,17 @@
child.acceptInternal(visited, visitor);
}
}
+
+ public int update(int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return updateInternal(visited, maxDepth, depth, updateCount, storeProcedure);
+ }
- public int update(int maxDepth, int depth, int updateCount, Procedure<Object> storeProcedure) {
+ public int updateInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
if(depth > maxDepth){
return 0;
}
@@ -107,19 +120,24 @@
for (int i = 0; i < updateCount; i++) {
if(i < _list.size()){
ListHolder child = _list.get(i);
- updatedCount += child.update(maxDepth, depth + 1, updateCount, storeProcedure);
+ updatedCount += child.updateInternal(visited, maxDepth, depth + 1, updateCount, storeProcedure);
}
}
- if(_list.size() > 1){
- _list.remove(_list.size() - 1);
- }
}
storeProcedure.apply(this);
return updatedCount;
}
+
+ public int delete(int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return deleteInternal(visited, maxDepth, depth, updateCount, deleteProcedure);
+ }
-
- public int delete(int maxDepth, int depth, int updateCount, Procedure<Object> deleteProcedure) {
+ public int deleteInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
if(depth > maxDepth){
return 0;
}
@@ -128,7 +146,7 @@
for (int i = 0; i < updateCount; i++) {
if(i < _list.size()){
ListHolder child = _list.get(i);
- deletedCount += child.delete(maxDepth, depth + 1, updateCount, deleteProcedure);
+ deletedCount += child.deleteInternal(visited, maxDepth, depth + 1, updateCount, deleteProcedure);
}
}
}
@@ -180,4 +198,9 @@
return (int)_id;
}
+ @Override
+ public String toString() {
+ return "ListHolder " + _id;
+ }
+
}
Modified: trunk/polepos/src/org/polepos/framework/DriverBase.java
===================================================================
--- trunk/polepos/src/org/polepos/framework/DriverBase.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/framework/DriverBase.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -21,6 +21,8 @@
import java.lang.reflect.*;
+import org.polepos.*;
+
/**
* an implementation of a circuit for a team
*/
@@ -118,7 +120,9 @@
try {
method.invoke(DriverBase.this, (Object[]) null);
} catch (Exception e) {
- System.err.println("Exception on calling method " + method);
+ if(Settings.DEBUG){
+ throw new RuntimeException(e);
+ }
e.printStackTrace();
}
}
@@ -126,10 +130,11 @@
private Method prepareMethod(){
try{
return DriverBase.this.getClass().getDeclaredMethod(lap.name(), (Class[])null);
- } catch (SecurityException e) {
+ } catch (Exception e) {
+ if(Settings.DEBUG){
+ throw new RuntimeException(e);
+ }
e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
}
return null;
}
Modified: trunk/polepos/src/org/polepos/framework/IdGenerator.java
===================================================================
--- trunk/polepos/src/org/polepos/framework/IdGenerator.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/framework/IdGenerator.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -24,7 +24,7 @@
public class IdGenerator {
- private AtomicLong _atomicLong = new AtomicLong(0);
+ private AtomicLong _atomicLong = new AtomicLong(1);
public long nextId(){
return _atomicLong.getAndIncrement();
Modified: trunk/polepos/src/org/polepos/teams/db4o/Db4oDriver.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/db4o/Db4oDriver.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/db4o/Db4oDriver.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -83,6 +83,10 @@
// db4o always works in a transaction so a begin call
// is not needed.
}
+
+ protected void activate(Object obj, int depth) {
+ _container.activate(obj, depth);
+ }
protected void commit() {
_container.commit();
Modified: trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -39,6 +39,7 @@
@Override
public void read() throws Throwable {
ListHolder root = root();
+ activate(root, Integer.MAX_VALUE);
root.accept(new Visitor<ListHolder>(){
public void visit(ListHolder listHolder){
addToCheckSum(listHolder);
@@ -58,23 +59,27 @@
@Override
public void update() throws Throwable {
ListHolder root = root();
- addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<Object>() {
+ activate(root, Integer.MAX_VALUE);
+ addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<ListHolder>() {
@Override
- public void apply(Object obj) {
+ public void apply(ListHolder obj) {
store(obj);
}
}));
+ commit();
}
@Override
public void delete() throws Throwable {
ListHolder root = root();
- addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<Object>() {
+ activate(root, Integer.MAX_VALUE);
+ addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<ListHolder>() {
@Override
- public void apply(Object obj) {
+ public void apply(ListHolder obj) {
delete(obj);
}
}));
+ commit();
}
@Override
Modified: trunk/polepos/src/org/polepos/teams/hibernate/HibernateCar.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/HibernateCar.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/hibernate/HibernateCar.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -19,134 +19,101 @@
package org.polepos.teams.hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.Configuration;
+import org.hibernate.*;
+import org.hibernate.cfg.*;
import org.hibernate.classic.Session;
-import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.hbm2ddl.*;
import org.polepos.framework.*;
-import org.polepos.teams.jdbc.Jdbc;
+import org.polepos.teams.jdbc.*;
-/**
- *
- * @author Herkules
- */
-public class HibernateCar extends Car
-{
+public class HibernateCar extends Car {
- private SessionFactory mFactory;
+ private SessionFactory _sessionFactory;
- private final String mDBType;
+ private final String _dbType;
-
public HibernateCar(Team team, String dbType){
super(team);
- mDBType = dbType;
+ _dbType = dbType;
}
public String name(){
- return Jdbc.settings().getName(mDBType)+"-"+Jdbc.settings().getVersion(mDBType);
+ return Jdbc.settings().getName(_dbType)+"-"+Jdbc.settings().getVersion(_dbType);
}
public Session openSession() throws CarMotorFailureException{
- if ( mFactory == null) {
- mFactory = getSessionFactory();
+ if ( _sessionFactory == null) {
+ _sessionFactory = getSessionFactory();
}
- try {
- Session session = mFactory.openSession();
- if("hsqldb".equals(mDBType)){
- session.createSQLQuery("SET WRITE_DELAY 0").executeUpdate();
- }
- return session;
- } catch (HibernateException e) {
- e.printStackTrace();
- throw new CarMotorFailureException();
- }
+ Session session = _sessionFactory.openSession();
+ if("hsqldb".equals(_dbType)){
+ session.createSQLQuery("SET WRITE_DELAY 0").executeUpdate();
+ }
+ return session;
}
public void closeSession(Session session){
- try {
- session.close();
- } catch (HibernateException e) {
- e.printStackTrace();
- }
+ session.close();
}
-
- /**
- *
- */
private SessionFactory getSessionFactory()
{
- try
- {
- Configuration cfg = new Configuration();
- for (Class clazz : HibernateTeam.persistentClasses()) {
- cfg.addClass(clazz);
- }
-
- try{
- Class.forName( Jdbc.settings().getDriverClass( mDBType ) ).newInstance();
- } catch ( Exception ex ) {
- ex.printStackTrace();
- }
-
- String connectUrl = Jdbc.settings().getConnectUrl( mDBType );
- cfg.setProperty("hibernate.connection.url", connectUrl);
-
- String user = Jdbc.settings().getUsername( mDBType );
- if(user != null){
- cfg.setProperty("hibernate.connection.user", user);
- }
-
- String password = Jdbc.settings().getPassword( mDBType );
- if(password != null){
- cfg.setProperty("hibernate.connection.password", password);
- }
-
- String dialect = Jdbc.settings().getHibernateDialect( mDBType );
- if(dialect != null){
- cfg.setProperty("hibernate.dialect", dialect);
- }
-
- String jdbcDriverClass = Jdbc.settings().getDriverClass( mDBType );
- if(jdbcDriverClass != null){
- cfg.setProperty("hibernate.connection.driver_class", jdbcDriverClass);
- }
-
- cfg.setProperty("hibernate.query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
- cfg.setProperty("hibernate.connection.pool_size", "20");
- cfg.setProperty("hibernate.proxool.pool_alias", "pool1");
- cfg.setProperty("hibernate.jdbc.batch_size", "20");
- cfg.setProperty("hibernate.jdbc.fetch_size", "500");
- cfg.setProperty("hibernate.use_outer_join", "true");
- cfg.setProperty("hibernate.jdbc.batch_versioned_data", "true");
- cfg.setProperty("hibernate.jdbc.use_streams_for_binary", "true");
- cfg.setProperty("hibernate.max_fetch_depth", "1");
- cfg.setProperty("hibernate.cache.region_prefix", "hibernate.test");
- cfg.setProperty("hibernate.cache.use_query_cache", "true");
- cfg.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
-
- cfg.setProperty("hibernate.proxool.pool_alias", "pool1");
-
- cfg.setProperty("hibernate.connection.writedelay", "0");
-
- SessionFactory factory = cfg.buildSessionFactory();
- new SchemaExport(cfg).create(true, true);
- return factory;
+ Configuration cfg = new Configuration();
+ for (Class clazz : HibernateTeam.persistentClasses()) {
+ cfg.addClass(clazz);
+ }
+
+ try{
+ Class.forName( Jdbc.settings().getDriverClass( _dbType ) ).newInstance();
+ } catch ( Exception ex ) {
+ ex.printStackTrace();
}
- catch ( MappingException mex )
- {
- mex.printStackTrace();
+
+ String connectUrl = Jdbc.settings().getConnectUrl( _dbType );
+ cfg.setProperty("hibernate.connection.url", connectUrl);
+
+ String user = Jdbc.settings().getUsername( _dbType );
+ if(user != null){
+ cfg.setProperty("hibernate.connection.user", user);
}
- catch ( HibernateException hex )
- {
- hex.printStackTrace();
- }
- return null;
+
+ String password = Jdbc.settings().getPassword( _dbType );
+ if(password != null){
+ cfg.setProperty("hibernate.connection.password", password);
+ }
+
+ String dialect = Jdbc.settings().getHibernateDialect( _dbType );
+ if(dialect != null){
+ cfg.setProperty("hibernate.dialect", dialect);
+ }
+
+ String jdbcDriverClass = Jdbc.settings().getDriverClass( _dbType );
+ if(jdbcDriverClass != null){
+ cfg.setProperty("hibernate.connection.driver_class", jdbcDriverClass);
+ }
+
+ cfg.setProperty("hibernate.query.substitutions", "true 1, false 0, yes 'Y', no 'N'");
+ cfg.setProperty("hibernate.connection.pool_size", "20");
+ cfg.setProperty("hibernate.proxool.pool_alias", "pool1");
+ cfg.setProperty("hibernate.jdbc.batch_size", "20");
+ cfg.setProperty("hibernate.jdbc.fetch_size", "500");
+ cfg.setProperty("hibernate.use_outer_join", "true");
+ cfg.setProperty("hibernate.jdbc.batch_versioned_data", "true");
+ cfg.setProperty("hibernate.jdbc.use_streams_for_binary", "true");
+ cfg.setProperty("hibernate.max_fetch_depth", "1");
+ cfg.setProperty("hibernate.cache.region_prefix", "hibernate.test");
+ cfg.setProperty("hibernate.cache.use_query_cache", "true");
+ cfg.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
+
+ cfg.setProperty("hibernate.proxool.pool_alias", "pool1");
+
+ cfg.setProperty("hibernate.connection.writedelay", "0");
+
+ SessionFactory factory = cfg.buildSessionFactory();
+ new SchemaExport(cfg).create(true, true);
+ return factory;
}
}
Modified: trunk/polepos/src/org/polepos/teams/hibernate/HibernateDriver.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/HibernateDriver.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/hibernate/HibernateDriver.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -82,6 +82,18 @@
}
}
+ protected <T> T queryForSingle(String query) {
+ Iterator<T> it = db().iterate( query );
+ if(! it.hasNext()){
+ throw new RuntimeException("none found");
+ }
+ T res = it.next();
+ if(it.hasNext()){
+ throw new RuntimeException("more than one found");
+ }
+ return res;
+ }
+
protected Transaction begin() {
return db().beginTransaction();
}
Modified: trunk/polepos/src/org/polepos/teams/hibernate/HibernateTeam.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/HibernateTeam.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/hibernate/HibernateTeam.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -30,13 +30,13 @@
public class HibernateTeam extends Team {
- private final Car[] mCars;
+ private final Car[] _cars;
public HibernateTeam() {
String[] dbs = Jdbc.settings().getHibernateTypes();
- mCars = new Car[dbs.length];
+ _cars = new Car[dbs.length];
for (int i = 0; i < dbs.length; i++) {
- mCars[i] = new HibernateCar(this, dbs[i]);
+ _cars[i] = new HibernateCar(this, dbs[i]);
}
}
@@ -50,17 +50,18 @@
}
public String databaseFile() {
- // not supported yet
+ // not needed
return null;
}
public Car[] cars() {
- return mCars;
+ return _cars;
}
public DriverBase[] drivers() {
return new DriverBase[] {
new FlatObjectHibernate(),
+ new NestedListsHibernate(),
new MelbourneHibernate(),
new SepangHibernate(),
new BahrainHibernate(),
@@ -79,17 +80,17 @@
@Override
public void setUp() {
- for(int i = 0; i < mCars.length;i++){
+ for(int i = 0; i < _cars.length;i++){
Session session = null;
try {
- session = ((HibernateCar)mCars[i]).openSession();
+ session = ((HibernateCar)_cars[i]).openSession();
} catch (CarMotorFailureException e) {
e.printStackTrace();
}
for (Class clazz : persistentClasses()) {
deleteExtent(session, clazz);
}
- ((HibernateCar)mCars[i]).closeSession(session);
+ ((HibernateCar)_cars[i]).closeSession(session);
}
}
@@ -101,14 +102,15 @@
public static final Class[] persistentClasses() {
return new Class[] {
- HibernateIndexedObject.class,
- HibernatePilot.class,
- HibernateTree.class,
- HibernateIndexedPilot.class,
- HB0.class,
- HibernateLightObject.class,
- HibernateListHolder.class,
- HN1.class,
+ HibernateIndexedObject.class,
+ HibernatePilot.class,
+ HibernateTree.class,
+ HibernateIndexedPilot.class,
+ HB0.class,
+ HibernateLightObject.class,
+ HibernateListHolder.class,
+ HN1.class,
+ ListHolder.class,
};
}
Added: trunk/polepos/src/org/polepos/teams/hibernate/NestedListsHibernate.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/NestedListsHibernate.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/hibernate/NestedListsHibernate.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -0,0 +1,79 @@
+/*
+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.polepos.teams.hibernate;
+
+import org.hibernate.*;
+import org.polepos.circuits.nestedlists.*;
+import org.polepos.framework.*;
+import org.polepos.teams.hibernate.data.*;
+
+public class NestedListsHibernate extends HibernateDriver implements NestedLists {
+
+ private final String FROM = "from org.polepos.teams.hibernate.data.ListHolder";
+
+ @Override
+ public void create() throws Throwable {
+ Transaction tx = begin();
+ store(ListHolder.generate(depth(), objectCount(), reuse()));
+ tx.commit();
+ }
+
+ @Override
+ public void read() throws Throwable {
+ ListHolder root = root();
+ root.accept(new Visitor<ListHolder>(){
+ public void visit(ListHolder listHolder){
+ addToCheckSum(listHolder);
+ }
+ });
+ }
+
+ private ListHolder root() {
+ return (ListHolder) queryForSingle(FROM + " where name='root'");
+ }
+
+ @Override
+ public void update() throws Throwable {
+ Transaction tx = begin();
+ ListHolder root = root();
+ addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<ListHolder>() {
+ @Override
+ public void apply(ListHolder obj) {
+ store(obj);
+ }
+ }));
+ tx.commit();
+ }
+
+ @Override
+ public void delete() throws Throwable {
+ Transaction tx = begin();
+ ListHolder root = root();
+ addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<ListHolder>() {
+ @Override
+ public void apply(ListHolder listHolder) {
+ delete(listHolder);
+ }
+ }));
+ tx.commit();
+ }
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/hibernate/NestedListsHibernate.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.hbm.xml
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.hbm.xml (rev 0)
+++ trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.hbm.xml 2010-11-22 12:03:56 UTC (rev 142)
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.polepos.teams.hibernate.data">
+ <class name="ListHolder" table="tListHolder">
+ <id name="id" column="fid" type="long" />
+ <property name="name" column="fname" type="string" length="100" />
+ <list name="list" access="field" cascade="all">
+ <key column="parentId" />
+ <index column="elementIndex"/>
+ <many-to-many class="ListHolder"/>
+ </list>
+ </class>
+</hibernate-mapping>
Property changes on: trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.hbm.xml
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -0,0 +1,203 @@
+/*
+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.polepos.teams.hibernate.data;
+
+import java.util.*;
+
+import org.polepos.framework.*;
+
+public class ListHolder implements CheckSummable {
+
+ public static final String ROOT_NAME = "root";
+
+ private static IdGenerator _idGenerator = new IdGenerator();
+
+ private long id;
+
+ private String name;
+
+ private List<ListHolder> list;
+
+ public static ListHolder generate(int depth, int leafs, int reuse){
+ ListHolder root = generate(new ArrayList<ListHolder>(), depth, leafs, reuse);
+ root.name = ROOT_NAME;
+ return root;
+ }
+
+ private static ListHolder generate(List<ListHolder> flatList, int depth, int leafs, int reuse){
+ if(depth == 0){
+ return null;
+ }
+ ListHolder listHolder = new ListHolder();
+ listHolder.setId(_idGenerator.nextId());
+
+ flatList.add(listHolder);
+ if(depth == 1){
+ return listHolder;
+ }
+ listHolder.setList(new ArrayList<ListHolder>());
+ int childDepth = depth -1;
+ for (int i = leafs -1; i >= 0; i--) {
+ if(i < reuse){
+ int indexInList = (flatList.size() - i) / 2;
+ if(indexInList < 0){
+ indexInList = 0;
+ }
+ listHolder.getList().add(flatList.get(indexInList) );
+ } else {
+ ListHolder child = generate(flatList, childDepth, leafs, reuse);
+ child.name = "child:" + depth + ":" + i;
+ listHolder.getList().add(child);
+ }
+ }
+ return listHolder;
+ }
+
+ @Override
+ public long checkSum() {
+ return name.hashCode();
+ }
+
+ public void accept(Visitor<ListHolder> visitor) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ acceptInternal(visited, visitor);
+ }
+
+ private void acceptInternal(Set<ListHolder> visited, Visitor<ListHolder> visitor){
+ if(visited.contains(this)){
+ return;
+ }
+ visitor.visit(this);
+ visited.add(this);
+ if(getList() == null){
+ return;
+ }
+ Iterator<ListHolder> i = getList().iterator();
+ while(i.hasNext()){
+ ListHolder child = i.next();
+ child.acceptInternal(visited, visitor);
+ }
+ }
+
+ public int update(int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return updateInternal(visited, maxDepth, depth, updateCount, storeProcedure);
+ }
+
+
+ public int updateInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
+ if(depth > maxDepth){
+ return 0;
+ }
+ int updatedCount = 1;
+ if(depth > 0){
+ name = "updated " + name;
+ }
+ if(getList() != null){
+ for (int i = 0; i < updateCount; i++) {
+ if(i < getList().size()){
+ ListHolder child = getList().get(i);
+ updatedCount += child.updateInternal(visited, maxDepth, depth + 1, updateCount, storeProcedure);
+ }
+ }
+ }
+ storeProcedure.apply(this);
+ return updatedCount;
+ }
+
+ public int delete(int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return deleteInternal(visited, maxDepth, depth, updateCount, deleteProcedure);
+ }
+
+ public int deleteInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
+ if(depth > maxDepth){
+ return 0;
+ }
+ int deletedCount = 1;
+ if(getList() != null){
+ for (int i = 0; i < updateCount; i++) {
+ if(i < getList().size()){
+ ListHolder child = getList().get(i);
+ deletedCount += child.deleteInternal(visited, maxDepth, depth + 1, updateCount, deleteProcedure);
+ }
+ }
+ }
+ deleteProcedure.apply(this);
+ return deletedCount;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+
+ public void setList(List<ListHolder> list) {
+ this.list = list;
+ }
+
+
+ public List<ListHolder> getList() {
+ return list;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this == obj){
+ return true;
+ }
+ if(obj == null){
+ return false;
+ }
+ if(obj.getClass() != this.getClass()){
+ return false;
+ }
+ ListHolder other = (ListHolder) obj;
+ return id == other.id;
+ }
+
+ @Override
+ public int hashCode() {
+ return (int)id;
+ }
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/hibernate/data/ListHolder.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/polepos/src/org/polepos/teams/jdbc/JdbcDriver.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/JdbcDriver.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/jdbc/JdbcDriver.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -347,13 +347,13 @@
public void createIndex(String tablename, String colname) {
// The maximum length for index names is 18 for Derby.
-
String indexName = indexName(tablename, colname);
-
+ indexName = indexName.replace(',', '_');
String sql = "CREATE INDEX " + indexName + " ON "
+ tablename + " (" + colname + ")";
executeSQL(sql);
}
+
private String indexName(String tablename, String colname) {
return "X" + tablename + "_" + colname;
@@ -369,6 +369,4 @@
return stmt;
}
-
-
}
Modified: trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -39,6 +39,9 @@
public static final int ITEM = 2;
+ public static final int ELEMENT = 3;
+
+
private int _rootId;
@@ -55,10 +58,11 @@
new Class[] {Integer.TYPE, String.class} );
createTable(LIST_TABLE,
- new String[]{ "id", "item"},
- new Class[] {Integer.TYPE, Integer.TYPE,},
+ new String[]{ "id", "item", "element"},
+ new Class[] {Integer.TYPE, Integer.TYPE, Integer.TYPE},
null);
createIndex(LIST_TABLE, "id");
+ createIndex(LIST_TABLE, "id,element");
close();
@@ -72,7 +76,7 @@
prepareStatement("insert into listholder (id, name) values (?,?)");
final PreparedStatement listStatement =
- prepareStatement("insert into list (id, item) values (?,?)");
+ prepareStatement("insert into list (id, item, element) values (?,?,?)");
ListHolder root = ListHolder.generate(depth(), objectCount(), reuse());
_rootId = (int) root.id();
@@ -87,9 +91,11 @@
listHolderStatement.addBatch();
List<ListHolder> list = listHolder.list();
if(list != null && ! list.isEmpty()){
+ int position = 0;
for (ListHolder child : list) {
listStatement.setInt(ID, listHolderId);
listStatement.setInt(ITEM, (int) child.id());
+ listStatement.setInt(ELEMENT, position++);
listStatement.addBatch();
}
}
@@ -107,10 +113,7 @@
@Override
public void read() throws Throwable {
- PreparedStatement listHolderStatement = prepareStatement("select * from listholder where id = ?");
- PreparedStatement listStatement = prepareStatement("select * from list where id = ?");
- Set<ListHolder> found = new HashSet<ListHolder>();
- ListHolder root = recurseRead(listHolderStatement, listStatement, _rootId, found);
+ ListHolder root = root();
root.accept(new Visitor<ListHolder>(){
public void visit(ListHolder listHolder){
addToCheckSum(listHolder);
@@ -118,6 +121,13 @@
});
}
+ private ListHolder root() throws SQLException {
+ PreparedStatement listHolderStatement = prepareStatement("select * from listholder where id = ?");
+ PreparedStatement listStatement = prepareStatement("select * from list where id = ? order by element");
+ Set<ListHolder> found = new HashSet<ListHolder>();
+ ListHolder root = recurseRead(listHolderStatement, listStatement, _rootId, found);
+ return root;
+ }
private ListHolder recurseRead(PreparedStatement listHolderStatement,
PreparedStatement listStatement, int id, Set<ListHolder> found) throws SQLException {
@@ -147,11 +157,41 @@
@Override
public void update() throws Throwable {
-
+ ListHolder root = root();
+ final PreparedStatement statement = prepareStatement("update listholder set name = ? where id = ?");
+ addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<ListHolder>() {
+ @Override
+ public void apply(ListHolder obj) {
+ try {
+ statement.setString(1, obj.name());
+ statement.setInt(2, (int)obj.id());
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ }));
+ statement.executeBatch();
+ commit();
}
@Override
public void delete() throws Throwable {
+ ListHolder root = root();
+ final PreparedStatement statement = prepareStatement("delete from listholder where id = ?");
+ addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<ListHolder>() {
+ @Override
+ public void apply(ListHolder obj) {
+ try {
+ statement.setInt(1, (int)obj.id());
+ statement.addBatch();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ }));
+ statement.executeBatch();
+ commit();
}
Modified: trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -39,13 +39,14 @@
@Override
public void read() throws Throwable {
- root().accept(new Visitor<ListHolder>(){
+ ListHolder root = root();
+ root.accept(new Visitor<ListHolder>(){
public void visit(ListHolder listHolder){
addToCheckSum(listHolder);
}
});
}
-
+
private ListHolder root() {
beginRead();
Query query = db().newQuery(ListHolder.class, "this._name == '" + ListHolder.ROOT_NAME + "'");
@@ -61,9 +62,9 @@
public void update() throws Throwable {
begin();
ListHolder root = root();
- addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<Object>() {
+ addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<ListHolder>() {
@Override
- public void apply(Object obj) {
+ public void apply(ListHolder obj) {
store(obj);
}
}));
@@ -74,10 +75,10 @@
public void delete() throws Throwable {
begin();
ListHolder root = root();
- addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<Object>() {
+ addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<ListHolder>() {
@Override
- public void apply(Object obj) {
- delete(obj);
+ public void apply(ListHolder listHolder) {
+ delete(listHolder);
}
}));
commit();
Modified: trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java 2010-11-20 14:05:07 UTC (rev 141)
+++ trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java 2010-11-22 12:03:56 UTC (rev 142)
@@ -28,7 +28,7 @@
public static final String ROOT_NAME = "root";
- private static IdGenerator _idGenerator;
+ private static IdGenerator _idGenerator = new IdGenerator();
private long _id;
@@ -37,13 +37,11 @@
private List<ListHolder> _list;
public static ListHolder generate(int depth, int leafs, int reuse){
- _idGenerator = new IdGenerator();
ListHolder root = generate(new ArrayList<ListHolder>(), depth, leafs, reuse);
root._name = ROOT_NAME;
return root;
}
-
private static ListHolder generate(List<ListHolder> flatList, int depth, int leafs, int reuse){
if(depth == 0){
return null;
@@ -60,6 +58,9 @@
for (int i = leafs -1; i >= 0; i--) {
if(i < reuse){
int indexInList = (flatList.size() - i) / 2;
+ if(indexInList < 0){
+ indexInList = 0;
+ }
listHolder.getList().add(flatList.get(indexInList) );
} else {
ListHolder child = generate(flatList, childDepth, leafs, reuse);
@@ -95,9 +96,18 @@
child.acceptInternal(visited, visitor);
}
}
+
+ public int update(int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return updateInternal(visited, maxDepth, depth, updateCount, storeProcedure);
+ }
- public int update(int maxDepth, int depth, int updateCount, Procedure<Object> storeProcedure) {
+ public int updateInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> storeProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
if(depth > maxDepth){
return 0;
}
@@ -109,19 +119,24 @@
for (int i = 0; i < updateCount; i++) {
if(i < getList().size()){
ListHolder child = getList().get(i);
- updatedCount += child.update(maxDepth, depth + 1, updateCount, storeProcedure);
+ updatedCount += child.updateInternal(visited, maxDepth, depth + 1, updateCount, storeProcedure);
}
}
- if(getList().size() > 1){
- getList().remove(getList().size() - 1);
- }
}
storeProcedure.apply(this);
return updatedCount;
}
+ public int delete(int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ Set<ListHolder> visited = new HashSet<ListHolder>();
+ return deleteInternal(visited, maxDepth, depth, updateCount, deleteProcedure);
+ }
- public int delete(int maxDepth, int depth, int updateCount, Procedure<Object> deleteProcedure) {
+ public int deleteInternal(Set<ListHolder> visited, int maxDepth, int depth, int updateCount, Procedure<ListHolder> deleteProcedure) {
+ if(visited.contains(this)){
+ return 0;
+ }
+ visited.add(this);
if(depth > maxDepth){
return 0;
}
@@ -130,7 +145,7 @@
for (int i = 0; i < updateCount; i++) {
if(i < getList().size()){
ListHolder child = getList().get(i);
- deletedCount += child.delete(maxDepth, depth + 1, updateCount, deleteProcedure);
+ deletedCount += child.deleteInternal(visited, maxDepth, depth + 1, updateCount, deleteProcedure);
}
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|