Revision: 139
http://polepos.svn.sourceforge.net/polepos/?rev=139&view=rev
Author: carlrosenberger
Date: 2010-11-19 13:53:02 +0000 (Fri, 19 Nov 2010)
Log Message:
-----------
cr + frm: Work on nested lists for JDO and JDBC
Modified Paths:
--------------
trunk/polepos/settings/DebugCircuits.properties
trunk/polepos/settings/versant.properties
trunk/polepos/src/org/polepos/Settings.java
trunk/polepos/src/org/polepos/data/ListHolder.java
trunk/polepos/src/org/polepos/framework/Team.java
trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java
trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java
trunk/polepos/src/org/polepos/teams/jdo/JdoCar.java
trunk/polepos/src/org/polepos/teams/jdo/JdoTeam.java
trunk/polepos/src/org/polepos/teams/jdo/data/package.jdo
Added Paths:
-----------
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
Modified: trunk/polepos/settings/DebugCircuits.properties
===================================================================
--- trunk/polepos/settings/DebugCircuits.properties 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/settings/DebugCircuits.properties 2010-11-19 13:53:02 UTC (rev 139)
@@ -25,11 +25,12 @@
# [updates]: number of updates and deletes to be run
# [depth]: depth of the tree
nestedlists.reuse=1,2,3
-nestedlists.objects=10,10,30
+nestedlists.objects=10,20,30
nestedlists.updates=2,2,2
nestedlists.depth=2,2,2
+
# Settings for the database benchmark
# with short test runs for debugging only
# Results are not signifant
Modified: trunk/polepos/settings/versant.properties
===================================================================
--- trunk/polepos/settings/versant.properties 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/settings/versant.properties 2010-11-19 13:53:02 UTC (rev 139)
@@ -4,4 +4,4 @@
versant.allowPmfCloseWithPmHavingOpenTx=true
versant.logging.logEvents=0
versant.vdsSchemaEvolve=true
-versant.metadata.0=org/polepos/teams/jdo/data/package.jdo
+versant.metadata.0=org/polepos/teams/jdo/data/package.jdo
\ No newline at end of file
Modified: trunk/polepos/src/org/polepos/Settings.java
===================================================================
--- trunk/polepos/src/org/polepos/Settings.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/Settings.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -26,7 +26,7 @@
* 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 = false;
+ private 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-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/data/ListHolder.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -28,7 +28,7 @@
public static final String ROOT_NAME = "root";
- private static final IdGenerator _idGenerator = new IdGenerator();
+ private static IdGenerator _idGenerator;
private long _id;
@@ -36,15 +36,13 @@
private List<ListHolder> _list;
- private transient boolean _visited;
-
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;
}
-
public static ListHolder generate(List<ListHolder> flatList, int depth, int leafs, int reuse){
if(depth == 0){
return null;
@@ -70,39 +68,40 @@
}
return listHolder;
}
-
+
@Override
public long checkSum() {
- return _name.hashCode() * (_list == null ? 1 : _list.size());
+ 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(_list == null){
return;
}
Iterator<ListHolder> i = _list.iterator();
while(i.hasNext()){
ListHolder child = i.next();
-
- if(child._id > _id){
-
- // We might still get multiple visits of the same
- // child this way but that's fine, we are simulating
- // network access.
- child.accept(visitor);
- }
+ child.acceptInternal(visited, visitor);
}
}
-
public int update(int maxDepth, int depth, int updateCount, Procedure<Object> storeProcedure) {
if(depth > maxDepth){
return 0;
}
int updatedCount = 1;
if(depth > 0){
- _name = "updated " + _name;
+ _name = "updated " + name();
}
if(_list != null){
for (int i = 0; i < updateCount; i++) {
@@ -136,6 +135,32 @@
deleteProcedure.apply(this);
return deletedCount;
}
+
+ public String name() {
+ return _name;
+ }
+
+ public List<ListHolder> list() {
+ return _list;
+ }
+ public long id(){
+ return _id;
+ }
+
+ public void name(String name) {
+ this._name = name;
+ }
+ public void list(List<ListHolder> list) {
+ this._list = list;
+ }
+
+ public void id(long id){
+ this._id = id;
+ }
+
+
+
+
}
Modified: trunk/polepos/src/org/polepos/framework/Team.java
===================================================================
--- trunk/polepos/src/org/polepos/framework/Team.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/framework/Team.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -53,6 +53,9 @@
vec.add(drivers[i]);
}
}
+ if(vec.size() == 0){
+ System.err.println("No driver for " + circuit.name() + " found for team " + name() );
+ }
DriverBase[] result = new DriverBase[vec.size()];
vec.toArray(result);
return result;
Modified: trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/teams/db4o/NestedListsDb4o.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -32,8 +32,8 @@
@Override
public void create() throws Throwable {
- ListHolder root = ListHolder.generate(depth(), objectCount(), reuse());
- store(root);
+ store(ListHolder.generate(depth(), objectCount(), reuse()));
+ commit();
}
@Override
Modified: trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -59,6 +59,7 @@
public DriverBase[] drivers() {
return new DriverBase[]{
new FlatObjectJdbc(),
+ new NestedListsJdbc(),
new MelbourneJdbc(),
new SepangJdbc(),
new BahrainJdbc(),
Added: trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -0,0 +1,151 @@
+/*
+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.jdbc;
+
+import java.sql.*;
+import java.util.*;
+
+import org.polepos.circuits.nestedlists.*;
+import org.polepos.data.*;
+import org.polepos.framework.*;
+
+public class NestedListsJdbc extends JdbcDriver implements NestedLists {
+
+ private static final String LISTHOLDER_TABLE = "listholder";
+
+ private static final String LIST_TABLE = "list";
+
+ public static final int ID = 1;
+
+ public static final int NAME = 2;
+
+ public static final int ITEM = 2;
+
+ private int _rootId;
+
+
+ public void takeSeatIn(Car car, TurnSetup setup) throws CarMotorFailureException{
+
+ super.takeSeatIn(car, setup);
+ openConnection();
+
+ dropTable(LISTHOLDER_TABLE);
+ dropTable(LIST_TABLE);
+
+ createTable(LISTHOLDER_TABLE,
+ new String[]{ "id", "name"},
+ new Class[] {Integer.TYPE, String.class} );
+
+ createTable(LIST_TABLE,
+ new String[]{ "id", "item"},
+ new Class[] {Integer.TYPE, Integer.TYPE,} );
+
+ close();
+
+ }
+
+
+ @Override
+ public void create() throws Throwable {
+
+ final PreparedStatement listHolderStatement =
+ prepareStatement("insert into listholder (id, name) values (?,?)");
+
+ final PreparedStatement listStatement =
+ prepareStatement("insert into list (id, item) values (?,?)");
+
+ ListHolder root = ListHolder.generate(depth(), objectCount(), reuse());
+ _rootId = (int) root.id();
+
+ root.accept(new Visitor<ListHolder>() {
+ @Override
+ public void visit(ListHolder listHolder) {
+ try {
+ int listHolderId = (int) listHolder.id();
+ listHolderStatement.setInt(ID, listHolderId);
+ listHolderStatement.setString(NAME, listHolder.name());
+ listHolderStatement.addBatch();
+ List<ListHolder> list = listHolder.list();
+ if(list != null && ! list.isEmpty()){
+ for (ListHolder child : list) {
+ listStatement.setInt(ID, listHolderId);
+ listStatement.setInt(ITEM, (int) child.id());
+ listStatement.addBatch();
+ }
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ listStatement.executeBatch();
+ listHolderStatement.executeBatch();
+ commit();
+
+ }
+
+ @Override
+ public void read() throws Throwable {
+ PreparedStatement listHolderStatement = prepareStatement("select * from listholder where id = ?");
+ PreparedStatement listStatement = prepareStatement("select * from list where id = ?");
+ ListHolder root = recurseRead(listHolderStatement, listStatement, _rootId);
+ root.accept(new Visitor<ListHolder>(){
+ public void visit(ListHolder listHolder){
+ addToCheckSum(listHolder);
+ }
+ });
+ }
+
+
+ private ListHolder recurseRead(PreparedStatement listHolderStatement,
+ PreparedStatement listStatement, int id) throws SQLException {
+
+ listHolderStatement.setInt(ID, id);
+ ResultSet listHolderResultSet = listHolderStatement.executeQuery();
+ listHolderResultSet.next();
+ ListHolder listHolder = new ListHolder();
+ listHolder.id(id);
+ listHolder.name(listHolderResultSet.getString(NAME));
+ listStatement.setInt(ID, id);
+
+ ResultSet listResultSet = listStatement.executeQuery();
+ if(listResultSet.next()){
+ List <ListHolder> list = new ArrayList<ListHolder>();
+ listHolder.list(list);
+ do{
+ list.add(recurseRead(listHolderStatement, listStatement, listResultSet.getInt(ITEM)));
+ } while(listResultSet.next());
+ }
+ return listHolder;
+ }
+
+ @Override
+ public void update() throws Throwable {
+
+ }
+
+ @Override
+ public void delete() throws Throwable {
+
+ }
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/jdbc/NestedListsJdbc.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/polepos/src/org/polepos/teams/jdo/JdoCar.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/JdoCar.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/teams/jdo/JdoCar.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -76,6 +76,8 @@
properties.setProperty("versant.remoteAccess", "false");
// Turning this on can make the Concurrency tests crash.
+ // Versant reports this is fixed.
+ // TODO: Test again against the latest VOD release
properties.setProperty("versant.l2CacheEnabled", "false");
// Reduces RPC calls for VOD for optimistic read from 3 to 1
Modified: trunk/polepos/src/org/polepos/teams/jdo/JdoTeam.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/JdoTeam.java 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/teams/jdo/JdoTeam.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -94,6 +94,7 @@
public DriverBase[] drivers() {
return new DriverBase[]{
new FlatObjectJdo(),
+ new NestedListsJdo(),
new MelbourneJdo(),
new SepangJdo(),
new BahrainJdo(),
@@ -131,6 +132,8 @@
deleteAll(pm, JN1.class);
deleteAll(pm, JdoIndexedObject.class);
+
+ deleteAll(pm, ListHolder.class);
pm.close();
}
Added: trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -0,0 +1,86 @@
+/*
+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.jdo;
+
+import java.util.*;
+
+import javax.jdo.Query;
+
+import org.polepos.circuits.nestedlists.*;
+import org.polepos.framework.*;
+import org.polepos.teams.jdo.data.ListHolder;
+
+public class NestedListsJdo extends JdoDriver implements NestedLists {
+
+ @Override
+ public void create() throws Throwable {
+ begin();
+ store(ListHolder.generate(depth(), objectCount(), reuse()));
+ commit();
+ }
+
+ @Override
+ public void read() throws Throwable {
+ 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 + "'");
+ Collection<ListHolder> result = (Collection<ListHolder>)query.execute();
+ if(result.size() != 1){
+ throw new IllegalStateException();
+ }
+ Iterator<ListHolder> it = result.iterator();
+ return it.next();
+ }
+
+ @Override
+ public void update() throws Throwable {
+ begin();
+ ListHolder root = root();
+ addToCheckSum(root.update(depth(), 0, updateCount(), new Procedure<Object>() {
+ @Override
+ public void apply(Object obj) {
+ store(obj);
+ }
+ }));
+ commit();
+ }
+
+ @Override
+ public void delete() throws Throwable {
+ begin();
+ ListHolder root = root();
+ addToCheckSum(root.delete(depth(), 0, updateCount(), new Procedure<Object>() {
+ @Override
+ public void apply(Object obj) {
+ delete(obj);
+ }
+ }));
+ commit();
+ }
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/jdo/NestedListsJdo.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java 2010-11-19 13:53:02 UTC (rev 139)
@@ -0,0 +1,161 @@
+/*
+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.jdo.data;
+
+import java.util.*;
+
+import org.polepos.framework.*;
+
+public class ListHolder implements CheckSummable {
+
+ public static final String ROOT_NAME = "root";
+
+ private static IdGenerator _idGenerator;
+
+ private long _id;
+
+ private String _name;
+
+ 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;
+ }
+ 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;
+ 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<Object> storeProcedure) {
+ 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.update(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<Object> deleteProcedure) {
+ 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.delete(maxDepth, depth + 1, updateCount, deleteProcedure);
+ }
+ }
+ }
+ deleteProcedure.apply(this);
+ return deletedCount;
+ }
+
+ private void setId(long id) {
+ _id = id;
+ }
+
+
+ public long getId() {
+ return _id;
+ }
+
+
+ private void setList(List<ListHolder> list) {
+ _list = list;
+ }
+
+
+ private List<ListHolder> getList() {
+ return _list;
+ }
+
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/jdo/data/ListHolder.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/polepos/src/org/polepos/teams/jdo/data/package.jdo
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdo/data/package.jdo 2010-10-05 13:46:32 UTC (rev 138)
+++ trunk/polepos/src/org/polepos/teams/jdo/data/package.jdo 2010-11-19 13:53:02 UTC (rev 139)
@@ -37,6 +37,7 @@
<field name = "_int" indexed = "true"/>
<field name = "_string" indexed = "true"/>
</class>
+ <class name="ListHolder"/>
</package>
</jdo>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|