/******************************************************************************* * Copyright (c) 2004, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.test.internal.performance.db; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import junit.framework.Assert; import org.eclipse.test.internal.performance.data.DataPoint; import org.eclipse.test.internal.performance.data.Dim; import org.eclipse.test.internal.performance.eval.StatisticsSession; /** * A Scenario contains a series of data points for a single scenario. * The axis of the data points can be specified when creating a scenario. * Typical examples are: * - datapoints corresponding to different builds * - datapoints corresponding to different OSes * - datapoints corresponding to different JVMs * @since 3.1 */ public class Scenario { private final static boolean DEBUG= false; public static class SharedState { private Variations fVariations; private String fSeriesKey; private Set fQueryDimensions; private String fScenarioPattern; private Map fMessages; SharedState(Variations variations, String scenarioPattern, String seriesKey, Dim[] dimensions) { fVariations= variations; fScenarioPattern= scenarioPattern; fSeriesKey= seriesKey; if (dimensions != null && dimensions.length > 0) { fQueryDimensions= new HashSet(); for (int i= 0; i < dimensions.length; i++) fQueryDimensions.add(dimensions[i]); } } String[] getFailures(String[] names, String scenarioId) { if (fMessages == null) { fMessages= new HashMap(); Variations v= (Variations) fVariations.clone(); for (int i= 0; i < names.length; i++) { v.put(fSeriesKey, names[i]); Map map= DB.queryFailure(fScenarioPattern, v); fMessages.put(names[i], map); } } String[] result= new String[names.length]; for (int i= 0; i < names.length; i++) { Map messages= (Map) fMessages.get(names[i]); if (messages != null) result[i]= (String) messages.get(scenarioId); } return result; } } private SharedState fSharedState; private String fScenarioName; private String[] fSeriesNames; private StatisticsSession[] fSessions; private Map fSeries= new HashMap(); private Dim[] fDimensions; /** * @param scenario * @param variations * @param seriesKey * @param dimensions * @deprecated */ public Scenario(String scenario, Variations variations, String seriesKey, Dim[] dimensions) { Assert.assertFalse(scenario.indexOf('%') >= 0); fScenarioName= scenario; fSharedState= new SharedState(variations, scenario, seriesKey, dimensions); } /** * @param scenario * @param sharedState */ public Scenario(String scenario, SharedState sharedState) { Assert.assertFalse(scenario.indexOf('%') >= 0); fScenarioName= scenario; fSharedState= sharedState; } public String getScenarioName() { return fScenarioName; } public Dim[] getDimensions() { loadSessions(); if (fDimensions == null) return new Dim[0]; return fDimensions; } public String[] getTimeSeriesLabels() { loadSeriesNames(); if (fSeriesNames == null) return new String[0]; return fSeriesNames; } public String[] getFailureMessages() { loadSeriesNames(); return fSharedState.getFailures(fSeriesNames, fScenarioName); } public TimeSeries getTimeSeries(Dim dim) { loadSessions(); TimeSeries ts= (TimeSeries) fSeries.get(dim); if (ts == null) { double[] ds= new double[fSessions.length]; double[] sd= new double[fSessions.length]; long[] sizes= new long[fSessions.length]; for (int i= 0; i < ds.length; i++) { ds[i]= fSessions[i].getAverage(dim); sd[i]= fSessions[i].getStddev(dim); sizes[i]= fSessions[i].getCount(dim); } ts= new TimeSeries(fSeriesNames, ds, sd, sizes); fSeries.put(dim, ts); } return ts; } public void dump(PrintStream ps, String key) { ps.println("Scenario: " + getScenarioName()); //$NON-NLS-1$ Report r= new Report(2); String[] timeSeriesLabels= getTimeSeriesLabels(); r.addCell(key + ":"); //$NON-NLS-1$ for (int j= 0; j < timeSeriesLabels.length; j++) r.addCellRight(timeSeriesLabels[j]); r.nextRow(); Dim[] dimensions= getDimensions(); for (int i= 0; i < dimensions.length; i++) { Dim dim= dimensions[i]; r.addCell(dim.getName() + ':'); TimeSeries ts= getTimeSeries(dim); int n= ts.getLength(); for (int j= 0; j < n; j++) { String stddev= ""; //$NON-NLS-1$ double stddev2= ts.getStddev(j); if (stddev2 != 0.0) stddev= " [" + dim.getDisplayValue(stddev2) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ r.addCellRight(dim.getDisplayValue(ts.getValue(j)) + stddev); } r.nextRow(); } r.print(ps); ps.println(); } //---- private private void loadSeriesNames() { if (fSeriesNames == null) { long start; if (DEBUG) start= System.currentTimeMillis(); fSeriesNames= DB.querySeriesValues(fScenarioName, fSharedState.fVariations, fSharedState.fSeriesKey); if (DEBUG) System.err.println("names: " + (System.currentTimeMillis()-start)); //$NON-NLS-1$ } } private void loadSessions() { if (fSessions != null) return; loadSeriesNames(); long start; Variations v= (Variations) fSharedState.fVariations.clone(); if (DEBUG) start= System.currentTimeMillis(); ArrayList sessions= new ArrayList(); ArrayList names2= new ArrayList(); Set dims= new HashSet(); for (int t= 0; t < fSeriesNames.length; t++) { v.put(fSharedState.fSeriesKey, fSeriesNames[t]); DataPoint[] dps= DB.queryDataPoints(v, fScenarioName, fSharedState.fQueryDimensions); if (DEBUG) System.err.println(" dps length: " + dps.length); //$NON-NLS-1$ if (dps.length > 0) { dims.addAll(dps[0].getDimensions2()); sessions.add(new StatisticsSession(dps)); names2.add(fSeriesNames[t]); } } if (DEBUG) System.err.println("data: " + (System.currentTimeMillis()-start)); //$NON-NLS-1$ fSessions= (StatisticsSession[]) sessions.toArray(new StatisticsSession[sessions.size()]); fSeriesNames= (String[]) names2.toArray(new String[sessions.size()]); fDimensions= (Dim[]) dims.toArray(new Dim[dims.size()]); Arrays.sort(fDimensions, new Comparator() { public int compare(Object o1, Object o2) { Dim d1= (Dim)o1; Dim d2= (Dim)o2; return d1.getName().compareTo(d2.getName()); } } ); } }