You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2020/09/17 15:22:43 UTC

[lucene-solr] 09/18: @844 Cleanup some slow stuf.

This is an automated email from the ASF dual-hosted git repository.

markrmiller pushed a commit to branch reference_impl_dev
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 1e587443dec08836433b605489f63935fecaabc8
Author: markrmiller@gmail.com <ma...@gmail.com>
AuthorDate: Wed Sep 16 20:57:44 2020 -0500

    @844 Cleanup some slow stuf.
---
 .../src/java/org/apache/solr/cloud/Overseer.java   |   2 +-
 .../org/apache/solr/cloud/ZkDistributedQueue.java  |  10 +-
 .../java/org/apache/solr/core/SolrXmlConfig.java   |  23 +-
 .../solr/cloud/MetricsHistoryIntegrationTest.java  |   2 +-
 .../MetricsHistoryWithAuthIntegrationTest.java     |   2 +-
 .../org/apache/solr/cloud/TestCloudRecovery.java   |   4 +-
 .../org/apache/solr/core/TestJmxIntegration.java   |   2 +-
 .../apache/solr/handler/admin/InfoHandlerTest.java |   2 +-
 .../solr/handler/admin/MBeansHandlerTest.java      |   2 +-
 .../solr/handler/admin/MetricsHandlerTest.java     |   2 +-
 .../handler/admin/MetricsHistoryHandlerTest.java   |   2 +-
 .../apache/solr/metrics/SolrMetricManagerTest.java |   2 +-
 .../solr/metrics/SolrMetricsIntegrationTest.java   |   4 +-
 .../metrics/reporters/SolrSlf4jReporterTest.java   |   2 +-
 .../org/apache/solr/search/TestSolr4Spatial2.java  |   2 +-
 .../solr/security/BasicAuthIntegrationTest.java    |   2 +-
 .../hadoop/TestImpersonationWithHadoopAuth.java    |   2 +-
 .../hadoop/TestSolrCloudWithHadoopAuthPlugin.java  |   2 +-
 .../java/org/apache/solr/client/solrj/io/Lang.java | 433 ++++++---------------
 .../client/solrj/io/stream/expr/StreamFactory.java |  11 +-
 .../org/apache/solr/common/cloud/SolrZkClient.java |   2 +-
 .../src/java/org/apache/solr/SolrTestCase.java     |   2 +-
 22 files changed, 165 insertions(+), 352 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
index 9b75be1..854e5b8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
@@ -307,7 +307,7 @@ public class Overseer implements SolrCloseable {
 //            } else {
 //              wait = 0;
 //            }
-            queue = new LinkedList<>(stateUpdateQueue.peekElements(10000, wait, (x) -> true));
+            queue = new LinkedList<>(stateUpdateQueue.peekElements(1500, wait, (x) -> true));
           } catch (AlreadyClosedException e) {
             return;
           } catch (KeeperException.SessionExpiredException e) {
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkDistributedQueue.java b/solr/core/src/java/org/apache/solr/cloud/ZkDistributedQueue.java
index 2fd8d9d..6dcd4cf 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkDistributedQueue.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkDistributedQueue.java
@@ -99,16 +99,13 @@ public class ZkDistributedQueue implements DistributedQueue {
    * Therefore, methods like {@link #peek()} have to double-check actual node existence, and methods
    * like {@link #poll()} must resolve any races by attempting to delete the underlying node.
    */
-  protected TreeSet<String> knownChildren = new TreeSet<>();
+  protected volatile TreeSet<String> knownChildren;
 
   /**
    * Used to wait on ZK changes to the child list; you must hold {@link #updateLock} before waiting on this condition.
    */
   private final Condition changed = updateLock.newCondition();
 
-
-  private LongAdder watcherCount = new LongAdder();
-
   private final int maxQueueSize;
 
   /**
@@ -485,7 +482,7 @@ public class ZkDistributedQueue implements DistributedQueue {
 
           while (existingChildren == knownChildren) {
             try {
-              changed.await(5000, TimeUnit.MILLISECONDS);
+              changed.await(500, TimeUnit.MILLISECONDS);
             } catch (InterruptedException e) {
               ParWork.propagateInterrupt(e);
               throw new AlreadyClosedException();
@@ -577,7 +574,7 @@ public class ZkDistributedQueue implements DistributedQueue {
   }
 
   @VisibleForTesting long watcherCount() throws InterruptedException {
-    return watcherCount.sum();
+    return 0;
   }
 
   @VisibleForTesting class ChildWatcher implements Watcher {
@@ -592,7 +589,6 @@ public class ZkDistributedQueue implements DistributedQueue {
 
       updateLock.lock();
       try {
-        watcherCount.decrement();
         knownChildren = fetchZkChildren(this);
 
         changed.signalAll();
diff --git a/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java b/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
index 3ad73e8..e41641e 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrXmlConfig.java
@@ -646,14 +646,21 @@ public class SolrXmlConfig {
       }
     }
     // if there's an MBean server running but there was no JMX reporter then add a default one
-    MBeanServer mBeanServer = JmxUtil.findFirstMBeanServer();
-    if (mBeanServer != null && !hasJmxReporter && !Boolean.getBoolean("solr.disableJmxReporter")) {
-      log.info("MBean server found: {}, but no JMX reporters were configured - adding default JMX reporter.", mBeanServer);
-      Map<String,Object> attributes = new HashMap<>(2);
-      attributes.put("name", "default");
-      attributes.put("class", SolrJmxReporter.class.getName());
-      PluginInfo defaultPlugin = new PluginInfo("reporter", attributes);
-      configs.add(defaultPlugin);
+    boolean disableJmxReporter = true;
+    String disableJmxReporterProp = System.getProperty("solr.disableDefaultJmxReporter");
+    if (disableJmxReporterProp != null) {
+      disableJmxReporter = Boolean.parseBoolean(disableJmxReporterProp);
+    }
+    if (!disableJmxReporter && !hasJmxReporter) {
+      MBeanServer mBeanServer = JmxUtil.findFirstMBeanServer();
+      if (mBeanServer != null ) {
+        log.info("MBean server found: {}, but no JMX reporters were configured - adding default JMX reporter.", mBeanServer);
+        Map<String,Object> attributes = new HashMap<>(2);
+        attributes.put("name", "default");
+        attributes.put("class", SolrJmxReporter.class.getName());
+        PluginInfo defaultPlugin = new PluginInfo("reporter", attributes);
+        configs.add(defaultPlugin);
+      }
     }
     return configs.toArray(new PluginInfo[configs.size()]);
   }
diff --git a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
index ba77e65..dfaf126 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryIntegrationTest.java
@@ -61,7 +61,7 @@ public class MetricsHistoryIntegrationTest extends SolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     boolean simulated = TEST_NIGHTLY ? random().nextBoolean() : true;
     if (simulated) {
       cloudManager = SimCloudManager.createCluster(1, TimeSource.get("simTime:50"));
diff --git a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
index a06f2a6..2e5e422a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MetricsHistoryWithAuthIntegrationTest.java
@@ -64,7 +64,7 @@ public class MetricsHistoryWithAuthIntegrationTest extends SolrCloudTestCase {
   @BeforeClass
   public static void setupCluster() throws Exception {
     System.setProperty("solr.disableMetricsHistoryHandler", "false");
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     String solrXml = MiniSolrCloudCluster.DEFAULT_CLOUD_SOLR_XML.replace("<metrics>\n",
         "<metrics>\n" + SOLR_XML_HISTORY_CONFIG);
     // Spin up a cluster with a protected /admin/metrics handler, and a 2 seconds metrics collectPeriod
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
index 3d01017..3f063ec 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestCloudRecovery.java
@@ -62,10 +62,10 @@ public class TestCloudRecovery extends SolrCloudTestCase {
 
   @BeforeClass
   public static void setupCluster() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     System.setProperty("solr.directoryFactory", "solr.StandardDirectoryFactory");
     System.setProperty("solr.ulog.numRecordsToKeep", "1000");
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     System.setProperty("solr.skipCommitOnClose", "false");
   }
 
diff --git a/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java b/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
index 9bc0032..a5d85c6 100644
--- a/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
+++ b/solr/core/src/test/org/apache/solr/core/TestJmxIntegration.java
@@ -61,7 +61,7 @@ public class TestJmxIntegration extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     // Make sure that at least one MBeanServer is available
     // prior to initializing the core
     //
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
index 1a4048d..84f9fe8 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/InfoHandlerTest.java
@@ -30,7 +30,7 @@ public class InfoHandlerTest extends SolrTestCaseJ4 {
   
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     initCore("solrconfig.xml", "schema.xml");
   }
   
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
index 01c378c..76b5136 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MBeansHandlerTest.java
@@ -40,7 +40,7 @@ public class MBeansHandlerTest extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     initCore("solrconfig.xml", "schema.xml");
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
index 088c5cb..724fee3 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHandlerTest.java
@@ -49,7 +49,7 @@ import org.junit.Test;
 public class MetricsHandlerTest extends SolrTestCaseJ4 {
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     initCore("solrconfig-minimal.xml", "schema.xml");
     h.getCoreContainer().waitForLoadingCoresToFinish(30000);
 
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHistoryHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHistoryHandlerTest.java
index 224fb21..ffa9485 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/MetricsHistoryHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/MetricsHistoryHandlerTest.java
@@ -66,7 +66,7 @@ public class MetricsHistoryHandlerTest extends SolrCloudTestCase {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     TEST_MBEAN_SERVER = MBeanServerFactory.createMBeanServer();
     simulated = TEST_NIGHTLY ? random().nextBoolean() : true;
     Map<String, Object> args = new HashMap<>();
diff --git a/solr/core/src/test/org/apache/solr/metrics/SolrMetricManagerTest.java b/solr/core/src/test/org/apache/solr/metrics/SolrMetricManagerTest.java
index db72d8d..ed060dc 100644
--- a/solr/core/src/test/org/apache/solr/metrics/SolrMetricManagerTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/SolrMetricManagerTest.java
@@ -39,7 +39,7 @@ public class SolrMetricManagerTest extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeSolrMetricManagerTest() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
index c3e3660..0c02a50 100644
--- a/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/SolrMetricsIntegrationTest.java
@@ -66,7 +66,7 @@ public class SolrMetricsIntegrationTest extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
   }
 
   private void assertTagged(Map<String, SolrMetricReporter> reporters, String name) {
@@ -75,7 +75,7 @@ public class SolrMetricsIntegrationTest extends SolrTestCaseJ4 {
 
   @Before
   public void beforeTest() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     Path home = Paths.get(TEST_HOME());
     // define these properties, they are used in solrconfig.xml
     System.setProperty("solr.test.sys.prop1", "propone");
diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java
index 7c7e45f..0f328b1 100644
--- a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java
+++ b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java
@@ -48,7 +48,7 @@ public class SolrSlf4jReporterTest extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
   }
 
   @Test
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
index f56776d..c144151 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
@@ -51,7 +51,7 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     initCore("solrconfig-spatial.xml", "schema-spatial.xml");
   }
 
diff --git a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
index 06e2812..5d29c8d 100644
--- a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
@@ -84,7 +84,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
   @Before
   public void setupCluster() throws Exception {
     System.setProperty("solr.disablePublicKeyHandler", "false");
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     useFactory(null);
     configureCluster(3)
         .addConfig("conf", configset("cloud-minimal"))
diff --git a/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java b/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
index 82c3746..74af5c4 100644
--- a/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
+++ b/solr/core/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
@@ -54,7 +54,7 @@ public class TestImpersonationWithHadoopAuth  extends SolrCloudTestCase {
   @SuppressWarnings("unchecked")
   @BeforeClass
   public static void setupClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     System.setProperty("solr.disablePublicKeyHandler", "false");
     HdfsTestUtil.checkAssumptions();
 
diff --git a/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHadoopAuthPlugin.java b/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHadoopAuthPlugin.java
index dbadc2a..a7176e1 100644
--- a/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHadoopAuthPlugin.java
+++ b/solr/core/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithHadoopAuthPlugin.java
@@ -43,7 +43,7 @@ public class TestSolrCloudWithHadoopAuthPlugin extends SolrCloudAuthTestCase {
 
   @BeforeClass
   public static void setupClass() throws Exception {
-    System.setProperty("solr.disableJmxReporter", "false");
+    System.setProperty("solr.disableDefaultJmxReporter", "false");
     System.setProperty("solr.disablePublicKeyHandler", "false");
     HdfsTestUtil.checkAssumptions();
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/Lang.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/Lang.java
index e2008be..fec3616 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/Lang.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/Lang.java
@@ -32,336 +32,141 @@ import org.apache.solr.client.solrj.io.stream.metrics.PercentileMetric;
 import org.apache.solr.client.solrj.io.stream.metrics.StdMetric;
 import org.apache.solr.client.solrj.io.stream.metrics.SumMetric;
 
-public class Lang {
-
-  public static void register(StreamFactory streamFactory) {
-    streamFactory
-        // source streams
-        .withFunctionName("search", SearchFacadeStream.class)
-        .withFunctionName("facet", FacetStream.class)
-        .withFunctionName("facet2D", Facet2DStream.class)
-        .withFunctionName("update", UpdateStream.class)
-        .withFunctionName("delete", DeleteStream.class)
-        .withFunctionName("jdbc", JDBCStream.class)
-        .withFunctionName("topic", TopicStream.class)
-        .withFunctionName("commit", CommitStream.class)
-        .withFunctionName("random", RandomFacadeStream.class)
-        .withFunctionName("knnSearch", KnnStream.class)
+import java.util.HashMap;
 
+public class Lang {
+  private static StreamFactory baseStreamFactory;
+  static {
+    baseStreamFactory = new StreamFactory().withFunctionName("search", SearchFacadeStream.class).withFunctionName("facet", FacetStream.class).withFunctionName("facet2D", Facet2DStream.class)
+        .withFunctionName("update", UpdateStream.class).withFunctionName("delete", DeleteStream.class).withFunctionName("jdbc", JDBCStream.class).withFunctionName("topic", TopicStream.class)
+        .withFunctionName("commit", CommitStream.class).withFunctionName("random", RandomFacadeStream.class).withFunctionName("knnSearch", KnnStream.class)
 
-            // decorator streams
-        .withFunctionName("merge", MergeStream.class)
-        .withFunctionName("unique", UniqueStream.class)
-        .withFunctionName("top", RankStream.class)
-        .withFunctionName("group", GroupOperation.class)
-        .withFunctionName("reduce", ReducerStream.class)
-        .withFunctionName("parallel", ParallelStream.class)
-        .withFunctionName("rollup", RollupStream.class)
-        .withFunctionName("stats", StatsStream.class)
-        .withFunctionName("innerJoin", InnerJoinStream.class)
-        .withFunctionName("leftOuterJoin", LeftOuterJoinStream.class)
-        .withFunctionName("hashJoin", HashJoinStream.class)
-        .withFunctionName("outerHashJoin", OuterHashJoinStream.class)
-        .withFunctionName("intersect", IntersectStream.class)
-        .withFunctionName("complement", ComplementStream.class)
-        .withFunctionName("sort", SortStream.class)
-        .withFunctionName("train", TextLogitStream.class)
-        .withFunctionName("features", FeaturesSelectionStream.class)
-        .withFunctionName("daemon", DaemonStream.class)
-        .withFunctionName("shortestPath", ShortestPathStream.class)
-        .withFunctionName("gatherNodes", GatherNodesStream.class)
-        .withFunctionName("nodes", GatherNodesStream.class)
-        .withFunctionName("select", SelectStream.class)
-        .withFunctionName("shortestPath", ShortestPathStream.class)
-        .withFunctionName("gatherNodes", GatherNodesStream.class)
-        .withFunctionName("nodes", GatherNodesStream.class)
-        .withFunctionName("scoreNodes", ScoreNodesStream.class)
-        .withFunctionName("model", ModelStream.class)
-        .withFunctionName("fetch", FetchStream.class)
-        .withFunctionName("executor", ExecutorStream.class)
-        .withFunctionName("null", NullStream.class)
-        .withFunctionName("priority", PriorityStream.class)
-        .withFunctionName("significantTerms", SignificantTermsStream.class)
-        .withFunctionName("cartesianProduct", CartesianProductStream.class)
-        .withFunctionName("shuffle", ShuffleStream.class)
-        .withFunctionName("export", ShuffleStream.class)
-        .withFunctionName("calc", CalculatorStream.class)
-        .withFunctionName("eval", EvalStream.class)
-        .withFunctionName("echo", EchoStream.class)
-        .withFunctionName("cell", CellStream.class)
-        .withFunctionName("list", ListStream.class)
-        .withFunctionName("let", LetStream.class)
-        .withFunctionName("get", GetStream.class)
-        .withFunctionName("timeseries", TimeSeriesStream.class)
-        .withFunctionName("tuple", TupStream.class)
-        .withFunctionName("sql", SqlStream.class)
-        .withFunctionName("plist", ParallelListStream.class)
-        .withFunctionName("zplot", ZplotStream.class)
-        .withFunctionName("hashRollup", HashRollupStream.class)
+        // decorator streams
+        .withFunctionName("merge", MergeStream.class).withFunctionName("unique", UniqueStream.class).withFunctionName("top", RankStream.class).withFunctionName("group", GroupOperation.class)
+        .withFunctionName("reduce", ReducerStream.class).withFunctionName("parallel", ParallelStream.class).withFunctionName("rollup", RollupStream.class).withFunctionName("stats", StatsStream.class)
+        .withFunctionName("innerJoin", InnerJoinStream.class).withFunctionName("leftOuterJoin", LeftOuterJoinStream.class).withFunctionName("hashJoin", HashJoinStream.class)
+        .withFunctionName("outerHashJoin", OuterHashJoinStream.class).withFunctionName("intersect", IntersectStream.class).withFunctionName("complement", ComplementStream.class)
+        .withFunctionName("sort", SortStream.class).withFunctionName("train", TextLogitStream.class).withFunctionName("features", FeaturesSelectionStream.class)
+        .withFunctionName("daemon", DaemonStream.class).withFunctionName("shortestPath", ShortestPathStream.class).withFunctionName("gatherNodes", GatherNodesStream.class)
+        .withFunctionName("nodes", GatherNodesStream.class).withFunctionName("select", SelectStream.class).withFunctionName("shortestPath", ShortestPathStream.class)
+        .withFunctionName("gatherNodes", GatherNodesStream.class).withFunctionName("nodes", GatherNodesStream.class).withFunctionName("scoreNodes", ScoreNodesStream.class)
+        .withFunctionName("model", ModelStream.class).withFunctionName("fetch", FetchStream.class).withFunctionName("executor", ExecutorStream.class).withFunctionName("null", NullStream.class)
+        .withFunctionName("priority", PriorityStream.class).withFunctionName("significantTerms", SignificantTermsStream.class).withFunctionName("cartesianProduct", CartesianProductStream.class)
+        .withFunctionName("shuffle", ShuffleStream.class).withFunctionName("export", ShuffleStream.class).withFunctionName("calc", CalculatorStream.class).withFunctionName("eval", EvalStream.class)
+        .withFunctionName("echo", EchoStream.class).withFunctionName("cell", CellStream.class).withFunctionName("list", ListStream.class).withFunctionName("let", LetStream.class)
+        .withFunctionName("get", GetStream.class).withFunctionName("timeseries", TimeSeriesStream.class).withFunctionName("tuple", TupStream.class).withFunctionName("sql", SqlStream.class)
+        .withFunctionName("plist", ParallelListStream.class).withFunctionName("zplot", ZplotStream.class).withFunctionName("hashRollup", HashRollupStream.class)
         .withFunctionName("noop", NoOpStream.class)
 
         // metrics
-        .withFunctionName("min", MinMetric.class)
-        .withFunctionName("max", MaxMetric.class)
-        .withFunctionName("avg", MeanMetric.class)
-        .withFunctionName("sum", SumMetric.class)
-        .withFunctionName("per", PercentileMetric.class)
-        .withFunctionName("std", StdMetric.class)
-        .withFunctionName("count", CountMetric.class)
+        .withFunctionName("min", MinMetric.class).withFunctionName("max", MaxMetric.class).withFunctionName("avg", MeanMetric.class).withFunctionName("sum", SumMetric.class)
+        .withFunctionName("per", PercentileMetric.class).withFunctionName("std", StdMetric.class).withFunctionName("count", CountMetric.class)
 
-            // tuple manipulation operations
+        // tuple manipulation operations
         .withFunctionName("replace", ReplaceOperation.class)
 
-            // stream reduction operations
-        .withFunctionName("group", GroupOperation.class)
-        .withFunctionName("distinct", DistinctOperation.class)
-        .withFunctionName("having", HavingStream.class)
+        // stream reduction operations
+        .withFunctionName("group", GroupOperation.class).withFunctionName("distinct", DistinctOperation.class).withFunctionName("having", HavingStream.class)
 
-            // Stream Evaluators
+        // Stream Evaluators
         .withFunctionName("val", RawValueEvaluator.class)
 
-            // New Evaluators
-        .withFunctionName("anova", AnovaEvaluator.class)
-        .withFunctionName("array", ArrayEvaluator.class)
-        .withFunctionName("col", ColumnEvaluator.class)
-        .withFunctionName("conv", ConvolutionEvaluator.class)
-        .withFunctionName("copyOfRange", CopyOfRangeEvaluator.class)
-        .withFunctionName("copyOf", CopyOfEvaluator.class)
-        .withFunctionName("cov", CovarianceEvaluator.class)
-        .withFunctionName("corr", CorrelationEvaluator.class)
-        .withFunctionName("describe", DescribeEvaluator.class)
-        .withFunctionName("distance", DistanceEvaluator.class)
-        .withFunctionName("empiricalDistribution", EmpiricalDistributionEvaluator.class)
-        .withFunctionName("finddelay", FindDelayEvaluator.class)
-        .withFunctionName("hist", HistogramEvaluator.class)
-        .withFunctionName("length", LengthEvaluator.class)
-        .withFunctionName("movingAvg", MovingAverageEvaluator.class)
-        .withFunctionName("standardize", NormalizeEvaluator.class)
-        .withFunctionName("percentile", PercentileEvaluator.class)
-        .withFunctionName("predict", PredictEvaluator.class)
-        .withFunctionName("rank", RankEvaluator.class)
-        .withFunctionName("regress", RegressionEvaluator.class)
-        .withFunctionName("rev", ReverseEvaluator.class)
-        .withFunctionName("scale", ScaleEvaluator.class)
-        .withFunctionName("sequence", SequenceEvaluator.class)
-        .withFunctionName("addAll", AppendEvaluator.class)
-        .withFunctionName("append", AppendEvaluator.class)
-        .withFunctionName("plot", PlotStream.class)
-        .withFunctionName("normalDistribution", NormalDistributionEvaluator.class)
-        .withFunctionName("uniformDistribution", UniformDistributionEvaluator.class)
-        .withFunctionName("sample", SampleEvaluator.class)
-        .withFunctionName("kolmogorovSmirnov", KolmogorovSmirnovEvaluator.class)
-        .withFunctionName("ks", KolmogorovSmirnovEvaluator.class)
-        .withFunctionName("asc", AscEvaluator.class)
-        .withFunctionName("cumulativeProbability", CumulativeProbabilityEvaluator.class)
-        .withFunctionName("ebeAdd", EBEAddEvaluator.class)
-        .withFunctionName("ebeSubtract", EBESubtractEvaluator.class)
-        .withFunctionName("ebeMultiply", EBEMultiplyEvaluator.class)
-        .withFunctionName("ebeDivide", EBEDivideEvaluator.class)
-        .withFunctionName("dotProduct", DotProductEvaluator.class)
-        .withFunctionName("cosineSimilarity", CosineSimilarityEvaluator.class)
-        .withFunctionName("freqTable", FrequencyTableEvaluator.class)
-        .withFunctionName("uniformIntegerDistribution", UniformIntegerDistributionEvaluator.class)
-        .withFunctionName("binomialDistribution", BinomialDistributionEvaluator.class)
-        .withFunctionName("poissonDistribution", PoissonDistributionEvaluator.class)
-        .withFunctionName("enumeratedDistribution", EnumeratedDistributionEvaluator.class)
-        .withFunctionName("probability", ProbabilityEvaluator.class)
-        .withFunctionName("sumDifference", SumDifferenceEvaluator.class)
-        .withFunctionName("meanDifference", MeanDifferenceEvaluator.class)
-        .withFunctionName("primes", PrimesEvaluator.class)
-        .withFunctionName("factorial", FactorialEvaluator.class)
-        .withFunctionName("movingMedian", MovingMedianEvaluator.class)
-        .withFunctionName("binomialCoefficient", BinomialCoefficientEvaluator.class)
-        .withFunctionName("expMovingAvg", ExponentialMovingAverageEvaluator.class)
-        .withFunctionName("monteCarlo", MonteCarloEvaluator.class)
-        .withFunctionName("constantDistribution", ConstantDistributionEvaluator.class)
-        .withFunctionName("weibullDistribution", WeibullDistributionEvaluator.class)
-        .withFunctionName("mean", MeanEvaluator.class)
-        .withFunctionName("var", VarianceEvaluator.class)
-        .withFunctionName("stddev", StandardDeviationEvaluator.class)
-        .withFunctionName("mode", ModeEvaluator.class)
-        .withFunctionName("logNormalDistribution", LogNormalDistributionEvaluator.class)
-        .withFunctionName("zipFDistribution", ZipFDistributionEvaluator.class)
-        .withFunctionName("gammaDistribution", GammaDistributionEvaluator.class)
-        .withFunctionName("betaDistribution", BetaDistributionEvaluator.class)
-        .withFunctionName("polyfit", PolyFitEvaluator.class)
-        .withFunctionName("harmonicFit", HarmonicFitEvaluator.class)
-        .withFunctionName("harmfit", HarmonicFitEvaluator.class)
-        .withFunctionName("loess", LoessEvaluator.class)
-        .withFunctionName("matrix", MatrixEvaluator.class)
-        .withFunctionName("transpose", TransposeEvaluator.class)
-        .withFunctionName("unitize", UnitEvaluator.class)
-        .withFunctionName("triangularDistribution", TriangularDistributionEvaluator.class)
-        .withFunctionName("precision", PrecisionEvaluator.class)
-        .withFunctionName("minMaxScale", MinMaxScaleEvaluator.class)
-        .withFunctionName("markovChain", MarkovChainEvaluator.class)
-        .withFunctionName("grandSum", GrandSumEvaluator.class)
-        .withFunctionName("scalarAdd", ScalarAddEvaluator.class)
-        .withFunctionName("scalarSubtract", ScalarSubtractEvaluator.class)
-        .withFunctionName("scalarMultiply", ScalarMultiplyEvaluator.class)
-        .withFunctionName("scalarDivide", ScalarDivideEvaluator.class)
-        .withFunctionName("sumRows", SumRowsEvaluator.class)
-        .withFunctionName("sumColumns", SumColumnsEvaluator.class)
-        .withFunctionName("diff", TimeDifferencingEvaluator.class)
-        .withFunctionName("corrPValues", CorrelationSignificanceEvaluator.class)
-        .withFunctionName("normalizeSum", NormalizeSumEvaluator.class)
-        .withFunctionName("geometricDistribution", GeometricDistributionEvaluator.class)
-        .withFunctionName("olsRegress", OLSRegressionEvaluator.class)
-        .withFunctionName("derivative", DerivativeEvaluator.class)
-        .withFunctionName("spline", SplineEvaluator.class)
-        .withFunctionName("ttest", TTestEvaluator.class)
-        .withFunctionName("pairedTtest", PairedTTestEvaluator.class)
-        .withFunctionName("multiVariateNormalDistribution", MultiVariateNormalDistributionEvaluator.class)
-        .withFunctionName("integral", IntegrateEvaluator.class)
-        .withFunctionName("density", DensityEvaluator.class)
-        .withFunctionName("mannWhitney", MannWhitneyUEvaluator.class)
-        .withFunctionName("sumSq", SumSqEvaluator.class)
-        .withFunctionName("akima", AkimaEvaluator.class)
-        .withFunctionName("lerp", LerpEvaluator.class)
-        .withFunctionName("chiSquareDataSet", ChiSquareDataSetEvaluator.class)
-        .withFunctionName("gtestDataSet", GTestDataSetEvaluator.class)
-        .withFunctionName("termVectors", TermVectorsEvaluator.class)
-        .withFunctionName("getColumnLabels", GetColumnLabelsEvaluator.class)
-        .withFunctionName("getRowLabels", GetRowLabelsEvaluator.class)
-        .withFunctionName("getAttribute", GetAttributeEvaluator.class)
-        .withFunctionName("kmeans", KmeansEvaluator.class)
-        .withFunctionName("getCentroids", GetCentroidsEvaluator.class)
-        .withFunctionName("getCluster", GetClusterEvaluator.class)
-        .withFunctionName("topFeatures", TopFeaturesEvaluator.class)
-        .withFunctionName("featureSelect", FeatureSelectEvaluator.class)
-        .withFunctionName("rowAt", RowAtEvaluator.class)
-        .withFunctionName("colAt", ColumnAtEvaluator.class)
-        .withFunctionName("setColumnLabels", SetColumnLabelsEvaluator.class)
-        .withFunctionName("setRowLabels", SetRowLabelsEvaluator.class)
-        .withFunctionName("knn", KnnEvaluator.class)
-        .withFunctionName("getAttributes", GetAttributesEvaluator.class)
-        .withFunctionName("indexOf", IndexOfEvaluator.class)
-        .withFunctionName("columnCount", ColumnCountEvaluator.class)
-        .withFunctionName("rowCount", RowCountEvaluator.class)
-        .withFunctionName("fuzzyKmeans", FuzzyKmeansEvaluator.class)
-        .withFunctionName("getMembershipMatrix", GetMembershipMatrixEvaluator.class)
-        .withFunctionName("multiKmeans", MultiKmeansEvaluator.class)
-        .withFunctionName("l2norm", NormEvaluator.class)
-        .withFunctionName("l1norm", L1NormEvaluator.class)
-        .withFunctionName("linfnorm", LInfNormEvaluator.class)
-        .withFunctionName("matrixMult", MatrixMultiplyEvaluator.class)
-        .withFunctionName("bicubicSpline", BicubicSplineEvaluator.class)
-        .withFunctionName("valueAt", ValueAtEvaluator.class)
-        .withFunctionName("memset", MemsetEvaluator.class)
-        .withFunctionName("fft", FFTEvaluator.class)
-        .withFunctionName("ifft", IFFTEvaluator.class)
-        .withFunctionName("manhattan", ManhattanEvaluator.class)
-        .withFunctionName("canberra", CanberraEvaluator.class)
-        .withFunctionName("earthMovers", EarthMoversEvaluator.class)
-        .withFunctionName("euclidean", EuclideanEvaluator.class)
-        .withFunctionName("chebyshev", ChebyshevEvaluator.class)
-        .withFunctionName("ones", OnesEvaluator.class)
-        .withFunctionName("zeros", ZerosEvaluator.class)
-        .withFunctionName("getValue", GetValueEvaluator.class)
-        .withFunctionName("setValue", SetValueEvaluator.class)
-        .withFunctionName("knnRegress", KnnRegressionEvaluator.class)
-        .withFunctionName("gaussfit", GaussFitEvaluator.class)
-        .withFunctionName("outliers", OutliersEvaluator.class)
-        .withFunctionName("stream", GetStream.class)
-        .withFunctionName("putCache", PutCacheEvaluator.class)
-        .withFunctionName("getCache", GetCacheEvaluator.class)
-        .withFunctionName("removeCache", RemoveCacheEvaluator.class)
-        .withFunctionName("listCache", ListCacheEvaluator.class)
-        .withFunctionName("zscores", NormalizeEvaluator.class)
-        .withFunctionName("latlonVectors", LatLonVectorsEvaluator.class)
-        .withFunctionName("convexHull", ConvexHullEvaluator.class)
-        .withFunctionName("getVertices", GetVerticesEvaluator.class)
-        .withFunctionName("getBaryCenter", GetBaryCenterEvaluator.class)
-        .withFunctionName("getArea", GetAreaEvaluator.class)
-        .withFunctionName("getBoundarySize", GetBoundarySizeEvaluator.class)
-        .withFunctionName("oscillate", OscillateEvaluator.class)
-        .withFunctionName("getAmplitude", GetAmplitudeEvaluator.class)
-        .withFunctionName("getPhase", GetPhaseEvaluator.class)
-        .withFunctionName("getAngularFrequency", GetAngularFrequencyEvaluator.class)
-        .withFunctionName("enclosingDisk", EnclosingDiskEvaluator.class)
-        .withFunctionName("getCenter", GetCenterEvaluator.class)
-        .withFunctionName("getRadius", GetRadiusEvaluator.class)
-        .withFunctionName("getSupportPoints", GetSupportPointsEvaluator.class)
-        .withFunctionName("pairSort", PairSortEvaluator.class)
-        .withFunctionName("recip", RecipEvaluator.class)
-        .withFunctionName("pivot", PivotEvaluator.class)
-        .withFunctionName("ltrim", LeftShiftEvaluator.class)
-        .withFunctionName("rtrim", RightShiftEvaluator.class)
-        .withFunctionName("repeat", RepeatEvaluator.class)
-        .withFunctionName("natural", NaturalEvaluator.class)
-        .withFunctionName("movingMAD", MovingMADEvaluator.class)
-        .withFunctionName("recNum", RecNumEvaluator.class)
-        .withFunctionName("notNull", NotNullEvaluator.class)
-        .withFunctionName("isNull", IsNullEvaluator.class)
-        .withFunctionName("matches", MatchesEvaluator.class)
-        .withFunctionName("projectToBorder", ProjectToBorderEvaluator.class)
-        .withFunctionName("parseCSV", CsvStream.class)
-        .withFunctionName("parseTSV", TsvStream.class)
-        .withFunctionName("double", DoubleEvaluator.class)
-        .withFunctionName("long", LongEvaluator.class)
-        .withFunctionName("dateTime", DateEvaluator.class)
-        .withFunctionName("concat", ConcatEvaluator.class)
-        .withFunctionName("lower", LowerEvaluator.class)
-        .withFunctionName("upper", UpperEvaluator.class)
-        .withFunctionName("split", SplitEvaluator.class)
-        .withFunctionName("trim", TrimEvaluator.class)
-        .withFunctionName("cosine", CosineDistanceEvaluator.class)
-        .withFunctionName("trunc", TruncEvaluator.class)
-        .withFunctionName("dbscan", DbscanEvaluator.class)
+        // New Evaluators
+        .withFunctionName("anova", AnovaEvaluator.class).withFunctionName("array", ArrayEvaluator.class).withFunctionName("col", ColumnEvaluator.class)
+        .withFunctionName("conv", ConvolutionEvaluator.class).withFunctionName("copyOfRange", CopyOfRangeEvaluator.class).withFunctionName("copyOf", CopyOfEvaluator.class)
+        .withFunctionName("cov", CovarianceEvaluator.class).withFunctionName("corr", CorrelationEvaluator.class).withFunctionName("describe", DescribeEvaluator.class)
+        .withFunctionName("distance", DistanceEvaluator.class).withFunctionName("empiricalDistribution", EmpiricalDistributionEvaluator.class).withFunctionName("finddelay", FindDelayEvaluator.class)
+        .withFunctionName("hist", HistogramEvaluator.class).withFunctionName("length", LengthEvaluator.class).withFunctionName("movingAvg", MovingAverageEvaluator.class)
+        .withFunctionName("standardize", NormalizeEvaluator.class).withFunctionName("percentile", PercentileEvaluator.class).withFunctionName("predict", PredictEvaluator.class)
+        .withFunctionName("rank", RankEvaluator.class).withFunctionName("regress", RegressionEvaluator.class).withFunctionName("rev", ReverseEvaluator.class)
+        .withFunctionName("scale", ScaleEvaluator.class).withFunctionName("sequence", SequenceEvaluator.class).withFunctionName("addAll", AppendEvaluator.class)
+        .withFunctionName("append", AppendEvaluator.class).withFunctionName("plot", PlotStream.class).withFunctionName("normalDistribution", NormalDistributionEvaluator.class)
+        .withFunctionName("uniformDistribution", UniformDistributionEvaluator.class).withFunctionName("sample", SampleEvaluator.class)
+        .withFunctionName("kolmogorovSmirnov", KolmogorovSmirnovEvaluator.class).withFunctionName("ks", KolmogorovSmirnovEvaluator.class).withFunctionName("asc", AscEvaluator.class)
+        .withFunctionName("cumulativeProbability", CumulativeProbabilityEvaluator.class).withFunctionName("ebeAdd", EBEAddEvaluator.class).withFunctionName("ebeSubtract", EBESubtractEvaluator.class)
+        .withFunctionName("ebeMultiply", EBEMultiplyEvaluator.class).withFunctionName("ebeDivide", EBEDivideEvaluator.class).withFunctionName("dotProduct", DotProductEvaluator.class)
+        .withFunctionName("cosineSimilarity", CosineSimilarityEvaluator.class).withFunctionName("freqTable", FrequencyTableEvaluator.class)
+        .withFunctionName("uniformIntegerDistribution", UniformIntegerDistributionEvaluator.class).withFunctionName("binomialDistribution", BinomialDistributionEvaluator.class)
+        .withFunctionName("poissonDistribution", PoissonDistributionEvaluator.class).withFunctionName("enumeratedDistribution", EnumeratedDistributionEvaluator.class)
+        .withFunctionName("probability", ProbabilityEvaluator.class).withFunctionName("sumDifference", SumDifferenceEvaluator.class).withFunctionName("meanDifference", MeanDifferenceEvaluator.class)
+        .withFunctionName("primes", PrimesEvaluator.class).withFunctionName("factorial", FactorialEvaluator.class).withFunctionName("movingMedian", MovingMedianEvaluator.class)
+        .withFunctionName("binomialCoefficient", BinomialCoefficientEvaluator.class).withFunctionName("expMovingAvg", ExponentialMovingAverageEvaluator.class)
+        .withFunctionName("monteCarlo", MonteCarloEvaluator.class).withFunctionName("constantDistribution", ConstantDistributionEvaluator.class)
+        .withFunctionName("weibullDistribution", WeibullDistributionEvaluator.class).withFunctionName("mean", MeanEvaluator.class).withFunctionName("var", VarianceEvaluator.class)
+        .withFunctionName("stddev", StandardDeviationEvaluator.class).withFunctionName("mode", ModeEvaluator.class).withFunctionName("logNormalDistribution", LogNormalDistributionEvaluator.class)
+        .withFunctionName("zipFDistribution", ZipFDistributionEvaluator.class).withFunctionName("gammaDistribution", GammaDistributionEvaluator.class)
+        .withFunctionName("betaDistribution", BetaDistributionEvaluator.class).withFunctionName("polyfit", PolyFitEvaluator.class).withFunctionName("harmonicFit", HarmonicFitEvaluator.class)
+        .withFunctionName("harmfit", HarmonicFitEvaluator.class).withFunctionName("loess", LoessEvaluator.class).withFunctionName("matrix", MatrixEvaluator.class)
+        .withFunctionName("transpose", TransposeEvaluator.class).withFunctionName("unitize", UnitEvaluator.class).withFunctionName("triangularDistribution", TriangularDistributionEvaluator.class)
+        .withFunctionName("precision", PrecisionEvaluator.class).withFunctionName("minMaxScale", MinMaxScaleEvaluator.class).withFunctionName("markovChain", MarkovChainEvaluator.class)
+        .withFunctionName("grandSum", GrandSumEvaluator.class).withFunctionName("scalarAdd", ScalarAddEvaluator.class).withFunctionName("scalarSubtract", ScalarSubtractEvaluator.class)
+        .withFunctionName("scalarMultiply", ScalarMultiplyEvaluator.class).withFunctionName("scalarDivide", ScalarDivideEvaluator.class).withFunctionName("sumRows", SumRowsEvaluator.class)
+        .withFunctionName("sumColumns", SumColumnsEvaluator.class).withFunctionName("diff", TimeDifferencingEvaluator.class).withFunctionName("corrPValues", CorrelationSignificanceEvaluator.class)
+        .withFunctionName("normalizeSum", NormalizeSumEvaluator.class).withFunctionName("geometricDistribution", GeometricDistributionEvaluator.class)
+        .withFunctionName("olsRegress", OLSRegressionEvaluator.class).withFunctionName("derivative", DerivativeEvaluator.class).withFunctionName("spline", SplineEvaluator.class)
+        .withFunctionName("ttest", TTestEvaluator.class).withFunctionName("pairedTtest", PairedTTestEvaluator.class)
+        .withFunctionName("multiVariateNormalDistribution", MultiVariateNormalDistributionEvaluator.class).withFunctionName("integral", IntegrateEvaluator.class)
+        .withFunctionName("density", DensityEvaluator.class).withFunctionName("mannWhitney", MannWhitneyUEvaluator.class).withFunctionName("sumSq", SumSqEvaluator.class)
+        .withFunctionName("akima", AkimaEvaluator.class).withFunctionName("lerp", LerpEvaluator.class).withFunctionName("chiSquareDataSet", ChiSquareDataSetEvaluator.class)
+        .withFunctionName("gtestDataSet", GTestDataSetEvaluator.class).withFunctionName("termVectors", TermVectorsEvaluator.class).withFunctionName("getColumnLabels", GetColumnLabelsEvaluator.class)
+        .withFunctionName("getRowLabels", GetRowLabelsEvaluator.class).withFunctionName("getAttribute", GetAttributeEvaluator.class).withFunctionName("kmeans", KmeansEvaluator.class)
+        .withFunctionName("getCentroids", GetCentroidsEvaluator.class).withFunctionName("getCluster", GetClusterEvaluator.class).withFunctionName("topFeatures", TopFeaturesEvaluator.class)
+        .withFunctionName("featureSelect", FeatureSelectEvaluator.class).withFunctionName("rowAt", RowAtEvaluator.class).withFunctionName("colAt", ColumnAtEvaluator.class)
+        .withFunctionName("setColumnLabels", SetColumnLabelsEvaluator.class).withFunctionName("setRowLabels", SetRowLabelsEvaluator.class).withFunctionName("knn", KnnEvaluator.class)
+        .withFunctionName("getAttributes", GetAttributesEvaluator.class).withFunctionName("indexOf", IndexOfEvaluator.class).withFunctionName("columnCount", ColumnCountEvaluator.class)
+        .withFunctionName("rowCount", RowCountEvaluator.class).withFunctionName("fuzzyKmeans", FuzzyKmeansEvaluator.class).withFunctionName("getMembershipMatrix", GetMembershipMatrixEvaluator.class)
+        .withFunctionName("multiKmeans", MultiKmeansEvaluator.class).withFunctionName("l2norm", NormEvaluator.class).withFunctionName("l1norm", L1NormEvaluator.class)
+        .withFunctionName("linfnorm", LInfNormEvaluator.class).withFunctionName("matrixMult", MatrixMultiplyEvaluator.class).withFunctionName("bicubicSpline", BicubicSplineEvaluator.class)
+        .withFunctionName("valueAt", ValueAtEvaluator.class).withFunctionName("memset", MemsetEvaluator.class).withFunctionName("fft", FFTEvaluator.class).withFunctionName("ifft", IFFTEvaluator.class)
+        .withFunctionName("manhattan", ManhattanEvaluator.class).withFunctionName("canberra", CanberraEvaluator.class).withFunctionName("earthMovers", EarthMoversEvaluator.class)
+        .withFunctionName("euclidean", EuclideanEvaluator.class).withFunctionName("chebyshev", ChebyshevEvaluator.class).withFunctionName("ones", OnesEvaluator.class)
+        .withFunctionName("zeros", ZerosEvaluator.class).withFunctionName("getValue", GetValueEvaluator.class).withFunctionName("setValue", SetValueEvaluator.class)
+        .withFunctionName("knnRegress", KnnRegressionEvaluator.class).withFunctionName("gaussfit", GaussFitEvaluator.class).withFunctionName("outliers", OutliersEvaluator.class)
+        .withFunctionName("stream", GetStream.class).withFunctionName("putCache", PutCacheEvaluator.class).withFunctionName("getCache", GetCacheEvaluator.class)
+        .withFunctionName("removeCache", RemoveCacheEvaluator.class).withFunctionName("listCache", ListCacheEvaluator.class).withFunctionName("zscores", NormalizeEvaluator.class)
+        .withFunctionName("latlonVectors", LatLonVectorsEvaluator.class).withFunctionName("convexHull", ConvexHullEvaluator.class).withFunctionName("getVertices", GetVerticesEvaluator.class)
+        .withFunctionName("getBaryCenter", GetBaryCenterEvaluator.class).withFunctionName("getArea", GetAreaEvaluator.class).withFunctionName("getBoundarySize", GetBoundarySizeEvaluator.class)
+        .withFunctionName("oscillate", OscillateEvaluator.class).withFunctionName("getAmplitude", GetAmplitudeEvaluator.class).withFunctionName("getPhase", GetPhaseEvaluator.class)
+        .withFunctionName("getAngularFrequency", GetAngularFrequencyEvaluator.class).withFunctionName("enclosingDisk", EnclosingDiskEvaluator.class)
+        .withFunctionName("getCenter", GetCenterEvaluator.class).withFunctionName("getRadius", GetRadiusEvaluator.class).withFunctionName("getSupportPoints", GetSupportPointsEvaluator.class)
+        .withFunctionName("pairSort", PairSortEvaluator.class).withFunctionName("recip", RecipEvaluator.class).withFunctionName("pivot", PivotEvaluator.class)
+        .withFunctionName("ltrim", LeftShiftEvaluator.class).withFunctionName("rtrim", RightShiftEvaluator.class).withFunctionName("repeat", RepeatEvaluator.class)
+        .withFunctionName("natural", NaturalEvaluator.class).withFunctionName("movingMAD", MovingMADEvaluator.class).withFunctionName("recNum", RecNumEvaluator.class)
+        .withFunctionName("notNull", NotNullEvaluator.class).withFunctionName("isNull", IsNullEvaluator.class).withFunctionName("matches", MatchesEvaluator.class)
+        .withFunctionName("projectToBorder", ProjectToBorderEvaluator.class).withFunctionName("parseCSV", CsvStream.class).withFunctionName("parseTSV", TsvStream.class)
+        .withFunctionName("double", DoubleEvaluator.class).withFunctionName("long", LongEvaluator.class).withFunctionName("dateTime", DateEvaluator.class)
+        .withFunctionName("concat", ConcatEvaluator.class).withFunctionName("lower", LowerEvaluator.class).withFunctionName("upper", UpperEvaluator.class)
+        .withFunctionName("split", SplitEvaluator.class).withFunctionName("trim", TrimEvaluator.class).withFunctionName("cosine", CosineDistanceEvaluator.class)
+        .withFunctionName("trunc", TruncEvaluator.class).withFunctionName("dbscan", DbscanEvaluator.class)
         // Boolean Stream Evaluators
 
-        .withFunctionName("and", AndEvaluator.class)
-        .withFunctionName("eor", ExclusiveOrEvaluator.class)
-        .withFunctionName("eq", EqualToEvaluator.class)
-        .withFunctionName("gt", GreaterThanEvaluator.class)
-        .withFunctionName("gteq", GreaterThanEqualToEvaluator.class)
-        .withFunctionName("lt", LessThanEvaluator.class)
-        .withFunctionName("lteq", LessThanEqualToEvaluator.class)
-        .withFunctionName("not", NotEvaluator.class)
-        .withFunctionName("or", OrEvaluator.class)
+        .withFunctionName("and", AndEvaluator.class).withFunctionName("eor", ExclusiveOrEvaluator.class).withFunctionName("eq", EqualToEvaluator.class)
+        .withFunctionName("gt", GreaterThanEvaluator.class).withFunctionName("gteq", GreaterThanEqualToEvaluator.class).withFunctionName("lt", LessThanEvaluator.class)
+        .withFunctionName("lteq", LessThanEqualToEvaluator.class).withFunctionName("not", NotEvaluator.class).withFunctionName("or", OrEvaluator.class)
 
-            // Date Time Evaluators
-        .withFunctionName(TemporalEvaluatorYear.FUNCTION_NAME, TemporalEvaluatorYear.class)
-        .withFunctionName(TemporalEvaluatorMonth.FUNCTION_NAME, TemporalEvaluatorMonth.class)
-        .withFunctionName(TemporalEvaluatorDay.FUNCTION_NAME, TemporalEvaluatorDay.class)
-        .withFunctionName(TemporalEvaluatorDayOfYear.FUNCTION_NAME, TemporalEvaluatorDayOfYear.class)
-        .withFunctionName(TemporalEvaluatorHour.FUNCTION_NAME, TemporalEvaluatorHour.class)
-        .withFunctionName(TemporalEvaluatorMinute.FUNCTION_NAME, TemporalEvaluatorMinute.class)
-        .withFunctionName(TemporalEvaluatorSecond.FUNCTION_NAME, TemporalEvaluatorSecond.class)
-        .withFunctionName(TemporalEvaluatorEpoch.FUNCTION_NAME, TemporalEvaluatorEpoch.class)
-        .withFunctionName(TemporalEvaluatorWeek.FUNCTION_NAME, TemporalEvaluatorWeek.class)
-        .withFunctionName(TemporalEvaluatorQuarter.FUNCTION_NAME, TemporalEvaluatorQuarter.class)
+        // Date Time Evaluators
+        .withFunctionName(TemporalEvaluatorYear.FUNCTION_NAME, TemporalEvaluatorYear.class).withFunctionName(TemporalEvaluatorMonth.FUNCTION_NAME, TemporalEvaluatorMonth.class)
+        .withFunctionName(TemporalEvaluatorDay.FUNCTION_NAME, TemporalEvaluatorDay.class).withFunctionName(TemporalEvaluatorDayOfYear.FUNCTION_NAME, TemporalEvaluatorDayOfYear.class)
+        .withFunctionName(TemporalEvaluatorHour.FUNCTION_NAME, TemporalEvaluatorHour.class).withFunctionName(TemporalEvaluatorMinute.FUNCTION_NAME, TemporalEvaluatorMinute.class)
+        .withFunctionName(TemporalEvaluatorSecond.FUNCTION_NAME, TemporalEvaluatorSecond.class).withFunctionName(TemporalEvaluatorEpoch.FUNCTION_NAME, TemporalEvaluatorEpoch.class)
+        .withFunctionName(TemporalEvaluatorWeek.FUNCTION_NAME, TemporalEvaluatorWeek.class).withFunctionName(TemporalEvaluatorQuarter.FUNCTION_NAME, TemporalEvaluatorQuarter.class)
         .withFunctionName(TemporalEvaluatorDayOfQuarter.FUNCTION_NAME, TemporalEvaluatorDayOfQuarter.class)
 
-            // Number Stream Evaluators
-        .withFunctionName("abs", AbsoluteValueEvaluator.class)
-        .withFunctionName("add", AddEvaluator.class)
-        .withFunctionName("div", DivideEvaluator.class)
-        .withFunctionName("mult", MultiplyEvaluator.class)
-        .withFunctionName("sub", SubtractEvaluator.class)
-        .withFunctionName("log", NaturalLogEvaluator.class)
-        .withFunctionName("log10", Log10Evaluator.class)
-        .withFunctionName("pow", PowerEvaluator.class)
-        .withFunctionName("mod", ModuloEvaluator.class)
-        .withFunctionName("ceil", CeilingEvaluator.class)
-        .withFunctionName("floor", FloorEvaluator.class)
-        .withFunctionName("sin", SineEvaluator.class)
-        .withFunctionName("asin", ArcSineEvaluator.class)
-        .withFunctionName("sinh", HyperbolicSineEvaluator.class)
-        .withFunctionName("cos", CosineEvaluator.class)
-        .withFunctionName("acos", ArcCosineEvaluator.class)
-        .withFunctionName("cosh", HyperbolicCosineEvaluator.class)
-        .withFunctionName("tan", TangentEvaluator.class)
-        .withFunctionName("atan", ArcTangentEvaluator.class)
-        .withFunctionName("tanh", HyperbolicTangentEvaluator.class)
-        .withFunctionName("round", RoundEvaluator.class)
-        .withFunctionName("sqrt", SquareRootEvaluator.class)
-        .withFunctionName("cbrt", CubedRootEvaluator.class)
-        .withFunctionName("coalesce", CoalesceEvaluator.class)
-        .withFunctionName("uuid", UuidEvaluator.class)
+        // Number Stream Evaluators
+        .withFunctionName("abs", AbsoluteValueEvaluator.class).withFunctionName("add", AddEvaluator.class).withFunctionName("div", DivideEvaluator.class)
+        .withFunctionName("mult", MultiplyEvaluator.class).withFunctionName("sub", SubtractEvaluator.class).withFunctionName("log", NaturalLogEvaluator.class)
+        .withFunctionName("log10", Log10Evaluator.class).withFunctionName("pow", PowerEvaluator.class).withFunctionName("mod", ModuloEvaluator.class).withFunctionName("ceil", CeilingEvaluator.class)
+        .withFunctionName("floor", FloorEvaluator.class).withFunctionName("sin", SineEvaluator.class).withFunctionName("asin", ArcSineEvaluator.class)
+        .withFunctionName("sinh", HyperbolicSineEvaluator.class).withFunctionName("cos", CosineEvaluator.class).withFunctionName("acos", ArcCosineEvaluator.class)
+        .withFunctionName("cosh", HyperbolicCosineEvaluator.class).withFunctionName("tan", TangentEvaluator.class).withFunctionName("atan", ArcTangentEvaluator.class)
+        .withFunctionName("tanh", HyperbolicTangentEvaluator.class).withFunctionName("round", RoundEvaluator.class).withFunctionName("sqrt", SquareRootEvaluator.class)
+        .withFunctionName("cbrt", CubedRootEvaluator.class).withFunctionName("coalesce", CoalesceEvaluator.class).withFunctionName("uuid", UuidEvaluator.class)
 
-            // Conditional Stream Evaluators
-        .withFunctionName("if", IfThenElseEvaluator.class)
-        .withFunctionName("convert", ConversionEvaluator.class);
+        // Conditional Stream Evaluators
+        .withFunctionName("if", IfThenElseEvaluator.class).withFunctionName("convert", ConversionEvaluator.class);
+  }
+
+  public static void register(StreamFactory streamFactory) {
+    streamFactory.setFunctionNames(new HashMap<>(baseStreamFactory.getFunctionNames()));
   }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
index 588024f..8b03a5c 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/expr/StreamFactory.java
@@ -46,17 +46,17 @@ import org.apache.solr.client.solrj.io.stream.metrics.Metric;
 public class StreamFactory implements Serializable {
   
   private transient HashMap<String, String> collectionZkHosts;
-  private transient HashMap<String, Supplier<Class<? extends Expressible>>> functionNames;
+  private transient volatile Map<String, Supplier<Class<? extends Expressible>>> functionNames;
   private transient String defaultZkHost;
   private transient String defaultCollection;
   private transient String defaultSort;
   
   public StreamFactory(){
     collectionZkHosts = new HashMap<>();
-    functionNames = new HashMap<>(1200);
+    functionNames = new HashMap<>(400);
   }
 
-  public StreamFactory(HashMap<String, Supplier<Class<? extends Expressible>>> functionNames) {
+  public StreamFactory(Map<String, Supplier<Class<? extends Expressible>>> functionNames) {
     this.functionNames = functionNames;
     collectionZkHosts = new HashMap<>();
   }
@@ -475,4 +475,9 @@ public class StreamFactory implements Serializable {
     // is a string
     return original;
   }
+
+  public void setFunctionNames(Map<String,Supplier<Class<? extends Expressible>>> functionNames) {
+    functionNames.putAll(this.functionNames);
+    this.functionNames = functionNames;
+  }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java b/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
index 6651aa9..f620793 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
@@ -98,7 +98,7 @@ public class SolrZkClient implements Closeable {
   private final ConnectionManager connManager;
 
   // what about ensuring order of state updates per collection??
-  final ExecutorService zkCallbackExecutor = ParWork.getParExecutorService(3, 6, 1, new BlockingArrayQueue());
+  final ExecutorService zkCallbackExecutor = ParWork.getParExecutorService(1, 1, 1, new BlockingArrayQueue());
 
   final ExecutorService zkConnManagerCallbackExecutor = ParWork.getParExecutorService(1, 1, 1, new BlockingArrayQueue());
 
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
index 71f09b7..726278d 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCase.java
@@ -261,7 +261,7 @@ public class SolrTestCase extends LuceneTestCase {
       System.setProperty("zookeeper.nio.shutdownTimeout", "10");
 
       // can make things quite slow
-      System.setProperty("solr.disableJmxReporter", "true");
+      System.setProperty("solr.disableDefaultJmxReporter", "true");
       System.setProperty("solr.skipCommitOnClose", "true");
 
       // can generate tons of URL garbage and can happen too often, defaults to false now anyway