blob: 7b63255d5e8801a3ced953a6a0332e3f286db6fe [file] [log] [blame]
Index: contrib/benchmark/conf/collector.alg
===================================================================
--- contrib/benchmark/conf/collector.alg (revision 0)
+++ contrib/benchmark/conf/collector.alg (revision 0)
@@ -0,0 +1,72 @@
+#/**
+# * Licensed to the Apache Software Foundation (ASF) under one or more
+# * contributor license agreements. See the NOTICE file distributed with
+# * this work for additional information regarding copyright ownership.
+# * The ASF licenses this file to You under the Apache License, Version 2.0
+# * (the "License"); you may not use this file except in compliance with
+# * the License. You may obtain a copy of the License at
+# *
+# * http://www.apache.org/licenses/LICENSE-2.0
+# *
+# * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# */
+# -------------------------------------------------------------------------------------
+# multi val params are iterated by NewRound's, added to reports, start with column name.
+
+# collector.class can be:
+# Fully Qualified Class Name of a Collector with a empty constructor
+# topDocOrdered - Creates a TopDocCollector that requires in order docs
+# topDocUnordered - Like above, but allows out of order
+collector.class=coll:topDocOrdered:topDocUnordered:topDocOrdered:topDocUnordered
+
+analyzer=org.apache.lucene.analysis.WhitespaceAnalyzer
+directory=FSDirectory
+#directory=RamDirectory
+
+doc.stored=true
+doc.tokenized=true
+doc.term.vector=false
+log.step=100000
+
+search.num.hits=1000
+
+content.source=org.apache.lucene.benchmark.byTask.feeds.LongToEnglishContentSource
+
+
+query.maker=org.apache.lucene.benchmark.byTask.feeds.LongToEnglishQueryMaker
+
+# task at this depth or less would print when they start
+task.max.depth.log=2
+
+log.queries=true
+# -------------------------------------------------------------------------------------
+
+{ "Rounds"
+
+ ResetSystemErase
+
+ { "Populate"
+ CreateIndex
+ { "MAddDocs" AddDoc } : 2000000
+ Optimize
+ CloseIndex
+ }
+
+ OpenReader
+ { "topDocs" SearchWithCollector > : 10000
+ CloseReader
+
+ RepSumByPref topDocs
+
+ NewRound
+
+} : 4
+
+RepSumByNameRound
+RepSumByName
+RepSumByPrefRound topDocs
+
Index: contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
===================================================================
--- contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java (revision 912115)
+++ contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java (working copy)
@@ -30,10 +30,12 @@
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.search.Collector;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.MultiTermQuery;
import org.apache.lucene.search.TopFieldCollector;
import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.Weight;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
@@ -105,23 +107,29 @@
res++;
Query q = queryMaker.makeQuery();
Sort sort = getSort();
- TopDocs hits;
+ TopDocs hits = null;
final int numHits = numHits();
if (numHits > 0) {
- if (sort != null) {
- Weight w = q.weight(searcher);
- TopFieldCollector collector = TopFieldCollector.create(sort, numHits,
- true, withScore(),
- withMaxScore(),
- !w.scoresDocsOutOfOrder());
- searcher.search(w, null, collector);
- hits = collector.topDocs();
+ if (withCollector() == false) {
+ if (sort != null) {
+ Weight w = q.weight(searcher);
+ TopFieldCollector collector = TopFieldCollector.create(sort, numHits,
+ true, withScore(),
+ withMaxScore(),
+ !w.scoresDocsOutOfOrder());
+ searcher.search(w, null, collector);
+ hits = collector.topDocs();
+ } else {
+ hits = searcher.search(q, numHits);
+ }
} else {
- hits = searcher.search(q, numHits);
+ Collector collector = createCollector();
+ searcher.search(q, null, collector);
+ //hits = collector.topDocs();
}
final String printHitsField = getRunData().getConfig().get("print.hits.field", null);
- if (printHitsField != null && printHitsField.length() > 0) {
+ if (hits != null && printHitsField != null && printHitsField.length() > 0) {
if (q instanceof MultiTermQuery) {
System.out.println("MultiTermQuery term count = " + ((MultiTermQuery) q).getTotalNumberOfTerms());
}
@@ -177,6 +185,9 @@
return res;
}
+ protected Collector createCollector() throws Exception {
+ return TopScoreDocCollector.create(numHits(), true);
+ }
protected Document retrieveDoc(IndexReader ir, int id) throws IOException {
@@ -192,6 +203,10 @@
* Return true if search should be performed.
*/
public abstract boolean withSearch();
+
+ public boolean withCollector(){
+ return false;
+ }
/**
Index: contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java
===================================================================
--- contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java (revision 0)
+++ contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithCollectorTask.java (revision 0)
@@ -0,0 +1,95 @@
+package org.apache.lucene.benchmark.byTask.tasks;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.benchmark.byTask.PerfRunData;
+import org.apache.lucene.benchmark.byTask.feeds.QueryMaker;
+import org.apache.lucene.benchmark.byTask.utils.Config;
+import org.apache.lucene.search.Collector;
+import org.apache.lucene.search.TopScoreDocCollector;
+
+import java.io.IOException;
+
+/**
+ * Does search w/ a custom collector
+ */
+public class SearchWithCollectorTask extends SearchTask {
+
+ protected String clnName;
+
+ public SearchWithCollectorTask(PerfRunData runData) {
+ super(runData);
+ }
+
+ @Override
+ public void setup() throws Exception {
+ super.setup();
+ //check to make sure either the doc is being stored
+ PerfRunData runData = getRunData();
+ Config config = runData.getConfig();
+ clnName = config.get("collector.class", "");
+ }
+
+
+
+ @Override
+ public boolean withCollector() {
+ return true;
+ }
+
+ @Override
+ protected Collector createCollector() throws Exception {
+ Collector collector = null;
+ if (clnName.equalsIgnoreCase("topDocOrdered") == true) {
+ collector = TopScoreDocCollector.create(numHits(), true);
+ } else if (clnName.equalsIgnoreCase("topDocUnOrdered") == true) {
+ collector = TopScoreDocCollector.create(numHits(), false);
+ } else if (clnName.equals("") == false){
+ Class<? extends Collector> clazz = (Class<? extends Collector>) Class.forName(clnName);
+ collector = clazz.newInstance();
+ } else {
+ collector = super.createCollector();
+ }
+ return collector;
+ }
+
+ @Override
+ public QueryMaker getQueryMaker() {
+ return getRunData().getQueryMaker(this);
+ }
+
+ @Override
+ public boolean withRetrieve() {
+ return false;
+ }
+
+ @Override
+ public boolean withSearch() {
+ return true;
+ }
+
+ @Override
+ public boolean withTraverse() {
+ return false;
+ }
+
+ @Override
+ public boolean withWarm() {
+ return false;
+ }
+
+}
Property changes on: contrib\benchmark\src\java\org\apache\lucene\benchmark\byTask\tasks\SearchWithCollectorTask.java
___________________________________________________________________
Added: svn:keywords
+ Date Author Id Revision HeadURL
Added: svn:eol-style
+ native
Index: contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java
===================================================================
--- contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java (revision 912115)
+++ contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Config.java (working copy)
@@ -22,20 +22,20 @@
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
-import java.util.List;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
/**
* Perf run configuration properties.
- * <p>
- * Numeric property containing ":", e.g. "10:100:5" is interpreted
- * as array of numeric values. It is extracted once, on first use, and
+ * <p/>
+ * Numeric property containing ":", e.g. "10:100:5" is interpreted
+ * as array of numeric values. It is extracted once, on first use, and
* maintain a round number to return the appropriate value.
- * <p>
- * The config property "work.dir" tells where is the root of
+ * <p/>
+ * The config property "work.dir" tells where is the root of
* docs data dirs and indexes dirs. It is set to either of: <ul>
* <li>value supplied for it in the alg file;</li>
* <li>otherwise, value of System property "benchmark.work.dir";</li>
@@ -48,30 +48,31 @@
private int roundNumber = 0;
private Properties props;
- private HashMap<String,Object> valByRound = new HashMap<String,Object>();
- private HashMap<String,String> colForValByRound = new HashMap<String,String>();
+ private HashMap<String, Object> valByRound = new HashMap<String, Object>();
+ private HashMap<String, String> colForValByRound = new HashMap<String, String>();
private String algorithmText;
/**
* Read both algorithm and config properties.
+ *
* @param algReader from where to read algorithm and config properties.
* @throws IOException
*/
- public Config (Reader algReader) throws IOException {
+ public Config(Reader algReader) throws IOException {
// read alg file to array of lines
ArrayList<String> lines = new ArrayList<String>();
BufferedReader r = new BufferedReader(algReader);
- int lastConfigLine=0;
- for (String line = r.readLine(); line!=null; line=r.readLine()) {
+ int lastConfigLine = 0;
+ for (String line = r.readLine(); line != null; line = r.readLine()) {
lines.add(line);
- if (line.indexOf('=')>0) {
+ if (line.indexOf('=') > 0) {
lastConfigLine = lines.size();
}
}
r.close();
// copy props lines to string
StringBuffer sb = new StringBuffer();
- for (int i=0; i<lastConfigLine; i++) {
+ for (int i = 0; i < lastConfigLine; i++) {
sb.append(lines.get(i));
sb.append(NEW_LINE);
}
@@ -80,17 +81,17 @@
props.load(new ByteArrayInputStream(sb.toString().getBytes()));
// make sure work dir is set properly
- if (props.get("work.dir")==null) {
- props.setProperty("work.dir",System.getProperty("benchmark.work.dir","work"));
+ if (props.get("work.dir") == null) {
+ props.setProperty("work.dir", System.getProperty("benchmark.work.dir", "work"));
}
-
- if (Boolean.valueOf(props.getProperty("print.props","true")).booleanValue()) {
+
+ if (Boolean.valueOf(props.getProperty("print.props", "true")).booleanValue()) {
printProps();
}
-
+
// copy algorithm lines
sb = new StringBuffer();
- for (int i=lastConfigLine; i<lines.size(); i++) {
+ for (int i = lastConfigLine; i < lines.size(); i++) {
sb.append(lines.get(i));
sb.append(NEW_LINE);
}
@@ -99,12 +100,13 @@
/**
* Create config without algorithm - useful for a programmatic perf test.
+ *
* @param props - configuration properties.
* @throws IOException
*/
- public Config (Properties props) {
+ public Config(Properties props) {
this.props = props;
- if (Boolean.valueOf(props.getProperty("print.props","true")).booleanValue()) {
+ if (Boolean.valueOf(props.getProperty("print.props", "true")).booleanValue()) {
printProps();
}
}
@@ -121,147 +123,176 @@
/**
* Return a string property.
+ *
* @param name name of property.
* @param dflt default value.
* @return a string property.
*/
- public String get (String name, String dflt) {
- return props.getProperty(name,dflt);
+ public String get(String name, String dflt) {
+ String vals[] = (String[]) valByRound.get(name);
+ if (vals != null) {
+ return vals[roundNumber % vals.length];
+ }
+ // done if not by round
+ String sval = props.getProperty(name, dflt);
+ if (sval == null) {
+ return null;
+ }
+ if (sval.indexOf(":") < 0) {
+ return sval;
+ }
+ // first time this prop is extracted by round
+ int k = sval.indexOf(":");
+ String colName = sval.substring(0, k);
+ sval = sval.substring(k + 1);
+ colForValByRound.put(name, colName);
+ vals = propToStringArray(sval);
+ valByRound.put(name, vals);
+ return vals[roundNumber % vals.length];
}
/**
* Set a property.
* Note: once a multiple values property is set, it can no longer be modified.
- * @param name name of property.
+ *
+ * @param name name of property.
* @param value either single or multiple property value (multiple values are separated by ":")
- * @throws Exception
+ * @throws Exception
*/
- public void set (String name, String value) throws Exception {
+ public void set(String name, String value) throws Exception {
if (valByRound.get(name) != null) {
throw new Exception("Cannot modify a multi value property!");
}
- props.setProperty(name,value);
+ props.setProperty(name, value);
}
/**
* Return an int property.
- * If the property contain ":", e.g. "10:100:5", it is interpreted
+ * If the property contain ":", e.g. "10:100:5", it is interpreted
* as array of ints. It is extracted once, on first call
- * to get() it, and a by-round-value is returned.
+ * to get() it, and a by-round-value is returned.
+ *
* @param name name of property
* @param dflt default value
* @return a int property.
*/
- public int get (String name, int dflt) {
+ public int get(String name, int dflt) {
// use value by round if already parsed
int vals[] = (int[]) valByRound.get(name);
if (vals != null) {
return vals[roundNumber % vals.length];
}
// done if not by round
- String sval = props.getProperty(name,""+dflt);
- if (sval.indexOf(":")<0) {
+ String sval = props.getProperty(name, "" + dflt);
+ if (sval.indexOf(":") < 0) {
return Integer.parseInt(sval);
}
// first time this prop is extracted by round
int k = sval.indexOf(":");
- String colName = sval.substring(0,k);
- sval = sval.substring(k+1);
- colForValByRound.put(name,colName);
+ String colName = sval.substring(0, k);
+ sval = sval.substring(k + 1);
+ colForValByRound.put(name, colName);
vals = propToIntArray(sval);
- valByRound.put(name,vals);
+ valByRound.put(name, vals);
return vals[roundNumber % vals.length];
}
-
+
/**
* Return a double property.
- * If the property contain ":", e.g. "10:100:5", it is interpreted
+ * If the property contain ":", e.g. "10:100:5", it is interpreted
* as array of doubles. It is extracted once, on first call
- * to get() it, and a by-round-value is returned.
+ * to get() it, and a by-round-value is returned.
+ *
* @param name name of property
* @param dflt default value
* @return a double property.
*/
- public double get (String name, double dflt) {
+ public double get(String name, double dflt) {
// use value by round if already parsed
double vals[] = (double[]) valByRound.get(name);
if (vals != null) {
return vals[roundNumber % vals.length];
}
// done if not by round
- String sval = props.getProperty(name,""+dflt);
- if (sval.indexOf(":")<0) {
+ String sval = props.getProperty(name, "" + dflt);
+ if (sval.indexOf(":") < 0) {
return Double.parseDouble(sval);
}
// first time this prop is extracted by round
int k = sval.indexOf(":");
- String colName = sval.substring(0,k);
- sval = sval.substring(k+1);
- colForValByRound.put(name,colName);
+ String colName = sval.substring(0, k);
+ sval = sval.substring(k + 1);
+ colForValByRound.put(name, colName);
vals = propToDoubleArray(sval);
- valByRound.put(name,vals);
+ valByRound.put(name, vals);
return vals[roundNumber % vals.length];
}
-
+
/**
* Return a boolean property.
- * If the property contain ":", e.g. "true.true.false", it is interpreted
+ * If the property contain ":", e.g. "true.true.false", it is interpreted
* as array of booleans. It is extracted once, on first call
- * to get() it, and a by-round-value is returned.
+ * to get() it, and a by-round-value is returned.
+ *
* @param name name of property
* @param dflt default value
* @return a int property.
*/
- public boolean get (String name, boolean dflt) {
+ public boolean get(String name, boolean dflt) {
// use value by round if already parsed
boolean vals[] = (boolean[]) valByRound.get(name);
if (vals != null) {
return vals[roundNumber % vals.length];
}
// done if not by round
- String sval = props.getProperty(name,""+dflt);
- if (sval.indexOf(":")<0) {
+ String sval = props.getProperty(name, "" + dflt);
+ if (sval.indexOf(":") < 0) {
return Boolean.valueOf(sval).booleanValue();
}
// first time this prop is extracted by round
int k = sval.indexOf(":");
- String colName = sval.substring(0,k);
- sval = sval.substring(k+1);
- colForValByRound.put(name,colName);
+ String colName = sval.substring(0, k);
+ sval = sval.substring(k + 1);
+ colForValByRound.put(name, colName);
vals = propToBooleanArray(sval);
- valByRound.put(name,vals);
+ valByRound.put(name, vals);
return vals[roundNumber % vals.length];
}
-
+
/**
- * Increment the round number, for config values that are extracted by round number.
+ * Increment the round number, for config values that are extracted by round number.
+ *
* @return the new round number.
*/
- public int newRound () {
+ public int newRound() {
roundNumber++;
-
- StringBuffer sb = new StringBuffer("--> Round ").append(roundNumber-1).append("-->").append(roundNumber);
+ StringBuffer sb = new StringBuffer("--> Round ").append(roundNumber - 1).append("-->").append(roundNumber);
+
// log changes in values
- if (valByRound.size()>0) {
+ if (valByRound.size() > 0) {
sb.append(": ");
for (final String name : valByRound.keySet()) {
Object a = valByRound.get(name);
if (a instanceof int[]) {
int ai[] = (int[]) a;
- int n1 = (roundNumber-1)%ai.length;
- int n2 = roundNumber%ai.length;
+ int n1 = (roundNumber - 1) % ai.length;
+ int n2 = roundNumber % ai.length;
sb.append(" ").append(name).append(":").append(ai[n1]).append("-->").append(ai[n2]);
- } else if (a instanceof double[]){
+ } else if (a instanceof double[]) {
double ad[] = (double[]) a;
- int n1 = (roundNumber-1)%ad.length;
- int n2 = roundNumber%ad.length;
+ int n1 = (roundNumber - 1) % ad.length;
+ int n2 = roundNumber % ad.length;
sb.append(" ").append(name).append(":").append(ad[n1]).append("-->").append(ad[n2]);
- }
- else {
+ } else if (a instanceof String[]) {
+ String ad[] = (String[]) a;
+ int n1 = (roundNumber - 1) % ad.length;
+ int n2 = roundNumber % ad.length;
+ sb.append(" ").append(name).append(":").append(ad[n1]).append("-->").append(ad[n2]);
+ } else {
boolean ab[] = (boolean[]) a;
- int n1 = (roundNumber-1)%ab.length;
- int n2 = roundNumber%ab.length;
+ int n1 = (roundNumber - 1) % ab.length;
+ int n2 = roundNumber % ab.length;
sb.append(" ").append(name).append(":").append(ab[n1]).append("-->").append(ab[n2]);
}
}
@@ -270,62 +301,76 @@
System.out.println();
System.out.println(sb.toString());
System.out.println();
-
+
return roundNumber;
}
-
+
+ private String[] propToStringArray(String s) {
+ if (s.indexOf(":") < 0) {
+ return new String[]{s};
+ }
+
+ ArrayList<String> a = new ArrayList<String>();
+ StringTokenizer st = new StringTokenizer(s, ":");
+ while (st.hasMoreTokens()) {
+ String t = st.nextToken();
+ a.add(t);
+ }
+ return (String[]) a.toArray(new String[a.size()]);
+ }
+
// extract properties to array, e.g. for "10:100:5" return int[]{10,100,5}.
- private int[] propToIntArray (String s) {
- if (s.indexOf(":")<0) {
- return new int [] { Integer.parseInt(s) };
+ private int[] propToIntArray(String s) {
+ if (s.indexOf(":") < 0) {
+ return new int[]{Integer.parseInt(s)};
}
-
+
ArrayList<Integer> a = new ArrayList<Integer>();
- StringTokenizer st = new StringTokenizer(s,":");
+ StringTokenizer st = new StringTokenizer(s, ":");
while (st.hasMoreTokens()) {
String t = st.nextToken();
a.add(Integer.valueOf(t));
}
- int res[] = new int[a.size()];
- for (int i=0; i<a.size(); i++) {
+ int res[] = new int[a.size()];
+ for (int i = 0; i < a.size(); i++) {
res[i] = a.get(i).intValue();
}
return res;
}
-
+
// extract properties to array, e.g. for "10.7:100.4:-2.3" return int[]{10.7,100.4,-2.3}.
- private double[] propToDoubleArray (String s) {
- if (s.indexOf(":")<0) {
- return new double [] { Double.parseDouble(s) };
+ private double[] propToDoubleArray(String s) {
+ if (s.indexOf(":") < 0) {
+ return new double[]{Double.parseDouble(s)};
}
-
+
ArrayList<Double> a = new ArrayList<Double>();
- StringTokenizer st = new StringTokenizer(s,":");
+ StringTokenizer st = new StringTokenizer(s, ":");
while (st.hasMoreTokens()) {
String t = st.nextToken();
a.add(Double.valueOf(t));
}
- double res[] = new double[a.size()];
- for (int i=0; i<a.size(); i++) {
+ double res[] = new double[a.size()];
+ for (int i = 0; i < a.size(); i++) {
res[i] = a.get(i).doubleValue();
}
return res;
}
-
+
// extract properties to array, e.g. for "true:true:false" return boolean[]{true,false,false}.
- private boolean[] propToBooleanArray (String s) {
- if (s.indexOf(":")<0) {
- return new boolean [] { Boolean.valueOf(s).booleanValue() };
+ private boolean[] propToBooleanArray(String s) {
+ if (s.indexOf(":") < 0) {
+ return new boolean[]{Boolean.valueOf(s).booleanValue()};
}
-
+
ArrayList<Boolean> a = new ArrayList<Boolean>();
- StringTokenizer st = new StringTokenizer(s,":");
+ StringTokenizer st = new StringTokenizer(s, ":");
while (st.hasMoreTokens()) {
String t = st.nextToken();
a.add(new Boolean(t));
}
- boolean res[] = new boolean[a.size()];
- for (int i=0; i<a.size(); i++) {
+ boolean res[] = new boolean[a.size()];
+ for (int i = 0; i < a.size(); i++) {
res[i] = a.get(i).booleanValue();
}
return res;
@@ -335,10 +380,10 @@
* @return names of params set by round, for reports title
*/
public String getColsNamesForValsByRound() {
- if (colForValByRound.size()==0) {
+ if (colForValByRound.size() == 0) {
return "";
}
- StringBuffer sb = new StringBuffer();
+ StringBuffer sb = new StringBuffer();
for (final String name : colForValByRound.keySet()) {
String colName = colForValByRound.get(name);
sb.append(" ").append(colName);
@@ -350,33 +395,35 @@
* @return values of params set by round, for reports lines.
*/
public String getColsValuesForValsByRound(int roundNum) {
- if (colForValByRound.size()==0) {
+ if (colForValByRound.size() == 0) {
return "";
}
- StringBuffer sb = new StringBuffer();
- for (final String name : colForValByRound.keySet()) {
+ StringBuffer sb = new StringBuffer();
+ for (final String name : colForValByRound.keySet()) {
String colName = colForValByRound.get(name);
- String template = " "+colName;
- if (roundNum<0) {
+ String template = " " + colName;
+ if (roundNum < 0) {
// just append blanks
- sb.append(Format.formatPaddLeft("-",template));
+ sb.append(Format.formatPaddLeft("-", template));
} else {
// append actual values, for that round
Object a = valByRound.get(name);
if (a instanceof int[]) {
int ai[] = (int[]) a;
int n = roundNum % ai.length;
- sb.append(Format.format(ai[n],template));
- }
- else if (a instanceof double[]) {
+ sb.append(Format.format(ai[n], template));
+ } else if (a instanceof double[]) {
double ad[] = (double[]) a;
int n = roundNum % ad.length;
- sb.append(Format.format(2, ad[n],template));
- }
- else {
+ sb.append(Format.format(2, ad[n], template));
+ } else if (a instanceof String[]) {
+ String ad[] = (String[]) a;
+ int n = roundNum % ad.length;
+ sb.append(ad[n]);
+ } else {
boolean ab[] = (boolean[]) a;
int n = roundNum % ab.length;
- sb.append(Format.formatPaddLeft(""+ab[n],template));
+ sb.append(Format.formatPaddLeft("" + ab[n], template));
}
}
}