You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2011/09/28 18:24:42 UTC

svn commit: r1176947 - in /incubator/jena/Experimental/JenaPerf/trunk: ./ .settings/ classes/ src/ src/main/ src/main/scala/ src/main/scala/org/ src/main/scala/org/apache/ src/main/scala/org/apache/jena/ src/main/scala/org/apache/jena/perf/ src/test/ s...

Author: andy
Date: Wed Sep 28 16:24:41 2011
New Revision: 1176947

URL: http://svn.apache.org/viewvc?rev=1176947&view=rev
Log:
Jena Performance Framework (experimental)

Added:
    incubator/jena/Experimental/JenaPerf/trunk/.classpath   (with props)
    incubator/jena/Experimental/JenaPerf/trunk/.project   (with props)
    incubator/jena/Experimental/JenaPerf/trunk/.settings/
    incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs   (with props)
    incubator/jena/Experimental/JenaPerf/trunk/D.ttl   (with props)
    incubator/jena/Experimental/JenaPerf/trunk/classes/
    incubator/jena/Experimental/JenaPerf/trunk/pom.xml   (with props)
    incubator/jena/Experimental/JenaPerf/trunk/src/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Enum.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Main.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala
    incubator/jena/Experimental/JenaPerf/trunk/src/test/
    incubator/jena/Experimental/JenaPerf/trunk/src/test/scala/
Modified:
    incubator/jena/Experimental/JenaPerf/trunk/   (props changed)

Propchange: incubator/jena/Experimental/JenaPerf/trunk/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed Sep 28 16:24:41 2011
@@ -0,0 +1,3 @@
+target
+
+DB

Added: incubator/jena/Experimental/JenaPerf/trunk/.classpath
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/.classpath?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/.classpath (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/.classpath Wed Sep 28 16:24:41 2011
@@ -0,0 +1,34 @@
+<classpath>
+  <!--
+  <classpathentry kind="src" path="src/main/java"/>
+  <classpathentry kind="src" path="src/test/java"/>
+  -->
+  <classpathentry kind="src" path="src/main/scala"/>
+  <classpathentry kind="src" path="src/test/scala"/>
+
+  <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+
+  <classpathentry kind="output" path="classes"/>
+
+  <classpathentry kind="var" path="M2_REPO/com/hp/hpl/jena/arq/2.8.9-SNAPSHOT/arq-2.8.9-SNAPSHOT.jar" sourcepath="M2_REPO/com/hp/hpl/jena/arq/2.8.9-SNAPSHOT/arq-2.8.9-SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/hp/hpl/jena/jena/2.6.4/jena-2.6.4.jar" sourcepath="M2_REPO/com/hp/hpl/jena/jena/2.6.4/jena-2.6.4-sources.jar"/>
+
+  <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/httpcomponents/httpclient/4.1.2/httpclient-4.1.2.jar" sourcepath="M2_REPO/org/apache/httpcomponents/httpclient/4.1.2/httpclient-4.1.2-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/apache/httpcomponents/httpcore/4.1.2/httpcore-4.1.2.jar" sourcepath="M2_REPO/org/apache/httpcomponents/httpcore/4.1.2/httpcore-4.1.2-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/ibm/icu/icu4j/3.4.4/icu4j-3.4.4.jar" sourcepath="M2_REPO/com/ibm/icu/icu4j/3.4.4/icu4j-3.4.4-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/hp/hpl/jena/iri/0.8/iri-0.8.jar" sourcepath="M2_REPO/com/hp/hpl/jena/iri/0.8/iri-0.8-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/jcl-over-slf4j/1.6.1/jcl-over-slf4j-1.6.1-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/junit/junit/4.9/junit-4.9.jar" sourcepath="M2_REPO/junit/junit/4.9/junit-4.9-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16.jar" sourcepath="M2_REPO/log4j/log4j/1.2.16/log4j-1.2.16-sources.jar"/>
+
+  <classpathentry kind="var" path="M2_REPO/org/scala-lang/scala-library/2.9.1/scala-library-2.9.1.jar" sourcepath="M2_REPO/org/scala-lang/scala-library/2.9.1/scala-library-2.9.1-sources.jar"/>
+
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/>
+  <classpathentry kind="var" path="M2_REPO/com/hp/hpl/jena/tdb/0.8.11-SNAPSHOT/tdb-0.8.11-SNAPSHOT.jar" sourcepath="M2_REPO/com/hp/hpl/jena/tdb/0.8.11-SNAPSHOT/tdb-0.8.11-SNAPSHOT-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/org/codehaus/woodstox/wstx-asl/3.2.9/wstx-asl-3.2.9.jar" sourcepath="M2_REPO/org/codehaus/woodstox/wstx-asl/3.2.9/wstx-asl-3.2.9-sources.jar"/>
+  <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.7.1/xercesImpl-2.7.1.jar"/>
+</classpath>
\ No newline at end of file

Propchange: incubator/jena/Experimental/JenaPerf/trunk/.classpath
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/jena/Experimental/JenaPerf/trunk/.project
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/.project?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/.project (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/.project Wed Sep 28 16:24:41 2011
@@ -0,0 +1,20 @@
+<projectDescription>
+  <name>jena-perf</name>
+  <projects/>
+  <buildSpec>
+    <buildCommand>
+      <name>org.scala-ide.sdt.core.scalabuilder</name>
+      <arguments>
+      </arguments>
+    </buildCommand>
+    <!--
+    <buildCommand>
+      <name>org.eclipse.jdt.core.javabuilder</name>
+    </buildCommand>
+    -->
+  </buildSpec>
+  <natures>
+    <nature>org.scala-ide.sdt.core.scalanature</nature>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>
\ No newline at end of file

Propchange: incubator/jena/Experimental/JenaPerf/trunk/.project
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs Wed Sep 28 16:24:41 2011
@@ -0,0 +1,16 @@
+#Tue Sep 27 17:34:26 BST 2011
+encoding//src/main/java=UTF-8
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+encoding//src/main/resources=UTF-8
+encoding//src/test/resources=UTF-8
+encoding//src/test/java=UTF-8
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error

Propchange: incubator/jena/Experimental/JenaPerf/trunk/.settings/org.eclipse.jdt.core.prefs
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/jena/Experimental/JenaPerf/trunk/D.ttl
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/D.ttl?rev=1176947&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/jena/Experimental/JenaPerf/trunk/D.ttl
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/jena/Experimental/JenaPerf/trunk/pom.xml
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/pom.xml?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/pom.xml (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/pom.xml Wed Sep 28 16:24:41 2011
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.jena</groupId>
+  <artifactId>jena-perf</artifactId>
+  <packaging>jar</packaging>
+  <name>Jena Benchmark Framework</name>
+  <version>0.0.0-SNAPSHOT</version>
+
+  <parent>
+    <groupId>org.apache.jena</groupId>
+    <artifactId>jena-top</artifactId>
+    <version>0-SNAPSHOT</version>
+    <relativePath>../JenaTop/pom.xml</relativePath>
+  </parent> 
+
+  <description/>
+
+  <organization>
+    <name>Apache Jena</name>
+    <url>http://incubator.apache.org/jena</url>
+  </organization>
+
+  <licenses>
+    <license>
+      <name>Apache 2.0 License</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+    </license>
+  </licenses>
+
+  <properties>
+    <this.root>${project.artifactId}-${project.version}</this.root>
+
+    <ver.jena>2.6.4</ver.jena>
+    <ver.arq>2.8.9-SNAPSHOT</ver.arq>
+    <ver.tdb>0.8.11-SNAPSHOT</ver.tdb>
+    <ver.httpclient>4.1.1</ver.httpclient>
+    <!-- <ver.httpfileupload>1.2.2</ver.httpfileupload> -->
+    <ver.junit>4.9</ver.junit>
+    <ver.commonscodec>1.5</ver.commonscodec>
+    <ver.slf4j>1.6.1</ver.slf4j>
+    <ver.log4j>1.2.16</ver.log4j>
+    <ver.scala>[2.9.0,]</ver.scala>
+  </properties>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.scala-lang</groupId>
+      <artifactId>scala-library</artifactId>
+      <version>${ver.scala}</version>
+    </dependency>
+
+
+    <dependency>
+      <groupId>com.hp.hpl.jena</groupId>
+      <artifactId>arq</artifactId>
+      <version>${ver.arq}</version>
+    </dependency>
+
+
+    <dependency>
+      <groupId>com.hp.hpl.jena</groupId>
+      <artifactId>jena</artifactId>
+      <classifier>tests</classifier>
+      <version>${ver.jena}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.hp.hpl.jena</groupId>
+      <artifactId>tdb</artifactId>
+      <version>${ver.tdb}</version>
+    </dependency>
+
+    <!--
+    <dependency>
+      <groupId>com.hp.hpl.jena</groupId>
+      <artifactId>sdb</artifactId>
+      <version>${ver.sdb}</version>
+      <optional>true</optional>
+    </dependency>
+    -->
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>${ver.junit}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${ver.slf4j}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>${ver.slf4j}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+      <version>${ver.slf4j}</version>
+      <optional>true</optional>
+    </dependency>
+
+    <!-- Needed if controlling logging in testing -->
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>${ver.log4j}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.jms</groupId>
+          <artifactId>jms</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.jdmk</groupId>
+          <artifactId>jmxtools</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.jmx</groupId>
+          <artifactId>jmxri</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.mail</groupId>
+          <artifactId>mail</artifactId>
+        </exclusion>
+      </exclusions> 
+    </dependency>
+  </dependencies>
+
+  <build>
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+
+      <plugin>
+	<groupId>org.scala-tools</groupId>
+	<artifactId>maven-scala-plugin</artifactId>
+
+	<configuration>
+	  <jvmArgs>
+	    <jvmArg>-Xmx1024m</jvmArg>
+          </jvmArgs>
+	  <args>
+	    <arg>-unchecked</arg>
+	    <arg>-deprecation</arg>
+	  </args>
+        </configuration> 
+
+	<executions>
+	  <execution>
+	    <id>scala-compile-first</id>
+	    <phase>process-resources</phase>
+	    <goals>
+	      <goal>add-source</goal>
+	      <goal>compile</goal>
+	    </goals>
+	  </execution>									
+	  <execution>
+	    <id>scala-test-compile</id>
+	    <phase>process-test-resources</phase>
+	    <goals>
+	      <goal>testCompile</goal>
+	    </goals>
+	  </execution>
+	</executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <includes>
+            <include>**/TS_*.java</include>
+          </includes>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <overWriteReleases>false</overWriteReleases>
+          <overWriteIfNewer>true</overWriteIfNewer>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+
+    </plugins>
+
+  </build>
+  
+
+  <pluginRepositories>
+    <pluginRepository>
+      <id>scala-tools.org</id>
+      <name>Scala-tools Maven2 Repository</name>
+	<url>http://scala-tools.org/repo-releases</url>
+    </pluginRepository>
+  </pluginRepositories>
+    
+</project>

Propchange: incubator/jena/Experimental/JenaPerf/trunk/pom.xml
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Enum.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Enum.scala?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Enum.scala (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Enum.scala Wed Sep 28 16:24:41 2011
@@ -0,0 +1,12 @@
+package org.apache.jena.perf
+
+// Machinary
+// Can iterate over the Enum names
+
+trait Enum[A] {
+  trait Value { self: A =>
+    _values :+= this
+  }
+  private var _values = List.empty[A]
+  def values = _values
+}

Added: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Main.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Main.scala?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Main.scala (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/Main.scala Wed Sep 28 16:24:41 2011
@@ -0,0 +1,20 @@
+package org.apache.jena.perf
+
+object Main {
+  def main(args: Array[String]): Unit = {
+    // Read actions
+    // Perform actions
+    val x = List("A","AB","XYZ")
+    
+    def func(a:String) = { List(a,a.length).iterator }
+    
+    val y = flatMap2(x.iterator, func)
+    
+    y.foreach( z => println(z) )
+  }
+  
+  def flatMap2[A,B](iter:Iterator[A], func: A => Iterator[B]) : Iterator[B] = 
+    iter.map(func(_)).flatten 
+  
+}
+

Added: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfMain.scala Wed Sep 28 16:24:41 2011
@@ -0,0 +1,81 @@
+package org.apache.jena.perf
+import java.util.Date
+import com.hp.hpl.jena.query._
+import com.hp.hpl.jena.tdb.TDBFactory
+import com.hp.hpl.jena.util.FileManager
+
+object PerfMain {
+    def main(args: Array[String]): Unit = {
+      println("Jena SPARQL Performance test bed")
+      
+      val query1 = QueryFactory.create("SELECT * { ?s1 ?p1 ?o1 }")
+      val query2 = QueryFactory.create("SELECT * { ?s2 ?p2 ?o2 }")
+      val action1 = new ActionByScheme("Q1", "file:D.ttl", query1)
+      val action2 = new ActionByScheme("Q2", "tdb:DB", query2)
+      val collector = new Collector()
+      
+      val actions: List[Action] = List ( action1, action2 )
+      
+      actions.foreach( a => collector.acc(a, a.perform ()) )
+      
+      println("Acc = "+collector.results.length)
+      for ( (action,result) <- collector.results )
+      {
+        println("**"+action.name)
+        println(result.outcome)
+        println(result.elapsed)
+      }
+      println("Done") 
+    }
+}
+
+class ActionByScheme(val name: String, uri:String, query:Query) extends ActionQuery {
+  def perform():Result = {
+    def action(): Action =
+    {
+      if ( uri.startsWith("tdb:") ) return new ActionQueryTDB(name, uri.substring(4), query)
+      if ( uri.startsWith("file:") ) return new ActionQueryFile(name, uri.substring(5), query)
+      new ActionNone("No scheme")
+    }
+    return action().perform()
+  }
+}
+
+trait ActionQuery extends Action {
+  def exec(ds:Dataset, query:Query) : Result = { 
+    import com.hp.hpl.jena.sparql.util.QueryExecUtils
+    val start = System.currentTimeMillis() ;  
+    val startDate = new Date()
+    val qexec = QueryExecutionFactory.create(query, ds)
+    // later
+    //QueryExecUtils.executeQuery(query, qexec)
+    
+    val count = ResultSetFormatter.consume(qexec.execSelect())
+    
+    val finish = System.currentTimeMillis() ;
+    val finishDate = new Date()
+    new Result(Success, finish-start)
+  }
+}
+
+class ActionQueryTDB(n:String, location:String, query:Query) extends ActionQuery {
+  val name = n+"["+location+"]"
+  def perform():Result = {
+    val ds = TDBFactory.createDataset(location)
+    return exec(ds, query)
+  }
+}
+
+class ActionQueryFile(val name:String, filename:String, query:Query) extends ActionQuery {
+  def perform():Result = {
+    val ds = DatasetFactory.create()
+    FileManager.get().readModel(ds.getDefaultModel(), filename)
+    return exec(ds, query)
+  }
+}
+
+class ActionNone(val name: String) extends Action {
+  def perform():Result = { return ResultNone ; }
+}
+
+

Added: incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala
URL: http://svn.apache.org/viewvc/incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala?rev=1176947&view=auto
==============================================================================
--- incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala (added)
+++ incubator/jena/Experimental/JenaPerf/trunk/src/main/scala/org/apache/jena/perf/PerfUnit.scala Wed Sep 28 16:24:41 2011
@@ -0,0 +1,50 @@
+package org.apache.jena.perf
+import java.util.Date
+import scala.collection.mutable.ListBuffer
+import scala.collection.mutable.ArrayBuffer
+
+/** A single step in the performance suite */ 
+case class PerfUnit(name:String, action:Action, result:Option[Result] = None) 
+
+trait Action {
+  def name:String
+  // This is blocking - pass in a handler to call after .
+  // Signature
+  def perform(): Result
+}
+
+// Simple - but no iteration.
+sealed abstract class Outcome(val name:String)
+case object Success extends Outcome("success")
+case object Failure extends Outcome("failure")
+case object NoOutcome extends Outcome("nothing")
+
+//sealed trait Outcome extends Outcome.Value
+//object Outcome extends Enum[Outcome]
+//case object Success extends Outcome
+//case object Failure extends Outcome
+//case object NoOutcome extends Outcome
+
+
+/** Details, details */ 
+case class Result(outcome:Outcome, elapsed:Long = -1, startDT:Option[Date] = None, finishDT:Option[Date] = None)
+object ResultNone extends Result(NoOutcome)
+
+class Collector {
+  type OneStep = (Action, Result)
+  private val lock:AnyRef = new AnyRef
+  private val resultsAcc:ArrayBuffer[(Action, Result)] = ArrayBuffer.empty
+  // Cache.
+  private var view:Option[Array[(Action, Result)]] = None
+  
+  def results:Array[(Action, Result)] = {
+    lock.synchronized {
+        if ( view.isEmpty ) view = Some(resultsAcc.toArray)
+        view.get
+    }
+  }
+  
+  def acc(step: OneStep /*action: Action, outcome:Result*/):Unit = {
+    lock.synchronized { resultsAcc += step ; view = None ; }
+  }
+}