/**
* 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.reference;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.neo4j.bench.AggregatedResultHandler;
import org.neo4j.bench.ResultHandler;
import org.neo4j.bench.ResultParser;
import org.neo4j.bench.RunUtil;
import org.neo4j.helpers.Args;
public class ShowReference extends RunUtil
{
public static void main( String[] args ) throws Exception
{
Args arguments = new Args( args );
final List<OneResultData> dataset = new ArrayList<OneResultData>();
final WeightedPattern[] benchFilters = loadFilters( arguments );
final String timeFilter = arguments.get( KEY_TIMER_FILTER, null );
final OneResultData[] referenceData = new OneResultData[ 1 ];
final String[] referenceVersion = new String[ 1 ];
referenceVersion[ 0 ] = arguments.get( KEY_NEO_VERSION, null );
ResultHandler handler = new ResultHandler()
{
OneResultData currentData = null;
public void newResult( Map<String, String> header )
{
String version = header.get( KEY_NEO_VERSION );
if ( referenceVersion[ 0 ] == null )
{
referenceVersion[ 0 ] = version;
}
currentData = new OneResultData( header );
dataset.add( currentData );
if ( referenceVersion[ 0 ].equals( version ) )
{
referenceData[ 0 ] = currentData;
}
}
public void value( Map<String, String> header, double value,
int numberOfIterations, String benchCase, String timer )
{
if ( matches( benchFilters, benchCase ) &&
matches( timeFilter, timer ) )
{
currentData.values.put(
getNiceBenchCaseName( benchCase, timer, null ),
( int ) value );
}
}
public void endResult()
{
}
};
Map<String, Collection<String>> aggregations =
RunUtil.loadAggregations( arguments );
if ( aggregations != null )
{
handler = new AggregatedResultHandler( handler, aggregations );
}
File file = getResultsFile( arguments );
new ResultParser( handler ).parse( new FileReader( file ), arguments );
calculateResults( dataset, referenceData[ 0 ] );
}
private static void calculateResults( List<OneResultData> dataset,
OneResultData referenceData )
{
System.out.println( "Reference version " + referenceData.header.get(
RunUtil.KEY_NEO_VERSION ) );
for ( OneResultData data : dataset )
{
if ( data == referenceData )
{
continue;
}
System.out.println();
System.out.println( "" + data.header );
for ( Map.Entry<String, Integer> entry : data.values.entrySet() )
{
String key = entry.getKey();
int referenceValue = referenceData.values.get( key );
int dataValue = entry.getValue();
double percentage =
( double ) dataValue / ( double ) referenceValue;
percentage *= 100.0;
percentage = Math.round( percentage );
System.out.println( key + "\t\t" +
niceDeltaPercentage( percentage ) );
}
}
}
private static String niceDeltaPercentage( double percentage )
{
percentage -= 100;
StringBuilder result = new StringBuilder();
result.append( percentage >= 0 ? "+" : "" );
result.append( percentage );
result.append( "%" );
if ( percentage > 10 )
{
result.append( " AAAHHHH!" );
}
return result.toString();
}
private static class OneResultData
{
private Map<String, String> header;
private Map<String, Integer> values = new TreeMap<String, Integer>();
OneResultData( Map<String, String> header )
{
this.header = header;
}
}
}