/** * Copyright (c) 2002-2011 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.bench.cases; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Properties; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.PropertyContainer; import org.neo4j.graphdb.Transaction; /** * o Add many new properties (on many different containers) in one tx * o Remove those properties in another tx */ public abstract class AddRemovePropsCase extends PropertyBenchCase { public static final String SET_TIMER = "s"; public static final String REMOVE_TIMER = "r"; protected static final int PROPERTY_COUNT = 100; public AddRemovePropsCase( Properties iterationCountConfig, Object value ) { super( iterationCountConfig, value ); } public void run( GraphDatabaseService graphDb ) { timerOff( MAIN_TIMER ); PropertyContainer[] containers = null; Transaction tx = graphDb.beginTx(); try { containers = createContainers( graphDb, getNumberOfContainers() ); tx.success(); } finally { tx.finish(); } timerOn( MAIN_TIMER ); beginTransaction( SET_TIMER ); tx = graphDb.beginTx(); try { for ( PropertyContainer container : containers ) { for ( int i = 0; i < PROPERTY_COUNT; i++ ) { container.setProperty( "key" + i, getPropertyValue() ); } } tx.success(); } finally { finishTransaction( tx, SET_TIMER ); } Iterable<Integer> randomInts = generateRandomInts(); beginTransaction( REMOVE_TIMER ); tx = graphDb.beginTx(); try { for ( PropertyContainer container : containers ) { for ( int index : randomInts ) { container.removeProperty( "key" + index ); } } tx.success(); } finally { finishTransaction( tx, REMOVE_TIMER ); } } private int getNumberOfContainers() { return getNumberOfIterations() / PROPERTY_COUNT; } private Iterable<Integer> generateRandomInts() { List<Integer> list = new ArrayList<Integer>(); int max = getNumberOfContainers(); for ( int i = 0; i < max; i++ ) { list.add( i ); } Collections.shuffle( list ); return list; } protected abstract PropertyContainer[] createContainers( GraphDatabaseService graphDb, int count ); }