1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/******************************************************************************* 2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 2009 IBM Corporation and others. 3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * All rights reserved. This program and the accompanying materials 4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * are made available under the terms of the Eclipse Public License v1.0 5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * which accompanies this distribution, and is available at 6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * http://www.eclipse.org/legal/epl-v10.html 7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Contributors: 9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * IBM Corporation - initial API and implementation 10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *******************************************************************************/ 11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.test.internal.performance.results.db; 12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.DataInputStream; 14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.DataOutputStream; 15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.IOException; 16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.ArrayList; 17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.List; 18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.InternalDimensions; 19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.eclipse.test.internal.performance.results.utils.Util; 20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Class to handle results for an Eclipse performance test box 23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (called a <i>configuration</i>). 24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * It gives access to results for each build on which this configuration has been run. 26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see BuildResults 28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class ConfigResults extends AbstractResults { 30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults baseline, current; 31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll boolean baselined = false, valid = false; 32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double delta, error; 33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic ConfigResults(AbstractResults parent, int id) { 35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll super(parent, id); 36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.name = parent.getPerformance().sortedConfigNames[id]; 37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.printStream = parent.printStream; 38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* 41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Complete results with additional database information. 42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid completeResults(String[] builds) { 44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll /*if (this.baseline == null || this.current == null) */initialize(); 45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll ScenarioResults scenarioResults = (ScenarioResults) this.parent; 46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll DB_Results.queryScenarioSummaries(scenarioResults, this.name, builds); 47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the baseline build name used to compare results with. 51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The name of the baseline build 53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see #getBaselineBuildResults() 54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic String getBaselineBuildName() { 56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null) { 57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.baseline.getName(); 60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the most recent baseline build results. 64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The {@link BuildResults baseline build results}. 66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see BuildResults 67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic BuildResults getBaselineBuildResults() { 69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null) { 70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.baseline; 73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Return the baseline build results run just before the given build name. 77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param buildName The build name 79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The {@link BuildResults baseline results} preceding the given build name 80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * or <code>null</code> if none was found. 81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic BuildResults getBaselineBuildResults(String buildName) { 83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null) { 84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = this.children.size(); 87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildDate = Util.getBuildDate(buildName); 88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=size-1; i>=0; i--) { 89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildResults.isBaseline() && buildResults.getDate().compareTo(buildDate) < 0) { 91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return buildResults; 92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.baseline; 95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the most recent baseline build result value. 100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The value of the most recent baseline build results. 102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double getBaselineBuildValue() { 104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null) { 105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.baseline.getValue(); 108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the configuration description (currently the box name). 112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The configuration description (currently the box name). 114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic String getDescription() { 116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return getPerformance().sortedConfigDescriptions[this.id]; 117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Return the results for the given build name. 121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param buildName The build name 123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The {@link BuildResults results} for the given build name 124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * or <code>null</code> if none was found. 125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic BuildResults getBuildResults(String buildName) { 127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return (BuildResults) getResults(buildName); 128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the build results matching a given pattern. 132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param buildPattern The pattern of searched builds 134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The list of the builds which names match the given pattern. 135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * The list is ordered by build results date. 136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic List getBuilds(String buildPattern) { 138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll List builds = new ArrayList(); 139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildPattern == null || buildResults.match(buildPattern)) { 143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll builds.add(buildResults); 144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return builds; 147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the build results before a given build name. 151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param buildName Name of the last build (included) 153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The list of the builds which precedes the given build name. 154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic List getBuildsBefore(String buildName) { 156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildDate = Util.getBuildDate(buildName); 157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll List builds = new ArrayList(); 158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildName == null || buildResults.getDate().compareTo(buildDate) <= 0) { 162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll builds.add(buildResults); 163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return builds; 166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns a list of build results which names starts with one of the given prefixes. 170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param prefixes List of expected prefixes 172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return A list of builds which names start with one of the given patterns. 173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic List getBuildsMatchingPrefixes(List prefixes) { 175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll List builds = new ArrayList(); 176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int length = prefixes.size(); 178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll AbstractResults buildResults = (AbstractResults) this.children.get(i); 180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildName = buildResults.getName(); 181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int j=0; j<length; j++) { 182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildName.startsWith((String)prefixes.get(j))) { 183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll builds.add(buildResults); 184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return builds; 188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Get all results numbers for the max last builds. 192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param max The number of last builds to get numbers. 194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return An 2 dimensions array of doubles. At the first level of the array each slot 195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * represents one build. That means that the dimension of the array matches 196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * the given numbers as soon as there are enough builds in the database. 197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <p> 198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * The slots of the second level are the numbers values: 199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <ul> 200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #BUILD_VALUE_INDEX}: the build value in milliseconds</li> 201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #BASELINE_VALUE_INDEX}: the baseline value in milliseconds</li> 202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #DELTA_VALUE_INDEX}: the difference between the build value and its more recent baseline</li> 203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #DELTA_ERROR_INDEX}: the error made while computing the difference</li> 204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #BUILD_ERROR_INDEX}: the error made while measuring the build value</li> 205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link #BASELINE_ERROR_INDEX}: the error made while measuring the baseline value</li> 206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </ul> 207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll*/ 208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double[][] getLastNumbers(int max) { 209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Return null if no previous builds are expected 211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (max <= 0) return null; 212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Add numbers for each previous build 214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double[][] numbers = new double[Math.min(max, size)][]; 216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int n = 0; 217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=size-1; i>=0 && n<max; i--) { 218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (!buildResults.isBaseline()) { 220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll numbers[n] = getNumbers(buildResults, getBaselineBuildResults(buildResults.getName())); 221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll n++; 222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Return the numbers 226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return numbers; 227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns interesting numbers for the current configuration. 231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return Values in an array of double: 233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <ul> 234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#BUILD_VALUE_INDEX}: the build value in milliseconds</li> 235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#BASELINE_VALUE_INDEX}: the baseline value in milliseconds</li> 236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#DELTA_VALUE_INDEX}: the difference between the build value and its more recent baseline</li> 237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#DELTA_ERROR_INDEX}: the error made while computing the difference</li> 238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#BUILD_ERROR_INDEX}: the error made while measuring the build value</li> 239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>{@link AbstractResults#BASELINE_ERROR_INDEX}: the error made while measuring the baseline value</li> 240402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </ul> 241402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 242402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Molldouble[] getNumbers(BuildResults buildResults, BuildResults baselineResults) { 243402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (baselineResults == null) { 244402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return null; 245402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 246402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double[] values = new double[NUMBERS_LENGTH]; 247402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0 ;i<NUMBERS_LENGTH; i++) { 248402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[i] = Double.NaN; 249402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 250402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double buildValue = buildResults.getValue(); 251402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[BUILD_VALUE_INDEX] = buildValue; 252402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double baselineValue = baselineResults.getValue(); 253402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[BASELINE_VALUE_INDEX] = baselineValue; 254402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double buildDelta = (baselineValue - buildValue) / baselineValue; 255402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[DELTA_VALUE_INDEX] = buildDelta; 256402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (Double.isNaN(buildDelta)) { 257402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return values; 258402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 259402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll long baselineCount = baselineResults.getCount(); 260402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll long currentCount = buildResults.getCount(); 261402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (baselineCount > 1 && currentCount > 1) { 262402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double baselineError = baselineResults.getError(); 263402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double currentError = buildResults.getError(); 264402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[BASELINE_ERROR_INDEX] = baselineError; 265402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[BUILD_ERROR_INDEX] = currentError; 266402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[DELTA_ERROR_INDEX] = Double.isNaN(baselineError) 267402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll ? currentError / baselineValue 268402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll : Math.sqrt(baselineError*baselineError + currentError*currentError) / baselineValue; 269402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 270402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return values; 271402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 272402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 273402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 274402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Return the deviation value and its associated standard error for the default dimension 275402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * (currently {@link InternalDimensions#ELAPSED_PROCESS}). 276402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 277402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return an array of double. First number is the deviation itself and 278402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * the second is the standard error. 279402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 280402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double[] getCurrentBuildDeltaInfo() { 281402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null || this.current == null) { 282402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 283402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 284402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return new double[] { this.delta, this.error }; 285402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 286402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 287402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 288402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the error of the current build results 289402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 290402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return the error made during the current build measure 291402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 292402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double getCurrentBuildError() { 293402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.current == null) { 294402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 295402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 296402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.current.getError(); 297402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 298402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 299402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 300402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the current build name. 301402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 302402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The name of the current build 303402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see #getCurrentBuildResults() 304402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 305402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic String getCurrentBuildName() { 306402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.current == null) { 307402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 308402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 309402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.current.getName(); 310402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 311402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 312402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 313402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the current build results. 314402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <p> 315402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * This build is currently the last integration or nightly 316402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * build which has performance results in the database. 317402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * It may differ from the {@link PerformanceResults#getName()}. 318402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 319402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The current build results. 320402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see BuildResults 321402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 322402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic BuildResults getCurrentBuildResults() { 323402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.current == null) { 324402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 325402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 326402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.current; 327402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 328402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 329402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 330402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the current build result value. 331402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 332402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The value of the current build results. 333402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 334402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double getCurrentBuildValue() { 335402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.current == null) { 336402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 337402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 338402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.current.getValue(); 339402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 340402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 341402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 342402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the delta between current and baseline builds results. 343402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 344402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return the delta 345402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 346402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double getDelta() { 347402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null || this.current == null) { 348402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 349402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 350402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.delta; 351402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 352402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 353402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 354402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the standard error of the delta between current and baseline builds results. 355402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 356402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return the delta 357402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @see #getDelta() 358402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 359402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double getError() { 360402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null || this.current == null) { 361402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 362402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 363402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.error; 364402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 365402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 366402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 367402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Return the name of the machine associated with the current config. 368402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 369402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return The name of the machine. 370402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 371402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic String getLabel() { 372402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.parent.getPerformance().sortedConfigDescriptions[this.id]; 373402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 374402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 375402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 376402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Get all dimension builds default dimension statistics for all builds. 377402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 378402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return An array of double built as follows: 379402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <ul> 380402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>0: numbers of values</li> 381402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>1: mean of values</li> 382402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>2: standard deviation of these values</li> 383402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>3: coefficient of variation of these values</li> 384402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </ul> 385402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 386402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double[] getStatistics() { 387402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return getStatistics(Util.ALL_BUILD_PREFIXES, DB_Results.getDefaultDimension().getId()); 388402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 389402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 390402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 391402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Get all dimension builds default dimension statistics for a given list of build 392402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * prefixes. 393402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 394402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param prefixes List of prefixes to filter builds. If <code>null</code> 395402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * then all the builds are taken to compute statistics. 396402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return An array of double built as follows: 397402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <ul> 398402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>0: numbers of values</li> 399402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>1: mean of values</li> 400402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>2: standard deviation of these values</li> 401402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>3: coefficient of variation of these values</li> 402402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </ul> 403402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 404402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double[] getStatistics(List prefixes) { 405402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return getStatistics(prefixes, DB_Results.getDefaultDimension().getId()); 406402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 407402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 408402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 409402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Get all dimension builds statistics for a given list of build prefixes 410402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * and a given dimension. 411402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 412402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param prefixes List of prefixes to filter builds. If <code>null</code> 413402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * then all the builds are taken to compute statistics. 414402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param dim_id The id of the dimension on which the statistics must be computed 415402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return An array of double built as follows: 416402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <ul> 417402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>0: numbers of values</li> 418402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>1: mean of values</li> 419402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>2: standard deviation of these values</li> 420402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * <li>3: coefficient of variation of these values</li> 421402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * </ul> 422402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 423402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic double[] getStatistics(List prefixes, int dim_id) { 424402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 425402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int length = prefixes == null ? 0 : prefixes.size(); 426402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int count = 0; 427402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double mean=0, stddev=0, variation=0; 428402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double[] values = new double[size]; 429402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll count = 0; 430402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll mean = 0.0; 431402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 432402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 433402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildName = buildResults.getName(); 434402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (isBuildConcerned(buildResults)) { 435402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (prefixes == null) { 436402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double value = buildResults.getValue(dim_id); 437402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[count] = value; 438402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll mean += value; 439402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll count++; 440402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } else { 441402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int j=0; j<length; j++) { 442402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildName.startsWith((String)prefixes.get(j))) { 443402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double value = buildResults.getValue(dim_id); 444402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll values[count] = value; 445402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll mean += value; 446402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll count++; 447402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 448402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 449402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 450402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 451402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 452402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll mean /= count; 453402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<count; i++) { 454402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll stddev += Math.pow(values[i] - mean, 2); 455402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 456402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll stddev = Math.sqrt((stddev / (count - 1))); 457402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll variation = stddev / mean; 458402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return new double[] { count, mean, stddev, variation }; 459402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 460402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 461402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollprivate void initialize() { 462402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll reset(); 463402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Get performance results builds name 464402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll PerformanceResults perfResults = getPerformance(); 465402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String baselineBuildName = perfResults.getBaselineName(); 466402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String baselineBuildDate = baselineBuildName == null ? null : Util.getBuildDate(baselineBuildName); 467402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String currentBuildName = perfResults.name; 468402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String currentBuildDate = currentBuildName == null ? null : Util.getBuildDate(currentBuildName); 469402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 470402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Set baseline and current builds 471402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults lastBaseline = null; 472402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 473402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (size == 0) return; 474402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 475402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 476402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildResults.values != null) { 477402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.cleanValues(); 478402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 479402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildResults.isBaseline()) { 480402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (lastBaseline == null || baselineBuildDate == null || baselineBuildDate.compareTo(buildResults.getDate()) >= 0) { 481402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll lastBaseline = buildResults; 482402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 483402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (baselineBuildName != null && buildResults.getName().equals(baselineBuildName)) { 484402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.baseline = buildResults; 485402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.baselined = true; 486402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 487402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } else if (currentBuildName == null || currentBuildDate == null || (this.current == null && buildResults.getDate().compareTo(currentBuildDate) >= 0)) { 488402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.current = buildResults; 489402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.valid = true; 490402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 491402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 492402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null) { 493402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.baseline = (lastBaseline == null) ? (BuildResults) this.children.get(0) : lastBaseline; 494402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 495402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.current == null) { 496402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int idx = size() - 1; 497402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults previous = (BuildResults) this.children.get(idx--); 498402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll while (idx >= 0 && previous.isBaseline()) { 499402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll previous = (BuildResults) this.children.get(idx--); 500402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 501402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.current = previous; 502402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 503402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 504402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Set delta between current vs. baseline and the corresponding error 505402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int dim_id = DB_Results.getDefaultDimension().getId(); 506402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double baselineValue = this.baseline.getValue(); 507402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double currentValue = this.current.getValue(); 508402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.delta = (currentValue - baselineValue) / baselineValue; 509402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (Double.isNaN(this.delta)) { 510402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.error = Double.NaN; 511402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } else { 512402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll long baselineCount = this.baseline.getCount(dim_id); 513402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll long currentCount = this.current.getCount(dim_id); 514402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (baselineCount == 1 || currentCount == 1) { 515402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.error = Double.NaN; 516402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } else { 517402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double baselineError = this.baseline.getError(dim_id); 518402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll double currentError = this.current.getError(dim_id); 519402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.error = Double.isNaN(baselineError) 520402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll ? currentError / baselineValue 521402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll : Math.sqrt(baselineError*baselineError + currentError*currentError) / baselineValue; 522402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 523402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 524402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 525402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll // Set the failure on the current build if necessary 526402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int failure_threshold = getPerformance().failure_threshold; 527402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.delta >= (failure_threshold/100.0)) { 528402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll StringBuffer buffer = new StringBuffer("Performance criteria not met when compared to '"); //$NON-NLS-1$ 529402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(this.baseline.getName()); 530402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append("': "); //$NON-NLS-1$ 531402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(DB_Results.getDefaultDimension().getName()); 532402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append("= "); //$NON-NLS-1$ 533402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(Util.timeString((long)this.current.getValue())); 534402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(" is not within [0%, "); //$NON-NLS-1$ 535402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(100+failure_threshold); 536402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append("'%] of "); //$NON-NLS-1$ 537402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buffer.append(Util.timeString((long)this.baseline.getValue())); 538402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.current.setFailure(buffer.toString()); 539402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 540402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 541402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 542402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 543402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns whether the configuration has results for the performance 544402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * baseline build or not. 545402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 546402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return <code>true</code> if the configuration has results 547402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * for the performance baseline build, <code>false</code> otherwise. 548402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 549402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic boolean isBaselined() { 550402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null || this.current == null) { 551402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 552402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 553402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.baselined; 554402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 555402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 556402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollboolean isBuildConcerned(BuildResults buildResults) { 557402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildDate = buildResults.getDate(); 558402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String currentBuildDate = getCurrentBuildResults() == null ? null : getCurrentBuildResults().getDate(); 559402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String baselineBuildDate = getBaselineBuildResults() == null ? null : getBaselineBuildResults().getDate(); 560402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return ((currentBuildDate == null || buildDate.compareTo(currentBuildDate) <= 0) && 561402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll (baselineBuildDate == null || buildDate.compareTo(baselineBuildDate) <= 0)); 562402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 563402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 564402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns whether the configuration has results for the performance 565402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * current build or not. 566402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 567402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return <code>true</code> if the configuration has results 568402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * for the performance current build, <code>false</code> otherwise. 569402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 570402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic boolean isValid() { 571402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (this.baseline == null || this.current == null) { 572402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll initialize(); 573402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 574402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return this.valid; 575402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 576402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 577402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/** 578402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Returns the 'n' last nightly build names. 579402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * 580402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @param n Number of last nightly builds to return 581402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * @return Last n nightly build names preceding current. 582402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 583402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic List lastNightlyBuildNames(int n) { 584402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll List labels = new ArrayList(); 585402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=size()-2; i>=0; i--) { 586402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 587402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (isBuildConcerned(buildResults)) { 588402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String buildName = buildResults.getName(); 589402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildName.startsWith("N")) { //$NON-NLS-1$ 590402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll labels.add(buildName); 591402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (labels.size() >= n) { 592402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll break; 593402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 594402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 595402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 596402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 597402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll return labels; 598402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 599402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 600402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* 601402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Read all configuration builds results data from the given stream. 602402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 603402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid readData(DataInputStream stream) throws IOException { 604402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = stream.readInt(); 605402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 606402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = new BuildResults(this); 607402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.readData(stream); 608402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll String lastBuildName = getPerformance().lastBuildName; 609402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (lastBuildName == null || buildResults.getDate().compareTo(Util.getBuildDate(lastBuildName)) <= 0) { 610402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll addChild(buildResults, true); 611402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 612402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 613402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 614402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 615402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollprivate void reset() { 616402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.current = null; 617402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.baseline = null; 618402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.baselined = false; 619402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.valid = false; 620402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.delta = 0; 621402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll this.error = -1; 622402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 623402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 624402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* 625402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Set the configuration value from database information 626402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 627402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid setInfos(int build_id, int summaryKind, String comment) { 628402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) getResults(build_id); 629402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildResults == null) { 630402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults = new BuildResults(this, build_id); 631402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll addChild(buildResults, true); 632402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 633402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.summaryKind = summaryKind; 634402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.comment = comment; 635402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 636402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 637402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* 638402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Set the configuration value from database information 639402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 640402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid setValue(int build_id, int dim_id, int step, long value) { 641402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll// reset(); 642402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) getResults(build_id); 643402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll if (buildResults == null) { 644402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults = new BuildResults(this, build_id); 645402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll addChild(buildResults, true); 646402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 647402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.setValue(dim_id, step, value); 648402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 649402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 650402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/* 651402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Write all configuration builds results data into the given stream. 652402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */ 653402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollvoid write(DataOutputStream stream) throws IOException { 654402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll int size = size(); 655402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll stream.writeInt(this.id); 656402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll stream.writeInt(size); 657402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll for (int i=0; i<size; i++) { 658402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll BuildResults buildResults = (BuildResults) this.children.get(i); 659402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll buildResults.write(stream); 660402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll } 661402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 662402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll 663402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll} 664