You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2017/06/07 14:11:05 UTC

[01/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10566: Add documentation

Repository: lucene-solr
Updated Branches:
  refs/heads/feature/autoscaling 8bc7c4715 -> d158f694b


SOLR-10566: Add documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6d6e47f1
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6d6e47f1
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6d6e47f1

Branch: refs/heads/feature/autoscaling
Commit: 6d6e47f1965697a830d94836058b7b9ef4d97036
Parents: 71b5d34
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Jun 1 16:26:57 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Jun 1 16:26:57 2017 -0400

----------------------------------------------------------------------
 solr/solr-ref-guide/src/stream-sources.adoc | 31 +++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6d6e47f1/solr/solr-ref-guide/src/stream-sources.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/stream-sources.adoc b/solr/solr-ref-guide/src/stream-sources.adoc
index e7356ae..986a5da 100644
--- a/solr/solr-ref-guide/src/stream-sources.adoc
+++ b/solr/solr-ref-guide/src/stream-sources.adoc
@@ -390,7 +390,36 @@ stats(collection1,
 
 == timeseries
 
-//TODO
+The `timeseries` function builds a time series aggregation. Under the covers the `timeseries` function uses the
+JSON Facet API as its high performance aggregation engine.
+
+=== timeseries Parameters
+
+* `collection`: (Mandatory) Collection the stats will be aggregated from.
+* `q`: (Mandatory) The query to build the aggregations from.
+* `field`: (Mandatory) The date field for the time series.
+* `start`: (Mandatory) The start of the time series expressed in Solr date or date math syntax.
+* `end`: (Mandatory) The end of the time series expressed in Solr date or date math syntax.
+* `gap`: (Mandatory) The time gap between time series aggregation points expressed in Solr date math syntax.
+* `metrics`: (Mandatory) The metrics to include in the result tuple. Current supported metrics are `sum(col)`, `avg(col)`, `min(col)`, `max(col)` and `count(*)`
+
+=== timeseries Syntax
+
+[source,text]
+----
+timeseries(collection1,
+           q=*:*,
+           field="rec_dt"
+           start="NOW-30DAYS",
+           end="NOW",
+           gap="+1DAY",
+           sum(a_i),
+           max(a_i),
+           max(a_f),
+           avg(a_i),
+           avg(a_f),
+           count(*))
+----
 
 == train
 


[27/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-7452: fix facet refinement for method:dvhash

Posted by sh...@apache.org.
SOLR-7452: fix facet refinement for method:dvhash


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/67876b30
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/67876b30
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/67876b30

Branch: refs/heads/feature/autoscaling
Commit: 67876b30277314f15f5e55ef321a39d67e7f1bac
Parents: db2b19f
Author: yonik <yo...@apache.org>
Authored: Sun Jun 4 20:13:25 2017 -0400
Committer: yonik <yo...@apache.org>
Committed: Sun Jun 4 20:13:33 2017 -0400

----------------------------------------------------------------------
 .../src/java/org/apache/solr/search/facet/FacetField.java     | 7 ++++++-
 .../org/apache/solr/search/facet/TestJsonFacetRefinement.java | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/67876b30/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetField.java b/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
index e8e624c..42f791c 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetField.java
@@ -98,7 +98,12 @@ public class FacetField extends FacetRequestSorted {
     FieldType ft = sf.getType();
     boolean multiToken = sf.multiValued() || ft.multiValuedFieldCache();
 
-    NumberType ntype = ft.getNumberType();
+    if (fcontext.facetInfo != null) {
+      // refinement... we will end up either skipping the entire facet, or doing calculating only specific facet buckets
+      return new FacetFieldProcessorByArrayDV(fcontext, this, sf);
+    }
+
+      NumberType ntype = ft.getNumberType();
     // ensure we can support the requested options for numeric faceting:
     if (ntype != null) {
       if (prefix != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/67876b30/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
index e0b1865..9087d30 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
@@ -238,7 +238,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     ModifiableSolrParams p = params("cat_s", "cat_s", "xy_s", "xy_s", "num_d", "num_d", "qw_s", "qw_s", "er_s","er_s");
     doBasicRefinement( p );
 
-    p.set("terms","method:dv,");
+    p.set("terms","method:dvhash,");
     doBasicRefinement( p );
 
     // multi-valued strings


[23/50] [abbrv] lucene-solr:feature/autoscaling: Fixed error in bin/solr cp example

Posted by sh...@apache.org.
Fixed error in bin/solr cp example


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9efa022e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9efa022e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9efa022e

Branch: refs/heads/feature/autoscaling
Commit: 9efa022e0a317805c9a6c5a4021751643892a8dd
Parents: 9e99a23
Author: Erick Erickson <er...@apache.org>
Authored: Fri Jun 2 14:19:03 2017 -0700
Committer: Erick Erickson <er...@apache.org>
Committed: Fri Jun 2 14:19:03 2017 -0700

----------------------------------------------------------------------
 .../src/using-zookeeper-to-manage-configuration-files.adoc         | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9efa022e/solr/solr-ref-guide/src/using-zookeeper-to-manage-configuration-files.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/using-zookeeper-to-manage-configuration-files.adoc b/solr/solr-ref-guide/src/using-zookeeper-to-manage-configuration-files.adoc
index 3a6c49d..b2dc9d5 100644
--- a/solr/solr-ref-guide/src/using-zookeeper-to-manage-configuration-files.adoc
+++ b/solr/solr-ref-guide/src/using-zookeeper-to-manage-configuration-files.adoc
@@ -93,5 +93,5 @@ If you for example would like to keep your `solr.xml` in ZooKeeper to avoid havi
 
 [source,bash]
 ----
-bin/solr cp file:local/file/path/to/solr.xml zk:/solr.xml -z localhost:2181
+bin/solr zk cp file:local/file/path/to/solr.xml zk:/solr.xml -z localhost:2181
 ----


[34/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10696: Add cumulative probability function

Posted by sh...@apache.org.
SOLR-10696: Add cumulative probability function


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/99ca13f9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/99ca13f9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/99ca13f9

Branch: refs/heads/feature/autoscaling
Commit: 99ca13f90fa04fb804e20bbdf51bf6cfc4ea3a34
Parents: f275e3b
Author: Joel Bernstein <jb...@apache.org>
Authored: Fri Jun 2 15:19:38 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Jun 5 11:19:17 2017 -0400

----------------------------------------------------------------------
 .../org/apache/solr/handler/StreamHandler.java  |  1 +
 .../io/eval/CumulativeProbabilityEvaluator.java | 66 ++++++++++++++++++++
 .../solrj/io/eval/PercentileEvaluator.java      | 24 ++++---
 .../solrj/io/stream/StreamExpressionTest.java   | 65 +++++++++++++++++--
 4 files changed, 143 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99ca13f9/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index f79f86e..d4029ff 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -187,6 +187,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       .withFunctionName("copyOfRange", CopyOfRangeEvaluator.class)
       .withFunctionName("percentile", PercentileEvaluator.class)
       .withFunctionName("empiricalDistribution", EmpiricalDistributionEvaluator.class)
+      .withFunctionName("cumulativeProbability", CumulativeProbabilityEvaluator.class)
       .withFunctionName("describe", DescribeEvaluator.class)
       .withFunctionName("finddelay", FindDelayEvaluator.class)
       .withFunctionName("sequence", SequenceEvaluator.class)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99ca13f9/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CumulativeProbabilityEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CumulativeProbabilityEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CumulativeProbabilityEvaluator.java
new file mode 100644
index 0000000..469e983
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CumulativeProbabilityEvaluator.java
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+package org.apache.solr.client.solrj.io.eval;
+
+import java.io.IOException;
+
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.stream.expr.Explanation;
+import org.apache.solr.client.solrj.io.stream.expr.Explanation.ExpressionType;
+import org.apache.solr.client.solrj.io.stream.expr.Expressible;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParameter;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class CumulativeProbabilityEvaluator extends ComplexEvaluator implements Expressible {
+
+  private static final long serialVersionUID = 1;
+
+  public CumulativeProbabilityEvaluator(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public Number evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Cumulative probability expects 2 parameters: an emperical distribution and a number");
+    }
+
+    StreamEvaluator r = subEvaluators.get(0);
+    StreamEvaluator d = subEvaluators.get(1);
+
+    EmpiricalDistributionEvaluator.EmpiricalDistributionTuple e = (EmpiricalDistributionEvaluator.EmpiricalDistributionTuple)r.evaluate(tuple);
+    Number n = (Number)d.evaluate(tuple);
+    return e.percentile(n.doubleValue());
+  }
+
+  @Override
+  public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(getClass()));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(nodeId.toString())
+        .withExpressionType(ExpressionType.EVALUATOR)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99ca13f9/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
index 19d423d..7867048 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
@@ -17,6 +17,9 @@
 
 package org.apache.solr.client.solrj.io.eval;
 
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.List;
 import java.io.IOException;
 
 import org.apache.solr.client.solrj.io.Tuple;
@@ -26,6 +29,7 @@ import org.apache.solr.client.solrj.io.stream.expr.Expressible;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParameter;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+import org.apache.commons.math3.stat.descriptive.rank.Percentile;
 
 public class PercentileEvaluator extends ComplexEvaluator implements Expressible {
 
@@ -36,17 +40,23 @@ public class PercentileEvaluator extends ComplexEvaluator implements Expressible
   }
 
   public Number evaluate(Tuple tuple) throws IOException {
-
     if(subEvaluators.size() != 2) {
-      throw new IOException("Percentile expects 2 parameters: a regression result and a number");
+      throw new IOException("Percentile expects 2 parameters: an array and a number");
     }
 
-    StreamEvaluator r = subEvaluators.get(0);
-    StreamEvaluator d = subEvaluators.get(1);
+    StreamEvaluator colEval = subEvaluators.get(0);
+    List<Number> column = (List<Number>)colEval.evaluate(tuple);
+
+    double[] data = new double[column.size()];
+    for(int i=0; i<data.length; i++) {
+      data[i] = column.get(i).doubleValue();
+    }
 
-    EmpiricalDistributionEvaluator.EmpiricalDistributionTuple e = (EmpiricalDistributionEvaluator.EmpiricalDistributionTuple)r.evaluate(tuple);
-    Number n = (Number)d.evaluate(tuple);
-    return e.percentile(n.doubleValue());
+    Percentile percentile = new Percentile();
+    percentile.setData(data);
+    StreamEvaluator numEval = subEvaluators.get(1);
+    Number num  = (Number)numEval.evaluate(tuple);
+    return percentile.evaluate(num.doubleValue());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99ca13f9/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index 3957915..8ca52d1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -5759,8 +5759,61 @@ public class StreamExpressionTest extends SolrCloudTestCase {
   }
 
 
+
+  @Test
+  public void testPercentile() throws Exception {
+    String cexpr = "percentile(array(1,2,3,4,5,6,7,8,9,10,11), 50)";
+    ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
+    paramsLoc.set("expr", cexpr);
+    paramsLoc.set("qt", "/stream");
+
+    String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
+    TupleStream solrStream = new SolrStream(url, paramsLoc);
+
+    StreamContext context = new StreamContext();
+    solrStream.setStreamContext(context);
+    List<Tuple> tuples = getTuples(solrStream);
+    assertTrue(tuples.size() == 1);
+    Tuple tuple = tuples.get(0);
+    double p = tuple.getDouble("return-value");
+    assertEquals(p, 6, 0.0);
+
+
+    cexpr = "percentile(array(11,10,3,4,5,6,7,8,9,2,1), 50)";
+    paramsLoc = new ModifiableSolrParams();
+    paramsLoc.set("expr", cexpr);
+    paramsLoc.set("qt", "/stream");
+
+    solrStream = new SolrStream(url, paramsLoc);
+
+    context = new StreamContext();
+    solrStream.setStreamContext(context);
+    tuples = getTuples(solrStream);
+    assertTrue(tuples.size() == 1);
+    tuple = tuples.get(0);
+    p = tuple.getDouble("return-value");
+    assertEquals(p, 6, 0.0);
+
+    cexpr = "percentile(array(11,10,3,4,5,6,7,8,9,2,1), 20)";
+    paramsLoc = new ModifiableSolrParams();
+    paramsLoc.set("expr", cexpr);
+    paramsLoc.set("qt", "/stream");
+
+    solrStream = new SolrStream(url, paramsLoc);
+
+    context = new StreamContext();
+    solrStream.setStreamContext(context);
+    tuples = getTuples(solrStream);
+    assertTrue(tuples.size() == 1);
+    tuple = tuples.get(0);
+    p = tuple.getDouble("return-value");
+    assertEquals(p, 2.4, 0.001);
+
+  }
+
+
   @Test
-  public void testPercentiles() throws Exception {
+  public void testCumulativeProbability() throws Exception {
     UpdateRequest updateRequest = new UpdateRequest();
 
     int i=0;
@@ -5773,11 +5826,11 @@ public class StreamExpressionTest extends SolrCloudTestCase {
 
     String expr = "search("+COLLECTIONORALIAS+", q=\"*:*\", fl=\"price_f\", sort=\"price_f asc\", rows=\"200\")";
     String cexpr = "let(a="+expr+", c=col(a, price_f), e=empiricalDistribution(c), " +
-        "tuple(p1=percentile(e, 88), " +
-        "p2=percentile(e, 2), " +
-        "p3=percentile(e, 99), " +
-        "p4=percentile(e, 77), " +
-        "p5=percentile(e, 98)))";
+        "tuple(p1=cumulativeProbability(e, 88), " +
+        "p2=cumulativeProbability(e, 2), " +
+        "p3=cumulativeProbability(e, 99), " +
+        "p4=cumulativeProbability(e, 77), " +
+        "p5=cumulativeProbability(e, 98)))";
 
     ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
     paramsLoc.set("expr", cexpr);


[36/50] [abbrv] lucene-solr:feature/autoscaling: LUCENE-7845: spatial-extras undo optimize; don't consider any rect or circle to be a point

Posted by sh...@apache.org.
LUCENE-7845: spatial-extras undo optimize; don't consider any rect or circle to be a point


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6b022c98
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6b022c98
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6b022c98

Branch: refs/heads/feature/autoscaling
Commit: 6b022c98f9a1f69de17445004ce8464ee936e51c
Parents: 78d9501
Author: David Smiley <ds...@apache.org>
Authored: Mon Jun 5 12:44:51 2017 -0400
Committer: David Smiley <ds...@apache.org>
Committed: Mon Jun 5 12:44:51 2017 -0400

----------------------------------------------------------------------
 .../lucene/spatial/prefix/PrefixTreeStrategy.java  | 17 ++++++-----------
 .../prefix/RecursivePrefixTreeStrategy.java        |  1 +
 .../prefix/RandomSpatialOpFuzzyPrefixTreeTest.java | 13 +++++++++++++
 3 files changed, 20 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6b022c98/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
----------------------------------------------------------------------
diff --git a/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java b/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
index 43851c7..0716e78 100644
--- a/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
+++ b/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/PrefixTreeStrategy.java
@@ -32,9 +32,7 @@ import org.apache.lucene.spatial.prefix.tree.SpatialPrefixTree;
 import org.apache.lucene.spatial.query.SpatialArgs;
 import org.apache.lucene.spatial.util.ShapeFieldCacheDistanceValueSource;
 import org.apache.lucene.util.Bits;
-import org.locationtech.spatial4j.shape.Circle;
 import org.locationtech.spatial4j.shape.Point;
-import org.locationtech.spatial4j.shape.Rectangle;
 import org.locationtech.spatial4j.shape.Shape;
 
 /**
@@ -208,15 +206,12 @@ public abstract class PrefixTreeStrategy extends SpatialStrategy {
     return HeatmapFacetCounter.calcFacets(this, context, topAcceptDocs, inputShape, facetLevel, maxCells);
   }
 
+  /**
+   * Returns true if the {@code shape} is a {@link Point}.  For custom spatial contexts, it may make sense to
+   * have certain other shapes return true.
+   * @lucene.experimental
+   */
   protected boolean isPointShape(Shape shape) {
-    if (shape instanceof Point) {
-      return true;
-    } else if (shape instanceof Circle) {
-      return ((Circle) shape).getRadius() == 0.0;
-    } else if (shape instanceof Rectangle) {
-      Rectangle rect = (Rectangle) shape;
-      return rect.getWidth() == 0.0 && rect.getHeight() == 0.0;
-    }
-    return false;
+    return shape instanceof Point;
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6b022c98/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
----------------------------------------------------------------------
diff --git a/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java b/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
index 7c79200..819c504 100644
--- a/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
+++ b/lucene/spatial-extras/src/java/org/apache/lucene/spatial/prefix/RecursivePrefixTreeStrategy.java
@@ -216,6 +216,7 @@ public class RecursivePrefixTreeStrategy extends PrefixTreeStrategy {
         cell = cellIterator.next();
         assert prevLevel < cell.getLevel();
       }
+      assert cell.isLeaf();
       return new TermQuery(new Term(getFieldName(), cell.getTokenBytesWithLeaf(null)));
     } else {
       // Well there could be parent cells. But we can reduce the "scan level" which will be slower for a point query.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6b022c98/lucene/spatial-extras/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
----------------------------------------------------------------------
diff --git a/lucene/spatial-extras/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java b/lucene/spatial-extras/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
index cfc9980..c5b145f 100644
--- a/lucene/spatial-extras/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
+++ b/lucene/spatial-extras/src/test/org/apache/lucene/spatial/prefix/RandomSpatialOpFuzzyPrefixTreeTest.java
@@ -164,6 +164,19 @@ public class RandomSpatialOpFuzzyPrefixTreeTest extends StrategyTestCase {
     assertEquals(1, executeQuery(query, 1).numFound);
   }
 
+  @Test
+  public void testPointsOnlyOptBug() throws IOException {
+    setupQuadGrid(8, false);
+    setupCtx2D(ctx);
+    ((PrefixTreeStrategy) strategy).setPointsOnly(true);
+    Point point = ctx.makePoint(86, -127.44362190053255);
+    adoc("0", point);
+    commit();
+    Query query = strategy.makeQuery(new SpatialArgs(SpatialOperation.Intersects,
+        ctx.makeRectangle(point, point)));
+    assertEquals(1, executeQuery(query, 1).numFound);
+  }
+
   /** See LUCENE-5062, {@link ContainsPrefixTreeQuery#multiOverlappingIndexedShapes}. */
   @Test
   public void testContainsPairOverlap() throws IOException {


[21/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10509, SOLR-10649: add docs for new metric features; add to solr.xml docs

Posted by sh...@apache.org.
SOLR-10509, SOLR-10649: add docs for new metric features; add <metrics> to solr.xml docs


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/9e99a23f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/9e99a23f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/9e99a23f

Branch: refs/heads/feature/autoscaling
Commit: 9e99a23f31b8d3508526ea473b944beb13303334
Parents: a477ebb
Author: Cassandra Targett <ct...@apache.org>
Authored: Fri Jun 2 14:50:54 2017 -0500
Committer: Cassandra Targett <ct...@apache.org>
Committed: Fri Jun 2 14:52:02 2017 -0500

----------------------------------------------------------------------
 solr/solr-ref-guide/src/format-of-solr-xml.adoc | 27 +++---
 solr/solr-ref-guide/src/metrics-reporting.adoc  | 97 +++++++++++++++++---
 2 files changed, 99 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e99a23f/solr/solr-ref-guide/src/format-of-solr-xml.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/format-of-solr-xml.adoc b/solr/solr-ref-guide/src/format-of-solr-xml.adoc
index 4e55033..02e72bd 100644
--- a/solr/solr-ref-guide/src/format-of-solr-xml.adoc
+++ b/solr/solr-ref-guide/src/format-of-solr-xml.adoc
@@ -22,7 +22,6 @@ The `solr.xml` file defines some global configuration options that apply to all
 
 This section will describe the default `solr.xml` file included with Solr and how to modify it for your needs. For details on how to configure `core.properties`, see the section <<defining-core-properties.adoc#defining-core-properties,Defining core.properties>>.
 
-[[Formatofsolr.xml-Definingsolr.xml]]
 == Defining solr.xml
 
 You can find `solr.xml` in your `$SOLR_HOME` directory (usually `server/solr`) in standalone mode or in Zookeeper when using SolrCloud. The default `solr.xml` file looks like this:
@@ -50,10 +49,9 @@ You can find `solr.xml` in your `$SOLR_HOME` directory (usually `server/solr`) i
 
 As you can see, the discovery Solr configuration is "SolrCloud friendly". However, the presence of the `<solrcloud>` element does _not_ mean that the Solr instance is running in SolrCloud mode. Unless the `-DzkHost` or `-DzkRun` are specified at startup time, this section is ignored.
 
-[[Formatofsolr.xml-Solr.xmlParameters]]
-=== Solr.xml Parameters
+== Solr.xml Parameters
 
-==== The `<solr>` Element
+=== The <solr> Element
 
 There are no attributes that you can specify in the `<solr>` tag, which is the root element of `solr.xml`. The tables below list the child nodes of each XML element in `solr.xml`.
 
@@ -74,7 +72,7 @@ There are no attributes that you can specify in the `<solr>` tag, which is the r
 |`configSetBaseDir` |The directory under which configsets for Solr cores can be found. Defaults to `$SOLR_HOME/configsets`.
 |===
 
-==== The `<solrcloud>` Element
+=== The <solrcloud> Element
 
 This element defines several parameters that relate so SolrCloud. This section is ignored unless theSolr instance is started with either `-DzkRun` or `-DzkHost`
 
@@ -96,7 +94,7 @@ This element defines several parameters that relate so SolrCloud. This section i
 |`zkCredentialsProvider` & ` zkACLProvider` |Optional parameters that can be specified if you are using <<zookeeper-access-control.adoc#zookeeper-access-control,ZooKeeper Access Control>>.
 |===
 
-==== The `<logging>` Element
+=== The <logging> Element
 
 // TODO: Change column width to %autowidth.spread when https://github.com/asciidoctor/asciidoctor-pdf/issues/599 is fixed
 
@@ -107,7 +105,7 @@ This element defines several parameters that relate so SolrCloud. This section i
 |`enabled` |true/false - whether to enable logging or not.
 |===
 
-===== The `<logging><watcher>` Element
+==== The <logging><watcher> Element
 
 // TODO: Change column width to %autowidth.spread when https://github.com/asciidoctor/asciidoctor-pdf/issues/599 is fixed
 
@@ -118,7 +116,7 @@ This element defines several parameters that relate so SolrCloud. This section i
 |`threshold` |The logging level above which your particular logging implementation will record. For example when using log4j one might specify DEBUG, WARN, INFO, etc.
 |===
 
-==== The `<shardHandlerFactory>` Element
+=== The <shardHandlerFactory> Element
 
 Custom shard handlers can be defined in `solr.xml` if you wish to create a custom shard handler.
 
@@ -146,14 +144,19 @@ Since this is a custom shard handler, sub-elements are specific to the implement
 |`fairnessPolicy` |A boolean to configure if the threadpool favours fairness over throughput. Default is false to favor throughput.
 |===
 
-[[Formatofsolr.xml-SubstitutingJVMSystemPropertiesinsolr.xml]]
+=== The <metrics> Element
+
+The `<metrics>` element in `solr.xml` allows you to customize the metrics reported by Solr. You can define system properties that should not be returned, or define custom suppliers and reporters. 
+
+In a default `solr.xml` you will not see any `<metrics>` configuration. If you would like to customize the metrics for your installation, see the section <<metrics-reporting.adoc#metrics-configuration,Metrics Configuration>>.
+
 == Substituting JVM System Properties in solr.xml
 
-Solr supports variable substitution of JVM system property values in `solr.xml`, which allows runtime specification of various configuration options. The syntax is `${propertyname[:option default value]`}. This allows defining a default that can be overridden when Solr is launched. If a default value is not specified, then the property must be specified at runtime or the `solr.xml` file will generate an error when parsed.
+Solr supports variable substitution of JVM system property values in `solr.xml`, which allows runtime specification of various configuration options. The syntax is `${propertyname[:option default value]}`. This allows defining a default that can be overridden when Solr is launched. If a default value is not specified, then the property must be specified at runtime or the `solr.xml` file will generate an error when parsed.
 
-Any JVM system properties usually specified using the -D flag when starting the JVM, can be used as variables in the `solr.xml` file.
+Any JVM system properties usually specified using the `-D` flag when starting the JVM, can be used as variables in the `solr.xml` file.
 
-For example, in the `solr.xml` file shown below, the `socketTimeout` and `connTimeout` values are each set to "0". However, if you start Solr using '`bin/solr -DsocketTimeout=1000`', the `socketTimeout` option of the `HttpShardHandlerFactory` to be overridden using a value of 1000ms, while the `connTimeout` option will continue to use the default property value of "0".
+For example, in the `solr.xml` file shown below, the `socketTimeout` and `connTimeout` values are each set to "0". However, if you start Solr using `bin/solr -DsocketTimeout=1000`, the `socketTimeout` option of the `HttpShardHandlerFactory` to be overridden using a value of 1000ms, while the `connTimeout` option will continue to use the default property value of "0".
 
 [source,xml]
 ----

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/9e99a23f/solr/solr-ref-guide/src/metrics-reporting.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/metrics-reporting.adoc b/solr/solr-ref-guide/src/metrics-reporting.adoc
index 63fdbf3..4fa049e 100644
--- a/solr/solr-ref-guide/src/metrics-reporting.adoc
+++ b/solr/solr-ref-guide/src/metrics-reporting.adoc
@@ -28,7 +28,7 @@ Internally this feature uses the http://metrics.dropwizard.io[Dropwizard Metrics
 * *timers* - measure the number and duration of events. They provide a count and histogram of timings.
 * *gauges* - offer instantaneous reading of a current value, e.g., current queue depth, current number of active connections, free heap size.
 
-Each group of related metrics with unique names is managed in a *metric registry*. Solr maintains several such registries, each corresponding to a high-level group such as: `jvm`, `jetty`, `http`, `node`, and `core` (see <<Metric Registries>> below).
+Each group of related metrics with unique names is managed in a *metric registry*. Solr maintains several such registries, each corresponding to a high-level group such as: `jvm`, `jetty`, `node`, and `core` (see <<Metric Registries>> below).
 
 For each group (and/or for each registry) there can be several *reporters*, which are components responsible for communication of metrics from selected registries to external systems. Currently implemented reporters support emitting metrics via JMX, Ganglia, Graphite and SLF4J.
 
@@ -42,7 +42,9 @@ Metrics are maintained and accumulated through all lifecycles of components from
 
 These are the major groups of metrics that are collected:
 
-=== JVM Registry (`solr.jvm`):
+=== JVM Registry
+
+This registry is returned at `solr.jvm` and includes the following information. When making requests with the <<Metrics API>>, you can specify `&group=jvm` to limit to only these metrics.
 
 * direct and mapped buffer pools
 * class loading / unloading
@@ -50,26 +52,28 @@ These are the major groups of metrics that are collected:
 * GC count and time
 * heap, non-heap memory and GC pools
 * number of threads, their states and deadlocks
+* System properties such as Java information, various installation directory paths, ports, and similar information. You can control what appears here by modifying `solr.xml`.
+// TODO for 7.0 fix this
+
+=== Node / CoreContainer Registry
 
-=== Node / CoreContainer Registry (`solr.node`):
+This registry is returned at `solr.node` and includes the following information. When making requests with the <<Metrics API>>, you can specify `&group=node` to limit to only these metrics.
 
 * handler requests (count, timing): collections, info, admin, configSets, etc.
 * number of cores (loaded, lazy, unloaded)
 
-=== Core (SolrCore) Registry:
+=== Core (SolrCore) Registry
 
-The <<Core Level Metrics,Core (SolrCore) Registry>> includes `solr.core.<collection>`, one for each core.
+The <<Core Level Metrics,Core (SolrCore) Registry>> includes `solr.core.<collection>`, one for each core. When making requests with the <<Metrics API>>, you can specify `&group=core` to limit to only these metrics.
 
 * all common RequestHandler-s report: request timers / counters, timeouts, errors.
 * <<Index Merge Metrics,index-level events>>: meters for minor / major merges, number of merged docs, number of deleted docs, gauges for currently running merges and their size.
 * shard replication and transaction log replay on replicas (TBD, SOLR-9856)
-* TBD: caches, update handler details, and other relevant SolrInfoMBean-s
-
-=== HTTP Registry (`solr.http`):
-
 * open / available / pending connections for shard handler and update handler
 
-=== Jetty Registry (`solr.jetty`):
+=== Jetty Registry
+
+This registry is returned at `solr.jetty` and includes the following information. When making requests with the <<Metrics API>>, you can specify `&group=jetty` to limit to only these metrics.
 
 * threads and pools,
 * connection and request timers,
@@ -77,6 +81,69 @@ The <<Core Level Metrics,Core (SolrCore) Registry>> includes `solr.core.<collect
 
 In the future, metrics will be added for shard leaders and cluster nodes, including aggregations from per-core metrics.
 
+== Metrics Configuration
+
+The metrics available in your system can be customized by modifying the `<metrics>` element in `solr.xml`.
+
+TIP: See also the section <<format-of-solr-xml.adoc#format-of-solr-xml,Format of Solr.xml>> for more information about the `solr.xml` file, where to find it, and how to edit it.
+
+=== The <metrics><hiddenSysProps> Element
+
+This section of `solr.xml` allows you to define the system properties which are considered system-sensitive and should not be exposed via the Metrics API.
+
+If this section is not defined, the following default configuration is used which hides password and authentication information:
+
+[source,xml]
+<metrics>
+  <hiddenSysProps>
+    <str>javax.net.ssl.keyStorePassword</str>
+    <str>javax.net.ssl.trustStorePassword</str>
+    <str>basicauth</str>
+    <str>zkDigestPassword</str>
+    <str>zkDigestReadonlyPassword</str>
+  </hiddenSysProps>
+</metrics>
+
+=== The <metrics><reporters> Element
+
+Reporters consume the metrics data generated by Solr. See the section <<Reporters>> below for more details on how to configure custom reporters.
+
+=== The <metrics><suppliers> Element
+
+Suppliers help Solr generate metrics data. The `<metrics><suppliers>` section of `solr.xml` allows you to define your own implementations of metrics and configure parameters for them.
+
+Implementation of a custom metrics supplier is beyond the scope of this guide, but there are other customizations possible with the default implementation, via the elements described below.
+
+<counter>:: This element defines the implementation and configuration of a `Counter` supplier. The default implementation does not support any configuration.
+
+<meter>:: This element defines the implementation of a `Meter` supplier. The default implementation supports an additional parameter:
+`<str name="clock">`::: The type of clock to use for calculating EWMA rates. The supported values are:
+* `user`, the default, which uses `System.nanoTime()`
+* `cpu`, which uses the current thread's CPU time
+
+<histogram>:: This element defines the implementation of a `Histogram` supplier. This element also supports the `clock` parameter shown above with the `meter` element, and also:
+`<str name="reservoir">`::: The fully-qualified class name of the `Reservoir` implementation to use. The default is `com.codahale.metrics.ExponentiallyDecayingReservoir` but there are other options available with the http://metrics.dropwizard.io/3.1.0/manual/core/#histograms[Codahale Metrics library] that Solr uses. The following parameters are supported, within the mentioned limitations:
+* `size`, the reservoir size. The default is 1028.
+* `alpha`, the decay parameter. The default is 0.015. This is only valid for the `ExponentiallyDecayingReservoir`.
+* `window`, the window size, in seconds, and only valid for the `SlidingTimeWindowReservoir`. The default is 300 (5 minutes).
+
+<timer>:: This element defines an implementation of a `Timer` supplier. The default implementation supports the `clock` and `reservoir` parameters described above.
+
+As an example of a section of `solr.xml` that defines some of these custom parameters, the following defines the default `Meter` supplier with a non-default `clock` and the default `Timer` is used with a non-default reservoir:
+
+[source,xml]
+<metrics>
+  <suppliers>
+    <meter>
+      <str name="clock">cpu</str>
+    </meter>
+    <timer>
+      <str name="reservoir">com.codahale.metrics.SlidingTimeWindowReservoir</str>
+      <long name="window">600</long>
+    </timer>
+  </suppliers>
+</metrics>
+
 == Reporters
 
 Reporter configurations are specified in `solr.xml` file in `<metrics><reporter>` sections, for example:
@@ -101,6 +168,8 @@ Reporter configurations are specified in `solr.xml` file in `<metrics><reporter>
 </solr>
 ----
 
+This example configures two reporters: <<Graphite Reporter,Graphite>> and <<SLF4J Reporter,SLF4J>>. See below for more details on how to configure reporters.
+
 === Reporter Arguments
 
 Reporter plugins use the following arguments:
@@ -260,15 +329,17 @@ If the boolean flag `mergeDetails` is true then the following additional metrics
 
 The `admin/metrics` endpoint provides access to all the metrics for all metric groups.
 
-A few query parameters are available to limit the request:
+A few query parameters are available to limit your request to only certain metrics:
 
 group:: The metric group to retrieve. The default is `all` to retrieve all metrics for all groups. Other possible values are: `jvm`, `jetty`, `node`, and `core`. More than one group can be specified in a request; multiple group names should be separated by a comma.
 
 type:: The type of metric to retrieve. The default is `all` to retrieve all metric types. Other possible values are `counter`, `gauge`, `histogram`, `meter`, and `timer`. More than one type can be specified in a request; multiple types should be separated by a comma.
 
-prefix:: The first characters of metric name that will filter the metrics returned to those starting with the provided string. It can be combined with group and/or type parameters. More than one prefix can be specified in a request; multiple prefixes should be separated by a comma. Prefix matching is also case-sensitive.
+prefix:: The first characters of metric name that will filter the metrics returned to those starting with the provided string. It can be combined with `group` and/or `type` parameters. More than one prefix can be specified in a request; multiple prefixes should be separated by a comma. Prefix matching is also case-sensitive.
+
+property:: Allows requesting only this metric from any compound metric. Multiple `property` parameters can be combined to act as an OR request. For example, to only get the 99th and 999th percentile values from all metric types and groups, you can add `&property=p99_ms&property=p999_ms` to your request. This can be combined with `group`, `type`, and `prefix` as necessary.
 
-compact:: When true, a more compact format of the response will be returned. Instead of a response like this:
+compact:: When false, a more verbose format of the response will be returned. Instead of a response like this:
 +
 [source,json]
   "metrics": [


[31/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class. (Christine Poerschke, Anshum Gupta)

Posted by sh...@apache.org.
SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class.
(Christine Poerschke, Anshum Gupta)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2271e73e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2271e73e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2271e73e

Branch: refs/heads/feature/autoscaling
Commit: 2271e73e763b17f971731f6f69d6ffe46c40b944
Parents: b1b9a94
Author: Christine Poerschke <cp...@apache.org>
Authored: Mon Jun 5 12:17:38 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Mon Jun 5 12:17:38 2017 +0100

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  6 +++++
 .../apache/solr/metrics/SolrMetricReporter.java | 22 ++++++++++++---
 .../metrics/reporters/SolrGangliaReporter.java  | 14 +++++-----
 .../metrics/reporters/SolrGraphiteReporter.java | 28 ++++++++++----------
 .../solr/metrics/reporters/SolrJmxReporter.java | 16 +----------
 .../metrics/reporters/SolrSlf4jReporter.java    | 16 +++++------
 .../reporters/solr/SolrClusterReporter.java     |  7 ++++-
 .../reporters/solr/SolrShardReporter.java       |  9 +++++--
 .../metrics/reporters/MockMetricReporter.java   |  4 +--
 9 files changed, 69 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index ff6ff46..7b3dcff 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -89,6 +89,9 @@ Upgrading from Solr 6.x
 * In solrconfig.xml the deprecated <mergePolicy> and <mergeFactor> and <maxMergeDocs> elements have
   been removed in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
 
+* Custom SolrMetricReporter classes must implement a new, factored out doInit() method and the validate() method
+  must pass for all reporters including reporters that are not enabled, please see SOLR-10671 for details.
+
 New Features
 ----------------------
 * SOLR-9857, SOLR-9858: Collect aggregated metrics from nodes and shard leaders in overseer. (ab)
@@ -230,6 +233,9 @@ Other Changes
 
 * SOLR-10801: Remove several deprecated methods that were exposed to plugin writers (hossman)
 
+* SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class.
+  (Christine Poerschke, Anshum Gupta)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
index 9ad15d0..222377b 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
@@ -17,16 +17,21 @@
 package org.apache.solr.metrics;
 
 import java.io.Closeable;
+import java.lang.invoke.MethodHandles;
 
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.util.SolrPluginUtils;
 import org.apache.solr.util.plugin.PluginInfoInitialized;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Interface for 'pluggable' metric reporters.
  */
 public abstract class SolrMetricReporter implements Closeable, PluginInfoInitialized {
 
+  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
   protected final String registryName;
   protected final SolrMetricManager metricManager;
   protected PluginInfo pluginInfo;
@@ -56,12 +61,23 @@ public abstract class SolrMetricReporter implements Closeable, PluginInfoInitial
       }
     }
     validate();
+    if (!enabled) {
+      log.info("Reporter disabled for registry " + registryName);
+      return;
+    }
+    log.debug("Initializing for registry " + registryName);
+    doInit();
   }
 
   /**
-   * Enable reporting, defaults to true. Implementations should check this flag in
-   * {@link #validate()} and accordingly enable or disable reporting.
-   * @param enabled enable, defaults to true when null or not set.
+   * Reporter initialization implementation.
+   */
+  protected abstract void doInit();
+
+  /**
+   * Enable reporting, defaults to true. {@link #init(PluginInfo)} checks
+   * this flag before calling {@link #doInit()} to initialize reporting.
+   * @param enabled - whether or not reporting is to be enabled
    */
   public void setEnabled(Boolean enabled) {
     if (enabled != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
index 142ddd8..4dfdbeb 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
@@ -110,11 +110,14 @@ public class SolrGangliaReporter extends SolrMetricReporter {
   }
 
   @Override
-  protected void validate() throws IllegalStateException {
-    if (!enabled) {
-      log.info("Reporter disabled for registry " + registryName);
-      return;
+  protected void doInit() {
+    if (!testing) {
+      start();
     }
+  }
+
+  @Override
+  protected void validate() throws IllegalStateException {
     if (host == null) {
       throw new IllegalStateException("Init argument 'host' must be set to a valid Ganglia server name.");
     }
@@ -124,9 +127,6 @@ public class SolrGangliaReporter extends SolrMetricReporter {
     if (period < 1) {
       throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1.");
     }
-    if (!testing) {
-      start();
-    }
   }
 
   //this is a separate method for unit tests

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java
index d5b7a20..b8eddf5 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java
@@ -99,23 +99,10 @@ public class SolrGraphiteReporter extends SolrMetricReporter {
   }
 
   @Override
-  protected void validate() throws IllegalStateException {
-    if (!enabled) {
-      log.info("Reporter disabled for registry " + registryName);
-      return;
-    }
-    if (host == null) {
-      throw new IllegalStateException("Init argument 'host' must be set to a valid Graphite server name.");
-    }
-    if (port == -1) {
-      throw new IllegalStateException("Init argument 'port' must be set to a valid Graphite server port.");
-    }
+  protected void doInit() {
     if (reporter != null) {
       throw new IllegalStateException("Already started once?");
     }
-    if (period < 1) {
-      throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1.");
-    }
     GraphiteSender graphite;
     String id = host + ":" + port + ":" + pickled;
     graphite = serviceRegistry.getOrCreate(id, () -> {
@@ -147,6 +134,19 @@ public class SolrGraphiteReporter extends SolrMetricReporter {
   }
 
   @Override
+  protected void validate() throws IllegalStateException {
+    if (host == null) {
+      throw new IllegalStateException("Init argument 'host' must be set to a valid Graphite server name.");
+    }
+    if (port == -1) {
+      throw new IllegalStateException("Init argument 'port' must be set to a valid Graphite server port.");
+    }
+    if (period < 1) {
+      throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1.");
+    }
+  }
+
+  @Override
   public void close() throws IOException {
     if (reporter != null) {
       reporter.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
index d09e043..68a94ef 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrJmxReporter.java
@@ -33,7 +33,6 @@ import com.codahale.metrics.JmxReporter;
 import com.codahale.metrics.MetricFilter;
 import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.MetricRegistryListener;
-import org.apache.solr.core.PluginInfo;
 import org.apache.solr.metrics.MetricsMap;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.apache.solr.metrics.SolrMetricReporter;
@@ -74,20 +73,7 @@ public class SolrJmxReporter extends SolrMetricReporter {
     setDomain(registryName);
   }
 
-  /**
-   * Initializes the reporter by finding an MBeanServer
-   * and registering the metricManager's metric registry.
-   *
-   * @param pluginInfo the configuration for the reporter
-   */
-  @Override
-  public synchronized void init(PluginInfo pluginInfo) {
-    super.init(pluginInfo);
-    if (!enabled) {
-      log.info("Reporter disabled for registry " + registryName);
-      return;
-    }
-    log.debug("Initializing for registry " + registryName);
+  protected synchronized void doInit() {
     if (serviceUrl != null && agentId != null) {
       mBeanServer = JmxUtil.findFirstMBeanServer();
       log.warn("No more than one of serviceUrl({}) and agentId({}) should be configured, using first MBeanServer instead of configuration.",

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java
index 8b7c35e..7dfe5bb 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java
@@ -95,14 +95,7 @@ public class SolrSlf4jReporter extends SolrMetricReporter {
   }
 
   @Override
-  protected void validate() throws IllegalStateException {
-    if (!enabled) {
-      log.info("Reporter disabled for registry " + registryName);
-      return;
-    }
-    if (period < 1) {
-      throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1.");
-    }
+  protected void doInit() {
     if (instancePrefix == null) {
       instancePrefix = registryName;
     } else {
@@ -140,6 +133,13 @@ public class SolrSlf4jReporter extends SolrMetricReporter {
   }
 
   @Override
+  protected void validate() throws IllegalStateException {
+    if (period < 1) {
+      throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1.");
+    }
+  }
+
+  @Override
   public void close() throws IOException {
     if (reporter != null) {
       reporter.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrClusterReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrClusterReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrClusterReporter.java
index c677bea..1e64b8a 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrClusterReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrClusterReporter.java
@@ -179,13 +179,18 @@ public class SolrClusterReporter extends SolrMetricReporter {
   }
 
   @Override
-  protected void validate() throws IllegalStateException {
+  protected void doInit() {
     if (reports.isEmpty()) { // set defaults
       reports = DEFAULT_REPORTS;
     }
   }
 
   @Override
+  protected void validate() throws IllegalStateException {
+    // Nothing to validate
+  }
+
+  @Override
   public void close() throws IOException {
     if (reporter != null) {
       reporter.close();;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrShardReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrShardReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrShardReporter.java
index 6ae84ac..b3b055d 100644
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrShardReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/solr/SolrShardReporter.java
@@ -113,11 +113,16 @@ public class SolrShardReporter extends SolrMetricReporter {
   }
 
   @Override
-  protected void validate() throws IllegalStateException {
+  protected void doInit() {
     if (filters.isEmpty()) {
       filters = DEFAULT_FILTERS;
     }
-    // start in inform(...) only when core is available
+    // start in setCore(SolrCore) when core is available
+  }
+
+  @Override
+  protected void validate() throws IllegalStateException {
+    // Nothing to validate
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2271e73e/solr/core/src/test/org/apache/solr/metrics/reporters/MockMetricReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/MockMetricReporter.java b/solr/core/src/test/org/apache/solr/metrics/reporters/MockMetricReporter.java
index 2ecc33b..e6110ba 100644
--- a/solr/core/src/test/org/apache/solr/metrics/reporters/MockMetricReporter.java
+++ b/solr/core/src/test/org/apache/solr/metrics/reporters/MockMetricReporter.java
@@ -22,7 +22,6 @@ import java.util.NoSuchElementException;
 
 import com.codahale.metrics.Metric;
 import com.codahale.metrics.MetricRegistry;
-import org.apache.solr.core.PluginInfo;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.apache.solr.metrics.SolrMetricReporter;
 
@@ -39,8 +38,7 @@ public class MockMetricReporter extends SolrMetricReporter {
   }
 
   @Override
-  public void init(PluginInfo pluginInfo) {
-    super.init(pluginInfo);
+  protected void doInit() {
     didInit = true;
   }
 


[17/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10280: document "compact" format of metrics response

Posted by sh...@apache.org.
SOLR-10280: document "compact" format of metrics response


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3b45d828
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3b45d828
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3b45d828

Branch: refs/heads/feature/autoscaling
Commit: 3b45d8284fed203eba146d98662485eb7a31364c
Parents: 3618fc5
Author: Cassandra Targett <ct...@apache.org>
Authored: Fri Jun 2 12:34:22 2017 -0500
Committer: Cassandra Targett <ct...@apache.org>
Committed: Fri Jun 2 12:36:19 2017 -0500

----------------------------------------------------------------------
 solr/solr-ref-guide/src/metrics-reporting.adoc | 52 +++++++++++++++++++--
 1 file changed, 49 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3b45d828/solr/solr-ref-guide/src/metrics-reporting.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/metrics-reporting.adoc b/solr/solr-ref-guide/src/metrics-reporting.adoc
index 6da87b5..63fdbf3 100644
--- a/solr/solr-ref-guide/src/metrics-reporting.adoc
+++ b/solr/solr-ref-guide/src/metrics-reporting.adoc
@@ -262,9 +262,55 @@ The `admin/metrics` endpoint provides access to all the metrics for all metric g
 
 A few query parameters are available to limit the request:
 
-* *group*: The metric group to retrieve. The default is `all` to retrieve all metrics for all groups. Other possible values are: `jvm`, `jetty`, `node`, and `core`. More than one group can be specified in a request; multiple group names should be separated by a comma.
-* *type*: The type of metric to retrieve. The default is `all` to retrieve all metric types. Other possible values are `counter`, `gauge`, `histogram`, `meter`, and `timer`. More than one type can be specified in a request; multiple types should be separated by a comma.
-* *prefix*: The first characters of metric name that will filter the metrics returned to those starting with the provided string. It can be combined with group and/or type parameters. More than one prefix can be specified in a request; multiple prefixes should be separated by a comma. Prefix matching is also case-sensitive.
+group:: The metric group to retrieve. The default is `all` to retrieve all metrics for all groups. Other possible values are: `jvm`, `jetty`, `node`, and `core`. More than one group can be specified in a request; multiple group names should be separated by a comma.
+
+type:: The type of metric to retrieve. The default is `all` to retrieve all metric types. Other possible values are `counter`, `gauge`, `histogram`, `meter`, and `timer`. More than one type can be specified in a request; multiple types should be separated by a comma.
+
+prefix:: The first characters of metric name that will filter the metrics returned to those starting with the provided string. It can be combined with group and/or type parameters. More than one prefix can be specified in a request; multiple prefixes should be separated by a comma. Prefix matching is also case-sensitive.
+
+compact:: When true, a more compact format of the response will be returned. Instead of a response like this:
++
+[source,json]
+  "metrics": [
+    "solr.core.gettingstarted",
+    {
+      "CORE.aliases": {
+        "value": ["gettingstarted"]
+      },
+      "CORE.coreName": {
+        "value": "gettingstarted"
+      },
+      "CORE.indexDir": {
+        "value": "/solr/example/schemaless/solr/gettingstarted/data/index/"
+      },
+      "CORE.instanceDir": {
+        "value": "/solr/example/schemaless/solr/gettingstarted"
+      },
+      "CORE.refCount": {
+        "value": 1
+      },
+      "CORE.startTime": {
+        "value": "2017-03-14T11:43:23.822Z"
+      }
+    }
+  ]
++
+The response will look like this:
++
+[source,json]
+  "metrics": [
+    "solr.core.gettingstarted",
+    {
+      "CORE.aliases": [
+        "gettingstarted"
+      ],
+      "CORE.coreName": "gettingstarted",
+      "CORE.indexDir": "/solr/example/schemaless/solr/gettingstarted/data/index/",
+      "CORE.instanceDir": "/solr/example/schemaless/solr/gettingstarted",
+      "CORE.refCount": 1,
+      "CORE.startTime": "2017-03-14T11:43:23.822Z"
+    }
+  ]
 
 Like other request handlers, the Metrics API can also take the `wt` parameter to define the output format.
 


[06/50] [abbrv] lucene-solr:feature/autoscaling: LUCENE-7852: Correct copyright year(s) in lucene/LICENSE.txt and solr/LICENSE.txt files

Posted by sh...@apache.org.
LUCENE-7852: Correct copyright year(s) in lucene/LICENSE.txt and solr/LICENSE.txt files


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/72ba34f6
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/72ba34f6
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/72ba34f6

Branch: refs/heads/feature/autoscaling
Commit: 72ba34f66c60c6d6a052502c99f8f28c6b671e38
Parents: 5b93b73
Author: Christine Poerschke <cp...@apache.org>
Authored: Fri Jun 2 10:36:07 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Fri Jun 2 10:36:07 2017 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt | 3 +++
 lucene/NOTICE.txt  | 2 +-
 solr/CHANGES.txt   | 3 +++
 solr/NOTICE.txt    | 4 ++--
 4 files changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/72ba34f6/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 79a30fa..4e2e4f2 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -110,6 +110,9 @@ Other
 
 * LUCENE-7540: Upgrade ICU to 59.1 (Mike McCandless, Jim Ferenczi)
 
+* LUCENE-7852: Correct copyright year(s) in lucene/LICENSE.txt file.
+  (Christine Poerschke, Steve Rowe)
+
 ======================= Lucene 6.7.0 =======================
 
 Other

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/72ba34f6/lucene/NOTICE.txt
----------------------------------------------------------------------
diff --git a/lucene/NOTICE.txt b/lucene/NOTICE.txt
index 6260f3b..1903adc 100644
--- a/lucene/NOTICE.txt
+++ b/lucene/NOTICE.txt
@@ -1,5 +1,5 @@
 Apache Lucene
-Copyright 2014 The Apache Software Foundation
+Copyright 2001-2017 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/72ba34f6/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 106a4df..af9ec5e 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -215,6 +215,9 @@ Other Changes
 
 * SOLR-10791: Remove deprecated options in SSLTestConfig (hossman)
 
+* LUCENE-7852: Correct copyright year(s) in solr/LICENSE.txt file.
+  (Christine Poerschke, Steve Rowe)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/72ba34f6/solr/NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/NOTICE.txt b/solr/NOTICE.txt
index 214a2f8..4f3fa2a 100644
--- a/solr/NOTICE.txt
+++ b/solr/NOTICE.txt
@@ -1,6 +1,6 @@
 ==============================================================
  Apache Solr
- Copyright 2006-2014 The Apache Software Foundation
+ Copyright 2006-2017 The Apache Software Foundation
 ==============================================================
 
 This product includes software developed at
@@ -119,7 +119,7 @@ parrt@antlr.org
 =========================================================================
 
 Apache Lucene
-Copyright 2014 The Apache Software Foundation
+Copyright 2001-2017 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).


[49/50] [abbrv] lucene-solr:feature/autoscaling: Merge remote-tracking branch 'origin/feature/autoscaling' into feature/autoscaling

Posted by sh...@apache.org.
Merge remote-tracking branch 'origin/feature/autoscaling' into feature/autoscaling

# Conflicts:
#	solr/core/src/java/org/apache/solr/cloud/ZkController.java
#	solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d3b5adfd
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d3b5adfd
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d3b5adfd

Branch: refs/heads/feature/autoscaling
Commit: d3b5adfd62c4e3c27937671a6a2ee9f42665b1c8
Parents: 2d54025 8bc7c47
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Wed Jun 7 19:09:24 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Wed Jun 7 19:09:24 2017 +0530

----------------------------------------------------------------------
 .../org/apache/solr/cloud/ZkController.java     | 101 +++++--
 .../cloud/autoscaling/AutoScalingConfig.java    | 146 ++++++++++
 .../cloud/autoscaling/NodeAddedTrigger.java     |  45 ++-
 .../solr/cloud/autoscaling/NodeLostTrigger.java |  41 ++-
 .../autoscaling/OverseerTriggerThread.java      |  52 +++-
 .../cloud/autoscaling/ScheduledTriggers.java    |  10 +-
 .../solr/cloud/autoscaling/TriggerBase.java     |   8 +-
 .../autoscaling/TriggerIntegrationTest.java     | 272 +++++++++++++++++--
 .../solr/common/cloud/LiveNodesListener.java    |  38 +++
 .../apache/solr/common/cloud/ZkStateReader.java |  32 ++-
 10 files changed, 681 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d3b5adfd/solr/core/src/java/org/apache/solr/cloud/ZkController.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 086c150,54514ba..de41871
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@@ -917,9 -962,7 +970,9 @@@ public class ZkController 
        String ourUrl = ZkCoreNodeProps.getCoreUrl(baseUrl, coreName);
        log.debug("We are " + ourUrl + " and leader is " + leaderUrl);
        boolean isLeader = leaderUrl.equals(ourUrl);
 -      
 +      Replica.Type replicaType =  zkStateReader.getClusterState().getCollection(collection).getReplica(coreZkNodeName).getType();
 +      assert !(isLeader && replicaType == Type.PULL): "Pull replica became leader!";
-       
++
        try (SolrCore core = cc.getCore(desc.getName())) {
          
          // recover from local transaction log and wait for it to complete before
@@@ -962,7 -1006,6 +1015,7 @@@
            publish(desc, Replica.State.ACTIVE);
          }
          
-         
++
          core.getCoreDescriptor().getCloudDescriptor().setHasRegistered(true);
        }
        
@@@ -1296,15 -1329,13 +1349,15 @@@
        assert false : "No collection was specified [" + collection + "]";
        return;
      }
 +    Replica replica = zkStateReader.getClusterState().getReplica(collection, coreNodeName);
-     
+ 
 -    ElectionContext context = electionContexts.remove(new ContextKey(collection, coreNodeName));
 +    if (replica == null || replica.getType() != Type.PULL) {
 +      ElectionContext context = electionContexts.remove(new ContextKey(collection, coreNodeName));
  
 -    if (context != null) {
 -      context.cancelElection();
 +      if (context != null) {
 +        context.cancelElection();
 +      }
      }
 -
      CloudDescriptor cloudDescriptor = cd.getCloudDescriptor();
      zkStateReader.unregisterCore(cloudDescriptor.getCollectionName());
  

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d3b5adfd/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
----------------------------------------------------------------------


[38/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-3702: concat(..) function query

Posted by sh...@apache.org.
SOLR-3702: concat(..) function query


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/357f4dfb
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/357f4dfb
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/357f4dfb

Branch: refs/heads/feature/autoscaling
Commit: 357f4dfb1840af86395dde878b55aff77c8d7e2d
Parents: 99093ca
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Sat Jun 3 19:35:29 2017 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Mon Jun 5 23:26:06 2017 +0300

----------------------------------------------------------------------
 solr/CHANGES.txt                                |   2 +
 .../StatsCollectorSupplierFactory.java          |   2 +-
 .../solr/analytics/util/AnalyticsParams.java    |   3 +-
 .../util/valuesource/ConcatStringFunction.java  |  54 -------
 .../util/valuesource/MultiStringFunction.java   | 146 -------------------
 .../apache/solr/search/ValueSourceParser.java   |   9 ++
 .../search/function/ConcatStringFunction.java   |  53 +++++++
 .../search/function/MultiStringFunction.java    | 146 +++++++++++++++++++
 .../apache/solr/search/QueryEqualityTest.java   |  15 ++
 .../solr/search/function/TestFunctionQuery.java |  19 +++
 solr/solr-ref-guide/src/function-queries.adoc   |   1 +
 11 files changed, 248 insertions(+), 202 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index a11c470..df071eb 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -276,6 +276,8 @@ New Features
 * SOLR-10479: Adds support for HttpShardHandlerFactory.loadBalancerRequests(MinimumAbsolute|MaximumFraction)
   configuration. (Ramsey Haddad, Daniel Collins, Christine Poerschke)
 
+* SOLR-3702: concat(...) function query (Andrey Kudryavtsev via Mikhail Khludnev)
+
 Bug Fixes
 ----------------------
 * SOLR-10723 JSON Facet API: resize() implemented incorrectly for CountSlotAcc, HllAgg.NumericAcc

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
----------------------------------------------------------------------
diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
index 30baec4..e22362d 100644
--- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
+++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/statistics/StatsCollectorSupplierFactory.java
@@ -36,7 +36,6 @@ import org.apache.solr.analytics.request.ExpressionRequest;
 import org.apache.solr.analytics.util.AnalyticsParams;
 import org.apache.solr.analytics.util.valuesource.AbsoluteValueDoubleFunction;
 import org.apache.solr.analytics.util.valuesource.AddDoubleFunction;
-import org.apache.solr.analytics.util.valuesource.ConcatStringFunction;
 import org.apache.solr.analytics.util.valuesource.ConstDateSource;
 import org.apache.solr.analytics.util.valuesource.ConstDoubleSource;
 import org.apache.solr.analytics.util.valuesource.ConstStringSource;
@@ -64,6 +63,7 @@ import org.apache.solr.schema.TrieDoubleField;
 import org.apache.solr.schema.TrieFloatField;
 import org.apache.solr.schema.TrieIntField;
 import org.apache.solr.schema.TrieLongField;
+import org.apache.solr.search.function.ConcatStringFunction;
 import org.apache.solr.util.DateMathParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParams.java
----------------------------------------------------------------------
diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParams.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParams.java
index b9da1cf..f6716ff 100644
--- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParams.java
+++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/AnalyticsParams.java
@@ -22,6 +22,7 @@ import java.util.Set;
 
 import org.apache.solr.common.params.FacetParams.FacetRangeInclude;
 import org.apache.solr.common.params.FacetParams.FacetRangeOther;
+import org.apache.solr.search.function.ConcatStringFunction;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -106,7 +107,7 @@ public interface AnalyticsParams {
   //Strings
   final static String CONSTANT_STRING = "const_str";
   final static String REVERSE = "rev";
-  final static String CONCATENATE = "concat";
+  final static String CONCATENATE = ConcatStringFunction.NAME;
   public static final Set<String> STRING_OPERATION_SET = Collections.unmodifiableSet(Sets.newLinkedHashSet(Lists.newArrayList(CONSTANT_STRING,REVERSE,CONCATENATE)));
   
   // Field Source Wrappers

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConcatStringFunction.java
----------------------------------------------------------------------
diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConcatStringFunction.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConcatStringFunction.java
deleted file mode 100644
index b1e1dc0..0000000
--- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/ConcatStringFunction.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.
- */
-package org.apache.solr.analytics.util.valuesource;
-
-import java.io.IOException;
-
-import org.apache.lucene.queries.function.FunctionValues;
-import org.apache.lucene.queries.function.ValueSource;
-import org.apache.solr.analytics.util.AnalyticsParams;
-
-/**
- * <code>ConcatStringFunction</code> concatenates the string values of its 
- * components in the order given.
- */
-public class ConcatStringFunction extends MultiStringFunction {
-  public final static String NAME = AnalyticsParams.CONCATENATE;
-
-  public ConcatStringFunction(ValueSource[] sources) {
-    super(sources);
-  }
-
-  protected String name() {
-    return NAME;
-  }
-
-  @Override
-  protected String func(int doc, FunctionValues[] valsArr) throws IOException {
-    StringBuilder sb = new StringBuilder();
-    for (FunctionValues val : valsArr) {
-      String v = val.strVal(doc);
-      if(v == null){
-        return null;
-      } else {
-        sb.append(v);
-      }
-    }
-    return sb.toString();
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/MultiStringFunction.java
----------------------------------------------------------------------
diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/MultiStringFunction.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/MultiStringFunction.java
deleted file mode 100644
index 4689d8b..0000000
--- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/valuesource/MultiStringFunction.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.
- */
-package org.apache.solr.analytics.util.valuesource;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Map;
-
-import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.queries.function.FunctionValues;
-import org.apache.lucene.queries.function.ValueSource;
-import org.apache.lucene.queries.function.docvalues.StrDocValues;
-import org.apache.lucene.util.BytesRefBuilder;
-import org.apache.lucene.util.mutable.MutableValue;
-import org.apache.lucene.util.mutable.MutableValueStr;
-
-/**
- * Abstract {@link ValueSource} implementation which wraps multiple ValueSources
- * and applies an extendible string function to their values.
- **/
-public abstract class MultiStringFunction extends ValueSource {
-  protected final ValueSource[] sources;
-  
-  public MultiStringFunction(ValueSource[] sources) {
-    this.sources = sources;
-  }
-
-  abstract protected String name();
-  abstract protected CharSequence func(int doc, FunctionValues[] valsArr) throws IOException;
-
-  @Override
-  public String description() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(name()).append('(');
-    boolean firstTime=true;
-    for (ValueSource source : sources) {
-      if (firstTime) {
-        firstTime=false;
-      } else {
-        sb.append(',');
-      }
-      sb.append(source);
-    }
-    sb.append(')');
-    return sb.toString();
-  }
-
-  @Override
-  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
-    final FunctionValues[] valsArr = new FunctionValues[sources.length];
-    for (int i=0; i<sources.length; i++) {
-      valsArr[i] = sources[i].getValues(context, readerContext);
-    }
-
-    return new StrDocValues(this) {
-      @Override
-      public String strVal(int doc) throws IOException {
-        CharSequence cs = func(doc, valsArr);
-        return  cs != null ? cs.toString() : null;
-      }
-      
-      @Override
-      public boolean exists(int doc) throws IOException {
-        boolean exists = true;
-        for (FunctionValues val : valsArr) {
-          exists = exists & val.exists(doc);
-        }
-        return exists;
-      }
-      
-      @Override
-      public boolean bytesVal(int doc, BytesRefBuilder bytes) throws IOException {
-        bytes.clear();
-        CharSequence cs = func(doc, valsArr);
-        if( cs != null ){
-          bytes.copyChars(func(doc,valsArr));
-          return true;
-        } else {
-          return false;
-        }
-      }
-      
-      @Override
-      public String toString(int doc) throws IOException {
-        StringBuilder sb = new StringBuilder();
-        sb.append(name()).append('(');
-        boolean firstTime=true;
-        for (FunctionValues vals : valsArr) {
-          if (firstTime) {
-            firstTime=false;
-          } else {
-            sb.append(',');
-          }
-          sb.append(vals.toString(doc));
-        }
-        sb.append(')');
-        return sb.toString();
-      }
-
-      @Override
-      public ValueFiller getValueFiller() {
-        return new ValueFiller() {
-          private final MutableValueStr mval = new MutableValueStr();
-
-          @Override
-          public MutableValue getValue() {
-            return mval;
-          }
-
-          @Override
-          public void fillValue(int doc) throws IOException {
-            mval.exists = bytesVal(doc, mval.value);
-          }
-        };
-      }
-    };
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (getClass() != o.getClass()) return false;
-    MultiStringFunction other = (MultiStringFunction)o;
-    return this.name().equals(other.name())
-            && Arrays.equals(this.sources, other.sources);
-  }
-
-  @Override
-  public int hashCode() {
-    return Arrays.hashCode(sources) + name().hashCode();
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
index 517b86f..b599272 100644
--- a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
+++ b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
@@ -64,6 +64,7 @@ import org.apache.solr.search.facet.SumsqAgg;
 import org.apache.solr.search.facet.UniqueAgg;
 import org.apache.solr.search.facet.VarianceAgg;
 import org.apache.solr.search.function.CollapseScoreFunction;
+import org.apache.solr.search.function.ConcatStringFunction;
 import org.apache.solr.search.function.OrdFieldSource;
 import org.apache.solr.search.function.ReverseOrdFieldSource;
 import org.apache.solr.search.function.SolrComparisonBoolFunction;
@@ -932,6 +933,14 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
       }
     });
 
+    addParser("concat", new ValueSourceParser() {
+      @Override
+      public ValueSource parse(FunctionQParser fp) throws SyntaxError {
+        List<ValueSource> sources = fp.parseValueSourceList();
+        return new ConcatStringFunction(sources.toArray(new ValueSource[sources.size()]));
+      }
+    });
+
 
     addParser("agg", new ValueSourceParser() {
       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/core/src/java/org/apache/solr/search/function/ConcatStringFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/ConcatStringFunction.java b/solr/core/src/java/org/apache/solr/search/function/ConcatStringFunction.java
new file mode 100644
index 0000000..9162342
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/search/function/ConcatStringFunction.java
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+package org.apache.solr.search.function;
+
+import java.io.IOException;
+
+import org.apache.lucene.queries.function.FunctionValues;
+import org.apache.lucene.queries.function.ValueSource;
+
+/**
+ * <code>ConcatStringFunction</code> concatenates the string values of its 
+ * components in the order given.
+ */
+public class ConcatStringFunction extends MultiStringFunction {
+  public final static String NAME = "concat";
+
+  public ConcatStringFunction(ValueSource[] sources) {
+    super(sources);
+  }
+
+  protected String name() {
+    return NAME;
+  }
+
+  @Override
+  protected String func(int doc, FunctionValues[] valsArr) throws IOException {
+    StringBuilder sb = new StringBuilder();
+    for (FunctionValues val : valsArr) {
+      String v = val.strVal(doc);
+      if(v == null){
+        return null;
+      } else {
+        sb.append(v);
+      }
+    }
+    return sb.toString();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java b/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
new file mode 100644
index 0000000..c4aef6c
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/search/function/MultiStringFunction.java
@@ -0,0 +1,146 @@
+/*
+ * 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.
+ */
+package org.apache.solr.search.function;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Map;
+
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.queries.function.FunctionValues;
+import org.apache.lucene.queries.function.ValueSource;
+import org.apache.lucene.queries.function.docvalues.StrDocValues;
+import org.apache.lucene.util.BytesRefBuilder;
+import org.apache.lucene.util.mutable.MutableValue;
+import org.apache.lucene.util.mutable.MutableValueStr;
+
+/**
+ * Abstract {@link ValueSource} implementation which wraps multiple ValueSources
+ * and applies an extendible string function to their values.
+ **/
+public abstract class MultiStringFunction extends ValueSource {
+  protected final ValueSource[] sources;
+  
+  public MultiStringFunction(ValueSource[] sources) {
+    this.sources = sources;
+  }
+
+  abstract protected String name();
+  abstract protected CharSequence func(int doc, FunctionValues[] valsArr) throws IOException;
+
+  @Override
+  public String description() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(name()).append('(');
+    boolean firstTime=true;
+    for (ValueSource source : sources) {
+      if (firstTime) {
+        firstTime=false;
+      } else {
+        sb.append(',');
+      }
+      sb.append(source);
+    }
+    sb.append(')');
+    return sb.toString();
+  }
+
+  @Override
+  public FunctionValues getValues(Map context, LeafReaderContext readerContext) throws IOException {
+    final FunctionValues[] valsArr = new FunctionValues[sources.length];
+    for (int i=0; i<sources.length; i++) {
+      valsArr[i] = sources[i].getValues(context, readerContext);
+    }
+
+    return new StrDocValues(this) {
+      @Override
+      public String strVal(int doc) throws IOException {
+        CharSequence cs = func(doc, valsArr);
+        return  cs != null ? cs.toString() : null;
+      }
+      
+      @Override
+      public boolean exists(int doc) throws IOException {
+        boolean exists = true;
+        for (FunctionValues val : valsArr) {
+          exists = exists & val.exists(doc);
+        }
+        return exists;
+      }
+      
+      @Override
+      public boolean bytesVal(int doc, BytesRefBuilder bytes) throws IOException {
+        bytes.clear();
+        CharSequence cs = func(doc, valsArr);
+        if( cs != null ){
+          bytes.copyChars(func(doc,valsArr));
+          return true;
+        } else {
+          return false;
+        }
+      }
+      
+      @Override
+      public String toString(int doc) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        sb.append(name()).append('(');
+        boolean firstTime=true;
+        for (FunctionValues vals : valsArr) {
+          if (firstTime) {
+            firstTime=false;
+          } else {
+            sb.append(',');
+          }
+          sb.append(vals.toString(doc));
+        }
+        sb.append(')');
+        return sb.toString();
+      }
+
+      @Override
+      public ValueFiller getValueFiller() {
+        return new ValueFiller() {
+          private final MutableValueStr mval = new MutableValueStr();
+
+          @Override
+          public MutableValue getValue() {
+            return mval;
+          }
+
+          @Override
+          public void fillValue(int doc) throws IOException {
+            mval.exists = bytesVal(doc, mval.value);
+          }
+        };
+      }
+    };
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (getClass() != o.getClass()) return false;
+    MultiStringFunction other = (MultiStringFunction)o;
+    return this.name().equals(other.name())
+            && Arrays.equals(this.sources, other.sources);
+  }
+
+  @Override
+  public int hashCode() {
+    return Arrays.hashCode(sources) + name().hashCode();
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
index 0a9059c..aece15e 100644
--- a/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
+++ b/solr/core/src/test/org/apache/solr/search/QueryEqualityTest.java
@@ -862,6 +862,21 @@ public class QueryEqualityTest extends SolrTestCaseJ4 {
     }
   }
 
+  public void testFuncConcat() throws Exception {
+    SolrQueryRequest req = req("myField","bar_f","myOtherField","bar_t");
+
+    try {
+      assertFuncEquals(req,
+          "concat(bar_f,bar_t)",
+          "concat($myField,bar_t)",
+          "concat(bar_f,$myOtherField)",
+          "concat($myField,$myOtherField)");
+
+    } finally {
+      req.close();
+    }
+  }
+
   public void testFuncSingleValueMathFuncs() throws Exception {
     SolrQueryRequest req = req("myVal","45", "myField","foo_i");
     for (final String func : new String[] {"abs","rad","deg","sqrt","cbrt",

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java b/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
index e77c4ee..675123c 100644
--- a/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
+++ b/solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java
@@ -773,6 +773,25 @@ public class TestFunctionQuery extends SolrTestCaseJ4 {
 
   }
 
+  public void testConcatFunction() {
+    clearIndex();
+  
+    assertU(adoc("id", "1", "field1_t", "buzz", "field2_t", "word"));
+    assertU(adoc("id", "2", "field1_t", "1", "field2_t", "2","field4_t", "4"));
+    assertU(commit());
+  
+    assertQ(req("q","id:1",
+        "fl","field:concat(field1_t,field2_t)"),
+        " //str[@name='field']='buzzword'");
+  
+    assertQ(req("q","id:2",
+        "fl","field:concat(field1_t,field2_t,field4_t)"),
+        " //str[@name='field']='124'");
+  
+    assertQ(req("q","id:1",
+        "fl","field:def(concat(field3_t, field4_t), 'defValue')"),
+        " //str[@name='field']='defValue'");
+   }
 
   @Test
   public void testPseudoFieldFunctions() throws Exception {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/357f4dfb/solr/solr-ref-guide/src/function-queries.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/function-queries.adoc b/solr/solr-ref-guide/src/function-queries.adoc
index 0a628c1..624406f 100644
--- a/solr/solr-ref-guide/src/function-queries.adoc
+++ b/solr/solr-ref-guide/src/function-queries.adoc
@@ -86,6 +86,7 @@ The table below summarizes the functions available for function queries.
 |===
 |Function |Description |Syntax Examples
 |abs |Returns the absolute value of the specified value or function. |`abs(x)` `abs(-5)`
+|concat(v,f..)|concatenates the given string fields, literals and other functions |`concat(name," ",$param,def(opt,"-"))`
 |"constant" |Specifies a floating point constant. |`1.5`
 |def |`def` is short for default. Returns the value of field "field", or if the field does not exist, returns the default value specified. and yields the first value where `exists()==true`.) |`def(rating,5):` This `def()` function returns the rating, or if no rating specified in the doc, returns 5 `def(myfield, 1.0):` equivalent to `if(exists(myfield),myfield,1.0)`
 |div |Divides one value or function by another. div(x,y) divides x by y. |`div(1,y)` `div(sum(x,100),max(y,1))`


[37/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10713: Add common output files to .gitignore

Posted by sh...@apache.org.
SOLR-10713: Add common output files to .gitignore

Signed-off-by: Mike Drob <md...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/99093cae
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/99093cae
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/99093cae

Branch: refs/heads/feature/autoscaling
Commit: 99093caec5932b00decbc2ee5948610bfd9202ca
Parents: 6b022c9
Author: Jason Gerlowski <ge...@gmail.com>
Authored: Sun Jun 4 16:59:25 2017 -0400
Committer: Mike Drob <md...@apache.org>
Committed: Mon Jun 5 12:49:50 2017 -0500

----------------------------------------------------------------------
 .gitignore       | 41 +++++++----------------------------------
 solr/.gitignore  | 30 ++++++++++++++++++++++++++++++
 solr/CHANGES.txt |  2 ++
 3 files changed, 39 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99093cae/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 4962ab9..7137e12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,19 @@
 # .
 /eclipse-build
 /classes
-**/build
+build
 /idea-build
-**/dist
-**/lib
-**/test-lib
+dist
+lib
+test-lib
 /*~
 /velocity.log
 /build.properties
 /.idea
 lucene/**/*.iml
-solr/**/*.iml
 parent.iml
-**/*.ipr
-**/*.iws
+*.ipr
+*.iws
 /.project
 /.classpath
 /.settings
@@ -22,33 +21,7 @@ parent.iml
 /prj.el
 /bin
 /bin.*
-**/pom.xml
+pom.xml
 /nbproject
 /nb-build
 .pydevproject
-
-/solr/package
-
-# can this be minimized?
-/solr/example/start.jar
-/solr/example/webapps/*
-/solr/example/logs/*.log
-/solr/example/**/data
-/solr/example/solr/lib
-/solr/example/solr/logs
-/solr/example/solr/zoo_data
-/solr/example/work/*
-/solr/example/exampledocs/post.jar
-
-/solr/example/example-DIH/**/data
-/solr/example/example-DIH/**/dataimport.properties
-/solr/example/example-DIH/solr/mail/lib/*.jar
-
-solr/contrib/dataimporthandler/test-lib/
-
-solr/core/test-lib/
-
-solr/server/logs/
-solr/server/solr/zoo_data/
-solr/server/solr-webapp
-solr/server/start.jar

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99093cae/solr/.gitignore
----------------------------------------------------------------------
diff --git a/solr/.gitignore b/solr/.gitignore
new file mode 100644
index 0000000..d02918b
--- /dev/null
+++ b/solr/.gitignore
@@ -0,0 +1,30 @@
+*.iml
+
+/bin/*.pid
+
+/contrib/dataimporthandler/test-lib/
+
+/core/test-lib/
+
+/example/start.jar
+/example/webapps/*
+/example/logs/*.log
+/example/**/data
+/example/solr/lib
+/example/solr/logs
+/example/solr/zoo_data
+/example/work/*
+/example/exampledocs/post.jar
+/example/example-DIH/**/data
+/example/example-DIH/**/dataimport.properties
+/example/example-DIH/solr/mail/lib/*.jar
+
+/package
+
+/server/logs/
+/server/solr/zoo_data/
+/server/solr-webapp
+/server/start.jar
+
+*.out
+*.err

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99093cae/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 7b3dcff..a11c470 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -236,6 +236,8 @@ Other Changes
 * SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class.
   (Christine Poerschke, Anshum Gupta)
 
+* SOLR-10713: Ignore .pid and .out files in solr working directory (Jason Gerlowski via Mike Drob)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.


[42/50] [abbrv] lucene-solr:feature/autoscaling: Merge branch 'feature/autoscaling_solr7'

Posted by sh...@apache.org.
Merge branch 'feature/autoscaling_solr7'

# Conflicts:
#	solr/CHANGES.txt


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d633c957
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d633c957
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d633c957

Branch: refs/heads/feature/autoscaling
Commit: d633c957cb79713e38bb3463969d7649cae18eaa
Parents: 4f55b43 b47572e
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue Jun 6 09:26:56 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Tue Jun 6 09:26:56 2017 +0530

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  18 +-
 .../src/java/org/apache/solr/cloud/Assign.java  |  64 +-
 .../apache/solr/cloud/CreateCollectionCmd.java  |   2 +-
 .../cloud/OverseerCollectionMessageHandler.java | 108 ++-
 .../java/org/apache/solr/cloud/RestoreCmd.java  |   2 +-
 .../org/apache/solr/cloud/SplitShardCmd.java    |   2 +-
 .../org/apache/solr/cloud/ZkController.java     |   1 +
 .../cloud/autoscaling/AutoScalingHandler.java   | 319 +++++++++
 .../solr/cloud/autoscaling/package-info.java    |  21 +
 .../solr/cloud/rule/ServerSnitchContext.java    |  25 +-
 .../org/apache/solr/core/CoreContainer.java     |  30 +-
 .../apache/solr/core/SolrResourceLoader.java    |   3 +-
 .../org/apache/solr/handler/BlobHandler.java    |   2 +-
 .../solr/handler/RequestHandlerUtils.java       |  13 +
 .../org/apache/solr/handler/SchemaHandler.java  |   2 +-
 .../apache/solr/handler/SolrConfigHandler.java  |  11 +-
 .../solr/handler/admin/CollectionsHandler.java  |   4 +-
 .../solr/handler/admin/SecurityConfHandler.java |   4 +-
 .../solr/response/TextResponseWriter.java       |  13 +-
 .../solr/security/PermissionNameProvider.java   |   2 +
 .../resources/apispec/autoscaling.Commands.json |  47 ++
 .../autoscaling/AutoScalingHandlerTest.java     | 338 ++++++++++
 .../solr/cloud/autoscaling/TestPolicyCloud.java | 195 ++++++
 .../solr/cloud/rule/ImplicitSnitchTest.java     |  50 +-
 .../solr/client/solrj/impl/CloudSolrClient.java |  15 +-
 .../solrj/impl/SolrClientDataProvider.java      | 256 ++++++++
 .../impl/ZkClientClusterStateProvider.java      |  11 +-
 .../solrj/request/CollectionAdminRequest.java   |  10 +-
 .../solr/client/solrj/request/V2Request.java    |   4 +-
 .../cloud/autoscaling/AddReplicaSuggester.java  |  69 ++
 .../org/apache/solr/cloud/autoscaling/Cell.java |  57 ++
 .../apache/solr/cloud/autoscaling/Clause.java   | 460 +++++++++++++
 .../cloud/autoscaling/ClusterDataProvider.java  |  52 ++
 .../cloud/autoscaling/MoveReplicaSuggester.java |  83 +++
 .../apache/solr/cloud/autoscaling/Operand.java  | 123 ++++
 .../apache/solr/cloud/autoscaling/Policy.java   | 519 +++++++++++++++
 .../solr/cloud/autoscaling/PolicyHelper.java    |  96 +++
 .../solr/cloud/autoscaling/Preference.java      |  87 +++
 .../org/apache/solr/cloud/autoscaling/Row.java  | 115 ++++
 .../solr/cloud/autoscaling/package-info.java    |  22 +
 .../org/apache/solr/common/IteratorWriter.java  |  21 +-
 .../java/org/apache/solr/common/MapWriter.java  |  10 +
 .../apache/solr/common/cloud/DocCollection.java |  14 +
 .../apache/solr/common/cloud/ZkStateReader.java |   1 +
 .../solr/common/cloud/rule/ImplicitSnitch.java  |  53 +-
 .../apache/solr/common/cloud/rule/Snitch.java   |   6 +-
 .../solr/common/cloud/rule/SnitchContext.java   |   7 +-
 .../apache/solr/common/params/CommonParams.java |   6 +-
 .../common/params/ModifiableSolrParams.java     |   4 +
 .../solr/common/util/CommandOperation.java      |  50 +-
 .../apache/solr/common/util/JavaBinCodec.java   |  15 +-
 .../java/org/apache/solr/common/util/Utils.java |  94 ++-
 .../solr/cloud/autoscaling/TestPolicy.java      | 654 +++++++++++++++++++
 53 files changed, 3998 insertions(+), 192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/CHANGES.txt
----------------------------------------------------------------------
diff --cc solr/CHANGES.txt
index b0da3b8,d83b786..9bbb725
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@@ -208,36 -204,12 +214,42 @@@ Other Change
  
  * SOLR-10755: delete/refactor many solrj deprecations (hossman)
  
 +* SOLR-10752: replicationFactor (nrtReplicas) default is 0 if tlogReplicas is specified when creating a collection
 +  (Tomás Fernández Löbbe)
 +
 +* SOLR-10757: delete/refactor/cleanup CollectionAdminRequest deprecations (hossman)
 +
 +* SOLR-10793: BlobHandler should have a well-known permission name (noble)
 +
 +* SOLR-10744: Update noggit to newer version (0.8) (noble)
 +
 +* SOLR-10792: Deprecate and remove implicit registration of "lucenePlusSort" aka OldLuceneQParser (hossman)
 +
 +* SOLR-10791: Remove deprecated options in SSLTestConfig (hossman)
 +
 +* LUCENE-7852: Correct copyright year(s) in solr/LICENSE.txt file.
 +  (Christine Poerschke, Steve Rowe)
 +
 +* SOLR-8668: In solrconfig.xml remove <mergePolicy> (and related <mergeFactor> and <maxMergeDocs>)
 +  support in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
 +  (Christine Poerschke, hossman)
 +
 +* SOLR-10799: Extracted functionality to collect eligible replicas from HttpShardHandler.prepDistributed()
 +  to a new method (Domenico Fabio Marino via Tomás Fernández Löbbe)
 +
 +* SOLR-10801: Remove several deprecated methods that were exposed to plugin writers (hossman)
 +
 +* SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class.
 +  (Christine Poerschke, Anshum Gupta)
 +
 +* SOLR-10713: Ignore .pid and .out files in solr working directory (Jason Gerlowski via Mike Drob)
 +
+ * SOLR-10764: AutoScalingHandler should validate policy and preferences before updating zookeeper. (shalin)
+ 
+ * SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups. (Noble Paul, shalin)
+ 
+ * SOLR-10419: All collection APIs should use the new Policy framework for replica placement. (Noble Paul, shalin)
+ 
  ==================  6.7.0 ==================
  
  Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
@@@ -321,15 -253,7 +333,15 @@@ Bug Fixe
  * SOLR-10723 JSON Facet API: resize() implemented incorrectly for CountSlotAcc, HllAgg.NumericAcc
    resulting in exceptions when using a hashing faceting method and sorting by hll(numeric_field).
    (yonik)
-   
+ 
 +* SOLR-10719: Creating a core.properties fails if the parent of core.properties is a symlinked dierctory
 +  (Erick Erickson)
 +
 +* SOLR-10360: Solr HDFS snapshot export fails due to FileNotFoundException error when using MR1 instead of
 +  yarn. (Hrishikesh via Mark Miller)
-   
++
 +* SOLR-10137: Ensure that ConfigSets created via API are mutable. (Hrishikesh via Mark Miller)
 +
  Optimizations
  ----------------------
  * SOLR-10634: JSON Facet API: When a field/terms facet will retrieve all buckets (i.e. limit:-1)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/core/src/java/org/apache/solr/cloud/Assign.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
index c80402f,f995d09..c18a8e4
--- a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
@@@ -216,13 -222,13 +222,17 @@@ public class CommandOperation 
  
    /**
     * Parse the command operations into command objects
+    *
+    * @param rdr               The payload
+    * @param singletonCommands commands that cannot be repeated
+    * @return parsed list of commands
     */
-   public static List<CommandOperation> parse(Reader rdr) throws IOException {
+   public static List<CommandOperation> parse(Reader rdr, Set<String> singletonCommands) throws IOException {
      JSONParser parser = new JSONParser(rdr);
 +    parser.setFlags(parser.getFlags() |
 +        JSONParser.ALLOW_MISSING_COLON_COMMA_BEFORE_OBJECT |
 +        JSONParser.OPTIONAL_OUTER_BRACES
 +    );
  
      ObjectBuilder ob = new ObjectBuilder(parser);
  

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d633c957/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
----------------------------------------------------------------------


[15/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-7452: tests: templatize refinement tests

Posted by sh...@apache.org.
SOLR-7452: tests: templatize refinement tests


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/393a2ed1
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/393a2ed1
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/393a2ed1

Branch: refs/heads/feature/autoscaling
Commit: 393a2ed176b8acfe26cee821d7f3a8babed122b9
Parents: ac26d81
Author: yonik <yo...@apache.org>
Authored: Fri Jun 2 11:35:59 2017 -0400
Committer: yonik <yo...@apache.org>
Committed: Fri Jun 2 11:36:10 2017 -0400

----------------------------------------------------------------------
 .../search/facet/TestJsonFacetRefinement.java   | 71 ++++++++++++--------
 1 file changed, 43 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/393a2ed1/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
index 6b542a1..e0b1865 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacetRefinement.java
@@ -235,6 +235,22 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
 
   @Test
   public void testBasicRefinement() throws Exception {
+    ModifiableSolrParams p = params("cat_s", "cat_s", "xy_s", "xy_s", "num_d", "num_d", "qw_s", "qw_s", "er_s","er_s");
+    doBasicRefinement( p );
+
+    p.set("terms","method:dv,");
+    doBasicRefinement( p );
+
+    // multi-valued strings
+    p = params("cat_s", "cat_ss", "xy_s", "xy_ss", "num_d", "num_d", "qw_s", "qw_ss", "er_s","er_ss");
+    doBasicRefinement( p );
+
+    // single valued docvalues
+    p = params("cat_s", "cat_sd", "xy_s", "xy_sd", "num_d", "num_dd", "qw_s", "qw_sd", "er_s","er_sd");
+    doBasicRefinement( p );
+  }
+
+  public void doBasicRefinement(ModifiableSolrParams p) throws Exception {
     initServers();
     Client client = servers.getClient(random().nextInt());
     client.queryDefaults().set( "shards", servers.getShards(), "debugQuery", Boolean.toString(random().nextBoolean()) );
@@ -244,7 +260,6 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
 
     client.deleteByQuery("*:*", null);
 
-    ModifiableSolrParams p = params("cat_s", "cat_s", "xy_s", "xy_s", "num_d", "num_d", "qw_s", "qw_s", "er_s","er_s");
     String cat_s = p.get("cat_s");
     String xy_s = p.get("xy_s");
     String qw_s = p.get("qw_s");
@@ -281,7 +296,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
 
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "cat0:{type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:false}" +
+            "cat0:{${terms} type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:false}" +
             "}"
         )
         , "facets=={ count:8" +
@@ -291,7 +306,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
 
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "cat0:{type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:true}" +
+            "cat0:{${terms} type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:true}" +
             "}"
         )
         , "facets=={ count:8" +
@@ -302,7 +317,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test that basic stats work for refinement
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "cat0:{type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:true, facet:{ stat1:'sum(${num_d})'}   }" +
+            "cat0:{${terms} type:terms, field:${cat_s}, sort:'count desc', limit:1, overrequest:0, refine:true, facet:{ stat1:'sum(${num_d})'}   }" +
             "}"
         )
         , "facets=={ count:8" +
@@ -313,11 +328,11 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test sorting buckets by a different stat
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            " cat0:{type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:false, facet:{ min1:'min(${num_d})'}   }" +
-            ",cat1:{type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }" +
-            ",qfacet:{type:query, q:'*:*', facet:{  cat2:{type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }  }}" +  // refinement needed through a query facet
-            ",allf:{type:terms, field:all_s,  facet:{  cat3:{type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }  }}" +  // refinement needed through field facet
-            ",sum1:'sum(num_d)'" +  // make sure that root bucket stats aren't affected by refinement
+            " cat0:{${terms} type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:false, facet:{ min1:'min(${num_d})'}   }" +
+            ",cat1:{${terms} type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }" +
+            ",qfacet:{type:query, q:'*:*', facet:{  cat2:{${terms} type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }  }}" +  // refinement needed through a query facet
+            ",allf:{${terms} type:terms, field:all_s,  facet:{  cat3:{${terms} type:terms, field:${cat_s}, sort:'min1 asc', limit:1, overrequest:0, refine:true,  facet:{ min1:'min(${num_d})'}   }  }}" +  // refinement needed through field facet
+            ",sum1:'sum(${num_d})'" +  // make sure that root bucket stats aren't affected by refinement
             "}"
         )
         , "facets=={ count:8" +
@@ -332,7 +347,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test partial buckets (field facet within field facet)
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "ab:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true,  facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true   }  }}" +
+            "ab:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true,  facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true   }  }}" +
             "}"
         )
         , "facets=={ count:8" +
@@ -343,10 +358,10 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test that sibling facets and stats are included for _p buckets, but skipped for _s buckets
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            " ab :{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true,  facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" +
-            ",ab2:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" + // top level refine=false shouldn't matter
-            ",allf :{type:terms, field:all_s, limit:1, overrequest:0, refine:true,  facet:{cat:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" +
-            ",allf2:{type:terms, field:all_s, limit:1, overrequest:0, refine:false, facet:{cat:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" + // top level refine=false shouldn't matter
+            " ab :{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true,  facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" +
+            ",ab2:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" + // top level refine=false shouldn't matter
+            ",allf :{${terms} type:terms, field:all_s, limit:1, overrequest:0, refine:true,  facet:{cat:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" +
+            ",allf2:{${terms} type:terms, field:all_s, limit:1, overrequest:0, refine:false, facet:{cat:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true}, qq:{query:'*:*'},ww:'sum(${num_d})'  }}" + // top level refine=false shouldn't matter
             "}"
         )
         , "facets=={ count:8" +
@@ -360,7 +375,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test refining under the special "missing" bucket of a field facet
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "f:{type:terms, field:missing_s, limit:1, overrequest:0, missing:true, refine:true,  facet:{  cat:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true   }  }}" +
+            "f:{${terms} type:terms, field:missing_s, limit:1, overrequest:0, missing:true, refine:true,  facet:{  cat:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true   }  }}" +
             "}"
         )
         , "facets=={ count:8" +
@@ -372,11 +387,11 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
             // test all values missing in sub-facet
-            " ab :{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false,  facet:{  zz:{type:terms, field:missing_s, limit:1, overrequest:0, refine:false, missing:true}  }}" +
-            ",ab2:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true ,  facet:{  zz:{type:terms, field:missing_s, limit:1, overrequest:0, refine:true , missing:true}  }}" +
+            " ab :{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false,  facet:{  zz:{${terms} type:terms, field:missing_s, limit:1, overrequest:0, refine:false, missing:true}  }}" +
+            ",ab2:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true ,  facet:{  zz:{${terms} type:terms, field:missing_s, limit:1, overrequest:0, refine:true , missing:true}  }}" +
             // test some values missing in sub-facet (and test that this works with normal partial bucket refinement)
-            ", cd :{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false,  facet:{  qw:{type:terms, field:${qw_s}, limit:1, overrequest:0, refine:false, missing:true,   facet:{qq:{query:'*:*'}}   }  }}" +
-            ", cd2:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true ,  facet:{  qw:{type:terms, field:${qw_s}, limit:1, overrequest:0, refine:true , missing:true,   facet:{qq:{query:'*:*'}}   }  }}" +
+            ", cd :{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false,  facet:{  qw:{${terms} type:terms, field:${qw_s}, limit:1, overrequest:0, refine:false, missing:true,   facet:{qq:{query:'*:*'}}   }  }}" +
+            ", cd2:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true ,  facet:{  qw:{${terms} type:terms, field:${qw_s}, limit:1, overrequest:0, refine:true , missing:true,   facet:{qq:{query:'*:*'}}   }  }}" +
 
             "}"
         )
@@ -391,9 +406,9 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test filling in missing "allBuckets"
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "  cat :{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, allBuckets:true, facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:false}  }  }" +
-            ", cat2:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , allBuckets:true, facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:true }  }  }" +
-            ", cat3:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , allBuckets:true, facet:{  xy:{type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:true , facet:{f:'sum(${num_d})'}   }  }  }" +
+            "  cat :{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, allBuckets:true, facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:false}  }  }" +
+            ", cat2:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , allBuckets:true, facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:true }  }  }" +
+            ", cat3:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , allBuckets:true, facet:{  xy:{${terms} type:terms, field:${xy_s}, limit:1, overrequest:0, allBuckets:true, refine:true , facet:{f:'sum(${num_d})'}   }  }  }" +
             "}"
         )
         , "facets=={ count:8" +
@@ -406,8 +421,8 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // test filling in missing numBuckets
     client.testJQ(params(p, "q", "*:*",
         "json.facet", "{" +
-            "  cat :{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, numBuckets:true, facet:{  er:{type:terms, field:${er_s}, limit:1, overrequest:0, numBuckets:true, refine:false}  }  }" +
-            ", cat2:{type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , numBuckets:true, facet:{  er:{type:terms, field:${er_s}, limit:1, overrequest:0, numBuckets:true, refine:true }  }  }" +
+            "  cat :{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:false, numBuckets:true, facet:{  er:{${terms} type:terms, field:${er_s}, limit:1, overrequest:0, numBuckets:true, refine:false}  }  }" +
+            ", cat2:{${terms} type:terms, field:${cat_s}, limit:1, overrequest:0, refine:true , numBuckets:true, facet:{  er:{${terms} type:terms, field:${er_s}, limit:1, overrequest:0, numBuckets:true, refine:true }  }  }" +
             "}"
         )
         , "facets=={ count:8" +
@@ -420,7 +435,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // simplistic join domain testing: no refinement == low count
     client.testJQ(params(p, "q", "${xy_s}:Y", // query only matches one doc per shard
                          "json.facet", "{"+
-                         "  cat0:{type:terms, field:${cat_s}, "+sort_limit_over+" refine:false,"+
+                         "  cat0:{${terms} type:terms, field:${cat_s}, "+sort_limit_over+" refine:false,"+
                          // self join on all_s ensures every doc on every shard included in facets
                          "        domain: { join: { from:all_s, to:all_s } } }" +
                          "}"
@@ -434,7 +449,7 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     // simplistic join domain testing: refinement == correct count
     client.testJQ(params(p, "q", "${xy_s}:Y", // query only matches one doc per shard
                          "json.facet", "{" +
-                         "  cat0:{type:terms, field:${cat_s}, "+sort_limit_over+" refine:true,"+
+                         "  cat0:{${terms} type:terms, field:${cat_s}, "+sort_limit_over+" refine:true,"+
                          // self join on all_s ensures every doc on every shard included in facets
                          "        domain: { join: { from:all_s, to:all_s } } }" +
                          "}"
@@ -449,10 +464,10 @@ public class TestJsonFacetRefinement extends SolrTestCaseHS {
     client.testJQ(params(p, "q", "${xy_s}:Y", // query only matches one doc per shard
                          "json.facet", "{" +
                          // top level facet has a single term
-                         "  all:{type:terms, field:all_s, "+sort_limit_over+" refine:true, " +
+                         "  all:{${terms} type:terms, field:all_s, "+sort_limit_over+" refine:true, " +
                          "       facet:{  "+
                          // subfacet will facet on cat after joining on all (so all docs should be included in subfacet)
-                         "         cat0:{type:terms, field:${cat_s}, "+sort_limit_over+" refine:true,"+
+                         "         cat0:{${terms} type:terms, field:${cat_s}, "+sort_limit_over+" refine:true,"+
                          "               domain: { join: { from:all_s, to:all_s } } } } }" +
                          "}"
                          )


[35/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10696: Fix precommit

Posted by sh...@apache.org.
SOLR-10696: Fix precommit


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6a9830cd
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6a9830cd
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6a9830cd

Branch: refs/heads/feature/autoscaling
Commit: 6a9830cdc0b5a5bf5ae18ff75119e64923d8266a
Parents: 99ca13f
Author: Joel Bernstein <jb...@apache.org>
Authored: Fri Jun 2 15:33:49 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Jun 5 11:19:17 2017 -0400

----------------------------------------------------------------------
 .../org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java  | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a9830cd/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
index 7867048..658e66a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/PercentileEvaluator.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.client.solrj.io.eval;
 
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.util.List;
 import java.io.IOException;
 


[33/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10805: Improve error handling for statistical Stream Evaluators

Posted by sh...@apache.org.
SOLR-10805: Improve error handling for statistical Stream Evaluators


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/f275e3b2
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f275e3b2
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f275e3b2

Branch: refs/heads/feature/autoscaling
Commit: f275e3b254ef70179bf9923140c1d805c4314dd3
Parents: 2271e73
Author: Joel Bernstein <jb...@apache.org>
Authored: Fri Jun 2 12:13:34 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Jun 5 11:19:17 2017 -0400

----------------------------------------------------------------------
 .../org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java   | 5 +++++
 .../apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java | 6 ++++++
 .../apache/solr/client/solrj/io/eval/CorrelationEvaluator.java | 5 +++++
 .../apache/solr/client/solrj/io/eval/CovarianceEvaluator.java  | 5 +++++
 .../apache/solr/client/solrj/io/eval/DistanceEvaluator.java    | 5 +++++
 .../apache/solr/client/solrj/io/eval/FindDelayEvaluator.java   | 5 +++++
 .../apache/solr/client/solrj/io/eval/HistogramEvaluator.java   | 6 ++++--
 .../solr/client/solrj/io/eval/MovingAverageEvaluator.java      | 5 +++++
 .../org/apache/solr/client/solrj/io/eval/RankEvaluator.java    | 5 +++++
 .../org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java | 5 +++++
 .../org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java   | 5 +++++
 .../apache/solr/client/solrj/io/eval/SequenceEvaluator.java    | 5 +++++
 12 files changed, 60 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java
index b228821..d80e693 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/AnovaEvaluator.java
@@ -40,6 +40,11 @@ public class AnovaEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public Tuple evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() < 2) {
+      throw new IOException("ANOVA evaluator expects atleast 2 parameters found: "+subEvaluators.size());
+    }
+
     List<double[]> list = new ArrayList();
     for(StreamEvaluator subEvaluator : subEvaluators) {
       List<Number> nums = (List<Number>)subEvaluator.evaluate(tuple);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java
index 6ca178d..000fa0d 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ConvolutionEvaluator.java
@@ -38,6 +38,12 @@ public class ConvolutionEvaluator extends ComplexEvaluator implements Expressibl
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Convolution evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
     StreamEvaluator colEval2 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CorrelationEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CorrelationEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CorrelationEvaluator.java
index fc3d8c3..05db16f 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CorrelationEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CorrelationEvaluator.java
@@ -37,6 +37,11 @@ public class CorrelationEvaluator extends ComplexEvaluator implements Expressibl
   }
 
   public Number evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Correlation evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
     StreamEvaluator colEval2 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CovarianceEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CovarianceEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CovarianceEvaluator.java
index 7a6de68..5778289 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CovarianceEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/CovarianceEvaluator.java
@@ -37,6 +37,11 @@ public class CovarianceEvaluator extends ComplexEvaluator implements Expressible
   }
 
   public Number evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Covariance evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
     StreamEvaluator colEval2 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/DistanceEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/DistanceEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/DistanceEvaluator.java
index 201da4b..f4ac319 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/DistanceEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/DistanceEvaluator.java
@@ -38,6 +38,11 @@ public class DistanceEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public Number evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Distance evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
     StreamEvaluator colEval2 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FindDelayEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FindDelayEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FindDelayEvaluator.java
index c5a9b8a..0cdd153 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FindDelayEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/FindDelayEvaluator.java
@@ -38,6 +38,11 @@ public class FindDelayEvaluator extends ComplexEvaluator implements Expressible
   }
 
   public Number evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Finddelay evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
     StreamEvaluator colEval2 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/HistogramEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/HistogramEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/HistogramEvaluator.java
index c691698..aa8408b 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/HistogramEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/HistogramEvaluator.java
@@ -42,6 +42,10 @@ public class HistogramEvaluator extends ComplexEvaluator implements Expressible
 
   public List<Map> evaluate(Tuple tuple) throws IOException {
 
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Histogram evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
 
     List<Number> numbers1 = (List<Number>)colEval1.evaluate(tuple);
@@ -79,8 +83,6 @@ public class HistogramEvaluator extends ComplexEvaluator implements Expressible
     return binList;
   }
 
-
-
   @Override
   public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
     StreamExpression expression = new StreamExpression(factory.getFunctionName(getClass()));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/MovingAverageEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/MovingAverageEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/MovingAverageEvaluator.java
index 2e0788f..783116e 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/MovingAverageEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/MovingAverageEvaluator.java
@@ -38,6 +38,11 @@ public class MovingAverageEvaluator extends ComplexEvaluator implements Expressi
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Moving average evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval = subEvaluators.get(0);
     StreamEvaluator windowEval = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RankEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RankEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RankEvaluator.java
index 8a22e94..2086c92 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RankEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RankEvaluator.java
@@ -38,6 +38,11 @@ public class RankEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 1) {
+      throw new IOException("Rank evaluator expects 1 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval = subEvaluators.get(0);
 
     List<Number> numbers = (List<Number>)colEval.evaluate(tuple);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java
index 016e995..cb11c91 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ReverseEvaluator.java
@@ -37,6 +37,11 @@ public class ReverseEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 1) {
+      throw new IOException("Reverse evaluator expects 1 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator colEval1 = subEvaluators.get(0);
 
     List<Number> numbers1 = (List<Number>)colEval1.evaluate(tuple);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java
index 8ff2a7c..f45e2c4 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ScaleEvaluator.java
@@ -38,6 +38,11 @@ public class ScaleEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 2) {
+      throw new IOException("Scale evaluator expects 2 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator numEval = subEvaluators.get(0);
     StreamEvaluator colEval1 = subEvaluators.get(1);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f275e3b2/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/SequenceEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/SequenceEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/SequenceEvaluator.java
index a88d695..c45e551 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/SequenceEvaluator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/SequenceEvaluator.java
@@ -38,6 +38,11 @@ public class SequenceEvaluator extends ComplexEvaluator implements Expressible {
   }
 
   public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 3) {
+      throw new IOException("Sequence evaluator expects 3 parameters found: "+subEvaluators.size());
+    }
+
     StreamEvaluator sizeEval = subEvaluators.get(0);
     StreamEvaluator startEval = subEvaluators.get(1);
     StreamEvaluator strideEval = subEvaluators.get(2);


[43/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10278: A new DSL to set cluster-wide preferences and policies on how to allocate replicas to nodes

Posted by sh...@apache.org.
SOLR-10278: A new DSL to set cluster-wide preferences and policies on how to allocate replicas to nodes


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/790fb193
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/790fb193
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/790fb193

Branch: refs/heads/feature/autoscaling
Commit: 790fb193770dd718f707a524b3864191f53f380f
Parents: d633c95
Author: Noble Paul <no...@apache.org>
Authored: Tue Jun 6 14:51:01 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Tue Jun 6 14:51:01 2017 +0930

----------------------------------------------------------------------
 solr/CHANGES.txt | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/790fb193/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9bbb725..5343bc5 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -125,6 +125,9 @@ New Features
           participate in elections.
   (Tomás Fernández Löbbe)
 
+* SOLR-10278: A new DSL to set cluster-wide preferences and policies on how to allocate replicas to nodes
+  (noble, shalin)
+
 * SOLR-10373: Implement read API for autoscaling configuration at /admin/autoscaling or
   /cluster/autoscaling paths. (shalin)
 


[04/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10559: Add tuple documentation

Posted by sh...@apache.org.
SOLR-10559: Add tuple documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/5b93b738
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/5b93b738
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/5b93b738

Branch: refs/heads/feature/autoscaling
Commit: 5b93b738b1df85c66044ac5d9ec3a64a96b42e62
Parents: a827a9d
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Jun 1 17:14:02 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Jun 1 17:14:02 2017 -0400

----------------------------------------------------------------------
 solr/solr-ref-guide/src/stream-sources.adoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5b93b738/solr/solr-ref-guide/src/stream-sources.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/stream-sources.adoc b/solr/solr-ref-guide/src/stream-sources.adoc
index e8887b4..97a1ca4 100644
--- a/solr/solr-ref-guide/src/stream-sources.adoc
+++ b/solr/solr-ref-guide/src/stream-sources.adoc
@@ -497,7 +497,7 @@ the tuple stream from the Stream Expression into a list of Tuples.
 [source,text]
 ----
 tuple(a=add(1,1),
-      b=search(collection1, q="cat:a", fl="a, b, c", sort"a desc"))
+      b=search(collection1, q="cat:a", fl="a, b, c", sort="a desc"))
 ----
 
 


[20/50] [abbrv] lucene-solr:feature/autoscaling: Ref Guide: add new level-2 header to fix out of order heading levels

Posted by sh...@apache.org.
Ref Guide: add new level-2 header to fix out of order heading levels


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/a477ebb9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/a477ebb9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/a477ebb9

Branch: refs/heads/feature/autoscaling
Commit: a477ebb9852bfd828352e5d5eef9ce42c6a83b9c
Parents: 07bcd4d
Author: Cassandra Targett <ct...@apache.org>
Authored: Fri Jun 2 14:50:03 2017 -0500
Committer: Cassandra Targett <ct...@apache.org>
Committed: Fri Jun 2 14:52:02 2017 -0500

----------------------------------------------------------------------
 solr/solr-ref-guide/src/codec-factory.adoc | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a477ebb9/solr/solr-ref-guide/src/codec-factory.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/codec-factory.adoc b/solr/solr-ref-guide/src/codec-factory.adoc
index 88bc083..8f47038 100644
--- a/solr/solr-ref-guide/src/codec-factory.adoc
+++ b/solr/solr-ref-guide/src/codec-factory.adoc
@@ -22,14 +22,12 @@ A `codecFactory` can be specified in `solrconfig.xml` to determine which Lucene
 
 If not specified, Lucene's default codec is implicitly used.
 
-There are two alternatives to Lucene's default codec:
+== Alternatives to the Default Codec
+There are two alternatives to Lucene's default codec.
 
-. {solr-javadocs}/solr-core/org/apache/solr/core/SchemaCodecFactory.html[`solr.SchemaCodecFactory`] 
-. {solr-javadocs}/solr-core/org/apache/solr/core/SimpleTextCodecFactory.html[`solr.SimpleTextCodecFactory`] 
- 
 === solr.SchemaCodecFactory
 
-`solr.SchemaCodecFactory` supports 2 key features:
+The {solr-javadocs}/solr-core/org/apache/solr/core/SchemaCodecFactory.html[`solr.SchemaCodecFactory`] supports 2 key features:
 
 * Schema based per-fieldtype configuration for `docValuesFormat` and `postingsFormat` - see the <<field-type-definitions-and-properties.adoc#field-type-properties,Field Type Properties>> section for more details.
 * A `compressionMode` option:
@@ -47,9 +45,9 @@ Example:
 
 === solr.SimpleTextCodecFactory
 
-This factory for Lucene's `SimpleTextCodec` produces a plain text human-readable index format.
+This factory for Lucene's {solr-javadocs}/solr-core/org/apache/solr/core/SimpleTextCodecFactory.html[`solr.SimpleTextCodecFactory`] produces a plain text human-readable index format.
 
-CAUTION: *FOR RECREATIONAL USE ONLY*.  This codec should never be used in production.  `SimpleTextCodec` is relatively slow and takes up a large amount of disk space.  Its use should be limited to educational and debugging purposes.
+CAUTION: *FOR RECREATIONAL USE ONLY*. This codec should never be used in production. `SimpleTextCodec` is relatively slow and takes up a large amount of disk space. Its use should be limited to educational and debugging purposes.
 
 Example:
 


[12/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-9735: sysLoadAverage and headusage are now double

Posted by sh...@apache.org.
SOLR-9735: sysLoadAverage and headusage are now double


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e36d2517
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e36d2517
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e36d2517

Branch: refs/heads/feature/autoscaling
Commit: e36d251751143ba36e06defbca8de4ff228483a0
Parents: 2a625df
Author: Noble Paul <no...@apache.org>
Authored: Sat Jun 3 00:17:58 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Sat Jun 3 00:17:58 2017 +0930

----------------------------------------------------------------------
 .../apache/solr/cloud/autoscaling/Clause.java   | 77 +++++++++++---------
 .../apache/solr/cloud/autoscaling/Operand.java  |  6 ++
 .../solr/cloud/autoscaling/TestPolicy.java      | 20 ++++-
 3 files changed, 66 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e36d2517/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
index 9b88d78..1a8a7ab 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
@@ -20,7 +20,6 @@ package org.apache.solr.cloud.autoscaling;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -33,7 +32,6 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.solr.cloud.autoscaling.Policy.ReplicaInfo;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.rule.ImplicitSnitch;
-import org.apache.solr.common.util.RetryUtil;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 
@@ -189,26 +187,6 @@ public class Clause implements MapWriter, Comparable<Clause> {
         operand = EQUAL;
         expectedVal = validate(s, val, true);
       }
-/*
-
-
-        String value = val == null ? null : String.valueOf(val).trim();
-      if(WILDCARD)
-
-      if ((expectedVal = WILDCARD.parse(value)) != null) {
-        operand = WILDCARD;
-      } else if ((expectedVal = NOT_EQUAL.parse(value)) != null) {
-        operand = NOT_EQUAL;
-      } else if ((expectedVal = GREATER_THAN.parse(value)) != null) {
-        operand = GREATER_THAN;
-      } else if ((expectedVal = LESS_THAN.parse(value)) != null) {
-        operand = LESS_THAN;
-      } else {
-        operand = EQUAL;
-        expectedVal = EQUAL.parse(value);
-      }
-*/
-
       return new Condition(conditionName, expectedVal, operand);
 
     } catch (Exception e) {
@@ -358,15 +336,17 @@ public class Clause implements MapWriter, Comparable<Clause> {
   static class ValidateInfo {
     final Class type;
     final Set<String> vals;
-    final Long min;
-    final Long max;
+    final Number min;
+    final Number max;
 
 
-    ValidateInfo(Class type, Set<String> vals, Long min, Long max) {
+    ValidateInfo(Class type, Set<String> vals, Number min, Number max) {
       this.type = type;
       this.vals = vals;
       this.min = min;
+      if(min != null && !type.isInstance(min)) throw new RuntimeException("wrong min value type");
       this.max = max;
+      if(max != null && !type.isInstance(max)) throw new RuntimeException("wrong max value type");
     }
   }
 
@@ -383,13 +363,26 @@ public class Clause implements MapWriter, Comparable<Clause> {
     ValidateInfo info = validatetypes.get(name);
     if (info == null && name.startsWith(ImplicitSnitch.SYSPROP)) info = validatetypes.get("STRING");
     if (info == null) throw new RuntimeException("Unknown type :" + name);
-    if (info.type == Long.class) {
-      Long num = parseNumber(name, val);
+    if (info.type == Double.class) {
+      Double num = parseDouble(name, val);
+      if (isRuleVal) {
+        if (info.min != null)
+          if (Double.compare(num, (Double) info.min) == -1)
+            throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
+        if (info.max != null)
+          if (Double.compare(num, (Double) info.max) == 1)
+            throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
+      }
+      return num;
+    } else if (info.type == Long.class) {
+      Long num = parseLong(name, val);
       if (isRuleVal) {
         if (info.min != null)
-          if (num < info.min) throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
+          if (num < info.min.longValue())
+            throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
         if (info.max != null)
-          if (num > info.max) throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
+          if (num > info.max.longValue())
+            throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
       }
       return num;
     } else if (info.type == String.class) {
@@ -401,9 +394,10 @@ public class Clause implements MapWriter, Comparable<Clause> {
     }
   }
 
-  public static Long parseNumber(String name, Object val) {
+  public static Long parseLong(String name, Object val) {
     if (val == null) return null;
-    Number num = 0;
+    if (val instanceof Long) return (Long) val;
+    Number num = null;
     if (val instanceof String) {
       try {
         num = Long.parseLong(((String) val).trim());
@@ -421,6 +415,23 @@ public class Clause implements MapWriter, Comparable<Clause> {
     return num.longValue();
   }
 
+  public static Double parseDouble(String name, Object val) {
+    if (val == null) return null;
+    if (val instanceof Double) return (Double) val;
+    Number num = 0;
+    if (val instanceof String) {
+      try {
+        num = Double.parseDouble((String) val);
+      } catch (NumberFormatException e) {
+        throw new RuntimeException(name + ": " + val + "not a valid number", e);
+      }
+
+    } else if (val instanceof Number) {
+      num = (Number) val;
+    }
+    return num.doubleValue();
+  }
+
   private static final Map<String, ValidateInfo> validatetypes = new HashMap();
 
   static {
@@ -431,8 +442,8 @@ public class Clause implements MapWriter, Comparable<Clause> {
     validatetypes.put(ImplicitSnitch.DISK, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
     validatetypes.put(ImplicitSnitch.NODEROLE, new ValidateInfo(String.class, unmodifiableSet(new HashSet(Arrays.asList("overseer"))), null, null));
     validatetypes.put(ImplicitSnitch.CORES, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
-    validatetypes.put(ImplicitSnitch.SYSLOADAVG, new ValidateInfo(Long.class, null, 0l, 100l));
-    validatetypes.put(ImplicitSnitch.HEAPUSAGE, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
+    validatetypes.put(ImplicitSnitch.SYSLOADAVG, new ValidateInfo(Double.class, null, 0d, 100d));
+    validatetypes.put(ImplicitSnitch.HEAPUSAGE, new ValidateInfo(Double.class, null, 0d, null));
     validatetypes.put("NUMBER", new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));//generic number validation
     validatetypes.put("STRING", new ValidateInfo(String.class, null, null, null));//generic string validation
     validatetypes.put("node", new ValidateInfo(String.class, null, null, null));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e36d2517/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
index bf36ef6..f961cac 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
@@ -57,6 +57,9 @@ public enum Operand {
     @Override
     public TestStatus match(Object ruleVal, Object testVal) {
       if (testVal == null) return NOT_APPLICABLE;
+      if (ruleVal instanceof Double) {
+        return Double.compare(Clause.parseDouble("", testVal), (Double) ruleVal) == 1 ? PASS : FAIL;
+      }
      return getLong(testVal) > getLong(ruleVal) ? PASS: FAIL ;
     }
 
@@ -69,6 +72,9 @@ public enum Operand {
     @Override
     public TestStatus match(Object ruleVal, Object testVal) {
       if (testVal == null) return NOT_APPLICABLE;
+      if (ruleVal instanceof Double) {
+        return Double.compare(Clause.parseDouble("", testVal), (Double) ruleVal) == -1 ? PASS : FAIL;
+      }
       return getLong(testVal) < getLong(ruleVal) ? PASS: FAIL ;
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e36d2517/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
index 6bdd7cf..120276c 100644
--- a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
@@ -125,8 +125,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
     expectError("sysLoadAvg", "-1","must be greater than");
     expectError("sysLoadAvg", -1,"must be greater than");
 
-    assertEquals(12l,Clause.validate("sysLoadAvg", "12.46",true));
-    assertEquals(12l,Clause.validate("sysLoadAvg", 12.46d,true));
+    assertEquals(12.46d,Clause.validate("sysLoadAvg", "12.46",true));
+    assertEquals(12.46,Clause.validate("sysLoadAvg", 12.46d,true));
 
 
     expectError("ip_1", "300","must be less than ");
@@ -138,8 +138,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
 
     expectError("heapUsage", "-1","must be greater than");
     expectError("heapUsage", -1,"must be greater than");
-    assertEquals(69l,Clause.validate("heapUsage", "69.9",true));
-    assertEquals(69l,Clause.validate("heapUsage", 69.9d,true));
+    assertEquals(69.9d,Clause.validate("heapUsage", "69.9",true));
+    assertEquals(69.9d,Clause.validate("heapUsage", 69.9d,true));
 
     expectError("port", "70000","must be less than ");
     expectError("port", 70000,"must be less than ");
@@ -175,6 +175,18 @@ public class TestPolicy extends SolrTestCaseJ4 {
     c = new Clause((Map<String, Object>) Utils.fromJSONString("{replica:0, nodeRole:'!overseer'}"));
     assertTrue(c.tag.isPass("OVERSEER"));
     assertFalse(c.tag.isPass("overseer"));
+
+    c = new Clause((Map<String, Object>) Utils.fromJSONString("{replica:0, sysLoadAvg:'<12.7'}"));
+    assertTrue(c.tag.isPass("12.6"));
+    assertTrue(c.tag.isPass(12.6d));
+    assertFalse(c.tag.isPass("12.9"));
+    assertFalse(c.tag.isPass(12.9d));
+
+    c = new Clause((Map<String, Object>) Utils.fromJSONString("{replica:0, sysLoadAvg:'>12.7'}"));
+    assertTrue(c.tag.isPass("12.8"));
+    assertTrue(c.tag.isPass(12.8d));
+    assertFalse(c.tag.isPass("12.6"));
+    assertFalse(c.tag.isPass(12.6d));
   }
 
   public void testRow() {


[24/50] [abbrv] lucene-solr:feature/autoscaling: LUCENE-7705: Allow CharTokenizer-derived tokenizers and KeywordTokenizer to configure the max token length, fix test failure.

Posted by sh...@apache.org.
LUCENE-7705: Allow CharTokenizer-derived tokenizers and KeywordTokenizer to configure the max token length, fix test failure.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2eacf13d
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2eacf13d
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2eacf13d

Branch: refs/heads/feature/autoscaling
Commit: 2eacf13def4dc9fbea1de9c79150c05682b0cdec
Parents: 9efa022 15a8a24
Author: Erick <er...@apache.org>
Authored: Fri Jun 2 20:32:37 2017 -0700
Committer: Erick <er...@apache.org>
Committed: Fri Jun 2 20:32:37 2017 -0700

----------------------------------------------------------------------
 .../collection1/conf/schema-tokenizer-test.xml  | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------



[29/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups

Posted by sh...@apache.org.
SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/744d1ab9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/744d1ab9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/744d1ab9

Branch: refs/heads/feature/autoscaling
Commit: 744d1ab974fac19f1721097f3bd5250adfbca528
Parents: e36d251
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Mon Jun 5 13:41:26 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Mon Jun 5 13:41:26 2017 +0530

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../src/java/org/apache/solr/cloud/Assign.java  | 11 ++---
 .../cloud/OverseerCollectionMessageHandler.java | 11 +----
 .../solr/cloud/rule/ServerSnitchContext.java    | 18 ++-----
 .../solr/handler/admin/CollectionsHandler.java  |  1 -
 .../autoscaling/AutoScalingHandlerTest.java     | 11 +++--
 .../solr/cloud/autoscaling/TestPolicyCloud.java | 22 ++++-----
 .../solr/cloud/rule/ImplicitSnitchTest.java     | 50 ++++++++++++++++++--
 .../solrj/impl/SolrClientDataProvider.java      | 14 ++----
 .../apache/solr/cloud/autoscaling/Clause.java   | 40 +++++++++-------
 .../apache/solr/cloud/autoscaling/Policy.java   | 29 +++++-------
 .../solr/cloud/autoscaling/PolicyHelper.java    |  2 -
 .../solr/cloud/autoscaling/Preference.java      | 13 +++--
 .../apache/solr/common/cloud/SolrZkClient.java  | 15 ------
 .../solr/common/cloud/rule/ImplicitSnitch.java  | 48 ++++++++++++-------
 .../apache/solr/common/cloud/rule/Snitch.java   |  6 +--
 .../solr/common/cloud/rule/SnitchContext.java   |  3 +-
 .../java/org/apache/solr/common/util/Utils.java | 23 +++++++++
 .../solr/cloud/autoscaling/TestPolicy.java      |  8 ++--
 19 files changed, 186 insertions(+), 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 7a3c81f..21d9ec1 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -206,6 +206,8 @@ Other Changes
 
 * SOLR-10764: AutoScalingHandler should validate policy and preferences before updating zookeeper. (shalin)
 
+* SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups. (Noble Paul, shalin)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/java/org/apache/solr/cloud/Assign.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/Assign.java b/solr/core/src/java/org/apache/solr/cloud/Assign.java
index d790e7a..4e1fd68 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Assign.java
@@ -41,19 +41,17 @@ import org.apache.solr.common.cloud.ClusterState;
 import org.apache.solr.common.cloud.DocCollection;
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.Slice;
-import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.zookeeper.KeeperException;
 
 import static java.util.Collections.singletonMap;
 import static org.apache.solr.cloud.autoscaling.Policy.POLICY;
-import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
 import static org.apache.solr.common.cloud.ZkStateReader.MAX_SHARDS_PER_NODE;
 import static org.apache.solr.common.cloud.ZkStateReader.SOLR_AUTOSCALING_CONF_PATH;
-import static org.apache.solr.common.params.CommonParams.NAME;
 
 
 public class Assign {
@@ -198,8 +196,8 @@ public class Assign {
       positions = getNodesViaRules(clusterState, shard, numberOfNodes, cc, coll, createNodeList, l);
     }
     String policyName = coll.getStr(POLICY);
-    Map autoSalingJson = cc.getZkController().getZkStateReader().getZkClient().getJson(SOLR_AUTOSCALING_CONF_PATH, true);
-    if (policyName != null || autoSalingJson.get(Policy.CLUSTER_POLICY) != null) {
+    Map autoScalingJson = Utils.getJson(cc.getZkController().getZkClient(), SOLR_AUTOSCALING_CONF_PATH, true);
+    if (policyName != null || autoScalingJson.get(Policy.CLUSTER_POLICY) != null) {
       positions= Assign.getPositionsUsingPolicy(collectionName, Collections.singletonList(shard), numberOfNodes,
           policyName, cc.getZkController().getZkStateReader());
     }
@@ -223,8 +221,9 @@ public class Assign {
         .withClusterStateProvider(new ZkClientClusterStateProvider(zkStateReader))
         .build()) {
       SolrClientDataProvider clientDataProvider = new SolrClientDataProvider(csc);
+      Map<String, Object> autoScalingJson = Utils.getJson(zkStateReader.getZkClient(), SOLR_AUTOSCALING_CONF_PATH, true);
       Map<String, List<String>> locations = PolicyHelper.getReplicaLocations(collName,
-          zkStateReader.getZkClient().getJson(SOLR_AUTOSCALING_CONF_PATH, true),
+          autoScalingJson,
           clientDataProvider, singletonMap(collName, policyName), shardNames, numReplicas);
       Map<ReplicaAssigner.Position, String> result = new HashMap<>();
       for (Map.Entry<String, List<String>> e : locations.entrySet()) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
index 2ff6285..e5b3b9b 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
@@ -37,16 +37,12 @@ import com.google.common.collect.ImmutableMap;
 import org.apache.commons.lang.StringUtils;
 import org.apache.solr.client.solrj.SolrResponse;
 import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient.RemoteSolrException;
-import org.apache.solr.client.solrj.impl.SolrClientDataProvider;
-import org.apache.solr.client.solrj.impl.ZkClientClusterStateProvider;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.client.solrj.response.UpdateResponse;
 import org.apache.solr.cloud.autoscaling.Policy;
-import org.apache.solr.cloud.autoscaling.PolicyHelper;
 import org.apache.solr.cloud.overseer.OverseerAction;
 import org.apache.solr.cloud.rule.ReplicaAssigner;
 import org.apache.solr.cloud.rule.ReplicaAssigner.Position;
@@ -65,7 +61,6 @@ import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
 import org.apache.solr.common.params.CollectionParams.CollectionAction;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.params.CoreAdminParams.CoreAdminAction;
 import org.apache.solr.common.params.ModifiableSolrParams;
@@ -86,7 +81,6 @@ import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.cloud.autoscaling.Policy.POLICY;
 import static org.apache.solr.common.cloud.DocCollection.SNITCH;
 import static org.apache.solr.common.cloud.ZkStateReader.BASE_URL_PROP;
@@ -719,8 +713,7 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
                                       int numPullReplicas) throws KeeperException, InterruptedException {
     List<Map> rulesMap = (List) message.get("rule");
     String policyName = message.getStr(POLICY);
-    Map autoSalingJson = zkStateReader.getZkClient().getJson(SOLR_AUTOSCALING_CONF_PATH, true);
-    autoSalingJson = autoSalingJson == null ? Collections.EMPTY_MAP : autoSalingJson;
+    Map autoScalingJson = Utils.getJson(zkStateReader.getZkClient(), SOLR_AUTOSCALING_CONF_PATH, true);
 
     if (rulesMap == null && policyName == null) {
       int i = 0;
@@ -747,7 +740,7 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
       }
     }
 
-    if (policyName != null || autoSalingJson.get(Policy.CLUSTER_POLICY) != null) {
+    if (policyName != null || autoScalingJson.get(Policy.CLUSTER_POLICY) != null) {
       return Assign.getPositionsUsingPolicy(message.getStr(COLLECTION_PROP, message.getStr(NAME)),
           shardNames, numNrtReplicas, policyName, zkStateReader);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/java/org/apache/solr/cloud/rule/ServerSnitchContext.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/rule/ServerSnitchContext.java b/solr/core/src/java/org/apache/solr/cloud/rule/ServerSnitchContext.java
index 446c80f..01680f5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/rule/ServerSnitchContext.java
+++ b/solr/core/src/java/org/apache/solr/cloud/rule/ServerSnitchContext.java
@@ -19,6 +19,7 @@ package org.apache.solr.cloud.rule;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.solr.client.solrj.SolrRequest;
@@ -36,7 +37,7 @@ import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.update.UpdateShardHandler;
-import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,21 +56,12 @@ public class ServerSnitchContext extends SnitchContext {
   }
 
 
-  public  Map getZkJson(String path) {
+  public Map getZkJson(String path) throws KeeperException, InterruptedException {
     if (coreContainer.isZooKeeperAware()) {
-      try {
-        byte[] data = coreContainer.getZkController().getZkClient().getData(path, null, new Stat(), true);
-        if (data == null) return null;
-        return (Map) Utils.fromJSON(data);
-      } catch (Exception e) {
-        log.warn("Unable to read from ZK path : " + path, e);
-        return null;
-
-      }
+      return Utils.getJson(coreContainer.getZkController().getZkClient(), path, true);
     } else {
-      return null;
+      return Collections.emptyMap();
     }
-
   }
 
   public void invokeRemote(String node, ModifiableSolrParams params, String klas, RemoteCallback callback) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
index fbc76a3..9a3fe00 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java
@@ -47,7 +47,6 @@ import org.apache.solr.cloud.OverseerSolrResponse;
 import org.apache.solr.cloud.OverseerTaskQueue;
 import org.apache.solr.cloud.OverseerTaskQueue.QueueEvent;
 import org.apache.solr.cloud.ZkController;
-import org.apache.solr.cloud.autoscaling.Policy;
 import org.apache.solr.cloud.overseer.SliceMutator;
 import org.apache.solr.cloud.rule.ReplicaAssigner;
 import org.apache.solr.cloud.rule.Rule;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
index 8b0401b..7bf4616 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
@@ -226,7 +226,6 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
-//    SolrQuery query = new SolrQuery().setParam(CommonParams.QT, path);
     req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
     response = solrClient.request(req);
 
@@ -252,17 +251,19 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
     assertNotNull(sortedNodes);
 
     assertEquals(2, sortedNodes.size());
-    String[] sortedNodeNames = new String[2];
     for (int i = 0; i < 2; i++) {
       Map node = (Map) sortedNodes.get(i);
       assertNotNull(node);
       assertEquals(5, node.size());
-      assertNotNull(sortedNodeNames[i] = (String) node.get("node"));
+      assertNotNull(node.get("node"));
       assertNotNull(node.get("cores"));
-      assertEquals("0", String.valueOf(node.get("cores")));
+      assertEquals(0L, node.get("cores"));
       assertNotNull(node.get("freedisk"));
+      assertTrue(node.get("freedisk") instanceof Double);
       assertNotNull(node.get("sysLoadAvg"));
+      assertTrue(node.get("sysLoadAvg") instanceof Double);
       assertNotNull(node.get("heapUsage"));
+      assertTrue(node.get("heapUsage") instanceof Double);
     }
 
     List<Map<String, Object>> violations = (List<Map<String, Object>>) diagnostics.get("violations");
@@ -314,7 +315,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
   static class AutoScalingRequest extends SolrRequest {
     protected final String message;
 
-    public AutoScalingRequest(METHOD m, String path, String message) {
+    AutoScalingRequest(METHOD m, String path, String message) {
       super(m, path);
       this.message = message;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
index 27655e6..fa592f3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
@@ -55,17 +55,19 @@ public class TestPolicyCloud extends SolrCloudTestCase {
   }
 
   @After
-  public void removeCollections() throws Exception {
+  public void after() throws Exception {
     cluster.deleteAllCollections();
+    cluster.getSolrClient().getZkStateReader().getZkClient().setData(ZkStateReader.SOLR_AUTOSCALING_CONF_PATH,
+        "{}".getBytes(StandardCharsets.UTF_8), true);
   }
+
   public void testCreateCollectionAddShardUsingPolicy() throws Exception {
     JettySolrRunner jetty = cluster.getRandomJetty(random());
     int port = jetty.getLocalPort();
 
-    String commands =  "{set-policy :{c1 : [{replica:1 , shard:'#EACH', port: 'REPLACEPORT'}]}}".replace("REPLACEPORT",String.valueOf(port));
-    Utils.fromJSONString(commands);
+    String commands =  "{set-policy :{c1 : [{replica:1 , shard:'#EACH', port: '" + port + "'}]}}";
     cluster.getSolrClient().request(AutoScalingHandlerTest.createAutoScalingRequest(SolrRequest.METHOD.POST, commands));
-    Map<String, Object> json = cluster.getZkClient().getJson(ZkStateReader.SOLR_AUTOSCALING_CONF_PATH, true);
+    Map<String, Object> json = Utils.getJson(cluster.getZkClient(), ZkStateReader.SOLR_AUTOSCALING_CONF_PATH, true);
     assertEquals("full json:"+ Utils.toJSONString(json) , "#EACH",
         Utils.getObjectByPath(json, true, "/policies/c1[0]/shard"));
     CollectionAdminRequest.createCollectionWithImplicitRouter("policiesTest", null, "s1,s2", 1)
@@ -80,8 +82,6 @@ public class TestPolicyCloud extends SolrCloudTestCase {
     coll = getCollectionState("policiesTest");
     assertEquals(1, coll.getSlice("s3").getReplicas().size());
     coll.getSlice("s3").forEach(replica -> assertEquals(jetty.getNodeName(), replica.getNodeName()));
-    cluster.getSolrClient().getZkStateReader().getZkClient().setData(ZkStateReader.SOLR_AUTOSCALING_CONF_PATH,
-        "{}".getBytes(StandardCharsets.UTF_8), true);
   }
 
   public void testDataProvider() throws IOException, SolrServerException, KeeperException, InterruptedException {
@@ -98,14 +98,14 @@ public class TestPolicyCloud extends SolrCloudTestCase {
     assertNotNull(val.get("heapUsage"));
     assertNotNull(val.get("sysLoadAvg"));
     assertTrue(((Number) val.get("cores")).intValue() > 0);
-    assertTrue("freedisk value is " + ((Number) val.get("freedisk")).longValue(), ((Number) val.get("freedisk")).longValue() > 0);
-    assertTrue("heapUsage value is " + ((Number) val.get("heapUsage")).longValue(), ((Number) val.get("heapUsage")).longValue() > 0);
-    assertTrue("sysLoadAvg value is " + ((Number) val.get("sysLoadAvg")).longValue(), ((Number) val.get("sysLoadAvg")).longValue() > 0);
+    assertTrue("freedisk value is " + ((Number) val.get("freedisk")).doubleValue(),  Double.compare(((Number) val.get("freedisk")).doubleValue(), 0.0d) > 0);
+    assertTrue("heapUsage value is " + ((Number) val.get("heapUsage")).doubleValue(), Double.compare(((Number) val.get("heapUsage")).doubleValue(), 0.0d) > 0);
+    assertTrue("sysLoadAvg value is " + ((Number) val.get("sysLoadAvg")).doubleValue(), Double.compare(((Number) val.get("sysLoadAvg")).doubleValue(), 0.0d) > 0);
     String overseerNode = OverseerTaskProcessor.getLeaderNode(cluster.getZkClient());
     cluster.getSolrClient().request(CollectionAdminRequest.addRole(overseerNode, "overseer"));
     for (int i = 0; i < 10; i++) {
-      Map<String, Object> data = cluster.getSolrClient().getZkStateReader().getZkClient().getJson(ZkStateReader.ROLES, true);
-      if (i >= 9 && data == null) {
+      Map<String, Object> data = Utils.getJson(cluster.getZkClient(), ZkStateReader.ROLES, true);
+      if (i >= 9 && data.isEmpty()) {
         throw new RuntimeException("NO overseer node created");
       }
       Thread.sleep(100);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/core/src/test/org/apache/solr/cloud/rule/ImplicitSnitchTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/rule/ImplicitSnitchTest.java b/solr/core/src/test/org/apache/solr/cloud/rule/ImplicitSnitchTest.java
index 94ca771..709555f 100644
--- a/solr/core/src/test/org/apache/solr/cloud/rule/ImplicitSnitchTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/rule/ImplicitSnitchTest.java
@@ -17,24 +17,28 @@
 
 package org.apache.solr.cloud.rule;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 import com.google.common.collect.Sets;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.cloud.rule.ImplicitSnitch;
+import org.apache.solr.common.cloud.rule.RemoteCallback;
 import org.apache.solr.common.cloud.rule.SnitchContext;
+import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.zookeeper.KeeperException;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
 
 import static org.hamcrest.core.Is.is;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.when;
 
-public class ImplicitSnitchTest {
+public class ImplicitSnitchTest extends LuceneTestCase {
 
   private ImplicitSnitch snitch;
   private SnitchContext context;
@@ -186,4 +190,42 @@ public class ImplicitSnitchTest {
     assertFalse(snitch.isKnownTag("ip_5"));
   }
 
+  @Test
+  public void testExceptions() throws Exception {
+    ImplicitSnitch implicitSnitch = new ImplicitSnitch();
+    ServerSnitchContext noNodeExceptionSnitch = new ServerSnitchContext(null, null, new HashMap<>(), null)  {
+      @Override
+      public Map getZkJson(String path) throws KeeperException, InterruptedException {
+        throw new KeeperException.NoNodeException();
+      }
+    };
+    implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.ROLE), noNodeExceptionSnitch);
+    Map map = (Map) noNodeExceptionSnitch.retrieve(ZkStateReader.ROLES); // todo it the key really supposed to /roles.json?
+    assertNotNull(map);
+    assertEquals(0, map.size());
+
+    implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.NODEROLE), noNodeExceptionSnitch);
+    map = (Map) noNodeExceptionSnitch.retrieve(ZkStateReader.ROLES); // todo it the key really supposed to /roles.json?
+    assertNotNull(map);
+    assertEquals(0, map.size());
+
+    ServerSnitchContext keeperExceptionSnitch = new ServerSnitchContext(null, null, new HashMap<>(), null)  {
+      @Override
+      public Map getZkJson(String path) throws KeeperException, InterruptedException {
+        throw new KeeperException.ConnectionLossException();
+      }
+    };
+    expectThrows(SolrException.class, KeeperException.ConnectionLossException.class, () -> implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.ROLE), keeperExceptionSnitch));
+    expectThrows(SolrException.class, KeeperException.ConnectionLossException.class, () -> implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.NODEROLE), keeperExceptionSnitch));
+
+    ServerSnitchContext remoteExceptionSnitch = new ServerSnitchContext(null, null, new HashMap<>(), null)  {
+      @Override
+      public void invokeRemote(String node, ModifiableSolrParams params, String klas, RemoteCallback callback) {
+        throw new RuntimeException();
+      }
+    };
+    expectThrows(SolrException.class, RuntimeException.class, () -> implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.CORES), remoteExceptionSnitch));
+    expectThrows(SolrException.class, RuntimeException.class, () -> implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.DISK), remoteExceptionSnitch));
+    expectThrows(SolrException.class, RuntimeException.class, () -> implicitSnitch.getTags("", Collections.singleton(ImplicitSnitch.SYSPROP + "xyz"), remoteExceptionSnitch));
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientDataProvider.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientDataProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientDataProvider.java
index 8bca7dc..e40f32b 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientDataProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/SolrClientDataProvider.java
@@ -50,7 +50,7 @@ import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
-import org.apache.zookeeper.data.Stat;
+import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -135,15 +135,9 @@ public class SolrClientDataProvider implements ClusterDataProvider, MapWriter {
     }
 
 
-    public Map getZkJson(String path) {
-      try {
-        byte[] data = zkClientClusterStateProvider.getZkStateReader().getZkClient().getData(path, null, new Stat(), true);
-        if (data == null) return null;
-        return (Map) Utils.fromJSON(data);
-      } catch (Exception e) {
-        log.warn("Unable to read from ZK path : " + path, e);
-        return null;
-      }
+    @Override
+    public Map getZkJson(String path) throws KeeperException, InterruptedException {
+      return Utils.getJson(zkClientClusterStateProvider.getZkStateReader().getZkClient(), path, true);
     }
 
     public void invokeRemote(String node, ModifiableSolrParams params, String klas, RemoteCallback callback) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
index 1a8a7ab..5e4078a 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
@@ -20,6 +20,7 @@ package org.apache.solr.cloud.autoscaling;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -36,7 +37,6 @@ import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 
 import static java.util.Collections.singletonMap;
-import static java.util.Collections.unmodifiableSet;
 import static org.apache.solr.cloud.autoscaling.Clause.TestStatus.PASS;
 import static org.apache.solr.cloud.autoscaling.Operand.EQUAL;
 import static org.apache.solr.cloud.autoscaling.Operand.GREATER_THAN;
@@ -71,7 +71,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
       collection = parse(COLLECTION, m);
       shard = parse(SHARD, m);
       if(m.get(REPLICA) == null){
-        throw new RuntimeException(StrUtils.formatString("'replica' is required" + Utils.toJSONString(m)));
+        throw new RuntimeException(StrUtils.formatString("'replica' is required in {0}", Utils.toJSONString(m)));
       }
       this.replica = parse(REPLICA, m);
       if (replica.op == WILDCARD) throw new RuntimeException("replica val cannot be null" + Utils.toJSONString(m));
@@ -344,9 +344,9 @@ public class Clause implements MapWriter, Comparable<Clause> {
       this.type = type;
       this.vals = vals;
       this.min = min;
-      if(min != null && !type.isInstance(min)) throw new RuntimeException("wrong min value type");
+      if(min != null && !type.isInstance(min)) throw new RuntimeException("wrong min value type, expected: " + type.getName() + " actual: " + min.getClass().getName());
       this.max = max;
-      if(max != null && !type.isInstance(max)) throw new RuntimeException("wrong max value type");
+      if(max != null && !type.isInstance(max)) throw new RuntimeException("wrong max value type, expected: " + type.getName() + " actual: " + max.getClass().getName());
     }
   }
 
@@ -412,13 +412,17 @@ public class Clause implements MapWriter, Comparable<Clause> {
     } else if (val instanceof Number) {
       num = (Number) val;
     }
-    return num.longValue();
+
+    if (num != null)  {
+      return num.longValue();
+    }
+    throw new RuntimeException(name + ": " + val + "not a valid number");
   }
 
   public static Double parseDouble(String name, Object val) {
     if (val == null) return null;
     if (val instanceof Double) return (Double) val;
-    Number num = 0;
+    Number num = null;
     if (val instanceof String) {
       try {
         num = Double.parseDouble((String) val);
@@ -429,26 +433,28 @@ public class Clause implements MapWriter, Comparable<Clause> {
     } else if (val instanceof Number) {
       num = (Number) val;
     }
-    return num.doubleValue();
+
+    if (num != null)  {
+      return num.doubleValue();
+    }
+    throw new RuntimeException(name + ": " + val + "not a valid number");
   }
 
-  private static final Map<String, ValidateInfo> validatetypes = new HashMap();
+  private static final Map<String, ValidateInfo> validatetypes = new HashMap<>();
 
   static {
     validatetypes.put("collection", new ValidateInfo(String.class, null, null, null));
     validatetypes.put("shard", new ValidateInfo(String.class, null, null, null));
-    validatetypes.put("replica", new ValidateInfo(Long.class, null, 0l, null));
-    validatetypes.put(ImplicitSnitch.PORT, new ValidateInfo(Long.class, null, 1024l, 65535l));
-    validatetypes.put(ImplicitSnitch.DISK, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
-    validatetypes.put(ImplicitSnitch.NODEROLE, new ValidateInfo(String.class, unmodifiableSet(new HashSet(Arrays.asList("overseer"))), null, null));
-    validatetypes.put(ImplicitSnitch.CORES, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
+    validatetypes.put("replica", new ValidateInfo(Long.class, null, 0L, null));
+    validatetypes.put(ImplicitSnitch.PORT, new ValidateInfo(Long.class, null, 1L, 65535L));
+    validatetypes.put(ImplicitSnitch.DISK, new ValidateInfo(Double.class, null, 0d, Double.MAX_VALUE));
+    validatetypes.put(ImplicitSnitch.NODEROLE, new ValidateInfo(String.class, Collections.singleton("overseer"), null, null));
+    validatetypes.put(ImplicitSnitch.CORES, new ValidateInfo(Long.class, null, 0L, Long.MAX_VALUE));
     validatetypes.put(ImplicitSnitch.SYSLOADAVG, new ValidateInfo(Double.class, null, 0d, 100d));
     validatetypes.put(ImplicitSnitch.HEAPUSAGE, new ValidateInfo(Double.class, null, 0d, null));
-    validatetypes.put("NUMBER", new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));//generic number validation
+    validatetypes.put("NUMBER", new ValidateInfo(Long.class, null, 0L, Long.MAX_VALUE));//generic number validation
     validatetypes.put("STRING", new ValidateInfo(String.class, null, null, null));//generic string validation
     validatetypes.put("node", new ValidateInfo(String.class, null, null, null));
-    for (String ip : ImplicitSnitch.IP_SNITCHES) validatetypes.put(ip, new ValidateInfo(Long.class, null, 0l, 255l));
-
-
+    for (String ip : ImplicitSnitch.IP_SNITCHES) validatetypes.put(ip, new ValidateInfo(Long.class, null, 0L, 255L));
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
index fce9147..72aeda9 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
@@ -30,8 +30,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
-import java.util.function.Consumer;
-import java.util.function.Predicate;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
@@ -63,11 +63,11 @@ public class Policy implements MapWriter {
   public static final String ANY = "#ANY";
   public static final String CLUSTER_POLICY = "cluster-policy";
   public static final String CLUSTER_PREFERENCE = "cluster-preferences";
-  public static final Set<String> GLOBAL_ONLY_TAGS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("cores")));
+  public static final Set<String> GLOBAL_ONLY_TAGS = Collections.singleton("cores");
   final Map<String, List<Clause>> policies = new HashMap<>();
   final List<Clause> clusterPolicy;
   final List<Preference> clusterPreferences;
-  final List<String> params = new ArrayList<>();
+  final List<String> params;
 
 
   public Policy(Map<String, Object> jsonMap) {
@@ -82,13 +82,15 @@ public class Policy implements MapWriter {
     if (clusterPreferences.isEmpty()) {
       clusterPreferences.add(new Preference((Map<String, Object>) Utils.fromJSONString("{minimize : cores, precision:1}")));
     }
+    SortedSet<String> paramsOfInterest = new TreeSet<>();
     for (Preference preference : clusterPreferences) {
-      if (params.contains(preference.name.name())) {
+      if (paramsOfInterest.contains(preference.name.name())) {
         throw new RuntimeException(preference.name + " is repeated");
       }
-      params.add(preference.name.toString());
-      preference.idx = params.size() - 1;
+      paramsOfInterest.add(preference.name.toString());
     }
+    this.params = new ArrayList<>(paramsOfInterest);
+
     clusterPolicy = ((List<Map<String, Object>>) jsonMap.getOrDefault(CLUSTER_POLICY, emptyList())).stream()
         .map(Clause::new)
         .filter(clause -> {
@@ -146,16 +148,13 @@ public class Policy implements MapWriter {
     Set<String> collections = new HashSet<>();
     List<Clause> expandedClauses;
     List<Violation> violations = new ArrayList<>();
-    private List<String> paramsOfInterest;
 
     private Session(List<String> nodes, ClusterDataProvider dataProvider,
-                    List<Row> matrix, List<Clause> expandedClauses,
-                    List<String> paramsOfInterest) {
+                    List<Row> matrix, List<Clause> expandedClauses) {
       this.nodes = nodes;
       this.dataProvider = dataProvider;
       this.matrix = matrix;
       this.expandedClauses = expandedClauses;
-      this.paramsOfInterest = paramsOfInterest;
     }
 
     Session(ClusterDataProvider dataProvider) {
@@ -174,11 +173,9 @@ public class Policy implements MapWriter {
       }
 
       Collections.sort(expandedClauses);
-      List<String> p = new ArrayList<>(params);
-      p.addAll(expandedClauses.stream().map(clause -> clause.tag.name).distinct().collect(Collectors.toList()));
-      paramsOfInterest = new ArrayList<>(p);
+
       matrix = new ArrayList<>(nodes.size());
-      for (String node : nodes) matrix.add(new Row(node, paramsOfInterest, dataProvider));
+      for (String node : nodes) matrix.add(new Row(node, params, dataProvider));
       applyRules();
     }
 
@@ -193,7 +190,7 @@ public class Policy implements MapWriter {
     }
 
     Session copy() {
-      return new Session(nodes, dataProvider, getMatrixCopy(), expandedClauses, paramsOfInterest);
+      return new Session(nodes, dataProvider, getMatrixCopy(), expandedClauses);
     }
 
     List<Row> getMatrixCopy() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
index 0a82c7a..168e94e 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
@@ -21,12 +21,10 @@ package org.apache.solr.cloud.autoscaling;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.client.solrj.impl.SolrClientDataProvider;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.util.Utils;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
index 69a9b9e..60a6756 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
@@ -57,10 +57,13 @@ class Preference implements MapWriter {
     Object o2 = useApprox ? r2.cells[idx].approxVal : r2.cells[idx].val;
     int result = 0;
     if (o1 instanceof Integer && o2 instanceof Integer) result = ((Integer) o1).compareTo((Integer) o2);
-    if (o1 instanceof Long && o2 instanceof Long) result = ((Long) o1).compareTo((Long) o2);
-    if (o1 instanceof Float && o2 instanceof Float) result = ((Float) o1).compareTo((Float) o2);
-    if (o1 instanceof Double && o2 instanceof Double) result = ((Double) o1).compareTo((Double) o2);
-    return result == 0 ? next == null ? 0 : next.compare(r1, r2, useApprox) : sort.sortval * result;
+    else if (o1 instanceof Long && o2 instanceof Long) result = ((Long) o1).compareTo((Long) o2);
+    else if (o1 instanceof Float && o2 instanceof Float) result = ((Float) o1).compareTo((Float) o2);
+    else if (o1 instanceof Double && o2 instanceof Double) result = ((Double) o1).compareTo((Double) o2);
+    else if (!o1.getClass().getName().equals(o2.getClass().getName()))  {
+      throw new RuntimeException("Unable to compare " + o1 + " of type: " + o1.getClass().getName() + " from " + r1.cells[idx].toString() + " and " + o2 + " of type: " + o2.getClass().getName() + " from " + r2.cells[idx].toString());
+    }
+    return result == 0 ? (next == null ? 0 : next.compare(r1, r2, useApprox)) : sort.sortval * result;
   }
 
   //sets the new value according to precision in val_
@@ -68,7 +71,7 @@ class Preference implements MapWriter {
     Object prevVal = null;
     for (Row row : tmpMatrix) {
       prevVal = row.cells[idx].approxVal =
-          prevVal == null || Math.abs(((Number) prevVal).longValue() - ((Number) row.cells[idx].val).longValue()) > precision ?
+          (prevVal == null || Double.compare(Math.abs(((Number) prevVal).doubleValue() - ((Number) row.cells[idx].val).doubleValue()), precision) > 0) ?
               row.cells[idx].val :
               prevVal;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
----------------------------------------------------------------------
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 507f719..66033bc 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
@@ -32,7 +32,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.regex.Pattern;
@@ -45,7 +44,6 @@ import org.apache.solr.common.cloud.ZkClientConnectionStrategy.ZkUpdate;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.common.util.SolrjNamedThreadFactory;
-import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException.NoNodeException;
@@ -364,19 +362,6 @@ public class SolrZkClient implements Closeable {
     }
   }
 
-  public Map<String, Object> getJson(String path, boolean retryOnConnLoss) throws KeeperException, InterruptedException {
-    byte[] bytes = null;
-    try {
-      bytes = getData(path, null, null, retryOnConnLoss);
-    } catch (KeeperException.NoNodeException e) {
-      return null;
-    }
-    if (bytes != null && bytes.length > 0) {
-      return (Map<String, Object>) Utils.fromJSON(bytes);
-    }
-    return null;
-  }
-
   /**
    * Returns node's state
    */

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/common/cloud/rule/ImplicitSnitch.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/ImplicitSnitch.java b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/ImplicitSnitch.java
index a2af163..e88ceaf 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/ImplicitSnitch.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/ImplicitSnitch.java
@@ -28,8 +28,10 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,21 +57,25 @@ public class ImplicitSnitch extends Snitch {
 
   @Override
   public void getTags(String solrNode, Set<String> requestedTags, SnitchContext ctx) {
-    if (requestedTags.contains(NODE)) ctx.getTags().put(NODE, solrNode);
-    if (requestedTags.contains(HOST)) {
-      Matcher hostAndPortMatcher = hostAndPortPattern.matcher(solrNode);
-      if (hostAndPortMatcher.find()) ctx.getTags().put(HOST, hostAndPortMatcher.group(1));
-    }
-    if (requestedTags.contains(PORT)) {
-      Matcher hostAndPortMatcher = hostAndPortPattern.matcher(solrNode);
-      if (hostAndPortMatcher.find()) ctx.getTags().put(PORT, hostAndPortMatcher.group(2));
-    }
-    if (requestedTags.contains(ROLE)) fillRole(solrNode, ctx, ROLE);
-    if (requestedTags.contains(NODEROLE)) fillRole(solrNode, ctx, NODEROLE);// for new policy framework
+    try {
+      if (requestedTags.contains(NODE)) ctx.getTags().put(NODE, solrNode);
+      if (requestedTags.contains(HOST)) {
+        Matcher hostAndPortMatcher = hostAndPortPattern.matcher(solrNode);
+        if (hostAndPortMatcher.find()) ctx.getTags().put(HOST, hostAndPortMatcher.group(1));
+      }
+      if (requestedTags.contains(PORT)) {
+        Matcher hostAndPortMatcher = hostAndPortPattern.matcher(solrNode);
+        if (hostAndPortMatcher.find()) ctx.getTags().put(PORT, hostAndPortMatcher.group(2));
+      }
+      if (requestedTags.contains(ROLE)) fillRole(solrNode, ctx, ROLE);
+      if (requestedTags.contains(NODEROLE)) fillRole(solrNode, ctx, NODEROLE);// for new policy framework
 
-    addIpTags(solrNode, requestedTags, ctx);
+      addIpTags(solrNode, requestedTags, ctx);
 
-    getRemoteInfo(solrNode, requestedTags, ctx);
+      getRemoteInfo(solrNode, requestedTags, ctx);
+    } catch (Exception e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
+    }
   }
 
   protected void getRemoteInfo(String solrNode, Set<String> requestedTags, SnitchContext ctx) {
@@ -82,16 +88,24 @@ public class ImplicitSnitch extends Snitch {
     if (params.size() > 0) ctx.invokeRemote(solrNode, params, "org.apache.solr.cloud.rule.ImplicitSnitch", null);
   }
 
-  private void fillRole(String solrNode, SnitchContext ctx, String key) {
+  private void fillRole(String solrNode, SnitchContext ctx, String key) throws KeeperException, InterruptedException {
     Map roles = (Map) ctx.retrieve(ZkStateReader.ROLES); // we don't want to hit the ZK for each node
     // so cache and reuse
-    if(roles == null) roles = ctx.getZkJson(ZkStateReader.ROLES);
-    ctx.store(ZkStateReader.ROLES, roles == null ? Collections.emptyMap() : roles);
+    try {
+      if (roles == null) roles = ctx.getZkJson(ZkStateReader.ROLES);
+      cacheRoles(solrNode, ctx, key, roles);
+    } catch (KeeperException.NoNodeException e) {
+      cacheRoles(solrNode, ctx, key, Collections.emptyMap());
+    }
+  }
+
+  private void cacheRoles(String solrNode, SnitchContext ctx, String key, Map roles) {
+    ctx.store(ZkStateReader.ROLES, roles);
     if (roles != null) {
       for (Object o : roles.entrySet()) {
         Map.Entry e = (Map.Entry) o;
         if (e.getValue() instanceof List) {
-          if(((List) e.getValue()).contains(solrNode)) {
+          if (((List) e.getValue()).contains(solrNode)) {
             ctx.getTags().put(key, e.getKey());
             break;
           }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/common/cloud/rule/Snitch.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/Snitch.java b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/Snitch.java
index e0417a7..7f9cbcd 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/Snitch.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/Snitch.java
@@ -16,18 +16,14 @@
  */
 package org.apache.solr.common.cloud.rule;
 
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.solr.common.cloud.rule.ImplicitSnitch;
-
 /**
  *
  */
 public abstract class Snitch {
-  public static final Set<Class> WELL_KNOWN_SNITCHES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(ImplicitSnitch.class)));
+  public static final Set<Class> WELL_KNOWN_SNITCHES = Collections.singleton(ImplicitSnitch.class);
 
   public abstract void getTags(String solrNode, Set<String> requestedTags, SnitchContext ctx);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/common/cloud/rule/SnitchContext.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/SnitchContext.java b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/SnitchContext.java
index 69a353e..584533e 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/rule/SnitchContext.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/rule/SnitchContext.java
@@ -22,6 +22,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,7 +59,7 @@ public abstract class SnitchContext implements RemoteCallback {
 
   }
 
-  public abstract Map getZkJson(String path) ;
+  public abstract Map getZkJson(String path) throws KeeperException, InterruptedException;
 
   public String getNode() {
     return node;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index cf83dee..5dc96f0 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -41,6 +41,9 @@ import org.apache.http.util.EntityUtils;
 import org.apache.solr.common.IteratorWriter;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.solr.common.cloud.ZkOperation;
+import org.apache.zookeeper.KeeperException;
 import org.noggit.CharArr;
 import org.noggit.JSONParser;
 import org.noggit.JSONWriter;
@@ -267,6 +270,26 @@ public class Utils {
     while (is.read() != -1) {}
   }
 
+  /**
+   * Assumes data in ZooKeeper is a JSON string, deserializes it and returns as a Map
+   *
+   * @param zkClient the zookeeper client
+   * @param path the path to the znode being read
+   * @param retryOnConnLoss whether to retry the operation automatically on connection loss, see {@link org.apache.solr.common.cloud.ZkCmdExecutor#retryOperation(ZkOperation)}
+   * @return a Map if the node exists and contains valid JSON or an empty map if znode does not exist or has a null data
+   */
+  public static Map<String, Object> getJson(SolrZkClient zkClient, String path, boolean retryOnConnLoss) throws KeeperException, InterruptedException {
+    try {
+      byte[] bytes = zkClient.getData(path, null, null, retryOnConnLoss);
+      if (bytes != null && bytes.length > 0) {
+        return (Map<String, Object>) Utils.fromJSON(bytes);
+      }
+    } catch (KeeperException.NoNodeException e) {
+      return Collections.emptyMap();
+    }
+    return Collections.emptyMap();
+  }
+
   public static final Pattern ARRAY_ELEMENT_INDEX = Pattern
       .compile("(\\S*?)\\[(\\d+)\\]");
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/744d1ab9/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
index 120276c..f992109 100644
--- a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
@@ -143,8 +143,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
 
     expectError("port", "70000","must be less than ");
     expectError("port", 70000,"must be less than ");
-    expectError("port", "1000","must be greater than");
-    expectError("port", 1000,"must be greater than");
+    expectError("port", "0","must be greater than");
+    expectError("port", 0,"must be greater than");
 
     expectError("cores", "-1","must be greater than");
 
@@ -268,8 +268,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
 
     List<Row> l = session.getSorted();
     assertEquals("node1", l.get(0).node);
-    assertEquals("node3", l.get(1).node);
-    assertEquals("node4", l.get(2).node);
+    assertEquals("node4", l.get(1).node);
+    assertEquals("node3", l.get(2).node);
     assertEquals("node2", l.get(3).node);
 
 


[03/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10559: Add tuple documentation

Posted by sh...@apache.org.
SOLR-10559: Add tuple documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/a827a9d9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/a827a9d9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/a827a9d9

Branch: refs/heads/feature/autoscaling
Commit: a827a9d909b38ea9bcd466e1b5ce3f7685cc6a3e
Parents: 057451a
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Jun 1 17:11:50 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Jun 1 17:11:50 2017 -0400

----------------------------------------------------------------------
 solr/solr-ref-guide/src/stream-sources.adoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a827a9d9/solr/solr-ref-guide/src/stream-sources.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/stream-sources.adoc b/solr/solr-ref-guide/src/stream-sources.adoc
index 2bb0805..e8887b4 100644
--- a/solr/solr-ref-guide/src/stream-sources.adoc
+++ b/solr/solr-ref-guide/src/stream-sources.adoc
@@ -485,7 +485,7 @@ topic(checkpointCollection,
 
 The `tuple` function emits a single Tuple with name/value pairs. The values can be set to variables assigned in a `let` expression, literals, Stream Evaluators or
 Stream Expressions. In the case of Stream Evaluators the tuple will output the return value from the evaluator.
-This could be a numeric, list or map. If a Stream Expression is set to a value, the `tuple` function will flatten
+This could be a numeric, list or map. If a value is set to a Stream Expression, the `tuple` function will flatten
 the tuple stream from the Stream Expression into a list of Tuples.
 
 === tuple Parameters


[07/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10790: Fix warnings in Assign.java and ReplicaAssigner.java classes.

Posted by sh...@apache.org.
SOLR-10790: Fix warnings in Assign.java and ReplicaAssigner.java classes.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/cccf97ca
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/cccf97ca
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/cccf97ca

Branch: refs/heads/feature/autoscaling
Commit: cccf97cae85e4714c2e7a5f042032c9fce2f47cf
Parents: 72ba34f
Author: Christine Poerschke <cp...@apache.org>
Authored: Fri Jun 2 10:39:18 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Fri Jun 2 10:39:18 2017 +0100

----------------------------------------------------------------------
 solr/CHANGES.txt                                                  | 3 +++
 solr/core/src/java/org/apache/solr/cloud/Assign.java              | 2 +-
 .../core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cccf97ca/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index af9ec5e..d8c9d04 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -298,6 +298,9 @@ Other Changes
 * SOLR-10741: Factor out createSliceShardsStr method from HttpShardHandler.prepDistributed.
   (Domenico Fabio Marino via Christine Poerschke)
 
+* SOLR-10790: Fix warnings in Assign.java and ReplicaAssigner.java classes.
+  (Christine Poerschke)
+
 ==================  6.6.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cccf97ca/solr/core/src/java/org/apache/solr/cloud/Assign.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/Assign.java b/solr/core/src/java/org/apache/solr/cloud/Assign.java
index 265e453..63e006e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Assign.java
@@ -98,7 +98,7 @@ public class Assign {
       map.put(shardId, cnt);
     }
 
-    Collections.sort(shardIdNames, (o1, o2) -> {
+    Collections.sort(shardIdNames, (String o1, String o2) -> {
       Integer one = map.get(o1);
       Integer two = map.get(o2);
       return one.compareTo(two);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cccf97ca/solr/core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java b/solr/core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java
index 506e158..669e82b 100644
--- a/solr/core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java
+++ b/solr/core/src/java/org/apache/solr/cloud/rule/ReplicaAssigner.java
@@ -211,7 +211,7 @@ public class ReplicaAssigner {
     int startPosition = 0;
     Map<String, Map<String, Integer>> copyOfCurrentState = getDeepCopy(shardVsNodes, 2);
     List<String> sortedLiveNodes = new ArrayList<>(this.participatingLiveNodes);
-    Collections.sort(sortedLiveNodes, (n1, n2) -> {
+    Collections.sort(sortedLiveNodes, (String n1, String n2) -> {
       int result1 = 0;
       for (int i = 0; i < rulePermutation.length; i++) {
         Rule rule = rules.get(rulePermutation[i]);


[10/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-9735: validation of all input values to either string or long

Posted by sh...@apache.org.
SOLR-9735: validation of all input values to either string or long


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4e691f9e
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4e691f9e
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4e691f9e

Branch: refs/heads/feature/autoscaling
Commit: 4e691f9e4ae4269d4fbf8d947cc82bb7123085e7
Parents: e2ae999
Author: Noble Paul <no...@apache.org>
Authored: Fri Jun 2 23:27:22 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Fri Jun 2 23:27:22 2017 +0930

----------------------------------------------------------------------
 .../autoscaling/AutoScalingHandlerTest.java     |  2 +-
 .../apache/solr/cloud/autoscaling/Clause.java   | 70 +++++++++++++-------
 .../apache/solr/cloud/autoscaling/Operand.java  | 52 ++-------------
 .../org/apache/solr/cloud/autoscaling/Row.java  |  2 +-
 .../solr/cloud/autoscaling/TestPolicy.java      | 42 ++++++------
 5 files changed, 77 insertions(+), 91 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4e691f9e/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
index 44cbd67..8b0401b 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
@@ -259,7 +259,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
       assertEquals(5, node.size());
       assertNotNull(sortedNodeNames[i] = (String) node.get("node"));
       assertNotNull(node.get("cores"));
-      assertEquals(0, node.get("cores"));
+      assertEquals("0", String.valueOf(node.get("cores")));
       assertNotNull(node.get("freedisk"));
       assertNotNull(node.get("sysLoadAvg"));
       assertNotNull(node.get("heapUsage"));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4e691f9e/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
index bf0ebfb..9b88d78 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.solr.cloud.autoscaling.Policy.ReplicaInfo;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.cloud.rule.ImplicitSnitch;
+import org.apache.solr.common.util.RetryUtil;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 
@@ -74,16 +75,8 @@ public class Clause implements MapWriter, Comparable<Clause> {
       if(m.get(REPLICA) == null){
         throw new RuntimeException(StrUtils.formatString("'replica' is required" + Utils.toJSONString(m)));
       }
-      Condition replica = parse(REPLICA, m);
-      try {
-        int replicaCount = Integer.parseInt(String.valueOf(replica.val));
-        if(replicaCount<0){
-          throw new RuntimeException("replica value sould be non null "+ Utils.toJSONString(m));
-        }
-        this.replica = new Condition(replica.name, replicaCount, replica.op);
-      } catch (NumberFormatException e) {
-        throw new RuntimeException("Only an integer value is supported for replica " + Utils.toJSONString(m));
-      }
+      this.replica = parse(REPLICA, m);
+      if (replica.op == WILDCARD) throw new RuntimeException("replica val cannot be null" + Utils.toJSONString(m));
       m.forEach((s, o) -> parseCondition(s, o));
     }
     if (tag == null)
@@ -117,7 +110,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
       if (this.isPerCollectiontag() && that.isPerCollectiontag()) {
         v = Integer.compare(this.replica.op.priority, that.replica.op.priority);
         if (v == 0) {
-          v = Integer.compare((Integer) this.replica.val, (Integer) that.replica.val);
+          v = Long.compare((Long) this.replica.val, (Long) that.replica.val);
           v = this.replica.op == LESS_THAN ? v : v * -1;
         }
         return v;
@@ -154,7 +147,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
     }
 
     boolean isPass(Object inputVal) {
-      return op.match(val, inputVal) == PASS;
+      return op.match(val, validate(name, inputVal, false)) == PASS;
     }
 
     boolean isPass(Row row) {
@@ -180,8 +173,28 @@ public class Clause implements MapWriter, Comparable<Clause> {
     Object val = m.get(s);
     try {
       String conditionName = s.trim();
-      String value = val == null ? null : String.valueOf(val).trim();
       Operand operand = null;
+      if (val == null) {
+        operand = WILDCARD;
+        expectedVal = Policy.ANY;
+      } else if (val instanceof String) {
+        String strVal = ((String) val).trim();
+        if (Policy.ANY.equals(strVal) || Policy.EACH.equals(strVal)) operand = WILDCARD;
+        else if (strVal.startsWith(NOT_EQUAL.operand)) operand = NOT_EQUAL;
+        else if (strVal.startsWith(GREATER_THAN.operand)) operand = GREATER_THAN;
+        else if (strVal.startsWith(LESS_THAN.operand)) operand = LESS_THAN;
+        else operand = EQUAL;
+        expectedVal = validate(s, strVal.substring(EQUAL == operand || WILDCARD == operand ? 0 : 1), true);
+      } else if (val instanceof Number) {
+        operand = EQUAL;
+        expectedVal = validate(s, val, true);
+      }
+/*
+
+
+        String value = val == null ? null : String.valueOf(val).trim();
+      if(WILDCARD)
+
       if ((expectedVal = WILDCARD.parse(value)) != null) {
         operand = WILDCARD;
       } else if ((expectedVal = NOT_EQUAL.parse(value)) != null) {
@@ -194,6 +207,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
         operand = EQUAL;
         expectedVal = EQUAL.parse(value);
       }
+*/
 
       return new Condition(conditionName, expectedVal, operand);
 
@@ -357,26 +371,34 @@ public class Clause implements MapWriter, Comparable<Clause> {
   }
 
 
-  public static Object validate(String name, Object val) {
+  /**
+   *
+   * @param name name of the condition
+   * @param val value of the condition
+   * @param isRuleVal is this provided in the rule
+   * @return actual validated value
+   */
+  public static Object validate(String name, Object val, boolean isRuleVal) {
     if (val == null) return null;
     ValidateInfo info = validatetypes.get(name);
-    if (info == null && name.startsWith(ImplicitSnitch.SYSPROP)) info = validatetypes.get(null);
+    if (info == null && name.startsWith(ImplicitSnitch.SYSPROP)) info = validatetypes.get("STRING");
     if (info == null) throw new RuntimeException("Unknown type :" + name);
     if (info.type == Long.class) {
       Long num = parseNumber(name, val);
-      if (info.min != null)
-        if (num < info.min) throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
-      if (info.max != null)
-        if (num > info.max) throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
+      if (isRuleVal) {
+        if (info.min != null)
+          if (num < info.min) throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
+        if (info.max != null)
+          if (num > info.max) throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
+      }
       return num;
     } else if (info.type == String.class) {
-      if (info.vals != null && !info.vals.contains(val))
+      if (isRuleVal && info.vals != null && !info.vals.contains(val))
         throw new RuntimeException(name + ": " + val + " must be one of " + StrUtils.join(info.vals, ','));
       return val;
     } else {
       throw new RuntimeException("Invalid type ");
     }
-
   }
 
   public static Long parseNumber(String name, Object val) {
@@ -384,7 +406,7 @@ public class Clause implements MapWriter, Comparable<Clause> {
     Number num = 0;
     if (val instanceof String) {
       try {
-        num = Long.parseLong((String) val);
+        num = Long.parseLong(((String) val).trim());
       } catch (NumberFormatException e) {
         try {
           num = Double.parseDouble((String) val);
@@ -411,7 +433,9 @@ public class Clause implements MapWriter, Comparable<Clause> {
     validatetypes.put(ImplicitSnitch.CORES, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
     validatetypes.put(ImplicitSnitch.SYSLOADAVG, new ValidateInfo(Long.class, null, 0l, 100l));
     validatetypes.put(ImplicitSnitch.HEAPUSAGE, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
-    validatetypes.put(null, new ValidateInfo(String.class, null, null, null));
+    validatetypes.put("NUMBER", new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));//generic number validation
+    validatetypes.put("STRING", new ValidateInfo(String.class, null, null, null));//generic string validation
+    validatetypes.put("node", new ValidateInfo(String.class, null, null, null));
     for (String ip : ImplicitSnitch.IP_SNITCHES) validatetypes.put(ip, new ValidateInfo(Long.class, null, 0l, 255l));
 
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4e691f9e/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
index 5371c25..bf36ef6 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Operand.java
@@ -34,11 +34,6 @@ public enum Operand {
       return testVal == null ? NOT_APPLICABLE : PASS;
     }
 
-    @Override
-    public Object parse(String val) {
-      if (val == null) return ANY;
-      return ANY.equals(val) || Policy.EACH.equals(val) ? val : null;
-    }
   },
   EQUAL("", 0) {
     @Override
@@ -60,15 +55,9 @@ public enum Operand {
   },
   GREATER_THAN(">", 1) {
     @Override
-    public Object parse(String val) {
-      return checkNumeric(super.parse(val));
-    }
-
-
-    @Override
     public TestStatus match(Object ruleVal, Object testVal) {
       if (testVal == null) return NOT_APPLICABLE;
-      return compareNum(ruleVal, testVal) == 1 ? PASS : FAIL;
+     return getLong(testVal) > getLong(ruleVal) ? PASS: FAIL ;
     }
 
     @Override
@@ -80,7 +69,7 @@ public enum Operand {
     @Override
     public TestStatus match(Object ruleVal, Object testVal) {
       if (testVal == null) return NOT_APPLICABLE;
-      return compareNum(ruleVal, testVal) == -1 ? PASS : FAIL;
+      return getLong(testVal) < getLong(ruleVal) ? PASS: FAIL ;
     }
 
     @Override
@@ -88,10 +77,6 @@ public enum Operand {
       return actual < expected ? 0 : (expected ) - actual;
     }
 
-    @Override
-    public Object parse(String val) {
-      return checkNumeric(super.parse(val));
-    }
   };
   public final String operand;
   final int priority;
@@ -105,38 +90,15 @@ public enum Operand {
     return operand + expectedVal.toString();
   }
 
-  Integer checkNumeric(Object val) {
-    if (val == null) return null;
-    try {
-      return Integer.parseInt(val.toString());
-    } catch (NumberFormatException e) {
-      throw new RuntimeException("for operand " + operand + " the value must be numeric");
-    }
-  }
-
-  public Object parse(String val) {
-    if (operand.isEmpty()) return val;
-    return val.startsWith(operand) ? val.substring(1) : null;
-  }
-
   public TestStatus match(Object ruleVal, Object testVal) {
-    return Objects.equals(String.valueOf(ruleVal), String.valueOf(testVal)) ? PASS : FAIL;
+    return Objects.equals(ruleVal, testVal) ? PASS : FAIL;
   }
 
+  Long getLong(Object o) {
+    if (o instanceof Long) return (Long) o;
+    if(o instanceof Number ) return ((Number) o).longValue();
+    return Long.parseLong(String.valueOf(o));
 
-  public int compareNum(Object n1Val, Object n2Val) {
-    Integer n1 = (Integer) parseObj(n1Val, Integer.class);
-    Integer n2 = (Integer) parseObj(n2Val, Integer.class);
-    return n1 > n2 ? -1 : Objects.equals(n1, n2) ? 0 : 1;
-  }
-
-  Object parseObj(Object o, Class typ) {
-    if (o == null) return o;
-    if (typ == String.class) return String.valueOf(o);
-    if (typ == Integer.class) {
-      return Integer.parseInt(String.valueOf(o));
-    }
-    return o;
   }
 
   public Integer delta(Object expected, Object actual) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4e691f9e/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
index a2546d0..92b4bac 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
@@ -48,7 +48,7 @@ class Row implements MapWriter {
     Map<String, Object> vals = dataProvider.getNodeValues(node, params);
     for (int i = 0; i < params.size(); i++) {
       String s = params.get(i);
-      cells[i] = new Cell(i, s, vals.get(s));
+      cells[i] = new Cell(i, s, Clause.validate(s,vals.get(s), false));
       if (NODE.equals(s)) cells[i].val = node;
       if (cells[i].val == null) anyValueMissing = true;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4e691f9e/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
index 08e1e1b..6bdd7cf 100644
--- a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
@@ -113,10 +113,10 @@ public class TestPolicy extends SolrTestCaseJ4 {
   public void testValidate() {
     expectError("replica", -1, "must be greater than" );
     expectError("replica","hello", "not a valid number" );
-    assertEquals( 1l,   Clause.validate("replica", "1"));
-    assertEquals("c",   Clause.validate("collection", "c"));
-    assertEquals( "s",   Clause.validate("shard", "s"));
-    assertEquals( "overseer",   Clause.validate("nodeRole", "overseer"));
+    assertEquals( 1l,   Clause.validate("replica", "1", true));
+    assertEquals("c",   Clause.validate("collection", "c", true));
+    assertEquals( "s",   Clause.validate("shard", "s",true));
+    assertEquals( "overseer",   Clause.validate("nodeRole", "overseer",true));
 
     expectError("nodeRole", "wrong","must be one of");
 
@@ -125,8 +125,8 @@ public class TestPolicy extends SolrTestCaseJ4 {
     expectError("sysLoadAvg", "-1","must be greater than");
     expectError("sysLoadAvg", -1,"must be greater than");
 
-    assertEquals(12l,Clause.validate("sysLoadAvg", "12.46"));
-    assertEquals(12l,Clause.validate("sysLoadAvg", 12.46d));
+    assertEquals(12l,Clause.validate("sysLoadAvg", "12.46",true));
+    assertEquals(12l,Clause.validate("sysLoadAvg", 12.46d,true));
 
 
     expectError("ip_1", "300","must be less than ");
@@ -134,12 +134,12 @@ public class TestPolicy extends SolrTestCaseJ4 {
     expectError("ip_1", "-1","must be greater than");
     expectError("ip_1", -1,"must be greater than");
 
-    assertEquals(1l,Clause.validate("ip_1", "1"));
+    assertEquals(1l,Clause.validate("ip_1", "1",true));
 
     expectError("heapUsage", "-1","must be greater than");
     expectError("heapUsage", -1,"must be greater than");
-    assertEquals(69l,Clause.validate("heapUsage", "69.9"));
-    assertEquals(69l,Clause.validate("heapUsage", 69.9d));
+    assertEquals(69l,Clause.validate("heapUsage", "69.9",true));
+    assertEquals(69l,Clause.validate("heapUsage", 69.9d,true));
 
     expectError("port", "70000","must be less than ");
     expectError("port", 70000,"must be less than ");
@@ -153,7 +153,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
 
   private static void expectError(String name, Object val, String msg){
     try {
-      Clause.validate(name, val);
+      Clause.validate(name, val,true);
       fail("expected exception containing "+msg);
     } catch (Exception e) {
       assertTrue("expected exception containing "+msg,e.getMessage().contains(msg));
@@ -202,7 +202,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
         "    'policy1': [" +
         "      { 'replica': '1', 'sysprop.fs': 'ssd', 'shard': '#EACH'}," +
         "      { 'replica': '<2', 'shard': '#ANY', 'node': '#ANY'}," +
-        "      { 'replica': '<2', 'shard': '#EACH', 'rack': 'rack1'}" +
+        "      { 'replica': '<2', 'shard': '#EACH', 'sysprop.rack': 'rack1'}" +
         "    ]" +
         "  }" +
         "}");
@@ -213,7 +213,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
     assertEquals("1", String.valueOf(clauses.get(0).original.get("replica")));
     assertEquals("0", String.valueOf(clauses.get(1).original.get("replica")));
     assertEquals("#ANY", clauses.get(3).original.get("shard"));
-    assertEquals("rack1", clauses.get(2).original.get("rack"));
+    assertEquals("rack1", clauses.get(2).original.get("sysprop.rack"));
     assertEquals("overseer", clauses.get(1).original.get("nodeRole"));
   }
 
@@ -223,13 +223,13 @@ public class TestPolicy extends SolrTestCaseJ4 {
         "      { 'nodeRole':'overseer', replica: 0,  'strict':false}," +
         "      { 'replica':'<1', 'node':'node3', 'shard':'#EACH'}," +
         "      { 'replica':'<2', 'node':'#ANY', 'shard':'#EACH'}," +
-        "      { 'replica':1, 'rack':'rack1'}]" +
+        "      { 'replica':1, 'sysprop.rack':'rack1'}]" +
         "  }";
     Policy p = new Policy((Map<String, Object>) Utils.fromJSONString(rules));
     List<Clause> clauses = new ArrayList<>(p.getClusterPolicy());
     Collections.sort(clauses);
     assertEquals("nodeRole", clauses.get(1).tag.name);
-    assertEquals("rack", clauses.get(0).tag.name);
+    assertEquals("sysprop.rack", clauses.get(0).tag.name);
   }
 
   public void testRules() throws IOException {
@@ -467,7 +467,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
         "{replica:0, 'nodeRole':'overseer','strict':false}," +
         "{'replica':'<1','node':'node3'}," +
         "{'replica':'<2','node':'#ANY','shard':'#EACH'}," +
-        "{'replica':'<3','shard':'#EACH','rack':'#ANY'}" +
+        "{'replica':'<3','shard':'#EACH','sysprop.rack':'#ANY'}" +
         "]" +
         "}" +
         "}";
@@ -476,7 +476,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
         "node1:{cores:12, freedisk: 334, heapUsage:10480, rack: rack4}," +
         "node2:{cores:4, freedisk: 749, heapUsage:6873, rack: rack3}," +
         "node3:{cores:7, freedisk: 262, heapUsage:7834, rack: rack2}," +
-        "node4:{cores:8, freedisk: 375, heapUsage:16900, nodeRole:overseer, rack: rack1}" +
+        "node4:{cores:8, freedisk: 375, heapUsage:16900, nodeRole:overseer, sysprop.rack: rack1}" +
         "}");
     Policy policy = new Policy((Map<String, Object>) Utils.fromJSONString(rules));
     ClusterDataProvider clusterDataProvider = getClusterDataProvider(nodeValues, clusterState);
@@ -593,17 +593,17 @@ public class TestPolicy extends SolrTestCaseJ4 {
         "  'policies': {" +
         "    'policy1': [" +
         "      { 'replica': '<2', 'shard': '#EACH', 'node': '#ANY'}," +
-        "      { 'replica': '<2', 'shard': '#EACH', 'rack': 'rack1'}" +
+        "      { 'replica': '<2', 'shard': '#EACH', 'sysprop.rack': 'rack1'}" +
         "    ]" +
         "  }" +
         "}";
 
 
     Map<String, Map> nodeValues = (Map<String, Map>) Utils.fromJSONString("{" +
-        "node1:{cores:12, freedisk: 334, heap:10480, rack:rack3}," +
-        "node2:{cores:4, freedisk: 749, heap:6873, sysprop.fs : ssd, rack:rack1}," +
-        "node3:{cores:7, freedisk: 262, heap:7834, rack:rack4}," +
-        "node4:{cores:0, freedisk: 900, heap:16900, nodeRole:overseer, rack:rack2}" +
+        "node1:{cores:12, freedisk: 334, heap:10480, sysprop.rack:rack3}," +
+        "node2:{cores:4, freedisk: 749, heap:6873, sysprop.fs : ssd, sysprop.rack:rack1}," +
+        "node3:{cores:7, freedisk: 262, heap:7834, sysprop.rack:rack4}," +
+        "node4:{cores:0, freedisk: 900, heap:16900, nodeRole:overseer, sysprop.rack:rack2}" +
         "}");
 
     ClusterDataProvider dataProvider = new ClusterDataProvider() {


[14/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10447: Ref guide documentation

Posted by sh...@apache.org.
SOLR-10447: Ref guide documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ac26d811
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ac26d811
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ac26d811

Branch: refs/heads/feature/autoscaling
Commit: ac26d81116079365dfdb8d70e8e0f50f93749b8b
Parents: 2eb324f
Author: Ishan Chattopadhyaya <is...@apache.org>
Authored: Fri Jun 2 20:58:22 2017 +0530
Committer: Ishan Chattopadhyaya <is...@apache.org>
Committed: Fri Jun 2 20:58:22 2017 +0530

----------------------------------------------------------------------
 solr/solr-ref-guide/src/collections-api.adoc | 30 +++++++++++++++++++++++
 1 file changed, 30 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ac26d811/solr/solr-ref-guide/src/collections-api.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/collections-api.adoc b/solr/solr-ref-guide/src/collections-api.adoc
index 3300b6e..35300a3 100644
--- a/solr/solr-ref-guide/src/collections-api.adoc
+++ b/solr/solr-ref-guide/src/collections-api.adoc
@@ -536,6 +536,36 @@ http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=testalias
 </response>
 ----
 
+[[CollectionsAPI-listaliases]]
+== LISTALIASES: List of all aliases in the cluster
+
+`/admin/collections?action=LISTALIASES`
+
+[[CollectionsAPI-Output.6]]
+=== Output
+
+The output will contain a list of aliases with the corresponding collection names.
+
+[[CollectionsAPI-Examples.6]]
+=== Examples
+
+*Output*
+
+[source,xml]
+----
+<response>
+  <lst name="responseHeader">
+    <int name="status">0</int>
+    <int name="QTime">0</int>
+  </lst>
+  <lst name="aliases">
+    <str name="testalias1">collection1</str>
+    <str name="testalias2">collection2</str>
+  </lst>
+</response>
+----
+
+
 [[CollectionsAPI-delete]]
 == DELETE: Delete a Collection
 


[32/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10813: Add arraySort Stream Evaluator

Posted by sh...@apache.org.
SOLR-10813: Add arraySort Stream Evaluator


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/78d95014
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/78d95014
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/78d95014

Branch: refs/heads/feature/autoscaling
Commit: 78d95014e75530fcd91040b1df3c0317a959b887
Parents: 6a9830c
Author: Joel Bernstein <jb...@apache.org>
Authored: Mon Jun 5 11:18:57 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Jun 5 11:19:17 2017 -0400

----------------------------------------------------------------------
 .../org/apache/solr/handler/StreamHandler.java  |  1 +
 .../solrj/io/eval/ArraySortEvaluator.java       | 77 ++++++++++++++++++++
 .../solrj/io/stream/StreamExpressionTest.java   | 25 ++++++-
 3 files changed, 102 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/78d95014/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
index d4029ff..7889bf7 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -195,6 +195,7 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       .withFunctionName("hist", HistogramEvaluator.class)
       .withFunctionName("anova", AnovaEvaluator.class)
       .withFunctionName("movingAvg", MovingAverageEvaluator.class)
+      .withFunctionName("arraySort", ArraySortEvaluator.class)
 
       // metrics
          .withFunctionName("min", MinMetric.class)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/78d95014/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ArraySortEvaluator.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ArraySortEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ArraySortEvaluator.java
new file mode 100644
index 0000000..dabc615
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/ArraySortEvaluator.java
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+package org.apache.solr.client.solrj.io.eval;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.stream.expr.Explanation;
+import org.apache.solr.client.solrj.io.stream.expr.Explanation.ExpressionType;
+import org.apache.solr.client.solrj.io.stream.expr.Expressible;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParameter;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class ArraySortEvaluator extends ComplexEvaluator implements Expressible {
+
+  private static final long serialVersionUID = 1;
+
+  public ArraySortEvaluator(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public List<Number> evaluate(Tuple tuple) throws IOException {
+
+    if(subEvaluators.size() != 1) {
+      throw new IOException("Array sort evaluator expects 1 parameters found: "+subEvaluators.size());
+    }
+
+    StreamEvaluator colEval1 = subEvaluators.get(0);
+
+    List<Number> numbers1 = (List<Number>)colEval1.evaluate(tuple);
+    List<Number> numbers2 = new ArrayList();
+    numbers2.addAll(numbers1);
+    Collections.sort(numbers2, new Comparator<Number>() {
+      @Override
+      public int compare(Number o1, Number o2) {
+        Double d1 = o1.doubleValue();
+        Double d2 = o2.doubleValue();
+        return d1.compareTo(d2);
+      }
+    });
+    return numbers2;
+  }
+
+  @Override
+  public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(getClass()));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(nodeId.toString())
+        .withExpressionType(ExpressionType.EVALUATOR)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/78d95014/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index 8ca52d1..3466af2 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
@@ -5808,9 +5808,32 @@ public class StreamExpressionTest extends SolrCloudTestCase {
     tuple = tuples.get(0);
     p = tuple.getDouble("return-value");
     assertEquals(p, 2.4, 0.001);
-
   }
 
+  @Test
+  public void testArraySort() throws Exception {
+    String cexpr = "arraySort(array(11.5, 12.3, 4, 3, 1, 0))";
+    ModifiableSolrParams paramsLoc = new ModifiableSolrParams();
+    paramsLoc.set("expr", cexpr);
+    paramsLoc.set("qt", "/stream");
+
+    String url = cluster.getJettySolrRunners().get(0).getBaseUrl().toString()+"/"+COLLECTIONORALIAS;
+    TupleStream solrStream = new SolrStream(url, paramsLoc);
+
+    StreamContext context = new StreamContext();
+    solrStream.setStreamContext(context);
+    List<Tuple> tuples = getTuples(solrStream);
+    assertTrue(tuples.size() == 1);
+    Tuple tuple = tuples.get(0);
+    List<Number> asort = (List<Number>)tuple.get("return-value");
+    assertEquals(asort.size(), 6);
+    assertEquals(asort.get(0).doubleValue(), 0, 0.0);
+    assertEquals(asort.get(1).doubleValue(), 1, 0.0);
+    assertEquals(asort.get(2).doubleValue(), 3, 0.0);
+    assertEquals(asort.get(3).doubleValue(), 4, 0.0);
+    assertEquals(asort.get(4).doubleValue(), 11.5, 0.0);
+    assertEquals(asort.get(5).doubleValue(), 12.3, 0.0);
+  }
 
   @Test
   public void testCumulativeProbability() throws Exception {


[26/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-8762: respond child docs in DIH debug

Posted by sh...@apache.org.
SOLR-8762: respond child docs in DIH debug


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/db2b19f6
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/db2b19f6
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/db2b19f6

Branch: refs/heads/feature/autoscaling
Commit: db2b19f6ba7766cf42bde668f8ec4e7b237e6007
Parents: 2c9f860
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Sat Jun 3 13:41:51 2017 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Sat Jun 3 21:36:52 2017 +0300

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 ++
 .../solr/handler/dataimport/DebugInfo.java      | 32 +++++++++++++++++++-
 .../AbstractDataImportHandlerTestCase.java      |  4 +--
 .../dataimport/TestHierarchicalDocBuilder.java  | 31 +++++++++++++------
 4 files changed, 56 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db2b19f6/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 3c887be..ff6ff46 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -315,6 +315,8 @@ Other Changes
 
 * SOLR-8437: Improve RAMDirectory details in sample solrconfig files (Mark Miller, Varun Thacker)
 
+* SOLR-8762: return child docs in DIH debug (Gopikannan Venugopalsamy via Mikhail Khludnev)
+
 ==================  6.6.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db2b19f6/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DebugInfo.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DebugInfo.java b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DebugInfo.java
index 9bd217a..623832f 100644
--- a/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DebugInfo.java
+++ b/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/DebugInfo.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.handler.dataimport;
 
+import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -25,7 +26,35 @@ import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
 
 public class DebugInfo {
-  public List<SolrInputDocument> debugDocuments = new ArrayList<>(0);
+
+  private static final class ChildRollupDocs extends AbstractList<SolrInputDocument> {
+
+    private List<SolrInputDocument> delegate = new ArrayList<>();
+
+    @Override
+    public SolrInputDocument get(int index) {
+      return delegate.get(index);
+    }
+
+    @Override
+    public int size() {
+      return delegate.size();
+    }
+
+    public boolean add(SolrInputDocument e) {
+      SolrInputDocument transformed = e.deepCopy();
+      if (transformed.hasChildDocuments()) {
+        ChildRollupDocs childList = new ChildRollupDocs();
+        childList.addAll(transformed.getChildDocuments());
+        transformed.addField("_childDocuments_", childList);
+        transformed.getChildDocuments().clear();
+      }
+      return delegate.add(transformed);
+    }
+  }
+
+  public List<SolrInputDocument> debugDocuments = new ChildRollupDocs();
+
   public NamedList<String> debugVerboseOutput = null;
   public boolean verbose;
   
@@ -34,3 +63,4 @@ public class DebugInfo {
     debugVerboseOutput = new NamedList<>();
   }
 }
+

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db2b19f6/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
index db02993..7b8ff88 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/AbstractDataImportHandlerTestCase.java
@@ -80,11 +80,11 @@ public abstract class AbstractDataImportHandlerTestCase extends
     }
   }
 
-  protected void runFullImport(String dataConfig) throws Exception {
+  protected String runFullImport(String dataConfig) throws Exception {
     LocalSolrQueryRequest request = lrf.makeRequest("command", "full-import",
             "debug", "on", "clean", "true", "commit", "true", "dataConfig",
             dataConfig);
-    h.query("/dataimport", request);
+    return h.query("/dataimport", request);
   }
 
   protected void runDeltaImport(String dataConfig) throws Exception {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/db2b19f6/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
----------------------------------------------------------------------
diff --git a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
index 603980a..086d7be 100644
--- a/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
+++ b/solr/contrib/dataimporthandler/src/test/org/apache/solr/handler/dataimport/TestHierarchicalDocBuilder.java
@@ -39,6 +39,7 @@ import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.handler.dataimport.config.ConfigNameConstants;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.util.TestHarness;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -118,7 +119,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
 
     List<String> parentIds = createDataIterator("select * from PARENT", parentType, parentType, parentsNum);
     Collections.shuffle(parentIds, random());
-    String parentId1 = parentIds.get(0);
+    final String parentId1 = parentIds.get(0);
     String parentId2 = parentIds.get(1);
     
     //parent 1 children
@@ -129,21 +130,24 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
     childrenNum += childrenIds.size();
     
     // grand children of first parent first child
-    String childId = childrenIds.get(0);
+    final String childId = childrenIds.get(0);
     String description = "grandchild of first parent, child of " + childId + " child";
     select = "select * from GRANDCHILD where parent_id='" + childId + "'";
     List<String> grandChildrenIds = createDataIterator(select, grandChildType, description, atLeast(2));
     grandChildrenNum += grandChildrenIds.size();
     
     // grand children of first parent second child
-    childId = childrenIds.get(1);
-    description = "grandchild of first parent, child of " + childId + " child";
-    select = "select * from GRANDCHILD where parent_id='" + childId + "'";
-    List<String> grandChildrenIds2 = createDataIterator(select, grandChildType, description, atLeast(2));
+    {
+      String childId2 = childrenIds.get(1);
+      description = "grandchild of first parent, child of " + childId2 + " child";
+      select = "select * from GRANDCHILD where parent_id='" + childId2 + "'";
+    }
+    final List<String> grandChildrenIds2 = createDataIterator(select, grandChildType, description, atLeast(2));
     grandChildrenNum += grandChildrenIds2.size();
     
-    grandChildrenIds.addAll(grandChildrenIds2);
-    
+    List<String> allGrandChildrenIds = new ArrayList<>(grandChildrenIds);
+    allGrandChildrenIds.addAll(grandChildrenIds2);
+        
     // third children of first parent has no grand children
     
     // parent 2 children (no grand children)   
@@ -155,7 +159,14 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
     
     int totalDocsNum = parentsNum + childrenNum + grandChildrenNum;
     
-    runFullImport(THREE_LEVEL_HIERARCHY_CONFIG);
+    String resp = runFullImport(THREE_LEVEL_HIERARCHY_CONFIG);
+    String xpath = "//arr[@name='documents']/lst/arr[@name='id' and .='"+parentId1+"']/../"+
+      "arr[@name='_childDocuments_']/lst/arr[@name='id' and .='"+childId+"']/../"+
+      "arr[@name='_childDocuments_']/lst/arr[@name='id' and .='"+grandChildrenIds.get(0)+"']";
+    String results = TestHarness.validateXPath(resp, 
+           xpath);
+    assertTrue("Debug documents does not contain child documents\n"+resp+"\n"+ xpath+
+                                                        "\n"+results, results == null);
     
     assertTrue("Update request processor processAdd was not called", TestUpdateRequestProcessor.processAddCalled);
     assertTrue("Update request processor processCommit was not callled", TestUpdateRequestProcessor.processCommitCalled);
@@ -169,7 +180,7 @@ public class TestHierarchicalDocBuilder extends AbstractDataImportHandlerTestCas
 
     // let's check BlockJoin
     // get first parent by any grand children
-    String randomGrandChildId = grandChildrenIds.get(random().nextInt(grandChildrenIds.size()));
+    String randomGrandChildId = allGrandChildrenIds.get(random().nextInt(allGrandChildrenIds.size()));
     Query query = createToParentQuery(parentType, FIELD_ID, randomGrandChildId);
     assertSearch(query, FIELD_ID, parentId1);
 


[30/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10744: remove unused import

Posted by sh...@apache.org.
SOLR-10744: remove unused import


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b1b9a94b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b1b9a94b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b1b9a94b

Branch: refs/heads/feature/autoscaling
Commit: b1b9a94b1d8c0f418d0c7408a17147e8cca2d2e1
Parents: 1f437fe
Author: Christine Poerschke <cp...@apache.org>
Authored: Mon Jun 5 10:35:53 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Mon Jun 5 10:35:53 2017 +0100

----------------------------------------------------------------------
 solr/core/src/test/org/apache/solr/util/TestUtils.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b1b9a94b/solr/core/src/test/org/apache/solr/util/TestUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/util/TestUtils.java b/solr/core/src/test/org/apache/solr/util/TestUtils.java
index 5c55cd7..4cf6f6b 100644
--- a/solr/core/src/test/org/apache/solr/util/TestUtils.java
+++ b/solr/core/src/test/org/apache/solr/util/TestUtils.java
@@ -18,7 +18,6 @@ package org.apache.solr.util;
 
 import java.io.IOException;
 import java.io.StringReader;
-import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;


[41/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10419: All collection APIs should use the new Policy framework for replica placement

Posted by sh...@apache.org.
SOLR-10419: All collection APIs should use the new Policy framework for replica placement


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/b47572ee
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/b47572ee
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/b47572ee

Branch: refs/heads/feature/autoscaling
Commit: b47572ee879468ac552668dcc78095c6dfbec11b
Parents: 744d1ab
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue Jun 6 09:22:38 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Tue Jun 6 09:22:38 2017 +0530

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../src/java/org/apache/solr/cloud/Assign.java  |  7 +-
 .../apache/solr/cloud/CreateCollectionCmd.java  |  2 +-
 .../cloud/OverseerCollectionMessageHandler.java |  5 +-
 .../java/org/apache/solr/cloud/RestoreCmd.java  |  2 +-
 .../org/apache/solr/cloud/SplitShardCmd.java    |  2 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java | 69 ++++++++++++++++++++
 .../apache/solr/cloud/autoscaling/Policy.java   | 13 +++-
 .../solr/cloud/autoscaling/PolicyHelper.java    | 10 ++-
 .../solr/cloud/autoscaling/TestPolicy.java      |  4 +-
 10 files changed, 102 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 21d9ec1..d83b786 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -208,6 +208,8 @@ Other Changes
 
 * SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups. (Noble Paul, shalin)
 
+* SOLR-10419: All collection APIs should use the new Policy framework for replica placement. (Noble Paul, shalin)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/java/org/apache/solr/cloud/Assign.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/Assign.java b/solr/core/src/java/org/apache/solr/cloud/Assign.java
index 4e1fd68..eeab761 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Assign.java
@@ -199,7 +199,7 @@ public class Assign {
     Map autoScalingJson = Utils.getJson(cc.getZkController().getZkClient(), SOLR_AUTOSCALING_CONF_PATH, true);
     if (policyName != null || autoScalingJson.get(Policy.CLUSTER_POLICY) != null) {
       positions= Assign.getPositionsUsingPolicy(collectionName, Collections.singletonList(shard), numberOfNodes,
-          policyName, cc.getZkController().getZkStateReader());
+          policyName, cc.getZkController().getZkStateReader(), createNodeList);
     }
 
     if(positions != null){
@@ -216,7 +216,8 @@ public class Assign {
 
   }
   public static Map<ReplicaAssigner.Position, String> getPositionsUsingPolicy(String collName, List<String> shardNames, int numReplicas,
-                                                                              String policyName, ZkStateReader zkStateReader) throws KeeperException, InterruptedException {
+                                                                              String policyName, ZkStateReader zkStateReader,
+                                                                              List<String> nodesList) throws KeeperException, InterruptedException {
     try (CloudSolrClient csc = new CloudSolrClient.Builder()
         .withClusterStateProvider(new ZkClientClusterStateProvider(zkStateReader))
         .build()) {
@@ -224,7 +225,7 @@ public class Assign {
       Map<String, Object> autoScalingJson = Utils.getJson(zkStateReader.getZkClient(), SOLR_AUTOSCALING_CONF_PATH, true);
       Map<String, List<String>> locations = PolicyHelper.getReplicaLocations(collName,
           autoScalingJson,
-          clientDataProvider, singletonMap(collName, policyName), shardNames, numReplicas);
+          clientDataProvider, singletonMap(collName, policyName), shardNames, numReplicas, nodesList);
       Map<ReplicaAssigner.Position, String> result = new HashMap<>();
       for (Map.Entry<String, List<String>> e : locations.entrySet()) {
         List<String> value = e.getValue();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
index 3d1a54e..e0d4cba 100644
--- a/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/CreateCollectionCmd.java
@@ -162,7 +162,7 @@ public class CreateCollectionCmd implements Cmd {
               + " shards to be created (higher than the allowed number)");
         }
 
-        positionVsNodes = ocmh.identifyNodes(clusterState, nodeList, message, shardNames, numNrtReplicas, numTlogReplicas, numPullReplicas);
+        positionVsNodes = ocmh.identifyNodes(clusterState, nodeList, collectionName, message, shardNames, numNrtReplicas, numTlogReplicas, numPullReplicas);
       }
 
       ZkStateReader zkStateReader = ocmh.zkStateReader;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
index e5b3b9b..a055033 100644
--- a/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/OverseerCollectionMessageHandler.java
@@ -706,6 +706,7 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
 
   Map<Position, String> identifyNodes(ClusterState clusterState,
                                       List<String> nodeList,
+                                      String collectionName,
                                       ZkNodeProps message,
                                       List<String> shardNames,
                                       int numNrtReplicas, 
@@ -741,8 +742,8 @@ public class OverseerCollectionMessageHandler implements OverseerMessageHandler
     }
 
     if (policyName != null || autoScalingJson.get(Policy.CLUSTER_POLICY) != null) {
-      return Assign.getPositionsUsingPolicy(message.getStr(COLLECTION_PROP, message.getStr(NAME)),
-          shardNames, numNrtReplicas, policyName, zkStateReader);
+      return Assign.getPositionsUsingPolicy(collectionName,
+          shardNames, numNrtReplicas, policyName, zkStateReader, nodeList);
 
     } else {
       List<Rule> rules = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java b/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
index 76c12b8..6a18bff 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RestoreCmd.java
@@ -214,7 +214,7 @@ public class RestoreCmd implements OverseerCollectionMessageHandler.Cmd {
     restoreCollection.getSlices().forEach(x -> sliceNames.add(x.getName()));
 
     Map<ReplicaAssigner.Position, String> positionVsNodes = ocmh.identifyNodes(clusterState, nodeList,
-        message, sliceNames, numNrtReplicas, numTlogReplicas, numPullReplicas);
+        restoreCollectionName, message, sliceNames, numNrtReplicas, numTlogReplicas, numPullReplicas);
 
     //Create one replica per shard and copy backed up data to it
     for (Slice slice : restoreCollection.getSlices()) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/java/org/apache/solr/cloud/SplitShardCmd.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/SplitShardCmd.java b/solr/core/src/java/org/apache/solr/cloud/SplitShardCmd.java
index fe95458..2e2e335 100644
--- a/solr/core/src/java/org/apache/solr/cloud/SplitShardCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/SplitShardCmd.java
@@ -381,9 +381,9 @@ public class SplitShardCmd implements Cmd {
 
       // TODO: change this to handle sharding a slice into > 2 sub-shards.
 
-
       Map<ReplicaAssigner.Position, String> nodeMap = ocmh.identifyNodes(clusterState,
           new ArrayList<>(clusterState.getLiveNodes()),
+          collectionName,
           new ZkNodeProps(collection.getProperties()),
           subSlices, repFactor - 1, 0, 0);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
index fa592f3..ddb9d11 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.lucene.util.LuceneTestCase;
@@ -31,7 +32,9 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.OverseerTaskProcessor;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.cloud.DocCollection;
+import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.ZkStateReader;
+import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.KeeperException;
 import org.junit.After;
@@ -61,6 +64,72 @@ public class TestPolicyCloud extends SolrCloudTestCase {
         "{}".getBytes(StandardCharsets.UTF_8), true);
   }
 
+  public void testCreateCollectionAddReplica() throws Exception  {
+    JettySolrRunner jetty = cluster.getRandomJetty(random());
+    int port = jetty.getLocalPort();
+
+    String commands =  "{set-policy :{c1 : [{replica:2 , shard:'#EACH', port: '" + port + "'}]}}";
+    cluster.getSolrClient().request(AutoScalingHandlerTest.createAutoScalingRequest(SolrRequest.METHOD.POST, commands));
+
+    String collectionName = "testCreateCollectionAddReplica";
+    CollectionAdminRequest.createCollection(collectionName, 1, 1)
+        .setPolicy("c1")
+        .process(cluster.getSolrClient());
+
+    getCollectionState(collectionName).forEachReplica((s, replica) -> assertEquals(jetty.getNodeName(), replica.getNodeName()));
+
+    CollectionAdminRequest.addReplicaToShard(collectionName, "shard1").process(cluster.getSolrClient());
+    waitForState("Timed out waiting to see 2 replicas for collection: " + collectionName,
+        collectionName, (liveNodes, collectionState) -> collectionState.getReplicas().size() == 2);
+
+    getCollectionState(collectionName).forEachReplica((s, replica) -> assertEquals(jetty.getNodeName(), replica.getNodeName()));
+  }
+
+  public void testCreateCollectionSplitShard() throws Exception  {
+    JettySolrRunner firstNode = cluster.getRandomJetty(random());
+    int firstNodePort = firstNode.getLocalPort();
+
+    JettySolrRunner secondNode = null;
+    while (true)  {
+      secondNode = cluster.getRandomJetty(random());
+      if (secondNode.getLocalPort() != firstNodePort)  break;
+    }
+    int secondNodePort = secondNode.getLocalPort();
+
+    String commands =  "{set-policy :{c1 : [{replica:1 , shard:'#EACH', port: '" + firstNodePort + "'}, {replica:1, shard:'#EACH', port:'" + secondNodePort + "'}]}}";
+    NamedList<Object> response = cluster.getSolrClient().request(AutoScalingHandlerTest.createAutoScalingRequest(SolrRequest.METHOD.POST, commands));
+    assertEquals("success", response.get("result"));
+
+    String collectionName = "testCreateCollectionSplitShard";
+    CollectionAdminRequest.createCollection(collectionName, 1, 2)
+        .setPolicy("c1")
+        .setMaxShardsPerNode(10)
+        .process(cluster.getSolrClient());
+
+    DocCollection docCollection = getCollectionState(collectionName);
+    List<Replica> list = docCollection.getReplicas(firstNode.getNodeName());
+    int replicasOnNode1 = list != null ? list.size() : 0;
+    list = docCollection.getReplicas(secondNode.getNodeName());
+    int replicasOnNode2 = list != null ? list.size() : 0;
+
+    assertEquals("Expected exactly one replica of collection on node with port: " + firstNodePort, 1, replicasOnNode1);
+    assertEquals("Expected exactly one replica of collection on node with port: " + secondNodePort, 1, replicasOnNode2);
+
+    CollectionAdminRequest.splitShard(collectionName).setShardName("shard1").process(cluster.getSolrClient());
+
+    waitForState("Timed out waiting to see 6 replicas for collection: " + collectionName,
+        collectionName, (liveNodes, collectionState) -> collectionState.getReplicas().size() == 6);
+
+    docCollection = getCollectionState(collectionName);
+    list = docCollection.getReplicas(firstNode.getNodeName());
+    replicasOnNode1 = list != null ? list.size() : 0;
+    list = docCollection.getReplicas(secondNode.getNodeName());
+    replicasOnNode2 = list != null ? list.size() : 0;
+
+    assertEquals("Expected exactly three replica of collection on node with port: " + firstNodePort, 3, replicasOnNode1);
+    assertEquals("Expected exactly three replica of collection on node with port: " + secondNodePort, 3, replicasOnNode2);
+  }
+
   public void testCreateCollectionAddShardUsingPolicy() throws Exception {
     JettySolrRunner jetty = cluster.getRandomJetty(random());
     int port = jetty.getLocalPort();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
index 72aeda9..dd9dfc5 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Policy.java
@@ -348,7 +348,11 @@ public class Policy implements MapWriter {
     }
 
     public Suggester hint(Hint hint, Object value) {
-      hints.put(hint, value);
+      if (hint == Hint.TARGET_NODE || hint == Hint.SRC_NODE) {
+        ((Set) hints.computeIfAbsent(hint, h -> new HashSet<>())).add(value);
+      } else {
+        hints.put(hint, value);
+      }
       return this;
     }
 
@@ -461,7 +465,12 @@ public class Policy implements MapWriter {
 
     protected boolean isAllowed(Object v, Hint hint) {
       Object hintVal = hints.get(hint);
-      return hintVal == null || Objects.equals(v, hintVal);
+      if (hint == Hint.TARGET_NODE || hint == Hint.SRC_NODE) {
+        Set set = (Set) hintVal;
+        return set == null || set.contains(v);
+      } else {
+        return hintVal == null || Objects.equals(v, hintVal);
+      }
     }
 
     public enum Hint {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
index 168e94e..33d4b97 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/PolicyHelper.java
@@ -25,10 +25,10 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.client.solrj.SolrRequest;
+import org.apache.solr.cloud.autoscaling.Policy.Suggester.Hint;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.util.Utils;
-import org.apache.solr.cloud.autoscaling.Policy.Suggester.Hint;
 
 import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDREPLICA;
 
@@ -37,7 +37,8 @@ public class PolicyHelper {
                                                               ClusterDataProvider cdp,
                                                               Map<String, String> optionalPolicyMapping,
                                                               List<String> shardNames,
-                                                              int repFactor) {
+                                                              int repFactor,
+                                                              List<String> nodesList) {
     Map<String, List<String>> positionMapping = new HashMap<>();
     for (String shardName : shardNames) positionMapping.put(shardName, new ArrayList<>(repFactor));
     if (optionalPolicyMapping != null) {
@@ -76,6 +77,11 @@ public class PolicyHelper {
         Policy.Suggester suggester = session.getSuggester(ADDREPLICA)
             .hint(Hint.COLL, collName)
             .hint(Hint.SHARD, shardName);
+        if (nodesList != null)  {
+          for (String nodeName : nodesList) {
+            suggester = suggester.hint(Hint.TARGET_NODE, nodeName);
+          }
+        }
         SolrRequest op = suggester.getOperation();
         if (op == null) {
           throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No node can satisfy the rules "+ Utils.toJSONString(Utils.getDeepCopy(session.expandedClauses, 4, true)));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/b47572ee/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
index f992109..8c296b9 100644
--- a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
@@ -586,7 +586,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
     };
     Map<String, List<String>> locations = PolicyHelper.getReplicaLocations(
         "newColl", (Map<String, Object>) Utils.fromJSONString(autoScaleJson),
-        dataProvider, Collections.singletonMap("newColl", "c1"), Arrays.asList("shard1", "shard2"), 1);
+        dataProvider, Collections.singletonMap("newColl", "c1"), Arrays.asList("shard1", "shard2"), 1, null);
     assertTrue(locations.get("shard1").containsAll(ImmutableList.of("127.0.0.1:50096_solr")));
     assertTrue(locations.get("shard2").containsAll(ImmutableList.of("127.0.0.1:50096_solr")));
   }
@@ -643,7 +643,7 @@ public class TestPolicy extends SolrTestCaseJ4 {
     };
     Map<String, List<String>> locations = PolicyHelper.getReplicaLocations(
         "newColl", (Map<String, Object>) Utils.fromJSONString(autoScaleJson),
-        dataProvider, Collections.singletonMap("newColl", "policy1"), Arrays.asList("shard1", "shard2"), 3);
+        dataProvider, Collections.singletonMap("newColl", "policy1"), Arrays.asList("shard1", "shard2"), 3, null);
     assertTrue(locations.get("shard1").containsAll(ImmutableList.of("node2", "node1", "node3")));
     assertTrue(locations.get("shard2").containsAll(ImmutableList.of("node2", "node1", "node3")));
 


[18/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10801: Remove several deprecated methods that were exposed to plugin writers

Posted by sh...@apache.org.
SOLR-10801: Remove several deprecated methods that were exposed to plugin writers


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/038baaed
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/038baaed
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/038baaed

Branch: refs/heads/feature/autoscaling
Commit: 038baaed92a0894faa4204089373fd1deb295097
Parents: 3b45d82
Author: Chris Hostetter <ho...@apache.org>
Authored: Fri Jun 2 10:49:26 2017 -0700
Committer: Chris Hostetter <ho...@apache.org>
Committed: Fri Jun 2 10:51:23 2017 -0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  2 +
 .../apache/solr/search/LuceneQParserPlugin.java |  6 --
 .../java/org/apache/solr/search/QParser.java    | 10 ----
 .../org/apache/solr/search/QueryParsing.java    | 26 --------
 .../org/apache/solr/util/SolrPluginUtils.java   | 63 --------------------
 5 files changed, 2 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/038baaed/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 6b664e4..b7e0b61 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -228,6 +228,8 @@ Other Changes
 * SOLR-10799: Extracted functionality to collect eligible replicas from HttpShardHandler.prepDistributed()
   to a new method (Domenico Fabio Marino via Tomás Fernández Löbbe)
 
+* SOLR-10801: Remove several deprecated methods that were exposed to plugin writers (hossman)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/038baaed/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
index 8668330..912b57f 100644
--- a/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/LuceneQParserPlugin.java
@@ -79,12 +79,6 @@ class OldLuceneQParser extends LuceneQParser {
   }
 
   @Override
-  @Deprecated
-  public SortSpec getSort(boolean useGlobal) throws SyntaxError {
-    return getSortSpec(useGlobal);
-  }
-
-  @Override
   public SortSpec getSortSpec(boolean useGlobal) throws SyntaxError {
     SortSpec sort = super.getSortSpec(useGlobal);
     if (sortStr != null && sortStr.length()>0 && sort.getSort()==null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/038baaed/solr/core/src/java/org/apache/solr/search/QParser.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/QParser.java b/solr/core/src/java/org/apache/solr/search/QParser.java
index 58c0265..7392cbc 100644
--- a/solr/core/src/java/org/apache/solr/search/QParser.java
+++ b/solr/core/src/java/org/apache/solr/search/QParser.java
@@ -238,16 +238,6 @@ public abstract class QParser {
   /**
    * @param useGlobalParams look up sort, start, rows in global params if not in local params
    * @return the sort specification
-   * @deprecated Use the not misleadingly named getSortSpec() function instead.
-   */
-  @Deprecated
-  public SortSpec getSort(boolean useGlobalParams) throws SyntaxError {
-    return getSortSpec(useGlobalParams);
-  }
-
-  /**
-   * @param useGlobalParams look up sort, start, rows in global params if not in local params
-   * @return the sort specification
    */
   public SortSpec getSortSpec(boolean useGlobalParams) throws SyntaxError {
     getQuery(); // ensure query is parsed first

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/038baaed/solr/core/src/java/org/apache/solr/search/QueryParsing.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/QueryParsing.java b/solr/core/src/java/org/apache/solr/search/QueryParsing.java
index bbce610..f636aca 100644
--- a/solr/core/src/java/org/apache/solr/search/QueryParsing.java
+++ b/solr/core/src/java/org/apache/solr/search/QueryParsing.java
@@ -57,32 +57,6 @@ public class QueryParsing {
   // true if the value was specified by the "v" param (i.e. v=myval, or v=$param)
   public static final String VAL_EXPLICIT = "__VAL_EXPLICIT__";
 
-
-  /**
-   * Returns the default operator for use by Query Parsers, parsed from the df string
-   * @param notUsed is not used, but is there for back compat with 3rd party QParsers
-   * @param df the df string from request
-   * @deprecated this method is here purely not to break code back compat in 7.x
-   */
-  @Deprecated
-  public static QueryParser.Operator getQueryParserDefaultOperator(final IndexSchema notUsed,
-                                                       final String df) {
-    return parseOP(df);
-  }
-
-  /**
-   * Returns the effective default field based on the 'df' param.
-   * TODO: This is kept for 3rd party QParser compat in 7.x. Remove this method in Solr 8.0
-   * @param ignored Not in use
-   * @param df the default field, which will be returned as-is
-   * @see org.apache.solr.common.params.CommonParams#DF
-   * @deprecated IndexScema does not contain defaultField anymore, you must rely on df alone
-   */
-  @Deprecated
-  public static String getDefaultField(final IndexSchema ignored, final String df) {
-    return df;
-  }
-
   /**
    * @param txt Text to parse
    * @param start Index into text for start of parsing

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/038baaed/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
index 658b035..1d265c7 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
@@ -35,7 +35,6 @@ import java.util.TreeMap;
 import java.util.regex.Pattern;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.index.IndexableField;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
@@ -44,8 +43,6 @@ import org.apache.lucene.search.DisjunctionMaxQuery;
 import org.apache.lucene.search.Explanation;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Sort;
-import org.apache.solr.common.SolrDocument;
-import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
@@ -1009,66 +1006,6 @@ public class SolrPluginUtils {
     }
   }
 
-  /**
-   * Convert a DocList to a SolrDocumentList
-   *
-   * The optional param "ids" is populated with the lucene document id
-   * for each SolrDocument.
-   *
-   * @param docs The {@link org.apache.solr.search.DocList} to convert
-   * @param searcher The {@link org.apache.solr.search.SolrIndexSearcher} to use to load the docs from the Lucene index
-   * @param fields The names of the Fields to load
-   * @param ids A map to store the ids of the docs
-   * @return The new {@link org.apache.solr.common.SolrDocumentList} containing all the loaded docs
-   * @throws java.io.IOException if there was a problem loading the docs
-   * @since solr 1.4
-   * @deprecated TODO in 7.0 remove this. It was inlined into ClusteringComponent. DWS: 'ids' is ugly.
-   */
-  public static SolrDocumentList docListToSolrDocumentList(
-      DocList docs,
-      SolrIndexSearcher searcher,
-      Set<String> fields,
-      Map<SolrDocument, Integer> ids ) throws IOException
-  {
-    /*  DWS deprecation note:
-     It's only called by ClusteringComponent, and I think the "ids" param aspect is a bit messy and not worth supporting.
-     If someone wants a similar method they can speak up and we can add a method to SolrDocumentFetcher.
-     */
-    IndexSchema schema = searcher.getSchema();
-
-    SolrDocumentList list = new SolrDocumentList();
-    list.setNumFound(docs.matches());
-    list.setMaxScore(docs.maxScore());
-    list.setStart(docs.offset());
-
-    DocIterator dit = docs.iterator();
-
-    while (dit.hasNext()) {
-      int docid = dit.nextDoc();
-
-      Document luceneDoc = searcher.doc(docid, fields);
-      SolrDocument doc = new SolrDocument();
-
-      for( IndexableField field : luceneDoc) {
-        if (null == fields || fields.contains(field.name())) {
-          SchemaField sf = schema.getField( field.name() );
-          doc.addField( field.name(), sf.getType().toObject( field ) );
-        }
-      }
-      if (docs.hasScores() && (null == fields || fields.contains("score"))) {
-        doc.addField("score", dit.score());
-      }
-
-      list.add( doc );
-
-      if( ids != null ) {
-        ids.put( doc, new Integer(docid) );
-      }
-    }
-    return list;
-  }
-
-
   public static void invokeSetters(Object bean, Iterable<Map.Entry<String,Object>> initArgs) {
     invokeSetters(bean, initArgs, false);
   }


[02/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10559: Add tuple documentation

Posted by sh...@apache.org.
SOLR-10559: Add tuple documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/057451ac
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/057451ac
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/057451ac

Branch: refs/heads/feature/autoscaling
Commit: 057451ac643b134dda3f685c5ffec1b2cdc23dc0
Parents: 6d6e47f
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Jun 1 17:08:52 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Jun 1 17:08:52 2017 -0400

----------------------------------------------------------------------
 solr/solr-ref-guide/src/stream-sources.adoc | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/057451ac/solr/solr-ref-guide/src/stream-sources.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/stream-sources.adoc b/solr/solr-ref-guide/src/stream-sources.adoc
index 986a5da..2bb0805 100644
--- a/solr/solr-ref-guide/src/stream-sources.adoc
+++ b/solr/solr-ref-guide/src/stream-sources.adoc
@@ -480,3 +480,24 @@ topic(checkpointCollection,
       q="topic query",
       fl="id, name, country")
 ----
+
+== tuple
+
+The `tuple` function emits a single Tuple with name/value pairs. The values can be set to variables assigned in a `let` expression, literals, Stream Evaluators or
+Stream Expressions. In the case of Stream Evaluators the tuple will output the return value from the evaluator.
+This could be a numeric, list or map. If a Stream Expression is set to a value, the `tuple` function will flatten
+the tuple stream from the Stream Expression into a list of Tuples.
+
+=== tuple Parameters
+
+* name=value pairs
+
+=== tuple Syntax
+
+[source,text]
+----
+tuple(a=add(1,1),
+      b=search(collection1, q="cat:a", fl="a, b, c", sort"a desc"))
+----
+
+


[11/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-9735: validation of all input values to either string or long

Posted by sh...@apache.org.
SOLR-9735: validation of all input values to either string or long


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2a625dfb
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2a625dfb
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2a625dfb

Branch: refs/heads/feature/autoscaling
Commit: 2a625dfb1ff6d71cb2435e3efeefafe80746cd72
Parents: 4e691f9
Author: Noble Paul <no...@apache.org>
Authored: Fri Jun 2 23:28:53 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Fri Jun 2 23:28:53 2017 +0930

----------------------------------------------------------------------
 solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2a625dfb/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
index 92b4bac..463d434 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
@@ -97,7 +97,7 @@ class Row implements MapWriter {
     if (replicas == null) c.put(shard, replicas = new ArrayList<>());
     replicas.add(new ReplicaInfo("" + new Random().nextInt(1000) + 1000, coll, shard, new HashMap<>()));
     for (Cell cell : row.cells) {
-      if (cell.name.equals("cores")) cell.val = ((Number) cell.val).intValue() + 1;
+      if (cell.name.equals("cores")) cell.val = ((Number) cell.val).longValue() + 1;
     }
     return row;
 


[46/50] [abbrv] lucene-solr:feature/autoscaling: Merge branch 'master' into feature/autoscaling

Posted by sh...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/CHANGES.txt
----------------------------------------------------------------------
diff --cc solr/CHANGES.txt
index 1ca238d,5343bc5..ed2feac
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@@ -71,23 -98,36 +98,46 @@@ New Feature
  
  * SOLR-9835: Create another replication mode for SolrCloud
  
- * SOLR-10292: Adds CartesianProductStream which turns a single tuple with a multi-valued field into N 
-   tuples, one for each value in the multi-valued field. (Dennis Gove)
+ * SOLR-10356: Adds basic math Streaming Evaluators (Dennis Gove)
+ 
+ * SOLR-10393: Adds UUID Streaming Evaluator (Dennis Gove)
+ 
+ * SOLR-10046: Add UninvertDocValuesMergePolicyFactory class. (Keith Laban, Christine Poerschke)
+ 
+ * SOLR-10547: JSON Facet API: Implement support for single-valued string fields for min/max aggregations.
+   (yonik)
+ 
+ * SOLR-10262: Add support for configurable metrics implementations. (ab)
+ 
+ * SOLR-10431: Make it possible to invoke v2 api calls using SolrJ (Cao Manh Dat, Noble Paul, shalin)
+ 
+ * SOLR-10233: Add support for different replica types, that can handle updates differently:
 -  - NRT: Writes updates to transaction log and indexes locally. Replicas of type “NRT” support NRT 
 -         (soft commits) and RTG. Any NRT replica can become a leader. This was the only type supported 
++  - NRT: Writes updates to transaction log and indexes locally. Replicas of type “NRT” support NRT
++         (soft commits) and RTG. Any NRT replica can become a leader. This was the only type supported
+          in SolrCloud until now and it’s the default type.
 -  - TLOG: Writes to transaction log, but not to index, uses replication to copy segment files from the 
 -          shard leader. Any TLOG replica can become leader (by first applying all local transaction log 
++  - TLOG: Writes to transaction log, but not to index, uses replication to copy segment files from the
++          shard leader. Any TLOG replica can become leader (by first applying all local transaction log
+           elements). If a replica is of type TLOG but is also the leader, it will behave as a NRT. This
+           is exactly what was added in SOLR-9835 (non-realtime replicas), just the API and naming changes.
 -  - PULL: Doesn’t index or writes to transaction log, just replicates from the shard leader. PULL replicas 
 -          can’t become shard leaders (i.e., if there are only PULL replicas in the collection at some point, 
 -          updates will fail same as if there is no leaders, queries continue to work), so they don’t even 
++  - PULL: Doesn’t index or writes to transaction log, just replicates from the shard leader. PULL replicas
++          can’t become shard leaders (i.e., if there are only PULL replicas in the collection at some point,
++          updates will fail same as if there is no leaders, queries continue to work), so they don’t even
+           participate in elections.
+   (Tomás Fernández Löbbe)
+ 
+ * SOLR-10278: A new DSL to set cluster-wide preferences and policies on how to allocate replicas to nodes
+   (noble, shalin)
  
 +* SOLR-10339: New set-trigger and remove-trigger APIs for autoscaling. (shalin)
 +
 +* SOLR-10340: New set-listener and remove-listener API for autoscaling. (shalin)
 +
 +* SOLR-10358: New suspend-trigger and resume-trigger APIs for autoscaling. (shalin)
 +
- * SOLR-10356: Adds basic math Streaming Evaluators (Dennis Gove)
- 
- * SOLR-10393: Adds UUID Streaming Evaluator (Dennis Gove)
- 
 +* SOLR-10376: Implement autoscaling trigger for nodeAdded event. (shalin)
 +
 +* SOLR-10396: Implement trigger support for nodeLost event type (Cao Manh Dat, shalin)
 +
  * SOLR-10373: Implement read API for autoscaling configuration at /admin/autoscaling or
    /cluster/autoscaling paths. (shalin)
  
@@@ -102,13 -142,20 +152,27 @@@ Bug Fixe
  * SOLR-9837: Fix 55% performance regression of FieldCache uninvert time of
    numeric fields.  (yonik)
  
+ * SOLR-10408: v2 API introspect should return useful message for non-existent command (Cao Manh Dat)
+ 
+ * SOLR-10411: v2 Collection API "modify" command specification's replicationFactor property is incorrectly typed as string,
+   should be integer (Cao Manh Dat)
+ 
+ * SOLR-10405: v2 API introspect response contains multiple copies of the experimental format WARNING (Cao Manh Dat)
+ 
+ * SOLR-10412: v2 API: many API command specification properties are typed "number" but should instead be typed "integer"
+   (Steve Rowe, Cao Manh Dat)
+ 
+ * SOLR-10413: v2 API: parsed JSON type should be coerced to expected type (Cao Manh Dat, Noble Paul)
+ 
+ * SOLR-10223: Allow running examples as root on Linux with -force option (janhoy)
+ 
 +* SOLR-10602: Triggers should be able to restore state from old instances when taking over. (shalin)
 +
 +* SOLR-10714: OverseerTriggerThread does not start triggers on overseer start until autoscaling
 +  config watcher is fired. (shalin)
 +
 +* SOLR-10738: TriggerAction is initialised even if the trigger is never scheduled. (shalin)
 +
  Optimizations
  ----------------------
  
@@@ -140,12 -191,195 +208,197 @@@ Other Change
    Add support for selecting specific properties from any compound metric using 'property' parameter to
    /admin/metrics handler. (ab)
  
+ * SOLR-10557: Make "compact" format default for /admin/metrics. (ab)
+ 
+ * SOLR-10310: By default, stop splitting on whitespace prior to analysis
+   in edismax and standard/"lucene" query parsers. (Steve Rowe)
+ 
+ * SOLR-10647: Move the V1 <-> V2 API mapping to SolrJ (noble)
+ 
+ * SOLR-10584: We'll now always throw an exception if defaultOperator is found in schema. This config has
+   been deprecated since 3.6, and enforced for new configs since 6.6 (janhoy)
+ 
+ * SOLR-10585: We'll now always throw an exception if defaultSearchField is found in schema. This config has
+   been deprecated since 3.6, and enforced for new configs since 6.6 (janhoy, David Smiley)
+ 
+ * SOLR-10414: RecoveryStrategy is now a Runnable instead of a Thread. (Tomás Fernández Löbbe)
+ 
+ * SOLR-10042: Delete old deprecated Admin UI, leaving the AngularJS UI the only one supported (janhoy)
+ 
+ * SOLR-10378: Clicking Solr logo on AdminUI shows blank page (Takumi Yoshida via janhoy)
+ 
+ * SOLR-10700: Deprecated and converted the PostingsSolrHighlighter to extend UnifiedSolrHighlighter and thus no
+   longer use the PostingsHighlighter.  It should behave mostly the same. (David Smiley)
+ 
+ * SOLR-10710: Fix LTR failing tests. (Diego Ceccarelli via Tomás Fernández Löbbe)
+ 
+ * SOLR-10755: delete/refactor many solrj deprecations (hossman)
+ 
+ * SOLR-10752: replicationFactor (nrtReplicas) default is 0 if tlogReplicas is specified when creating a collection
+   (Tomás Fernández Löbbe)
+ 
+ * SOLR-10757: delete/refactor/cleanup CollectionAdminRequest deprecations (hossman)
+ 
+ * SOLR-10793: BlobHandler should have a well-known permission name (noble)
+ 
+ * SOLR-10744: Update noggit to newer version (0.8) (noble)
+ 
+ * SOLR-10792: Deprecate and remove implicit registration of "lucenePlusSort" aka OldLuceneQParser (hossman)
+ 
+ * SOLR-10791: Remove deprecated options in SSLTestConfig (hossman)
+ 
+ * LUCENE-7852: Correct copyright year(s) in solr/LICENSE.txt file.
+   (Christine Poerschke, Steve Rowe)
+ 
+ * SOLR-8668: In solrconfig.xml remove <mergePolicy> (and related <mergeFactor> and <maxMergeDocs>)
+   support in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
+   (Christine Poerschke, hossman)
+ 
+ * SOLR-10799: Extracted functionality to collect eligible replicas from HttpShardHandler.prepDistributed()
+   to a new method (Domenico Fabio Marino via Tomás Fernández Löbbe)
+ 
+ * SOLR-10801: Remove several deprecated methods that were exposed to plugin writers (hossman)
+ 
+ * SOLR-10671: Add abstract doInit method to the SolrMetricReporter base class.
+   (Christine Poerschke, Anshum Gupta)
+ 
+ * SOLR-10713: Ignore .pid and .out files in solr working directory (Jason Gerlowski via Mike Drob)
+ 
 +* SOLR-10643: Throttling strategy for triggers and policy executions. (shalin)
 +
  * SOLR-10764: AutoScalingHandler should validate policy and preferences before updating zookeeper. (shalin)
  
+ * SOLR-10782: Improve error handling and tests for Snitch and subclasses and general cleanups. (Noble Paul, shalin)
+ 
+ * SOLR-10419: All collection APIs should use the new Policy framework for replica placement. (Noble Paul, shalin)
+ 
+ ==================  6.7.0 ==================
+ 
+ Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
+ 
+ Versions of Major Components
+ ---------------------
+ Apache Tika 1.13
+ Carrot2 3.15.0
+ Velocity 1.7 and Velocity Tools 2.0
+ Apache UIMA 2.3.1
+ Apache ZooKeeper 3.4.10
+ Jetty 9.3.14.v20161028
+ 
+ Detailed Change List
  ----------------------
  
+ Upgrade Notes
+ ----------------------
+ 
+ * SOLR-10307: If starting Jetty without the Solr start script, you must now pass keystore and truststore
+   passwords via the env variables SOLR_SSL_KEY_STORE_PASSWORD and SOLR_SSL_TRUST_STORE_PASSWORD rather
+   than system properties.
+ 
+ * SOLR-10379: ManagedSynonymFilterFactory has been deprecated in favor of ManagedSynonymGraphFilterFactory.
+ 
+ New Features
+ ----------------------
+ 
+ * SOLR-10307: Allow Passing SSL passwords through environment variables. (Mano Kovacs via Mark Miller)
+ 
+ * SOLR-10721: Provide a way to know when Core Discovery is finished and when all async cores are done loading
+   (Erick Erickson)
 -  
++
+ * SOLR-10379: Add ManagedSynonymGraphFilterFactory, deprecate ManagedSynonymFilterFactory. (Steve Rowe)
+ 
+ * SOLR-10479: Adds support for HttpShardHandlerFactory.loadBalancerRequests(MinimumAbsolute|MaximumFraction)
+   configuration. (Ramsey Haddad, Daniel Collins, Christine Poerschke)
+ 
+ * SOLR-3702: concat(...) function query (Andrey Kudryavtsev via Mikhail Khludnev)
+ 
+ * SOLR-10767: Add movingAvg Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10813: Add arraySort Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10696: Add cumulative probability function (Joel Bernstein)
+ 
+ * SOLR-10765: Add anova Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10754: Add hist Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10753: Add array Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10747: Allow /stream handler to execute Stream Evaluators directly (Joel Bernstein)
+ 
+ * SOLR-10743: Add sequence StreamEvaluator (Joel Bernstein)
+ 
+ * SOLR-10684: Add finddelay Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10731: Add knn Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10724: Add describe Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10693: Add copyOfRange Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10623: Add sql Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10661: Add copyOf Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10663: Add distance Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10664: Add scale Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10666: Add rank transformation Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10662: Add length Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10660: Add reverse Stream Evaluator (Joel Bernstein)
+ 
+ Bug Fixes
+ ----------------------
+ * SOLR-10723 JSON Facet API: resize() implemented incorrectly for CountSlotAcc, HllAgg.NumericAcc
+   resulting in exceptions when using a hashing faceting method and sorting by hll(numeric_field).
+   (yonik)
+ 
+ * SOLR-10719: Creating a core.properties fails if the parent of core.properties is a symlinked dierctory
+   (Erick Erickson)
+ 
+ * SOLR-10360: Solr HDFS snapshot export fails due to FileNotFoundException error when using MR1 instead of
+   yarn. (Hrishikesh via Mark Miller)
+ 
+ * SOLR-10137: Ensure that ConfigSets created via API are mutable. (Hrishikesh via Mark Miller)
+ 
+ Optimizations
+ ----------------------
+ * SOLR-10634: JSON Facet API: When a field/terms facet will retrieve all buckets (i.e. limit:-1)
+   and there are no nested facets, aggregations are computed in the first collection phase
+   so that the second phase which would normally involve calculating the domain for the bucket
+   can be skipped entirely, leading to large performance improvements. (yonik)
+ 
+ Other Changes
+ ----------------------
+ 
+ * SOLR-10617: JDBCStream accepts columns of type TIME, DATE & TIMESTAMP as well as CLOBs and decimal
+   numeric types (James Dyer)
+ 
+ * SOLR-10400: Replace (instanceof TrieFooField || instanceof FooPointField) constructs with
+   FieldType.getNumberType() or SchemaField.getSortField() where appropriate. (hossman, Steve Rowe)
 -  
 -* SOLR-10438: Assign explicit useDocValuesAsStored values to all points field types in 
++
++* SOLR-10438: Assign explicit useDocValuesAsStored values to all points field types in
+   schema-point.xml/TestPointFields. (hossman, Steve Rowe)
 -  
++
+ * LUCENE-7705: Allow CharTokenizer-derived tokenizers and KeywordTokenizer to configure the max token length.
+   (Amrit Sarkar via Erick Erickson)
+ 
+ * SOLR-10659: Remove ResponseBuilder.getSortSpec use in SearchGroupShardResponseProcessor.
+   (Judith Silverman via Christine Poerschke)
+ 
+ * SOLR-10741: Factor out createSliceShardsStr method from HttpShardHandler.prepDistributed.
+   (Domenico Fabio Marino via Christine Poerschke)
+ 
+ * SOLR-10790: Fix warnings in Assign.java and ReplicaAssigner.java classes.
+   (Christine Poerschke)
+ 
+ * SOLR-8437: Improve RAMDirectory details in sample solrconfig files (Mark Miller, Varun Thacker)
+ 
+ * SOLR-8762: return child docs in DIH debug (Gopikannan Venugopalsamy via Mikhail Khludnev)
+ 
  ==================  6.6.0 ==================
  
  Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.
@@@ -202,6 -439,61 +458,61 @@@ New Feature
    Example: json.facet={x:"stddev(field1)", y:"variance(field2)"}
    (Rustam Hashimov, yonik)
  
+ * SOLR-10505: Add multi-field support to TermsComponent when requesting terms' statistics. (Shai Erera)
+ 
+ * SOLR-10537: SolrJ: Added SolrParams.toLocalParamsString() and ClientUtils.encodeLocalParamVal. (David Smiley)
+ 
+ * SOLR-10507: Core Admin status command to emit collection details of each core (noble)
+ 
 -* SOLR-10521: introducing sort=childfield(field) asc for searching by {!parent} (Mikhail Khludnev) 
++* SOLR-10521: introducing sort=childfield(field) asc for searching by {!parent} (Mikhail Khludnev)
+ 
+ * SOLR-9596: Add Solr support for SimpleTextCodec, via <codecFactory class="solr.SimpleTextCodecFactory"/>
+   in solrconfig.xml (per-field specification in the schema is not possible). (Steve Rowe)
+ 
+ * SOLR-1485: Add payload support with payload() value source and {!payload_score} and {!payload_check}
+   query parsers.  (Erik Hatcher)
+ 
+ * SOLR-10430: Add ls command to ZkCLI for listing only sub-directories. (Peter Szantai-Kis via Mark Miller)
+ 
+ * SOLR-10583: JSON Faceting now supports a query time 'join' domain change option (hossman)
+ 
+ * SOLR-9530: An Update Processor to convert normal update operation to an atomic operations such as
+   add, set,inc, remove ,set, removeregex (Amrit Sarkar, noble)
+ 
+ * SOLR-10303: Add date/time Stream Evaluators (Gethin James, Dennis Gove, Joel Bernstein)
+ 
+ * SOLR-10351: Add analyze Stream Evaluator to support streaming NLP (Joel Bernstein)
+ 
+ * SOLR-10426: Add shuffle Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10274: The search Streaming Expression should work in non-SolrCloud mode (Joel Bernstein)
+ 
+ * SOLR-10504: Add echo Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10516: Add eval Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10566: Add timeseries Streaming Expression (Joel Bernstein)
+ 
+ * SOLR-10559: Add let, get and tuple Streaming Expressions (Dennis Gove, Joel Bernstein)
+ 
+ * SOLR-10582: Add Correlation Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10536: stats Streaming Expression should work in non-SolrCloud mode (Joel Bernstein)
+ 
+ * SOLR-10622: Add regress and predict Stream Evaluators (Joel Bernstein)
+ 
+ * SOLR-10626: Add covariance Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10625: Add convolution Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-10638: Add normalize Stream Evaluator (Joel Bernstein)
+ 
+ * SOLR-8440: Support for enabling basic authentication using bin/solr|bin/solr.cmd. (Ishan Chattopadhyaya, janhoy,
+   Noble Paul, Hrishikesh Gadre)
+ 
+ * SOLR-10292: Adds CartesianProductStream which turns a single tuple with a multi-valued field into N
+   tuples, one for each value in the multi-valued field. (Dennis Gove)
+ 
  Optimizations
  ----------------------
  
@@@ -209,6 -501,19 +520,19 @@@
    instance if it already is modifiable, otherwise creates a new ModifiableSolrParams instance.
    (Jörg Rathlev via Koji)
  
+ * SOLR-10499: facet.heatmap is now significantly faster when the docset (base query) matches everything and there are no
+   deleted docs.  It's also faster when the docset matches a small fraction of the index or none. (David Smiley)
+ 
 -* SOLR-9217: Reduced heap consumption for filter({!join ... score=...}) 
++* SOLR-9217: Reduced heap consumption for filter({!join ... score=...})
+   (Andrey Kudryavtsev, Gopikannan Venugopalsamy via Mikhail Khludnev)
+ 
+ * SOLR-10548: JSON Facet API now uses hyper-log-log++ for determining the number of buckets
+   when merging requests from a multi-shard distributed request. (yonik)
+ 
+ * SOLR-10524: Better ZkStateWriter batching (Cao Manh Dat, Noble Paul, shalin, Scott Blum)
+ 
+ * SOLR-10619: Optimize using cache for DistributedQueue in case of single-consumer (Cao Manh Dat, Scott Blum)
+ 
  Bug Fixes
  ----------------------
  * SOLR-10281: ADMIN_PATHS is duplicated in two places and inconsistent. This can cause automatic
@@@ -220,7 -525,7 +544,7 @@@
  
  * SOLR-10369: bin\solr.cmd delete and healthcheck now works again; fixed continuation chars ^ (Luis Goes via janhoy)
  
--* SOLR-10387: zkTransfer normalizes destination path incorrectly if source is a windows directory 
++* SOLR-10387: zkTransfer normalizes destination path incorrectly if source is a windows directory
    (gopikannan venugopalsamy, Erick Erickson)
  
  * SOLR-10323: fix to SpellingQueryConverter to properly strip out colons in field-specific queries.
@@@ -228,8 -533,8 +552,8 @@@
  
  * SOLR-10264: Fixes multi-term synonym parsing in ManagedSynonymFilterFactory.
    (Jörg Rathlev, Steve Rowe, Christine Poerschke)
--  
--* SOLR-8807: fix Spellcheck "collateMaxCollectDocs" parameter to work with queries that have the 
++
++* SOLR-8807: fix Spellcheck "collateMaxCollectDocs" parameter to work with queries that have the
    CollpasingQParserPlugin applied.  (James Dyer)
  
  * SOLR-10474: TestPointFields.testPointFieldReturn() depends on order of unsorted hits. (Steve Rowe)
@@@ -245,6 -550,51 +569,51 @@@
  * SOLR-5127: Multiple highlight fields and wildcards are now supported e.g. hl.fl=title,text_*
    (Sven-S. Porst, Daniel Debray, Simon Endele, Christine Poerschke)
  
+ * SOLR-10493: Investigate SolrCloudExampleTest failures. (Erick Erickson)
+ 
+ * SOLR-10552: JSON Facet API numBuckets was not consistent between distributed and non-distributed requests
+   when there was a mincount > 1.  This has been corrected by changing numBuckets cardinality processing to
+   ignore mincount > 1 for non-distributed requests. (yonik)
+ 
 -* SOLR-10520: child.facet.field doubled counts at least when rows>0. (Dr. Oleg Savrasov via Mikhail Khludnev) 
++* SOLR-10520: child.facet.field doubled counts at least when rows>0. (Dr. Oleg Savrasov via Mikhail Khludnev)
+ 
+ * SOLR-10480: Full pagination in JSON Facet API using offset does not work. (yonik)
+ 
+ * SOLR-10526: facet.heatmap didn't honor facet exclusions ('ex') for distributed search. (David Smiley)
+ 
 -* SOLR-10500: nested child docs are adopted by neighbour when several parents come in update/json/docs 
++* SOLR-10500: nested child docs are adopted by neighbour when several parents come in update/json/docs
+   (Alexey Suprun,noble via Mikhail Khludnev)
+ 
+ * SOLR-10316: Unloading a core can remove a ZK SolrCore registration entry for the wrong SolrCore. (Mark Miller)
+ 
+ * SOLR-10588: Prevent redundant core reload on config update (Mikhail Khludnev)
+ 
+ * SOLR-10549: The new 'large' attribute had been forgotten in /schema/fieldtypes?showDefaults=true (David Smiley)
+ 
+ * SOLR-10615: requests are suspended until SolrDispatchFilter initialization is completed.
+   After core container shutdown or severe initialization problem Solr responds with
+   http stauts 404 Not Found instead of 500 as it was before (Mikhail Khludnev)
+ 
+ * SOLR-8149: Admin UI - Plugins / Stats - active item is now highlighted (Labuzov Dmitriy via janhoy)
+ 
+ * SOLR-10630: HttpSolrCall.getAuthCtx().new AuthorizationContext() {...}.getParams()
+   sometimes throws java.lang.NullPointerException (hu xiaodong via shalin)
+ 
+ * SOLR-9527: Improve distribution of replicas when restoring a collection
+   (Hrishikesh Gadre, Stephen Lewis, Rohit, Varun Thacker)
+ 
+ * LUCENE-7821: The classic and flexible query parsers, as well as Solr's
+  "lucene"/standard query parser, should require " TO " in range queries,
+   and accept "TO" as endpoints in range queries. (hossman, Steve Rowe)
+ 
+ * SOLR-10735: Windows script (solr.cmd) didn't work properly with directory containing spaces. Adding quotations
 -  to fix (Uwe Schindler, janhoy, Tomas Fernandez-Lobbe, Ishan Chattopadhyaya) 
++  to fix (Uwe Schindler, janhoy, Tomas Fernandez-Lobbe, Ishan Chattopadhyaya)
+ 
+ Ref Guide
+ ----------------------
+ 
+ * SOLR-10758: Modernize the Solr ref guide's Chinese language analysis coverage. (Steve Rowe)
+ 
  Other Changes
  ----------------------
  
@@@ -257,7 -607,7 +626,7 @@@
  
  * SOLR-10352: bin/solr script now prints warning when available system entropy is lower than 300 (Esther Quansah via
    Ishan Chattopadhyaya)
--  
++
  * SOLR-10344: Update Solr default/example and test configs to use WordDelimiterGraphFilterFactory. (Steve Rowe)
  
  * SOLR-10343: Update Solr default/example and test configs to use SynonymGraphFilterFactory. (Steve Rowe)
@@@ -265,8 -615,9 +634,9 @@@
  * SOLR-10365: Handle a SolrCoreInitializationException while publishing core state during SolrCore creation
    (Ishan Chattopadhyaya)
  
--* SOLR-10357: Enable edismax and standard query parsers to handle the option combination 
++* SOLR-10357: Enable edismax and standard query parsers to handle the option combination
    sow=false / autoGeneratePhraseQueries="true" by setting QueryBuilder.autoGenerateMultiTermSynonymsQuery.
+   (Steve Rowe)
  
  * SOLR-10147: Admin UI -> Cloud -> Graph: Impossible to see shard state (Amrit Sarkar, janhoy)
  
@@@ -311,7 -688,7 +707,7 @@@ Bug Fixe
  
  * SOLR-10404: The fetch() streaming expression wouldn't work if a value included query syntax chars (like :+-).
    Fixed, and enhanced the generated query to not pollute the queryCache. (David Smiley)
--  
++
  * SOLR-10423: Disable graph query production via schema configuration <fieldtype ... enableGraphQueries="false">.
    This fixes broken queries for ShingleFilter-containing query-time analyzers when request param sow=false.
    (Steve Rowe)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/java/org/apache/solr/cloud/Overseer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
index bf1cc51,5946bf4..ff101f3
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
@@@ -21,15 -21,9 +21,13 @@@ import java.io.IOException
  import java.lang.invoke.MethodHandles;
  import java.util.ArrayList;
  import java.util.Collection;
 +import java.util.Collections;
 +import java.util.Date;
  import java.util.HashMap;
- import java.util.HashSet;
  import java.util.List;
- import java.util.Locale;
  import java.util.Map;
 +import java.util.Set;
 +import java.util.concurrent.TimeUnit;
  
  import com.google.common.collect.ImmutableSet;
  import org.apache.solr.api.Api;
@@@ -49,8 -44,6 +48,7 @@@ import org.apache.solr.request.SolrRequ
  import org.apache.solr.response.SolrQueryResponse;
  import org.apache.solr.security.AuthorizationContext;
  import org.apache.solr.security.PermissionNameProvider;
- import org.apache.solr.util.CommandOperation;
 +import org.apache.solr.util.TimeSource;
  import org.apache.zookeeper.KeeperException;
  import org.apache.zookeeper.data.Stat;
  import org.slf4j.Logger;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
index c0ceddb,6d70435..da9f70b
--- a/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
@@@ -68,9 -73,9 +73,10 @@@ import org.apache.solr.schema.FieldType
  import org.apache.solr.schema.IndexSchema;
  import org.apache.solr.schema.SchemaField;
  import org.apache.solr.search.DocList;
 +import org.apache.solr.search.SolrDocumentFetcher;
  import org.apache.solr.search.QParser;
  import org.apache.solr.search.ReturnFields;
+ import org.apache.solr.search.SolrDocumentFetcher;
  import org.apache.solr.search.SolrIndexSearcher;
  import org.apache.solr.search.SolrReturnFields;
  import org.apache.solr.search.SyntaxError;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
index 142ddd8,4dfdbeb..0eec3a0
--- a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java
@@@ -110,11 -110,14 +110,18 @@@ public class SolrGangliaReporter extend
    }
  
    @Override
+   protected void doInit() {
+     if (!testing) {
+       start();
+     }
+   }
+ 
+   @Override
    protected void validate() throws IllegalStateException {
 +    if (!enabled) {
 +      log.info("Reporter disabled for registry " + registryName);
 +      return;
 +    }
      if (host == null) {
        throw new IllegalStateException("Init argument 'host' must be set to a valid Ganglia server name.");
      }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/resources/apispec/autoscaling.Commands.json
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
----------------------------------------------------------------------
diff --cc solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
index 39dea17,7bf4616..2f02df9
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
@@@ -516,8 -198,8 +515,8 @@@ public class AutoScalingHandlerTest ext
          "      {'nodeRole':'overseer', 'replica':0}" +
          "    ]" +
          "}";
-     req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setClusterPolicyCommand);
 -    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
 -    NamedList<Object> response = solrClient.request(req);
++    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setClusterPolicyCommand);
 +    response = solrClient.request(req);
      assertEquals(response.get("result").toString(), "success");
  
      String setPreferencesCommand = "{" +
@@@ -544,20 -226,9 +543,19 @@@
      response = solrClient.request(req);
      assertEquals(response.get("result").toString(), "success");
  
-     SolrQuery query = new SolrQuery().setParam(CommonParams.QT, path);
-     QueryResponse queryResponse = solrClient.query(query);
-     response = queryResponse.getResponse();
+     req = createAutoScalingRequest(SolrRequest.METHOD.GET, null);
+     response = solrClient.request(req);
  
 +    Map triggers = (Map) response.get("triggers");
 +    assertNotNull(triggers);
 +    assertEquals(1, triggers.size());
 +    assertTrue(triggers.containsKey("node_added_trigger1"));
 +    Map node_added_trigger1 = (Map) triggers.get("node_added_trigger1");
 +    assertEquals(4, node_added_trigger1.size());
 +    assertEquals(0L, node_added_trigger1.get("waitFor"));
 +    assertEquals(true, node_added_trigger1.get("enabled"));
 +    assertEquals(3, ((List)node_added_trigger1.get("actions")).size());
 +
      List<Map> clusterPrefs = (List<Map>) response.get("cluster-preferences");
      assertNotNull(clusterPrefs);
      assertEquals(4, clusterPrefs.size());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/solr-ref-guide/src/fonts/Noto_Sans/LICENSE.txt
----------------------------------------------------------------------
diff --cc solr/solr-ref-guide/src/fonts/Noto_Sans/LICENSE.txt
index 0000000,75b5248..d645695
mode 000000,100755..100755
--- a/solr/solr-ref-guide/src/fonts/Noto_Sans/LICENSE.txt
+++ b/solr/solr-ref-guide/src/fonts/Noto_Sans/LICENSE.txt
@@@ -1,0 -1,202 +1,202 @@@
 -
 -                                 Apache License
 -                           Version 2.0, January 2004
 -                        http://www.apache.org/licenses/
 -
 -   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 -
 -   1. Definitions.
 -
 -      "License" shall mean the terms and conditions for use, reproduction,
 -      and distribution as defined by Sections 1 through 9 of this document.
 -
 -      "Licensor" shall mean the copyright owner or entity authorized by
 -      the copyright owner that is granting the License.
 -
 -      "Legal Entity" shall mean the union of the acting entity and all
 -      other entities that control, are controlled by, or are under common
 -      control with that entity. For the purposes of this definition,
 -      "control" means (i) the power, direct or indirect, to cause the
 -      direction or management of such entity, whether by contract or
 -      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 -      outstanding shares, or (iii) beneficial ownership of such entity.
 -
 -      "You" (or "Your") shall mean an individual or Legal Entity
 -      exercising permissions granted by this License.
 -
 -      "Source" form shall mean the preferred form for making modifications,
 -      including but not limited to software source code, documentation
 -      source, and configuration files.
 -
 -      "Object" form shall mean any form resulting from mechanical
 -      transformation or translation of a Source form, including but
 -      not limited to compiled object code, generated documentation,
 -      and conversions to other media types.
 -
 -      "Work" shall mean the work of authorship, whether in Source or
 -      Object form, made available under the License, as indicated by a
 -      copyright notice that is included in or attached to the work
 -      (an example is provided in the Appendix below).
 -
 -      "Derivative Works" shall mean any work, whether in Source or Object
 -      form, that is based on (or derived from) the Work and for which the
 -      editorial revisions, annotations, elaborations, or other modifications
 -      represent, as a whole, an original work of authorship. For the purposes
 -      of this License, Derivative Works shall not include works that remain
 -      separable from, or merely link (or bind by name) to the interfaces of,
 -      the Work and Derivative Works thereof.
 -
 -      "Contribution" shall mean any work of authorship, including
 -      the original version of the Work and any modifications or additions
 -      to that Work or Derivative Works thereof, that is intentionally
 -      submitted to Licensor for inclusion in the Work by the copyright owner
 -      or by an individual or Legal Entity authorized to submit on behalf of
 -      the copyright owner. For the purposes of this definition, "submitted"
 -      means any form of electronic, verbal, or written communication sent
 -      to the Licensor or its representatives, including but not limited to
 -      communication on electronic mailing lists, source code control systems,
 -      and issue tracking systems that are managed by, or on behalf of, the
 -      Licensor for the purpose of discussing and improving the Work, but
 -      excluding communication that is conspicuously marked or otherwise
 -      designated in writing by the copyright owner as "Not a Contribution."
 -
 -      "Contributor" shall mean Licensor and any individual or Legal Entity
 -      on behalf of whom a Contribution has been received by Licensor and
 -      subsequently incorporated within the Work.
 -
 -   2. Grant of Copyright License. Subject to the terms and conditions of
 -      this License, each Contributor hereby grants to You a perpetual,
 -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 -      copyright license to reproduce, prepare Derivative Works of,
 -      publicly display, publicly perform, sublicense, and distribute the
 -      Work and such Derivative Works in Source or Object form.
 -
 -   3. Grant of Patent License. Subject to the terms and conditions of
 -      this License, each Contributor hereby grants to You a perpetual,
 -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 -      (except as stated in this section) patent license to make, have made,
 -      use, offer to sell, sell, import, and otherwise transfer the Work,
 -      where such license applies only to those patent claims licensable
 -      by such Contributor that are necessarily infringed by their
 -      Contribution(s) alone or by combination of their Contribution(s)
 -      with the Work to which such Contribution(s) was submitted. If You
 -      institute patent litigation against any entity (including a
 -      cross-claim or counterclaim in a lawsuit) alleging that the Work
 -      or a Contribution incorporated within the Work constitutes direct
 -      or contributory patent infringement, then any patent licenses
 -      granted to You under this License for that Work shall terminate
 -      as of the date such litigation is filed.
 -
 -   4. Redistribution. You may reproduce and distribute copies of the
 -      Work or Derivative Works thereof in any medium, with or without
 -      modifications, and in Source or Object form, provided that You
 -      meet the following conditions:
 -
 -      (a) You must give any other recipients of the Work or
 -          Derivative Works a copy of this License; and
 -
 -      (b) You must cause any modified files to carry prominent notices
 -          stating that You changed the files; and
 -
 -      (c) You must retain, in the Source form of any Derivative Works
 -          that You distribute, all copyright, patent, trademark, and
 -          attribution notices from the Source form of the Work,
 -          excluding those notices that do not pertain to any part of
 -          the Derivative Works; and
 -
 -      (d) If the Work includes a "NOTICE" text file as part of its
 -          distribution, then any Derivative Works that You distribute must
 -          include a readable copy of the attribution notices contained
 -          within such NOTICE file, excluding those notices that do not
 -          pertain to any part of the Derivative Works, in at least one
 -          of the following places: within a NOTICE text file distributed
 -          as part of the Derivative Works; within the Source form or
 -          documentation, if provided along with the Derivative Works; or,
 -          within a display generated by the Derivative Works, if and
 -          wherever such third-party notices normally appear. The contents
 -          of the NOTICE file are for informational purposes only and
 -          do not modify the License. You may add Your own attribution
 -          notices within Derivative Works that You distribute, alongside
 -          or as an addendum to the NOTICE text from the Work, provided
 -          that such additional attribution notices cannot be construed
 -          as modifying the License.
 -
 -      You may add Your own copyright statement to Your modifications and
 -      may provide additional or different license terms and conditions
 -      for use, reproduction, or distribution of Your modifications, or
 -      for any such Derivative Works as a whole, provided Your use,
 -      reproduction, and distribution of the Work otherwise complies with
 -      the conditions stated in this License.
 -
 -   5. Submission of Contributions. Unless You explicitly state otherwise,
 -      any Contribution intentionally submitted for inclusion in the Work
 -      by You to the Licensor shall be under the terms and conditions of
 -      this License, without any additional terms or conditions.
 -      Notwithstanding the above, nothing herein shall supersede or modify
 -      the terms of any separate license agreement you may have executed
 -      with Licensor regarding such Contributions.
 -
 -   6. Trademarks. This License does not grant permission to use the trade
 -      names, trademarks, service marks, or product names of the Licensor,
 -      except as required for reasonable and customary use in describing the
 -      origin of the Work and reproducing the content of the NOTICE file.
 -
 -   7. Disclaimer of Warranty. Unless required by applicable law or
 -      agreed to in writing, Licensor provides the Work (and each
 -      Contributor provides its Contributions) on an "AS IS" BASIS,
 -      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 -      implied, including, without limitation, any warranties or conditions
 -      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 -      PARTICULAR PURPOSE. You are solely responsible for determining the
 -      appropriateness of using or redistributing the Work and assume any
 -      risks associated with Your exercise of permissions under this License.
 -
 -   8. Limitation of Liability. In no event and under no legal theory,
 -      whether in tort (including negligence), contract, or otherwise,
 -      unless required by applicable law (such as deliberate and grossly
 -      negligent acts) or agreed to in writing, shall any Contributor be
 -      liable to You for damages, including any direct, indirect, special,
 -      incidental, or consequential damages of any character arising as a
 -      result of this License or out of the use or inability to use the
 -      Work (including but not limited to damages for loss of goodwill,
 -      work stoppage, computer failure or malfunction, or any and all
 -      other commercial damages or losses), even if such Contributor
 -      has been advised of the possibility of such damages.
 -
 -   9. Accepting Warranty or Additional Liability. While redistributing
 -      the Work or Derivative Works thereof, You may choose to offer,
 -      and charge a fee for, acceptance of support, warranty, indemnity,
 -      or other liability obligations and/or rights consistent with this
 -      License. However, in accepting such obligations, You may act only
 -      on Your own behalf and on Your sole responsibility, not on behalf
 -      of any other Contributor, and only if You agree to indemnify,
 -      defend, and hold each Contributor harmless for any liability
 -      incurred by, or claims asserted against, such Contributor by reason
 -      of your accepting any such warranty or additional liability.
 -
 -   END OF TERMS AND CONDITIONS
 -
 -   APPENDIX: How to apply the Apache License to your work.
 -
 -      To apply the Apache License to your work, attach the following
 -      boilerplate notice, with the fields enclosed by brackets "[]"
 -      replaced with your own identifying information. (Don't include
 -      the brackets!)  The text should be enclosed in the appropriate
 -      comment syntax for the file format. We also recommend that a
 -      file or class name and description of purpose be included on the
 -      same "printed page" as the copyright notice for easier
 -      identification within third-party archives.
 -
 -   Copyright [yyyy] [name of copyright owner]
 -
 -   Licensed 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.
++
++                                 Apache License
++                           Version 2.0, January 2004
++                        http://www.apache.org/licenses/
++
++   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
++
++   1. Definitions.
++
++      "License" shall mean the terms and conditions for use, reproduction,
++      and distribution as defined by Sections 1 through 9 of this document.
++
++      "Licensor" shall mean the copyright owner or entity authorized by
++      the copyright owner that is granting the License.
++
++      "Legal Entity" shall mean the union of the acting entity and all
++      other entities that control, are controlled by, or are under common
++      control with that entity. For the purposes of this definition,
++      "control" means (i) the power, direct or indirect, to cause the
++      direction or management of such entity, whether by contract or
++      otherwise, or (ii) ownership of fifty percent (50%) or more of the
++      outstanding shares, or (iii) beneficial ownership of such entity.
++
++      "You" (or "Your") shall mean an individual or Legal Entity
++      exercising permissions granted by this License.
++
++      "Source" form shall mean the preferred form for making modifications,
++      including but not limited to software source code, documentation
++      source, and configuration files.
++
++      "Object" form shall mean any form resulting from mechanical
++      transformation or translation of a Source form, including but
++      not limited to compiled object code, generated documentation,
++      and conversions to other media types.
++
++      "Work" shall mean the work of authorship, whether in Source or
++      Object form, made available under the License, as indicated by a
++      copyright notice that is included in or attached to the work
++      (an example is provided in the Appendix below).
++
++      "Derivative Works" shall mean any work, whether in Source or Object
++      form, that is based on (or derived from) the Work and for which the
++      editorial revisions, annotations, elaborations, or other modifications
++      represent, as a whole, an original work of authorship. For the purposes
++      of this License, Derivative Works shall not include works that remain
++      separable from, or merely link (or bind by name) to the interfaces of,
++      the Work and Derivative Works thereof.
++
++      "Contribution" shall mean any work of authorship, including
++      the original version of the Work and any modifications or additions
++      to that Work or Derivative Works thereof, that is intentionally
++      submitted to Licensor for inclusion in the Work by the copyright owner
++      or by an individual or Legal Entity authorized to submit on behalf of
++      the copyright owner. For the purposes of this definition, "submitted"
++      means any form of electronic, verbal, or written communication sent
++      to the Licensor or its representatives, including but not limited to
++      communication on electronic mailing lists, source code control systems,
++      and issue tracking systems that are managed by, or on behalf of, the
++      Licensor for the purpose of discussing and improving the Work, but
++      excluding communication that is conspicuously marked or otherwise
++      designated in writing by the copyright owner as "Not a Contribution."
++
++      "Contributor" shall mean Licensor and any individual or Legal Entity
++      on behalf of whom a Contribution has been received by Licensor and
++      subsequently incorporated within the Work.
++
++   2. Grant of Copyright License. Subject to the terms and conditions of
++      this License, each Contributor hereby grants to You a perpetual,
++      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++      copyright license to reproduce, prepare Derivative Works of,
++      publicly display, publicly perform, sublicense, and distribute the
++      Work and such Derivative Works in Source or Object form.
++
++   3. Grant of Patent License. Subject to the terms and conditions of
++      this License, each Contributor hereby grants to You a perpetual,
++      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
++      (except as stated in this section) patent license to make, have made,
++      use, offer to sell, sell, import, and otherwise transfer the Work,
++      where such license applies only to those patent claims licensable
++      by such Contributor that are necessarily infringed by their
++      Contribution(s) alone or by combination of their Contribution(s)
++      with the Work to which such Contribution(s) was submitted. If You
++      institute patent litigation against any entity (including a
++      cross-claim or counterclaim in a lawsuit) alleging that the Work
++      or a Contribution incorporated within the Work constitutes direct
++      or contributory patent infringement, then any patent licenses
++      granted to You under this License for that Work shall terminate
++      as of the date such litigation is filed.
++
++   4. Redistribution. You may reproduce and distribute copies of the
++      Work or Derivative Works thereof in any medium, with or without
++      modifications, and in Source or Object form, provided that You
++      meet the following conditions:
++
++      (a) You must give any other recipients of the Work or
++          Derivative Works a copy of this License; and
++
++      (b) You must cause any modified files to carry prominent notices
++          stating that You changed the files; and
++
++      (c) You must retain, in the Source form of any Derivative Works
++          that You distribute, all copyright, patent, trademark, and
++          attribution notices from the Source form of the Work,
++          excluding those notices that do not pertain to any part of
++          the Derivative Works; and
++
++      (d) If the Work includes a "NOTICE" text file as part of its
++          distribution, then any Derivative Works that You distribute must
++          include a readable copy of the attribution notices contained
++          within such NOTICE file, excluding those notices that do not
++          pertain to any part of the Derivative Works, in at least one
++          of the following places: within a NOTICE text file distributed
++          as part of the Derivative Works; within the Source form or
++          documentation, if provided along with the Derivative Works; or,
++          within a display generated by the Derivative Works, if and
++          wherever such third-party notices normally appear. The contents
++          of the NOTICE file are for informational purposes only and
++          do not modify the License. You may add Your own attribution
++          notices within Derivative Works that You distribute, alongside
++          or as an addendum to the NOTICE text from the Work, provided
++          that such additional attribution notices cannot be construed
++          as modifying the License.
++
++      You may add Your own copyright statement to Your modifications and
++      may provide additional or different license terms and conditions
++      for use, reproduction, or distribution of Your modifications, or
++      for any such Derivative Works as a whole, provided Your use,
++      reproduction, and distribution of the Work otherwise complies with
++      the conditions stated in this License.
++
++   5. Submission of Contributions. Unless You explicitly state otherwise,
++      any Contribution intentionally submitted for inclusion in the Work
++      by You to the Licensor shall be under the terms and conditions of
++      this License, without any additional terms or conditions.
++      Notwithstanding the above, nothing herein shall supersede or modify
++      the terms of any separate license agreement you may have executed
++      with Licensor regarding such Contributions.
++
++   6. Trademarks. This License does not grant permission to use the trade
++      names, trademarks, service marks, or product names of the Licensor,
++      except as required for reasonable and customary use in describing the
++      origin of the Work and reproducing the content of the NOTICE file.
++
++   7. Disclaimer of Warranty. Unless required by applicable law or
++      agreed to in writing, Licensor provides the Work (and each
++      Contributor provides its Contributions) on an "AS IS" BASIS,
++      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
++      implied, including, without limitation, any warranties or conditions
++      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
++      PARTICULAR PURPOSE. You are solely responsible for determining the
++      appropriateness of using or redistributing the Work and assume any
++      risks associated with Your exercise of permissions under this License.
++
++   8. Limitation of Liability. In no event and under no legal theory,
++      whether in tort (including negligence), contract, or otherwise,
++      unless required by applicable law (such as deliberate and grossly
++      negligent acts) or agreed to in writing, shall any Contributor be
++      liable to You for damages, including any direct, indirect, special,
++      incidental, or consequential damages of any character arising as a
++      result of this License or out of the use or inability to use the
++      Work (including but not limited to damages for loss of goodwill,
++      work stoppage, computer failure or malfunction, or any and all
++      other commercial damages or losses), even if such Contributor
++      has been advised of the possibility of such damages.
++
++   9. Accepting Warranty or Additional Liability. While redistributing
++      the Work or Derivative Works thereof, You may choose to offer,
++      and charge a fee for, acceptance of support, warranty, indemnity,
++      or other liability obligations and/or rights consistent with this
++      License. However, in accepting such obligations, You may act only
++      on Your own behalf and on Your sole responsibility, not on behalf
++      of any other Contributor, and only if You agree to indemnify,
++      defend, and hold each Contributor harmless for any liability
++      incurred by, or claims asserted against, such Contributor by reason
++      of your accepting any such warranty or additional liability.
++
++   END OF TERMS AND CONDITIONS
++
++   APPENDIX: How to apply the Apache License to your work.
++
++      To apply the Apache License to your work, attach the following
++      boilerplate notice, with the fields enclosed by brackets "[]"
++      replaced with your own identifying information. (Don't include
++      the brackets!)  The text should be enclosed in the appropriate
++      comment syntax for the file format. We also recommend that a
++      file or class name and description of purpose be included on the
++      same "printed page" as the copyright notice for easier
++      identification within third-party archives.
++
++   Copyright [yyyy] [name of copyright owner]
++
++   Licensed 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.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
index 0f2b24b,0f2b24b..d1a3626
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
@@@ -1,57 -1,57 +1,7 @@@
--/*
-- * 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.
-- */
--
  package org.apache.solr.cloud.autoscaling;
  
--import java.io.IOException;
--import java.util.HashMap;
--
--import org.apache.solr.common.MapWriter;
--import org.apache.solr.common.util.Utils;
--
--class Cell implements MapWriter {
--  final int index;
--  final String name;
--  Object val, approxVal;
--
--  Cell(int index, String name, Object val) {
--    this.index = index;
--    this.name = name;
--    this.val = val;
--  }
--
--  Cell(int index, String name, Object val, Object approxVal) {
--    this.index = index;
--    this.name = name;
--    this.val = val;
--    this.approxVal = approxVal;
--  }
--
--  @Override
--  public void writeMap(EntryWriter ew) throws IOException {
--    ew.put(name, val);
--  }
--
--  @Override
--  public String toString() {
--    return Utils.toJSONString(this.toMap(new HashMap<>()));
--  }
--
--  public Cell copy() {
--    return new Cell(index, name, val, approxVal);
--  }
++/**
++ * Created by shalin on 6/6/17.
++ */
++public class Cell {
  }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZkClient.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6a8768e3/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
----------------------------------------------------------------------


[25/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-8437: Improve RAMDirectory details in sample solrconfig files

Posted by sh...@apache.org.
SOLR-8437: Improve RAMDirectory details in sample solrconfig files


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2c9f8604
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2c9f8604
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2c9f8604

Branch: refs/heads/feature/autoscaling
Commit: 2c9f8604c2a8a82d53c125a5af4ad6326df311ac
Parents: 2eacf13
Author: Varun Thacker <va...@apache.org>
Authored: Fri Jun 2 21:56:49 2017 -0700
Committer: Varun Thacker <va...@apache.org>
Committed: Fri Jun 2 21:56:49 2017 -0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                                  | 2 ++
 solr/example/example-DIH/solr/db/conf/solrconfig.xml              | 3 +--
 solr/example/example-DIH/solr/mail/conf/solrconfig.xml            | 3 +--
 solr/example/example-DIH/solr/solr/conf/solrconfig.xml            | 3 +--
 solr/example/files/conf/solrconfig.xml                            | 3 +--
 solr/server/solr/configsets/basic_configs/conf/solrconfig.xml     | 3 +--
 .../configsets/data_driven_schema_configs/conf/solrconfig.xml     | 3 +--
 .../configsets/sample_techproducts_configs/conf/solrconfig.xml    | 3 +--
 8 files changed, 9 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b7e0b61..3c887be 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -313,6 +313,8 @@ Other Changes
 * SOLR-10790: Fix warnings in Assign.java and ReplicaAssigner.java classes.
   (Christine Poerschke)
 
+* SOLR-8437: Improve RAMDirectory details in sample solrconfig files (Mark Miller, Varun Thacker)
+
 ==================  6.6.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/example/example-DIH/solr/db/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/example/example-DIH/solr/db/conf/solrconfig.xml b/solr/example/example-DIH/solr/db/conf/solrconfig.xml
index 71d8f5a..8513aa0 100644
--- a/solr/example/example-DIH/solr/db/conf/solrconfig.xml
+++ b/solr/example/example-DIH/solr/db/conf/solrconfig.xml
@@ -112,8 +112,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory" 
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/example/example-DIH/solr/mail/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/example/example-DIH/solr/mail/conf/solrconfig.xml b/solr/example/example-DIH/solr/mail/conf/solrconfig.xml
index 8bc24f5..7120e43 100644
--- a/solr/example/example-DIH/solr/mail/conf/solrconfig.xml
+++ b/solr/example/example-DIH/solr/mail/conf/solrconfig.xml
@@ -115,8 +115,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory" 
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/example/example-DIH/solr/solr/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/example/example-DIH/solr/solr/conf/solrconfig.xml b/solr/example/example-DIH/solr/solr/conf/solrconfig.xml
index 873391b..5fc9711 100644
--- a/solr/example/example-DIH/solr/solr/conf/solrconfig.xml
+++ b/solr/example/example-DIH/solr/solr/conf/solrconfig.xml
@@ -112,8 +112,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory" 
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/example/files/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/example/files/conf/solrconfig.xml b/solr/example/files/conf/solrconfig.xml
index f83c235..71da510 100644
--- a/solr/example/files/conf/solrconfig.xml
+++ b/solr/example/files/conf/solrconfig.xml
@@ -114,8 +114,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory"
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/server/solr/configsets/basic_configs/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/server/solr/configsets/basic_configs/conf/solrconfig.xml b/solr/server/solr/configsets/basic_configs/conf/solrconfig.xml
index e009aab..53f74c3 100644
--- a/solr/server/solr/configsets/basic_configs/conf/solrconfig.xml
+++ b/solr/server/solr/configsets/basic_configs/conf/solrconfig.xml
@@ -112,8 +112,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory"
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml b/solr/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml
index 2ca1b7f..48d47e3 100644
--- a/solr/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml
+++ b/solr/server/solr/configsets/data_driven_schema_configs/conf/solrconfig.xml
@@ -112,8 +112,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory"
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2c9f8604/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
index 23c2acd..698213d 100644
--- a/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
+++ b/solr/server/solr/configsets/sample_techproducts_configs/conf/solrconfig.xml
@@ -116,8 +116,7 @@
        One can force a particular implementation via solr.MMapDirectoryFactory,
        solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
 
-       solr.RAMDirectoryFactory is memory based, not
-       persistent, and doesn't work with replication.
+       solr.RAMDirectoryFactory is memory based and not persistent.
     -->
   <directoryFactory name="DirectoryFactory" 
                     class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>


[16/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10799: Refator HttpShardHandler.prepDistributed collection of shard replicas

Posted by sh...@apache.org.
SOLR-10799: Refator HttpShardHandler.prepDistributed collection of shard replicas


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/3618fc52
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/3618fc52
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/3618fc52

Branch: refs/heads/feature/autoscaling
Commit: 3618fc529dff85ee604614b3c545fa0b5fbf3b06
Parents: 393a2ed
Author: Tomas Fernandez Lobbe <tf...@apache.org>
Authored: Fri Jun 2 10:34:30 2017 -0700
Committer: Tomas Fernandez Lobbe <tf...@apache.org>
Committed: Fri Jun 2 10:34:30 2017 -0700

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  3 ++
 .../handler/component/HttpShardHandler.java     | 47 +++++++++++++-------
 2 files changed, 33 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3618fc52/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 195443d..6b664e4 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -225,6 +225,9 @@ Other Changes
   support in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
   (Christine Poerschke, hossman)
 
+* SOLR-10799: Extracted functionality to collect eligible replicas from HttpShardHandler.prepDistributed()
+  to a new method (Domenico Fabio Marino via Tomás Fernández Löbbe)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3618fc52/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
index bc620b6..2954cff 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/HttpShardHandler.java
@@ -30,6 +30,7 @@ import java.util.concurrent.CompletionService;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
 
 import org.apache.http.client.HttpClient;
 import org.apache.solr.client.solrj.SolrClient;
@@ -398,18 +399,11 @@ public class HttpShardHandler extends ShardHandler {
             continue;
             // throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "no such shard: " + sliceName);
           }
-          Replica shardLeader = null;
-
-          final Collection<Replica> allSliceReplicas = slice.getReplicasMap().values();
-          final List<Replica> eligibleSliceReplicas = new ArrayList<>(allSliceReplicas.size());
-          for (Replica replica : allSliceReplicas) {
-            if (!clusterState.liveNodesContain(replica.getNodeName())
-                || replica.getState() != Replica.State.ACTIVE
-                || (onlyNrtReplicas && replica.getType() == Replica.Type.PULL)) {
-              continue;
-            }
-            
-            if (onlyNrtReplicas && replica.getType() == Replica.Type.TLOG) {
+          final Predicate<Replica> isShardLeader = new Predicate<Replica>() {
+            private Replica shardLeader = null;
+
+            @Override
+            public boolean test(Replica replica) {
               if (shardLeader == null) {
                 try {
                   shardLeader = zkController.getZkStateReader().getLeaderRetry(cloudDescriptor.getCollectionName(), slice.getName());
@@ -424,12 +418,11 @@ public class HttpShardHandler extends ShardHandler {
                   throw e;
                 }
               }
-              if (!replica.getName().equals(shardLeader.getName())) {
-                continue;
-              }
+              return replica.getName().equals(shardLeader.getName());
             }
-            eligibleSliceReplicas.add(replica);
-          }
+          };
+
+          final List<Replica> eligibleSliceReplicas = collectEligibleReplicas(slice, clusterState, onlyNrtReplicas, isShardLeader);
 
           replicaListTransformer.transform(eligibleSliceReplicas);
 
@@ -462,6 +455,26 @@ public class HttpShardHandler extends ShardHandler {
     }
   }
 
+  private static List<Replica> collectEligibleReplicas(Slice slice, ClusterState clusterState, boolean onlyNrtReplicas, Predicate<Replica> isShardLeader) {
+    final Collection<Replica> allSliceReplicas = slice.getReplicasMap().values();
+    final List<Replica> eligibleSliceReplicas = new ArrayList<>(allSliceReplicas.size());
+    for (Replica replica : allSliceReplicas) {
+      if (!clusterState.liveNodesContain(replica.getNodeName())
+          || replica.getState() != Replica.State.ACTIVE
+          || (onlyNrtReplicas && replica.getType() == Replica.Type.PULL)) {
+        continue;
+      }
+
+      if (onlyNrtReplicas && replica.getType() == Replica.Type.TLOG) {
+        if (!isShardLeader.test(replica)) {
+          continue;
+        }
+      }
+      eligibleSliceReplicas.add(replica);
+    }
+    return eligibleSliceReplicas;
+  }
+
   private static String createSliceShardsStr(final List<String> shardUrls) {
     final StringBuilder sliceShardsStr = new StringBuilder();
     boolean first = true;


[47/50] [abbrv] lucene-solr:feature/autoscaling: Merge branch 'master' into feature/autoscaling

Posted by sh...@apache.org.
Merge branch 'master' into feature/autoscaling


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/6a8768e3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/6a8768e3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/6a8768e3

Branch: refs/heads/feature/autoscaling
Commit: 6a8768e3959e6bb1beb8082ed9f4cc6807f94aff
Parents: ee2be20 ea79c66
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue Jun 6 19:30:00 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Tue Jun 6 19:30:00 2017 +0530

----------------------------------------------------------------------
 .gitignore                                      |    41 +-
 dev-tools/doap/lucene.rdf                       |     7 +
 dev-tools/doap/solr.rdf                         |     7 +
 dev-tools/idea/.idea/libraries/HSQLDB.xml       |     2 +-
 .../lucene/classification/classification.iml    |     3 +-
 dev-tools/idea/solr/core/src/java/solr-core.iml |     1 +
 dev-tools/scripts/buildAndPushRelease.py        |     4 +-
 dev-tools/scripts/checkJavaDocs.py              |     2 +-
 dev-tools/scripts/checkJavadocLinks.py          |     5 +-
 dev-tools/scripts/smokeTestRelease.py           |     6 +-
 lucene/CHANGES.txt                              |    97 +
 lucene/MIGRATE.txt                              |     6 +
 lucene/NOTICE.txt                               |    12 +-
 .../lucene/analysis/core/KeywordTokenizer.java  |    10 +-
 .../analysis/core/KeywordTokenizerFactory.java  |    19 +-
 .../lucene/analysis/core/LetterTokenizer.java   |    14 +
 .../analysis/core/LetterTokenizerFactory.java   |    19 +-
 .../analysis/core/LowerCaseTokenizer.java       |    13 +
 .../core/LowerCaseTokenizerFactory.java         |    37 +-
 .../lucene/analysis/core/StopFilterFactory.java |     2 +-
 .../core/UnicodeWhitespaceTokenizer.java        |    13 +
 .../analysis/core/WhitespaceTokenizer.java      |    13 +
 .../core/WhitespaceTokenizerFactory.java        |    18 +-
 .../lucene/analysis/util/CharTokenizer.java     |    27 +-
 .../lucene/analysis/util/UnicodeProps.java      |     6 +-
 .../org/tartarus/snowball/SnowballProgram.java  |    20 +-
 .../compound/hyphenation/hyphenation.dtd        |     2 +-
 .../lucene/analysis/compound/hyphenation.dtd    |     2 +-
 .../analysis/core/TestKeywordTokenizer.java     |    88 +
 .../core/TestUnicodeWhitespaceTokenizer.java    |    51 +
 .../analysis/util/TestCharTokenizers.java       |    95 +
 .../icu/src/data/utr30/DiacriticFolding.txt     |     5 +
 .../icu/src/data/utr30/NativeDigitFolding.txt   |    30 +
 lucene/analysis/icu/src/data/utr30/nfc.txt      |    22 +-
 lucene/analysis/icu/src/data/utr30/nfkc.txt     |     5 +-
 lucene/analysis/icu/src/data/utr30/nfkc_cf.txt  |   225 +-
 .../analysis/icu/segmentation/Default.brk       |   Bin 35264 -> 36768 bytes
 .../icu/segmentation/MyanmarSyllable.brk        |   Bin 19776 -> 20744 bytes
 .../org/apache/lucene/analysis/icu/utr30.nrm    |   Bin 53840 -> 55184 bytes
 .../icu/segmentation/TestICUTokenizerCJK.java   |     9 +-
 .../analysis/icu/GenerateUTR30DataFiles.java    |     2 +-
 .../uk/UkrainianMorfologikAnalyzer.java         |     2 +
 .../analysis/uk/TestUkrainianAnalyzer.java      |     9 +-
 .../apache/lucene/legacy/LegacyDoubleField.java |   174 -
 .../org/apache/lucene/legacy/LegacyField.java   |    90 -
 .../apache/lucene/legacy/LegacyFieldType.java   |   149 -
 .../apache/lucene/legacy/LegacyFloatField.java  |   174 -
 .../apache/lucene/legacy/LegacyIntField.java    |   175 -
 .../apache/lucene/legacy/LegacyLongField.java   |   184 -
 .../lucene/legacy/LegacyNumericRangeQuery.java  |   537 -
 .../lucene/legacy/LegacyNumericTokenStream.java |   357 -
 .../apache/lucene/legacy/LegacyNumericType.java |    34 -
 .../lucene/legacy/LegacyNumericUtils.java       |   510 -
 .../lucene/legacy/doc-files/nrq-formula-1.png   |   Bin 3171 -> 0 bytes
 .../lucene/legacy/doc-files/nrq-formula-2.png   |   Bin 3694 -> 0 bytes
 .../org/apache/lucene/legacy/package-info.java  |    21 -
 .../index/TestBackwardsCompatibility.java       |    56 +-
 .../org/apache/lucene/index/index.6.5.1-cfs.zip |   Bin 0 -> 15842 bytes
 .../apache/lucene/index/index.6.5.1-nocfs.zip   |   Bin 0 -> 15827 bytes
 .../apache/lucene/legacy/TestLegacyField.java   |   186 -
 .../lucene/legacy/TestLegacyFieldReuse.java     |    81 -
 .../lucene/legacy/TestLegacyNumericUtils.java   |   571 -
 .../apache/lucene/legacy/TestLegacyTerms.java   |   164 -
 .../TestMultiValuedNumericRangeQuery.java       |    84 -
 .../lucene/legacy/TestNumericRangeQuery32.java  |   461 -
 .../lucene/legacy/TestNumericRangeQuery64.java  |   490 -
 .../lucene/legacy/TestNumericTokenStream.java   |   188 -
 lucene/benchmark/conf/highlighters-postings.alg |     4 +-
 .../tasks/SearchTravRetHighlightTask.java       |    30 -
 .../lucene/benchmark/quality/trecQRels.txt      |  1090 +-
 lucene/classification/build.xml                 |     8 +-
 .../lucene/classification/BM25NBClassifier.java |   243 +
 .../classification/KNearestFuzzyClassifier.java |   224 +
 .../classification/utils/DatasetSplitter.java   |     2 +-
 .../classification/BM25NBClassifierTest.java    |   154 +
 .../KNearestFuzzyClassifierTest.java            |   119 +
 .../utils/ConfusionMatrixGeneratorTest.java     |   123 +-
 .../codecs/simpletext/SimpleTextBKDWriter.java  |    20 +-
 .../org/apache/lucene/codecs/CodecUtil.java     |     8 +-
 .../apache/lucene/document/RangeFieldQuery.java |    48 +-
 .../lucene/index/BufferedUpdatesStream.java     |     5 +-
 .../org/apache/lucene/index/CheckIndex.java     |    32 +-
 .../lucene/index/DefaultIndexingChain.java      |     8 +-
 .../lucene/index/DocumentsWriterPerThread.java  |     4 +
 .../apache/lucene/index/FieldInvertState.java   |    17 +-
 .../apache/lucene/index/IndexFileDeleter.java   |    12 +-
 .../org/apache/lucene/index/IndexReader.java    |     4 +-
 .../org/apache/lucene/index/IndexWriter.java    |    21 +-
 .../apache/lucene/index/SegmentCoreReaders.java |     5 +-
 .../apache/lucene/index/SegmentDocValues.java   |     3 +-
 .../org/apache/lucene/index/SegmentReader.java  |     5 +-
 .../lucene/index/StandardDirectoryReader.java   |     9 +-
 .../lucene/search/DoubleValuesSource.java       |    47 +-
 .../org/apache/lucene/search/LRUQueryCache.java |     2 +-
 .../search/similarities/BM25Similarity.java     |    79 +-
 .../search/similarities/ClassicSimilarity.java  |   101 +-
 .../search/similarities/SimilarityBase.java     |    65 +-
 .../search/similarities/TFIDFSimilarity.java    |   128 +-
 .../org/apache/lucene/store/FSDirectory.java    |     2 +-
 .../apache/lucene/util/AttributeFactory.java    |    39 +-
 .../java/org/apache/lucene/util/IOUtils.java    |    92 +-
 .../org/apache/lucene/util/OfflineSorter.java   |   453 +-
 .../lucene/util/SameThreadExecutorService.java  |    71 +
 .../java/org/apache/lucene/util/SmallFloat.java |    83 +-
 .../java/org/apache/lucene/util/Version.java    |     7 +
 .../org/apache/lucene/util/bkd/BKDWriter.java   |    21 +-
 .../graph/GraphTokenStreamFiniteStrings.java    |    34 +-
 .../org/apache/lucene/codecs/TestCodecUtil.java |    13 +
 .../index/TestDemoParallelLeafReader.java       |    12 +-
 .../apache/lucene/index/TestIndexSorting.java   |    82 +
 .../lucene/index/TestMaxTermFrequency.java      |    47 +-
 .../test/org/apache/lucene/index/TestNorms.java |    65 +-
 .../org/apache/lucene/index/TestOmitTf.java     |     4 +-
 .../lucene/search/TestDisjunctionMaxQuery.java  |     3 +-
 .../search/TestDoubleRangeFieldQueries.java     |    15 +-
 .../lucene/search/TestDoubleValuesSource.java   |    63 +
 .../lucene/search/TestElevationComparator.java  |     9 +-
 .../search/TestFloatRangeFieldQueries.java      |    15 +-
 .../lucene/search/TestIntRangeFieldQueries.java |    23 +-
 .../apache/lucene/search/TestLRUQueryCache.java |     2 +
 .../search/TestLongRangeFieldQueries.java       |    23 +-
 .../apache/lucene/search/TestPhraseQuery.java   |     7 +-
 .../apache/lucene/search/TestQueryRescorer.java |    18 +-
 .../apache/lucene/search/TestSimilarity.java    |    14 +-
 .../lucene/search/TestSimilarityProvider.java   |   117 +-
 .../apache/lucene/search/TestSortRescorer.java  |     2 +-
 .../similarities/TestAxiomaticSimilarity.java   |    13 -
 .../search/similarities/TestBM25Similarity.java |    70 +-
 .../similarities/TestBooleanSimilarity.java     |     5 +-
 .../similarities/TestClassicSimilarity.java     |    91 +-
 .../search/similarities/TestSimilarityBase.java |    99 +-
 .../org/apache/lucene/store/TestDirectory.java  |    17 +-
 .../apache/lucene/util/TestOfflineSorter.java   |    50 +-
 .../org/apache/lucene/util/TestSmallFloat.java  |    54 +-
 .../TestGraphTokenStreamFiniteStrings.java      |    53 +
 .../lucene/expressions/ExpressionRescorer.java  |    13 +-
 .../expressions/ExpressionValueSource.java      |    15 +
 .../expressions/js/JavascriptCompiler.java      |   131 +-
 .../lucene/expressions/TestDemoExpressions.java |    32 +-
 .../expressions/TestExpressionRescorer.java     |     4 +-
 .../apache/lucene/facet/FacetsCollector.java    |    56 +-
 .../lucene/facet/FacetsCollectorManager.java    |    16 +-
 .../org/apache/lucene/facet/FacetsConfig.java   |     2 +-
 ...ConcurrentSortedSetDocValuesFacetCounts.java |   353 +
 .../DefaultSortedSetDocValuesReaderState.java   |    56 +-
 .../SortedSetDocValuesFacetCounts.java          |   231 +-
 .../sortedset/SortedSetDocValuesFacetField.java |     1 +
 .../SortedSetDocValuesReaderState.java          |     7 +-
 .../facet/range/TestRangeFacetCounts.java       |     5 +
 .../sortedset/TestSortedSetDocValuesFacets.java |    70 +-
 .../CustomSeparatorBreakIterator.java           |   150 -
 .../DefaultPassageFormatter.java                |   137 -
 .../MultiTermHighlighting.java                  |   282 -
 .../search/postingshighlight/Passage.java       |   159 -
 .../postingshighlight/PassageFormatter.java     |    40 -
 .../search/postingshighlight/PassageScorer.java |   104 -
 .../postingshighlight/PostingsHighlighter.java  |   820 --
 .../postingshighlight/WholeBreakIterator.java   |   116 -
 .../search/postingshighlight/package-info.java  |    21 -
 .../CustomSeparatorBreakIterator.java           |   150 +
 .../search/uhighlight/WholeBreakIterator.java   |   116 +
 .../search/highlight/HighlighterTest.java       |     8 +-
 .../search/postingshighlight/CambridgeMA.utf8   |     1 -
 .../TestCustomSeparatorBreakIterator.java       |   114 -
 .../TestMultiTermHighlighting.java              |   884 --
 .../TestPostingsHighlighter.java                |  1185 --
 .../TestPostingsHighlighterRanking.java         |   324 -
 .../TestWholeBreakIterator.java                 |   134 -
 .../uhighlight/LengthGoalBreakIteratorTest.java |     1 -
 .../TestCustomSeparatorBreakIterator.java       |   114 +
 .../uhighlight/TestUnifiedHighlighter.java      |     1 -
 .../uhighlight/TestWholeBreakIterator.java      |   134 +
 lucene/ivy-versions.properties                  |    25 +-
 .../lucene/search/join/GlobalOrdinalsQuery.java |     6 +-
 .../join/GlobalOrdinalsWithScoreQuery.java      |    18 +-
 .../org/apache/lucene/search/join/JoinUtil.java |    23 +-
 .../join/PointInSetIncludingScoreQuery.java     |    10 +-
 .../search/join/TermsIncludingScoreQuery.java   |    91 +-
 .../apache/lucene/search/join/TermsQuery.java   |    39 +-
 .../search/join/ToParentBlockJoinQuery.java     |     2 +-
 .../search/join/ToParentBlockJoinSortField.java |    26 +
 .../lucene/search/join/TestBlockJoin.java       |    62 +-
 .../search/join/TestBlockJoinSorting.java       |    41 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   246 +
 lucene/licenses/icu4j-56.1.jar.sha1             |     1 -
 lucene/licenses/icu4j-59.1.jar.sha1             |     1 +
 .../morfologik-ukrainian-search-3.7.6.jar.sha1  |     1 +
 .../apache/lucene/index/memory/MemoryIndex.java |     2 +-
 .../lucene/index/memory/TestMemoryIndex.java    |    34 +-
 .../apache/lucene/misc/SweetSpotSimilarity.java |    25 +-
 .../lucene/misc/SweetSpotSimilarityTest.java    |   117 +-
 .../search/TestInetAddressRangeQueries.java     |    18 +-
 .../queries/function/FunctionScoreQuery.java    |    11 +-
 .../lucene/queries/function/ValueSource.java    |    11 +
 .../function/valuesource/NormValueSource.java   |    36 +-
 .../queries/payloads/PayloadScoreQuery.java     |    32 +-
 .../queries/payloads/SpanPayloadCheckQuery.java |    22 +-
 .../function/TestFunctionScoreExplanations.java |     2 +-
 .../function/TestFunctionScoreQuery.java        |     4 +-
 .../function/TestLongNormValueSource.java       |   117 +-
 .../queries/function/TestValueSources.java      |     2 +-
 .../queries/payloads/TestPayloadCheckQuery.java |    43 +-
 .../queries/payloads/TestPayloadScoreQuery.java |    45 +-
 .../queries/payloads/TestPayloadTermQuery.java  |     3 +-
 .../lucene/queryparser/classic/QueryParser.java |    47 +-
 .../lucene/queryparser/classic/QueryParser.jj   |     6 +-
 .../flexible/core/util/QueryNodeOperation.java  |     2 +-
 .../standard/parser/StandardSyntaxParser.java   |    43 +-
 .../standard/parser/StandardSyntaxParser.jj     |     6 +-
 .../queryparser/util/QueryParserTestBase.java   |    51 +
 .../lucene/replicator/http/HttpClientBase.java  |     7 +-
 .../apache/lucene/replicator/nrt/CopyJob.java   |     2 +-
 .../lucene/replicator/nrt/CopyOneFile.java      |     5 +-
 .../lucene/replicator/nrt/ReplicaNode.java      |     4 +-
 lucene/spatial-extras/build.xml                 |     2 -
 .../lucene/spatial/bbox/BBoxStrategy.java       |    59 +-
 .../prefix/BytesRefIteratorTokenStream.java     |     2 -
 .../prefix/NumberRangePrefixTreeStrategy.java   |    24 +-
 .../spatial/prefix/PrefixTreeStrategy.java      |    15 +-
 .../prefix/RecursivePrefixTreeStrategy.java     |    42 +-
 .../prefix/tree/DateRangePrefixTree.java        |     8 +-
 .../prefix/tree/PackedQuadPrefixTree.java       |    30 +-
 .../spatial/vector/PointVectorStrategy.java     |    52 -
 .../lucene/spatial/DistanceStrategyTest.java    |     3 -
 .../lucene/spatial/QueryEqualsHashCodeTest.java |     2 -
 .../lucene/spatial/bbox/TestBBoxStrategy.java   |    33 +-
 .../spatial/prefix/DateNRStrategyTest.java      |    52 +-
 .../RandomSpatialOpFuzzyPrefixTreeTest.java     |    41 +-
 .../spatial/vector/TestPointVectorStrategy.java |     7 +-
 .../spatial3d/geom/GeoPolygonFactory.java       |    63 +
 .../spatial3d/geom/GeoWideLongitudeSlice.java   |     8 +-
 .../lucene/spatial3d/geom/GeoPolygonTest.java   |    63 +
 .../analyzing/SuggestStopFilterFactory.java     |     2 +-
 .../lucene/index/OwnCacheKeyMultiReader.java    |     5 +-
 .../org/apache/lucene/mockfile/VerboseFS.java   |    14 +-
 .../search/BaseRangeFieldQueryTestCase.java     |     4 +-
 .../search/similarities/RandomSimilarity.java   |     2 +-
 .../lucene/store/MockDirectoryWrapper.java      |     2 +-
 solr/.gitignore                                 |    30 +
 solr/CHANGES.txt                                |   431 +-
 solr/NOTICE.txt                                 |    36 +-
 solr/bin/install_solr_service.sh                |     8 +-
 solr/bin/solr                                   |   195 +-
 solr/bin/solr.cmd                               |   130 +-
 solr/bin/solr.in.cmd                            |     3 +
 solr/bin/solr.in.sh                             |     3 +
 solr/build.xml                                  |     3 +
 .../collection1/conf/schema-folding-extra.xml   |     1 -
 .../collection1/conf/schema-icucollate-dv.xml   |     1 -
 .../solr/collection1/conf/schema-icucollate.xml |     1 -
 .../conf/schema-icucollateoptions.xml           |     1 -
 .../StatsCollectorSupplierFactory.java          |     2 +-
 .../solr/analytics/util/AnalyticsParams.java    |     3 +-
 .../solr/analytics/util/AnalyticsParsers.java   |     2 +-
 .../util/valuesource/ConcatStringFunction.java  |    54 -
 .../util/valuesource/DateFieldSource.java       |     2 +-
 .../util/valuesource/MultiStringFunction.java   |   146 -
 .../clustering/solr/collection1/conf/schema.xml |     6 -
 .../conf/dataimport-schema-no-unique-key.xml    |     7 -
 solr/contrib/dataimporthandler/ivy.xml          |     2 +-
 .../solr/handler/dataimport/DebugInfo.java      |    32 +-
 .../solr/collection1/conf/dataimport-schema.xml |     2 -
 .../conf/dataimport-solr_id-schema.xml          |     7 -
 .../collection1/conf/dataimport-solrconfig.xml  |     1 +
 .../AbstractDataImportHandlerTestCase.java      |     4 +-
 .../dataimport/TestContentStreamDataSource.java |     2 +-
 .../dataimport/TestHierarchicalDocBuilder.java  |    31 +-
 .../TestVariableResolverEndToEnd.java           |     8 +-
 .../extraction/solr/collection1/conf/schema.xml |     1 -
 .../extraction/TestXLSXResponseWriter.java      |     2 +-
 .../langid/solr/collection1/conf/schema.xml     |     1 -
 .../solr/ltr/feature/FieldLengthFeature.java    |     3 +-
 .../apache/solr/ltr/TestLTRQParserPlugin.java   |    11 +-
 .../solr/ltr/TestParallelWeightCreation.java    |     5 +-
 .../solr/ltr/TestSelectiveWeightCreation.java   |    44 +-
 .../uima/solr/collection1/conf/schema.xml       |     9 -
 .../test-files/uima/uima-tokenizers-schema.xml  |     9 -
 .../velocity/src/resources/velocity/head.vm     |     2 +-
 .../velocity/solr/collection1/conf/schema.xml   |     5 -
 .../src/java/org/apache/solr/api/ApiBag.java    |    11 +-
 .../java/org/apache/solr/api/V2HttpCall.java    |     2 +
 .../org/apache/solr/cloud/AddReplicaCmd.java    |    10 +-
 .../src/java/org/apache/solr/cloud/Assign.java  |    78 +-
 .../org/apache/solr/cloud/CloudDescriptor.java  |    45 +-
 .../apache/solr/cloud/CreateCollectionCmd.java  |    40 +-
 .../org/apache/solr/cloud/CreateShardCmd.java   |    48 +-
 .../org/apache/solr/cloud/DistributedQueue.java |    47 +-
 .../org/apache/solr/cloud/ElectionContext.java  |    13 +-
 .../java/org/apache/solr/cloud/MigrateCmd.java  |     8 +-
 .../org/apache/solr/cloud/MoveReplicaCmd.java   |     4 +-
 .../java/org/apache/solr/cloud/Overseer.java    |     3 +-
 .../cloud/OverseerCollectionMessageHandler.java |   123 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java |   171 +-
 .../org/apache/solr/cloud/ReplaceNodeCmd.java   |     4 +-
 .../apache/solr/cloud/ReplicateFromLeader.java  |    42 +-
 .../java/org/apache/solr/cloud/RestoreCmd.java  |   123 +-
 .../org/apache/solr/cloud/SolrZkServer.java     |   163 +-
 .../org/apache/solr/cloud/SplitShardCmd.java    |     6 +-
 .../src/java/org/apache/solr/cloud/ZkCLI.java   |    96 +-
 .../org/apache/solr/cloud/ZkController.java     |    72 +-
 .../cloud/autoscaling/AutoScalingHandler.java   |    13 +-
 .../solr/cloud/overseer/ReplicaMutator.java     |     7 +-
 .../solr/cloud/overseer/SliceMutator.java       |    27 +-
 .../solr/cloud/overseer/ZkStateWriter.java      |    14 +-
 .../apache/solr/cloud/rule/ReplicaAssigner.java |     8 +-
 .../solr/cloud/rule/ServerSnitchContext.java    |    18 +-
 .../org/apache/solr/core/CoreContainer.java     |   116 +-
 .../apache/solr/core/CorePropertiesLocator.java |    23 +-
 .../java/org/apache/solr/core/CoresLocator.java |    10 -
 .../org/apache/solr/core/MetricsConfig.java     |   121 +
 .../java/org/apache/solr/core/NodeConfig.java   |    32 +-
 .../java/org/apache/solr/core/PluginBag.java    |     2 +-
 .../solr/core/SimpleTextCodecFactory.java       |    38 +
 .../src/java/org/apache/solr/core/SolrCore.java |    19 +-
 .../java/org/apache/solr/core/SolrCores.java    |     1 +
 .../org/apache/solr/core/SolrXmlConfig.java     |    29 +-
 .../solr/core/snapshots/SolrSnapshotsTool.java  |     7 +-
 .../apache/solr/handler/AnalyzeEvaluator.java   |     1 +
 .../org/apache/solr/handler/BlobHandler.java    |    17 +-
 .../apache/solr/handler/CalciteJDBCStream.java  |    75 +
 .../org/apache/solr/handler/ExportWriter.java   |     1 -
 .../handler/FieldAnalysisRequestHandler.java    |    11 +-
 .../org/apache/solr/handler/IndexFetcher.java   |    23 +-
 .../apache/solr/handler/RealTimeGetHandler.java |    20 +-
 .../apache/solr/handler/ReplicationHandler.java |     4 +
 .../org/apache/solr/handler/SQLHandler.java     |     3 +-
 .../org/apache/solr/handler/SchemaHandler.java  |    19 -
 .../apache/solr/handler/SolrConfigHandler.java  |     9 +-
 .../org/apache/solr/handler/StreamHandler.java  |    49 +-
 .../handler/admin/BaseHandlerApiSupport.java    |    76 +-
 .../handler/admin/CollectionHandlerApi.java     |   317 +-
 .../solr/handler/admin/CollectionsHandler.java  |    31 +-
 .../solr/handler/admin/ConfigSetsHandler.java   |     4 +
 .../handler/admin/ConfigSetsHandlerApi.java     |   109 +-
 .../solr/handler/admin/CoreAdminHandler.java    |     1 +
 .../solr/handler/admin/CoreAdminHandlerApi.java |   172 +-
 .../solr/handler/admin/CoreAdminOperation.java  |    90 +-
 .../solr/handler/admin/LukeRequestHandler.java  |     1 -
 .../handler/admin/MetricsCollectorHandler.java  |    13 +-
 .../solr/handler/admin/MetricsHandler.java      |     2 +-
 .../solr/handler/admin/PrepRecoveryOp.java      |    30 +-
 .../solr/handler/admin/SecurityConfHandler.java |     4 +-
 .../handler/admin/SecurityConfHandlerLocal.java |     2 +-
 .../handler/admin/SecurityConfHandlerZk.java    |     2 +-
 .../solr/handler/component/ExpandComponent.java |    34 +-
 .../solr/handler/component/FacetComponent.java  |     3 +-
 .../handler/component/HighlightComponent.java   |     9 +-
 .../handler/component/HttpShardHandler.java     |    92 +-
 .../component/HttpShardHandlerFactory.java      |    28 +-
 .../handler/component/RealTimeGetComponent.java |    22 +-
 .../handler/component/SpatialHeatmapFacets.java |    80 +-
 .../handler/component/SpellCheckComponent.java  |    12 +-
 .../solr/handler/component/TermsComponent.java  |    96 +-
 .../org/apache/solr/handler/sql/SolrTable.java  |     1 +
 .../solr/highlight/DefaultSolrHighlighter.java  |     8 +-
 .../solr/highlight/PostingsSolrHighlighter.java |   326 +-
 .../apache/solr/highlight/SolrHighlighter.java  |     5 +-
 .../solr/highlight/UnifiedSolrHighlighter.java  |     4 +-
 .../org/apache/solr/legacy/BBoxStrategy.java    |   706 +
 .../org/apache/solr/legacy/BBoxValueSource.java |   135 +
 .../apache/solr/legacy/DistanceValueSource.java |   133 +
 .../apache/solr/legacy/LegacyDoubleField.java   |   174 +
 .../org/apache/solr/legacy/LegacyField.java     |    90 +
 .../org/apache/solr/legacy/LegacyFieldType.java |   149 +
 .../apache/solr/legacy/LegacyFloatField.java    |   174 +
 .../org/apache/solr/legacy/LegacyIntField.java  |   175 +
 .../org/apache/solr/legacy/LegacyLongField.java |   184 +
 .../solr/legacy/LegacyNumericRangeQuery.java    |   537 +
 .../solr/legacy/LegacyNumericTokenStream.java   |   357 +
 .../apache/solr/legacy/LegacyNumericType.java   |    34 +
 .../apache/solr/legacy/LegacyNumericUtils.java  |   510 +
 .../apache/solr/legacy/PointVectorStrategy.java |   292 +
 .../solr/legacy/doc-files/nrq-formula-1.png     |   Bin 0 -> 3171 bytes
 .../solr/legacy/doc-files/nrq-formula-2.png     |   Bin 0 -> 3694 bytes
 .../org/apache/solr/legacy/package-info.java    |    21 +
 .../apache/solr/metrics/MetricSuppliers.java    |   363 +
 .../solr/metrics/SolrCoreMetricManager.java     |     2 +-
 .../apache/solr/metrics/SolrMetricManager.java  |    45 +-
 .../apache/solr/metrics/SolrMetricReporter.java |    27 +
 .../metrics/reporters/SolrGangliaReporter.java  |    10 +-
 .../metrics/reporters/SolrGraphiteReporter.java |    28 +-
 .../solr/metrics/reporters/SolrJmxReporter.java |    16 +-
 .../metrics/reporters/SolrSlf4jReporter.java    |    16 +-
 .../reporters/solr/SolrClusterReporter.java     |     8 +-
 .../metrics/reporters/solr/SolrReporter.java    |    21 +-
 .../reporters/solr/SolrShardReporter.java       |    10 +-
 .../org/apache/solr/parser/QueryParser.java     |    49 +-
 .../java/org/apache/solr/parser/QueryParser.jj  |     8 +-
 .../apache/solr/parser/SolrQueryParserBase.java |     2 +-
 .../apache/solr/request/SolrQueryRequest.java   |    44 +-
 .../solr/request/SolrQueryRequestBase.java      |     2 +-
 .../apache/solr/response/SchemaXmlWriter.java   |     9 -
 .../solr/response/TextResponseWriter.java       |    13 +-
 .../analysis/ManagedSynonymFilterFactory.java   |     5 +
 .../ManagedSynonymGraphFilterFactory.java       |   437 +
 .../java/org/apache/solr/schema/BBoxField.java  |     4 +-
 .../java/org/apache/solr/schema/EnumField.java  |    10 +-
 .../java/org/apache/solr/schema/FieldType.java  |     1 +
 .../org/apache/solr/schema/GeoHashField.java    |     3 +
 .../org/apache/solr/schema/IndexSchema.java     |    59 +-
 .../java/org/apache/solr/schema/LatLonType.java |     3 +
 .../apache/solr/schema/ManagedIndexSchema.java  |     3 -
 .../org/apache/solr/schema/SchemaManager.java   |     2 +-
 .../schema/SpatialPointVectorFieldType.java     |     7 +-
 .../SpatialTermQueryPrefixTreeFieldType.java    |     3 +-
 .../org/apache/solr/schema/TrieDoubleField.java |     2 +-
 .../java/org/apache/solr/schema/TrieField.java  |    24 +-
 .../org/apache/solr/schema/TrieFloatField.java  |     2 +-
 .../org/apache/solr/schema/TrieIntField.java    |     2 +-
 .../org/apache/solr/schema/TrieLongField.java   |     2 +-
 .../solr/search/CollapsingQParserPlugin.java    |    80 +-
 .../solr/search/ComplexPhraseQParserPlugin.java |     5 +-
 .../org/apache/solr/search/DisMaxQParser.java   |    12 +-
 .../solr/search/ExtendedDismaxQParser.java      |    58 +-
 .../org/apache/solr/search/FastLRUCache.java    |     2 +-
 .../solr/search/FloatPayloadValueSource.java    |   221 +
 .../apache/solr/search/JoinQParserPlugin.java   |    22 +-
 .../java/org/apache/solr/search/LFUCache.java   |     2 +-
 .../java/org/apache/solr/search/LRUCache.java   |     2 +-
 .../search/LegacyNumericRangeQueryBuilder.java  |     8 +-
 .../org/apache/solr/search/LuceneQParser.java   |     7 +-
 .../apache/solr/search/LuceneQParserPlugin.java |     8 +-
 .../solr/search/OldLuceneQParserPlugin.java     |     3 +
 .../solr/search/PayloadCheckQParserPlugin.java  |   109 +
 .../solr/search/PayloadScoreQParserPlugin.java  |    85 +
 .../java/org/apache/solr/search/QParser.java    |    10 -
 .../org/apache/solr/search/QParserPlugin.java   |     3 +-
 .../org/apache/solr/search/QueryParsing.java    |    63 +-
 .../apache/solr/search/QueryWrapperFilter.java  |     2 +-
 .../apache/solr/search/SimpleQParserPlugin.java |     8 +-
 .../apache/solr/search/SolrIndexSearcher.java   |     3 +
 .../solr/search/SurroundQParserPlugin.java      |     2 +-
 .../apache/solr/search/ValueSourceParser.java   |    75 +-
 .../apache/solr/search/XmlQParserPlugin.java    |     2 +-
 .../apache/solr/search/facet/FacetField.java    |     7 +-
 .../solr/search/facet/FacetFieldMerger.java     |    14 +-
 .../solr/search/facet/FacetFieldProcessor.java  |   135 +-
 .../facet/FacetFieldProcessorByArray.java       |     2 +-
 .../solr/search/facet/FacetProcessor.java       |    12 +-
 .../apache/solr/search/facet/FacetRequest.java  |    74 +-
 .../org/apache/solr/search/facet/HLLAgg.java    |     8 +-
 .../org/apache/solr/search/facet/MaxAgg.java    |    57 -
 .../org/apache/solr/search/facet/MinAgg.java    |    54 -
 .../org/apache/solr/search/facet/MinMaxAgg.java |   236 +
 .../org/apache/solr/search/facet/SlotAcc.java   |    38 +-
 .../org/apache/solr/search/facet/UniqueAgg.java |     6 +-
 .../solr/search/facet/UniqueMultiDvSlotAcc.java |    21 +-
 .../search/facet/UniqueMultivaluedSlotAcc.java  |     5 +-
 .../search/facet/UniqueSinglevaluedSlotAcc.java |    20 +-
 .../apache/solr/search/facet/UniqueSlotAcc.java |     6 +-
 .../search/function/ConcatStringFunction.java   |    53 +
 .../search/function/MultiStringFunction.java    |   146 +
 .../SearchGroupShardResponseProcessor.java      |     4 +-
 .../join/BlockJoinFacetComponentSupport.java    |    12 +-
 .../search/join/BlockJoinParentQParser.java     |    11 +-
 .../join/ChildFieldValueSourceParser.java       |   197 +
 .../search/join/ScoreJoinQParserPlugin.java     |    11 +-
 .../apache/solr/search/mlt/CloudMLTQParser.java |     2 +-
 .../solr/search/mlt/SimpleMLTQParser.java       |     2 +-
 .../PayloadScoringSimilarityWrapper.java        |    80 +
 .../similarities/SchemaSimilarityFactory.java   |    23 +-
 .../security/AutorizationEditOperation.java     |     2 +-
 .../apache/solr/security/BasicAuthPlugin.java   |     2 +-
 .../solr/security/ConfigEditablePlugin.java     |     4 +-
 .../solr/security/PKIAuthenticationPlugin.java  |     1 +
 .../security/RuleBasedAuthorizationPlugin.java  |     2 +-
 .../security/Sha256AuthenticationProvider.java  |     8 +-
 .../org/apache/solr/servlet/HttpSolrCall.java   |     6 +-
 .../org/apache/solr/servlet/ResponseUtils.java  |     2 +-
 .../apache/solr/servlet/SolrDispatchFilter.java |    77 +-
 .../apache/solr/servlet/SolrRequestParsers.java |     2 +-
 .../DocumentExpressionDictionaryFactory.java    |    35 +-
 .../org/apache/solr/uninverting/FieldCache.java |    20 +-
 .../solr/uninverting/UninvertingReader.java     |    16 +-
 .../solr/update/DefaultSolrCoreState.java       |     4 +-
 .../solr/update/DirectUpdateHandler2.java       |    65 +-
 .../java/org/apache/solr/update/PeerSync.java   |     7 +-
 .../apache/solr/update/SolrCmdDistributor.java  |     4 +-
 .../org/apache/solr/update/SolrIndexConfig.java |   148 +-
 .../org/apache/solr/update/UpdateHandler.java   |     6 +-
 .../java/org/apache/solr/update/UpdateLog.java  |    19 +-
 .../org/apache/solr/update/VersionInfo.java     |     2 +-
 .../processor/AtomicUpdateProcessorFactory.java |   183 +
 .../processor/DistributedUpdateProcessor.java   |    51 +-
 .../DocExpirationUpdateProcessorFactory.java    |     2 +-
 .../processor/UpdateRequestProcessorChain.java  |    12 +-
 .../org/apache/solr/util/CommandOperation.java  |   346 -
 .../java/org/apache/solr/util/FileUtils.java    |    20 +
 .../apache/solr/util/JsonSchemaValidator.java   |   479 +-
 .../org/apache/solr/util/PayloadDecoder.java    |    27 +
 .../java/org/apache/solr/util/PayloadUtils.java |   129 +
 .../java/org/apache/solr/util/RTimerTree.java   |     7 +-
 .../org/apache/solr/util/SimplePostTool.java    |    10 +-
 .../src/java/org/apache/solr/util/SolrCLI.java  |   366 +-
 .../org/apache/solr/util/SolrPluginUtils.java   |    82 +-
 .../org/apache/solr/util/TestInjection.java     |     6 +-
 .../util/configuration/SSLConfigurations.java   |    78 +
 .../configuration/SSLConfigurationsFactory.java |    49 +
 .../solr/util/configuration/package-info.java   |    23 +
 .../resources/apispec/autoscaling.Commands.json |     6 +-
 .../src/resources/apispec/cluster.Commands.json |     2 +-
 .../resources/apispec/collections.Commands.json |    18 +-
 .../collections.collection.Commands.json        |     4 +-
 .../collections.collection.Commands.modify.json |     2 +-
 .../collections.collection.shards.Commands.json |     5 +
 .../apispec/core.SchemaEdit.addField.json       |    10 +-
 .../apispec/core.SchemaEdit.addFieldType.json   |     2 +-
 .../src/resources/apispec/core.SchemaRead.json  |     3 +-
 .../src/resources/apispec/cores.Commands.json   |     2 +-
 .../test-files/lib-dirs/d/d1/empty-file-d1.txt  |     1 -
 .../solr/analysisconfs/analysis-err-schema.xml  |     1 -
 .../solr/collection1/conf/bad-mp-solrconfig.xml |    36 -
 .../bad-schema-analyzer-class-and-nested.xml    |     1 -
 .../bad-schema-codec-global-vs-ft-mismatch.xml  |     1 -
 .../bad-schema-currency-dynamic-multivalued.xml |     1 -
 ...bad-schema-currency-ft-bogus-code-in-xml.xml |     1 -
 ...ad-schema-currency-ft-bogus-default-code.xml |     1 -
 .../conf/bad-schema-currency-ft-multivalued.xml |     1 -
 .../conf/bad-schema-currency-ft-oer-norates.xml |     1 -
 .../conf/bad-schema-currency-multivalued.xml    |     1 -
 .../conf/bad-schema-default-operator.xml        |    26 +
 .../conf/bad-schema-defaultsearchfield.xml      |    26 +
 .../conf/bad-schema-dup-dynamicField.xml        |     1 -
 .../collection1/conf/bad-schema-dup-field.xml   |     1 -
 .../conf/bad-schema-dup-fieldType.xml           |     1 -
 .../bad-schema-dynamicfield-default-val.xml     |     1 -
 .../conf/bad-schema-dynamicfield-required.xml   |     1 -
 .../collection1/conf/bad-schema-init-error.xml  |    25 -
 .../conf/bad-schema-nontext-analyzer.xml        |     1 -
 .../conf/bad-schema-not-indexed-but-norms.xml   |     1 -
 .../conf/bad-schema-not-indexed-but-pos.xml     |     1 -
 .../conf/bad-schema-not-indexed-but-tf.xml      |     1 -
 .../conf/bad-schema-omit-tf-but-not-pos.xml     |     1 -
 .../bad-schema-sim-default-does-not-exist.xml   |     2 -
 ...d-schema-sim-default-has-no-explicit-sim.xml |     2 -
 .../bad-schema-sim-global-vs-ft-mismatch.xml    |     2 -
 .../conf/bad-schema-sweetspot-both-tf.xml       |     1 -
 .../bad-schema-sweetspot-partial-baseline.xml   |     1 -
 .../bad-schema-sweetspot-partial-hyperbolic.xml |     3 +-
 .../conf/bad-schema-sweetspot-partial-norms.xml |     3 +-
 .../bad-schema-uniquekey-is-copyfield-dest.xml  |     1 -
 .../conf/bad-schema-uniquekey-multivalued.xml   |     1 -
 .../conf/bad-schema-uniquekey-uses-default.xml  |     1 -
 .../solr/collection1/conf/hyphenation.dtd       |     2 +-
 .../conf/schema-HighlighterMaxOffsetTest.xml    |     2 -
 .../collection1/conf/schema-SimpleTextCodec.xml |    32 +
 .../conf/schema-blockjoinfacetcomponent.xml     |     1 -
 .../solr/collection1/conf/schema-bm25.xml       |     1 -
 .../collection1/conf/schema-charfilters.xml     |     1 -
 .../solr/collection1/conf/schema-collate-dv.xml |     1 -
 .../solr/collection1/conf/schema-collate.xml    |     1 -
 .../collection1/conf/schema-complex-phrase.xml  |    36 -
 .../collection1/conf/schema-copyfield-test.xml  |     1 -
 .../collection1/conf/schema-custom-field.xml    |     1 -
 .../solr/collection1/conf/schema-dfi.xml        |     1 -
 .../solr/collection1/conf/schema-dfr.xml        |     1 -
 .../conf/schema-distrib-interval-faceting.xml   |     1 -
 .../conf/schema-docValuesFaceting.xml           |     1 -
 .../collection1/conf/schema-docValuesJoin.xml   |     1 -
 .../conf/schema-field-sort-values.xml           |     1 -
 .../solr/collection1/conf/schema-folding.xml    |     1 -
 .../solr/collection1/conf/schema-hash.xml       |     1 -
 .../solr/collection1/conf/schema-ib.xml         |     1 -
 .../collection1/conf/schema-lmdirichlet.xml     |     1 -
 .../collection1/conf/schema-lmjelinekmercer.xml |     1 -
 .../conf/schema-not-required-unique-key.xml     |     1 -
 .../collection1/conf/schema-phrasesuggest.xml   |     1 -
 .../solr/collection1/conf/schema-point.xml      |    47 +-
 .../conf/schema-postingshighlight.xml           |     1 -
 .../collection1/conf/schema-psuedo-fields.xml   |     3 +-
 .../collection1/conf/schema-required-fields.xml |     1 -
 .../solr/collection1/conf/schema-rest.xml       |    34 +-
 .../solr/collection1/conf/schema-reversed.xml   |     1 -
 .../solr/collection1/conf/schema-sim.xml        |     1 -
 .../collection1/conf/schema-simpleqpplugin.xml  |     1 -
 .../conf/schema-single-dynamic-copy-field.xml   |   667 -
 .../collection1/conf/schema-spellchecker.xml    |     7 -
 .../solr/collection1/conf/schema-sql.xml        |     1 -
 .../solr/collection1/conf/schema-stop-keep.xml  |    59 -
 .../solr/collection1/conf/schema-sweetspot.xml  |     1 -
 .../conf/schema-synonym-tokenizer.xml           |     1 -
 .../solr/collection1/conf/schema-tfidf.xml      |     1 -
 .../collection1/conf/schema-tokenizer-test.xml  |   150 +
 .../solr/collection1/conf/schema-trie.xml       |     4 -
 .../conf/schema-unifiedhighlight.xml            |     1 -
 .../test-files/solr/collection1/conf/schema.xml |     1 -
 .../solr/collection1/conf/schema11.xml          |    26 +-
 .../solr/collection1/conf/schema12.xml          |     1 -
 .../solr/collection1/conf/schema15.xml          |     9 +-
 .../solr/collection1/conf/schema_codec.xml      |     1 -
 .../solr/collection1/conf/schema_latest.xml     |    15 -
 .../solr/collection1/conf/schemasurround.xml    |     1 -
 .../conf/solrconfig-cache-enable-disable.xml    |     8 +-
 .../conf/solrconfig-collapseqparser.xml         |     5 +
 .../collection1/conf/solrconfig-delpolicy1.xml  |     3 +-
 .../collection1/conf/solrconfig-delpolicy2.xml  |     3 +-
 .../collection1/conf/solrconfig-elevate.xml     |     6 +
 .../conf/solrconfig-functionquery.xml           |     5 +
 .../collection1/conf/solrconfig-indexconfig.xml |    31 -
 .../conf/solrconfig-indexmetrics.xml            |     8 +-
 .../collection1/conf/solrconfig-lazywriter.xml  |    29 -
 .../conf/solrconfig-logmergepolicy.xml          |    36 -
 .../conf/solrconfig-managed-schema.xml          |     6 +
 .../conf/solrconfig-mergepolicy-legacy.xml      |     1 -
 .../conf/solrconfig-mergepolicy-nocfs.xml       |    34 -
 .../collection1/conf/solrconfig-minimal.xml     |     6 +
 .../collection1/conf/solrconfig-nocache.xml     |     6 +
 .../conf/solrconfig-plugcollector.xml           |     6 +
 .../conf/solrconfig-postingshighlight.xml       |     1 +
 .../conf/solrconfig-response-log-component.xml  |     6 +
 .../solrconfig-sortingmergepolicyfactory.xml    |     5 +
 .../conf/solrconfig-spellcheckcomponent.xml     |     8 +-
 .../conf/solrconfig-tieredmergepolicy.xml       |    48 -
 .../solrconfig-tlog-with-delayingcomponent.xml  |   119 -
 .../solr/collection1/conf/solrconfig-tlog.xml   |    14 +
 .../solr/collection1/conf/solrconfig-warmer.xml |    46 -
 .../solrconfig.snippet.randomindexconfig.xml    |     3 +-
 .../solr/collection1/conf/solrconfig.xml        |    17 +-
 .../conf/solrconfig_SimpleTextCodec.xml         |    26 +
 .../configsets/cloud-dynamic/conf/schema.xml    |     1 -
 .../cloud-minimal/conf/solrconfig.xml           |     2 +-
 .../solr/configsets/doc-expiry/conf/schema.xml  |     1 -
 .../test-files/solr/crazy-path-to-config.xml    |     7 +
 .../test-files/solr/crazy-path-to-schema.xml    |     1 -
 .../src/test-files/solr/solr-metricsconfig.xml  |    61 +
 .../core/src/test-files/solr/solr-multicore.xml |     0
 .../solr-shardhandler-loadBalancerRequests.xml  |    23 +
 .../apache/solr/DisMaxRequestHandlerTest.java   |     4 +-
 .../test/org/apache/solr/MinimalSchemaTest.java |     1 -
 .../apache/solr/TestDistributedGrouping.java    |     4 +-
 .../org/apache/solr/TestGroupingSearch.java     |     3 -
 .../AbstractCloudBackupRestoreTestCase.java     |    70 +-
 .../test/org/apache/solr/cloud/AssignTest.java  |     6 +
 .../solr/cloud/BasicDistributedZk2Test.java     |     4 +-
 .../solr/cloud/BasicDistributedZkTest.java      |    10 +-
 .../cloud/ChaosMonkeyNothingIsSafeTest.java     |   136 +-
 ...MonkeyNothingIsSafeWithPullReplicasTest.java |   327 +
 ...aosMonkeySafeLeaderWithPullReplicasTest.java |   255 +
 .../CollectionsAPIAsyncDistributedZkTest.java   |    62 +-
 .../cloud/CollectionsAPIDistributedZkTest.java  |     4 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |    68 +-
 ...ConcurrentDeleteAndCreateCollectionTest.java |    12 +-
 .../org/apache/solr/cloud/DeleteNodeTest.java   |    11 +-
 .../apache/solr/cloud/DeleteReplicaTest.java    |    22 +-
 .../org/apache/solr/cloud/DeleteStatusTest.java |    23 -
 .../apache/solr/cloud/DistributedQueueTest.java |    36 +
 .../org/apache/solr/cloud/ForceLeaderTest.java  |    29 +-
 .../cloud/FullSolrCloudDistribCmdsTest.java     |    16 +-
 .../FullThrottleStoppableIndexingThread.java    |   156 +
 .../apache/solr/cloud/HttpPartitionTest.java    |    44 +-
 .../cloud/LeaderFailoverAfterPartitionTest.java |    10 +-
 .../LeaderInitiatedRecoveryOnCommitTest.java    |    27 +-
 .../apache/solr/cloud/MultiThreadedOCPTest.java |    63 +-
 .../solr/cloud/OnlyLeaderIndexesTest.java       |   435 -
 ...verseerCollectionConfigSetProcessorTest.java |     3 +-
 .../org/apache/solr/cloud/OverseerTest.java     |     2 +-
 .../solr/cloud/RecoveryAfterSoftCommitTest.java |     8 +-
 .../org/apache/solr/cloud/ReplaceNodeTest.java  |    23 +-
 .../solr/cloud/ReplicationFactorTest.java       |     8 +-
 .../apache/solr/cloud/RollingRestartTest.java   |     2 +-
 .../org/apache/solr/cloud/ShardSplitTest.java   |     8 +-
 .../cloud/SharedFSAutoReplicaFailoverTest.java  |    24 +-
 .../cloud/SimpleCollectionCreateDeleteTest.java |    13 +-
 .../apache/solr/cloud/SolrCloudExampleTest.java |    89 +-
 .../solr/cloud/TestAuthenticationFramework.java |    11 +-
 .../cloud/TestCloudJSONFacetJoinDomain.java     |   596 +
 .../apache/solr/cloud/TestCloudRecovery.java    |     5 +-
 .../apache/solr/cloud/TestCollectionAPI.java    |    34 +-
 .../apache/solr/cloud/TestConfigSetsAPI.java    |     5 +-
 .../solr/cloud/TestConfigSetsAPIZkFailure.java  |     4 +-
 .../solr/cloud/TestMiniSolrCloudCluster.java    |    11 +-
 .../solr/cloud/TestMiniSolrCloudClusterSSL.java |     2 +-
 .../org/apache/solr/cloud/TestPullReplica.java  |   645 +
 .../cloud/TestPullReplicaErrorHandling.java     |   344 +
 .../cloud/TestRandomRequestDistribution.java    |    15 +-
 .../solr/cloud/TestRequestForwarding.java       |     6 +-
 .../TestSolrCloudWithDelegationTokens.java      |     2 +-
 .../cloud/TestSolrCloudWithKerberosAlt.java     |    20 +-
 .../TestSolrCloudWithSecureImpersonation.java   |     6 +-
 .../org/apache/solr/cloud/TestTlogReplica.java  |   913 ++
 .../test/org/apache/solr/cloud/ZkCLITest.java   |    28 +
 .../autoscaling/AutoScalingHandlerTest.java     |    83 +-
 .../solr/cloud/autoscaling/TestPolicyCloud.java |   135 +-
 .../cloud/hdfs/HdfsBasicDistributedZkTest.java  |     4 +-
 .../solr/cloud/overseer/ZkStateWriterTest.java  |    10 +-
 .../solr/cloud/rule/ImplicitSnitchTest.java     |    50 +-
 .../org/apache/solr/core/TestBadConfig.java     |     2 -
 .../test/org/apache/solr/core/TestConfig.java   |     9 +-
 .../org/apache/solr/core/TestCoreContainer.java |     5 -
 .../org/apache/solr/core/TestCoreDiscovery.java |    20 +-
 .../org/apache/solr/core/TestLazyCores.java     |     2 +-
 .../apache/solr/core/TestMergePolicyConfig.java |    18 +-
 .../test/org/apache/solr/core/TestNRTOpen.java  |     3 -
 .../apache/solr/core/TestSimpleTextCodec.java   |    67 +
 .../apache/solr/core/TestSolrConfigHandler.java |     4 +-
 .../apache/solr/core/TestSolrIndexConfig.java   |     2 +-
 .../core/snapshots/TestSolrCloudSnapshots.java  |     5 +
 .../FieldAnalysisRequestHandlerTest.java        |     8 +
 .../org/apache/solr/handler/JsonLoaderTest.java |   139 +-
 .../apache/solr/handler/TestBlobHandler.java    |    10 +-
 .../solr/handler/V2ApiIntegrationTest.java      |    84 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |    24 +-
 .../handler/admin/SecurityConfHandlerTest.java  |     2 +-
 .../admin/SegmentsInfoRequestHandlerTest.java   |     2 -
 .../solr/handler/admin/StatsReloadRaceTest.java |    23 +-
 .../solr/handler/admin/TestApiFramework.java    |     2 +-
 .../solr/handler/admin/TestCollectionAPIs.java  |    42 +-
 .../solr/handler/admin/TestConfigsApi.java      |     2 +-
 .../DistributedExpandComponentTest.java         |    50 +-
 .../DistributedTermsComponentTest.java          |    10 +-
 .../component/QueryElevationComponentTest.java  |     4 +-
 .../component/SpatialHeatmapFacetsTest.java     |    22 +
 .../component/SpellCheckComponentTest.java      |    79 +-
 .../handler/component/TermsComponentTest.java   |    47 +-
 .../handler/component/TestExpandComponent.java  |    62 +-
 .../component/TestHttpShardHandlerFactory.java  |   102 +
 .../highlight/HighlighterMaxOffsetTest.java     |     3 +-
 .../org/apache/solr/legacy/TestLegacyField.java |   186 +
 .../solr/legacy/TestLegacyFieldReuse.java       |    81 +
 .../solr/legacy/TestLegacyNumericUtils.java     |   571 +
 .../org/apache/solr/legacy/TestLegacyTerms.java |   164 +
 .../TestMultiValuedNumericRangeQuery.java       |    84 +
 .../solr/legacy/TestNumericRangeQuery32.java    |   461 +
 .../solr/legacy/TestNumericRangeQuery64.java    |   490 +
 .../solr/legacy/TestNumericTokenStream.java     |   188 +
 .../org/apache/solr/metrics/JvmMetricsTest.java |     4 +-
 .../apache/solr/metrics/MetricsConfigTest.java  |   126 +
 .../solr/metrics/MockCounterSupplier.java       |    36 +
 .../solr/metrics/MockHistogramSupplier.java     |    40 +
 .../apache/solr/metrics/MockMeterSupplier.java  |    36 +
 .../apache/solr/metrics/MockTimerSupplier.java  |    46 +
 .../solr/metrics/SolrMetricTestUtils.java       |     4 +-
 .../metrics/SolrMetricsIntegrationTest.java     |     2 +-
 .../metrics/reporters/MockMetricReporter.java   |     4 +-
 .../metrics/reporters/SolrJmxReporterTest.java  |     8 +-
 .../reporters/solr/SolrCloudReportersTest.java  |    10 +-
 .../org/apache/solr/rest/TestRestManager.java   |     4 +-
 .../schema/TestDefaultSearchFieldResource.java  |    28 -
 .../solr/rest/schema/TestFieldTypeResource.java |     3 +-
 .../solr/rest/schema/TestSchemaResource.java    |    12 +-
 ...tSolrQueryParserDefaultOperatorResource.java |    29 -
 .../schema/TestSolrQueryParserResource.java     |    30 -
 .../TestManagedSynonymGraphFilterFactory.java   |   297 +
 .../apache/solr/schema/BadIndexSchemaTest.java  |    10 +-
 .../org/apache/solr/schema/CopyFieldTest.java   |     6 +-
 .../solr/schema/TestHalfAndHalfDocValues.java   |   132 +
 .../apache/solr/schema/TestSchemaManager.java   |     2 +-
 .../solr/schema/TestUseDocValuesAsStored.java   |     2 +-
 .../apache/solr/search/QueryEqualityTest.java   |    74 +-
 .../apache/solr/search/QueryParsingTest.java    |     4 +-
 .../solr/search/TestCollapseQParserPlugin.java  |    18 +
 .../solr/search/TestExtendedDismaxParser.java   |   142 +-
 .../apache/solr/search/TestIndexSearcher.java   |     3 -
 .../TestLegacyNumericRangeQueryBuilder.java     |     2 +-
 .../solr/search/TestMaxScoreQueryParser.java    |     6 +-
 .../search/TestPayloadCheckQParserPlugin.java   |    73 +
 .../search/TestPayloadScoreQParserPlugin.java   |    54 +
 .../org/apache/solr/search/TestRangeQuery.java  |    42 +
 .../solr/search/TestReRankQParserPlugin.java    |     6 +
 .../solr/search/TestSimpleQParserPlugin.java    |     4 +-
 .../apache/solr/search/TestSolr4Spatial.java    |     2 +-
 .../apache/solr/search/TestSolrQueryParser.java |    95 +-
 .../org/apache/solr/search/facet/DebugAgg.java  |   146 +
 .../search/facet/TestJsonFacetRefinement.java   |   140 +-
 .../solr/search/facet/TestJsonFacets.java       |   445 +-
 .../search/function/SortByFunctionTest.java     |     6 +-
 .../solr/search/function/TestFunctionQuery.java |    57 +-
 .../solr/search/function/TestOrdValues.java     |     4 +-
 .../search/join/BlockJoinFacetDistribTest.java  |    10 +-
 .../search/join/BlockJoinFacetRandomTest.java   |     1 +
 .../search/join/TestCloudNestedDocsSort.java    |   185 +
 .../solr/search/join/TestNestedDocsSort.java    |   145 +
 .../search/join/TestScoreJoinQPNoScore.java     |    16 +-
 .../TestSweetSpotSimilarityFactory.java         |    91 +-
 .../solr/search/stats/TestDistribIDF.java       |    13 +-
 .../solr/security/BasicAuthIntegrationTest.java |    15 +-
 .../TestRuleBasedAuthorizationPlugin.java       |     4 +-
 .../TestSha256AuthenticationProvider.java       |     2 +-
 .../hadoop/TestDelegationWithHadoopAuth.java    |     2 +-
 .../solr/uninverting/TestDocTermOrds.java       |     6 +-
 .../solr/uninverting/TestFieldCacheSort.java    |     8 +-
 .../solr/uninverting/TestLegacyFieldCache.java  |     8 +-
 .../solr/uninverting/TestNumericTerms32.java    |     6 +-
 .../solr/uninverting/TestNumericTerms64.java    |     6 +-
 .../solr/uninverting/TestUninvertingReader.java |     8 +-
 .../solr/update/DirectUpdateHandlerTest.java    |     2 -
 .../solr/update/SolrCmdDistributorTest.java     |     3 -
 .../apache/solr/update/SolrIndexConfigTest.java |    36 +-
 .../solr/update/TestInPlaceUpdatesDistrib.java  |    14 +-
 .../update/TestInPlaceUpdatesStandalone.java    |     4 -
 .../AtomicUpdateProcessorFactoryTest.java       |   281 +
 .../UpdateRequestProcessorFactoryTest.java      |     1 +
 .../org/apache/solr/util/JsonValidatorTest.java |    27 +-
 .../apache/solr/util/SimplePostToolTest.java    |    29 +-
 .../apache/solr/util/SolrPluginUtilsTest.java   |     6 +-
 .../solr/util/TestMaxTokenLenTokenizer.java     |   135 +
 .../apache/solr/util/TestSolrCLIRunExample.java |   138 +-
 .../test/org/apache/solr/util/TestUtils.java    |    26 +-
 .../configuration/SSLConfigurationsTest.java    |   121 +
 solr/example/example-DIH/ivy.xml                |     2 +-
 .../solr/atom/conf/atom-data-config.xml         |     2 +-
 .../example-DIH/solr/db/conf/managed-schema     |    20 +-
 .../example-DIH/solr/db/conf/solrconfig.xml     |     3 +-
 .../example-DIH/solr/mail/conf/managed-schema   |    20 +-
 .../example-DIH/solr/mail/conf/solrconfig.xml   |     3 +-
 .../example-DIH/solr/solr/conf/managed-schema   |    20 +-
 .../example-DIH/solr/solr/conf/solrconfig.xml   |     3 +-
 .../example-DIH/solr/tika/conf/managed-schema   |     2 +-
 solr/example/files/conf/solrconfig.xml          |     3 +-
 solr/example/files/conf/velocity/head.vm        |     2 +-
 .../android-json-0.0.20131108.vaadin1.jar.sha1  |     1 +
 solr/licenses/android-json-LICENSE-ASL.txt      |   202 +
 solr/licenses/android-json-NOTICE.txt           |     0
 .../asciidoctor-ant-1.6.0-alpha.3.jar.sha1      |     1 +
 solr/licenses/asciidoctor-ant-LICENSE-ASL.txt   |   202 +
 solr/licenses/asciidoctor-ant-NOTICE.txt        |     5 +
 solr/licenses/hsqldb-1.8.0.10.jar.sha1          |     1 -
 solr/licenses/hsqldb-2.4.0.jar.sha1             |     1 +
 solr/licenses/hsqldb-LICENSE-BSD_LIKE.txt       |     9 +-
 solr/licenses/hsqldb-NOTICE.txt                 |   135 +-
 solr/licenses/icu4j-56.1.jar.sha1               |     1 -
 solr/licenses/icu4j-59.1.jar.sha1               |     1 +
 .../javacscript-natural-sort-NOTICE.txt         |     5 -
 .../javascript-natural-sort-LICENSE-MIT.txt     |    21 -
 solr/licenses/jsoup-1.8.2.jar.sha1              |     1 +
 solr/licenses/jsoup-LICENSE-MIT.txt             |    21 +
 solr/licenses/metrics-core-3.1.2.jar.sha1       |     1 -
 solr/licenses/metrics-core-3.2.2.jar.sha1       |     1 +
 solr/licenses/metrics-ganglia-3.1.2.jar.sha1    |     1 -
 solr/licenses/metrics-ganglia-3.2.2.jar.sha1    |     1 +
 solr/licenses/metrics-graphite-3.1.2.jar.sha1   |     1 -
 solr/licenses/metrics-graphite-3.2.2.jar.sha1   |     1 +
 solr/licenses/metrics-jetty9-3.1.2.jar.sha1     |     1 -
 solr/licenses/metrics-jetty9-3.2.2.jar.sha1     |     1 +
 solr/licenses/metrics-jvm-3.1.2.jar.sha1        |     1 -
 solr/licenses/metrics-jvm-3.2.2.jar.sha1        |     1 +
 solr/licenses/noggit-0.6.jar.sha1               |     1 -
 solr/licenses/noggit-0.8.jar.sha1               |     1 +
 solr/licenses/slf4j-simple-1.7.7.jar.sha1       |     1 +
 solr/licenses/zookeeper-3.4.10.jar.sha1         |     1 +
 solr/licenses/zookeeper-3.4.6.jar.sha1          |     1 -
 solr/server/etc/jetty-ssl.xml                   |     4 +-
 .../server/etc/test/create-solrtest.keystore.sh |    37 -
 solr/server/etc/test/solrtest.keystore          |   Bin 2208 -> 0 bytes
 .../scripts/cloud-scripts/snapshotscli.sh       |     2 +-
 .../basic_configs/conf/managed-schema           |     5 +-
 .../basic_configs/conf/solrconfig.xml           |     3 +-
 .../conf/managed-schema                         |    30 +-
 .../conf/solrconfig.xml                         |     3 +-
 .../conf/managed-schema                         |    30 +-
 .../conf/solrconfig.xml                         |     3 +-
 .../conf/velocity/head.vm                       |     2 +-
 solr/server/solr/zoo.cfg                        |    14 +
 solr/solr-ref-guide/README.adoc                 |    43 +
 solr/solr-ref-guide/build.xml                   |   239 +
 solr/solr-ref-guide/ivy.xml                     |    34 +
 .../meta-docs/asciidoc-syntax.adoc              |   239 +
 .../solr-ref-guide/meta-docs/editing-tools.adoc |    39 +
 solr/solr-ref-guide/meta-docs/jekyll.adoc       |    89 +
 solr/solr-ref-guide/meta-docs/pdf.adoc          |   145 +
 solr/solr-ref-guide/meta-docs/publish.adoc      |   220 +
 solr/solr-ref-guide/src/.gitignore              |     3 +
 solr/solr-ref-guide/src/README.md               |     3 +
 solr/solr-ref-guide/src/_config.yml.template    |    91 +
 solr/solr-ref-guide/src/_data/strings.yml       |     5 +
 solr/solr-ref-guide/src/_data/tags.yml          |     7 +
 solr/solr-ref-guide/src/_includes/footer.html   |     9 +
 .../src/_includes/google_analytics.html         |     6 +
 solr/solr-ref-guide/src/_includes/head.html     |    35 +
 .../src/_includes/head_print.html               |    33 +
 solr/solr-ref-guide/src/_includes/sidebar.html  |    65 +
 solr/solr-ref-guide/src/_includes/taglogic.html |    22 +
 solr/solr-ref-guide/src/_includes/toc.html      |     9 +
 solr/solr-ref-guide/src/_includes/topnav.html   |    61 +
 solr/solr-ref-guide/src/_layouts/default.html   |    55 +
 .../src/_layouts/default_print.html             |    25 +
 solr/solr-ref-guide/src/_layouts/none.html      |     3 +
 solr/solr-ref-guide/src/_layouts/page.html      |    80 +
 .../solr-ref-guide/src/_layouts/page_print.html |    15 +
 solr/solr-ref-guide/src/a-quick-overview.adoc   |    49 +
 solr/solr-ref-guide/src/a-step-closer.adoc      |    70 +
 solr/solr-ref-guide/src/about-filters.adoc      |    45 +
 solr/solr-ref-guide/src/about-this-guide.adoc   |    73 +
 solr/solr-ref-guide/src/about-tokenizers.adoc   |    47 +
 ...adding-custom-plugins-in-solrcloud-mode.adoc |   172 +
 solr/solr-ref-guide/src/analysis-screen.adoc    |    33 +
 solr/solr-ref-guide/src/analyzers.adoc          |   119 +
 ...uthentication-and-authorization-plugins.adoc |   186 +
 .../src/basic-authentication-plugin.adoc        |   156 +
 solr/solr-ref-guide/src/blob-store-api.adoc     |   151 +
 solr/solr-ref-guide/src/blockjoin-faceting.adoc |   115 +
 .../solr-ref-guide/src/charfilterfactories.adoc |   175 +
 .../src/choosing-an-output-format.adoc          |    25 +
 solr/solr-ref-guide/src/client-api-lineup.adoc  |    45 +
 solr/solr-ref-guide/src/client-apis.adoc        |    38 +
 solr/solr-ref-guide/src/cloud-screens.adoc      |    45 +
 solr/solr-ref-guide/src/codec-factory.adoc      |    57 +
 .../src/collapse-and-expand-results.adoc        |   149 +
 .../src/collection-specific-tools.adoc          |    46 +
 solr/solr-ref-guide/src/collections-api.adoc    |  1969 +++
 .../src/collections-core-admin.adoc             |    41 +
 .../combining-distribution-and-replication.adoc |    35 +
 .../src/command-line-utilities.adoc             |   168 +
 .../src/common-query-parameters.adoc            |   381 +
 solr/solr-ref-guide/src/config-api.adoc         |   537 +
 solr/solr-ref-guide/src/config-sets.adoc        |    42 +
 solr/solr-ref-guide/src/configsets-api.adoc     |   212 +
 solr/solr-ref-guide/src/configuration-apis.adoc |    27 +
 .../solr-ref-guide/src/configuring-logging.adoc |   126 +
 .../src/configuring-solrconfig-xml.adoc         |   171 +
 solr/solr-ref-guide/src/content-streams.adoc    |    64 +
 solr/solr-ref-guide/src/copying-fields.adoc     |    56 +
 .../solr-ref-guide/src/core-specific-tools.adoc |    52 +
 solr/solr-ref-guide/src/coreadmin-api.adoc      |   369 +
 .../src/cross-data-center-replication-cdcr.adoc |   777 ++
 solr/solr-ref-guide/src/css/comments.css        |   164 +
 solr/solr-ref-guide/src/css/customstyles.css    |   885 ++
 .../solr-ref-guide/src/css/font-awesome.min.css |     4 +
 .../solr-ref-guide/src/css/lavish-bootstrap.css |  5420 ++++++++
 solr/solr-ref-guide/src/css/printstyles.css     |   160 +
 solr/solr-ref-guide/src/css/ref-guide.css       |  2840 +++++
 solr/solr-ref-guide/src/css/theme-solr.css      |   127 +
 ...adir-and-directoryfactory-in-solrconfig.adoc |    61 +
 solr/solr-ref-guide/src/dataimport-screen.adoc  |    29 +
 solr/solr-ref-guide/src/de-duplication.adoc     |   116 +
 .../src/defining-core-properties.adoc           |    95 +
 solr/solr-ref-guide/src/defining-fields.adoc    |    73 +
 .../detecting-languages-during-indexing.adoc    |    98 +
 .../src/distributed-requests.adoc               |   139 +
 .../distributed-search-with-index-sharding.adoc |   181 +
 .../src/documents-fields-and-schema-design.adoc |    44 +
 solr/solr-ref-guide/src/documents-screen.adoc   |    89 +
 solr/solr-ref-guide/src/docvalues.adoc          |    91 +
 solr/solr-ref-guide/src/dynamic-fields.adoc     |    36 +
 solr/solr-ref-guide/src/enabling-ssl.adoc       |   361 +
 solr/solr-ref-guide/src/errata.adoc             |    33 +
 .../src/exporting-result-sets.adoc              |    71 +
 solr/solr-ref-guide/src/faceting.adoc           |   754 ++
 solr/solr-ref-guide/src/feed.xml                |    28 +
 .../src/field-properties-by-use-case.adoc       |    50 +
 .../field-type-definitions-and-properties.adoc  |   131 +
 .../src/field-types-included-with-solr.adoc     |    56 +
 solr/solr-ref-guide/src/files-screen.adoc       |    39 +
 .../solr-ref-guide/src/filter-descriptions.adoc |  1817 +++
 .../src/fonts/Inconsolata/Inconsolata-Bold.ttf  |   Bin 0 -> 109948 bytes
 .../fonts/Inconsolata/Inconsolata-Regular.ttf   |   Bin 0 -> 96964 bytes
 .../src/fonts/Inconsolata/OFL.txt               |    92 +
 .../src/fonts/Noto_Sans/LICENSE.txt             |   202 +
 .../src/fonts/Noto_Sans/NotoSans-Bold.ttf       |   Bin 0 -> 415132 bytes
 .../src/fonts/Noto_Sans/NotoSans-BoldItalic.ttf |   Bin 0 -> 290436 bytes
 .../src/fonts/Noto_Sans/NotoSans-Italic.ttf     |   Bin 0 -> 279268 bytes
 .../src/fonts/Noto_Sans/NotoSans-Regular.ttf    |   Bin 0 -> 414820 bytes
 .../src/fonts/fontawesome/FontAwesome.otf       |   Bin 0 -> 85908 bytes
 .../fonts/fontawesome/fontawesome-webfont.eot   |   Bin 0 -> 56006 bytes
 .../fonts/fontawesome/fontawesome-webfont.svg   |   520 +
 .../fonts/fontawesome/fontawesome-webfont.ttf   |   Bin 0 -> 112160 bytes
 .../fonts/fontawesome/fontawesome-webfont.woff  |   Bin 0 -> 65452 bytes
 .../glyphicons/glyphicons-halflings-regular.eot |   Bin 0 -> 20127 bytes
 .../glyphicons/glyphicons-halflings-regular.svg |   288 +
 .../glyphicons/glyphicons-halflings-regular.ttf |   Bin 0 -> 45404 bytes
 .../glyphicons-halflings-regular.woff           |   Bin 0 -> 23424 bytes
 .../glyphicons-halflings-regular.woff2          |   Bin 0 -> 18028 bytes
 .../src/fonts/mplus1mn/mplus1mn-bold-ascii.ttf  |   Bin 0 -> 15868 bytes
 .../mplus1mn/mplus1mn-bold_italic-ascii.ttf     |   Bin 0 -> 15908 bytes
 .../fonts/mplus1mn/mplus1mn-italic-ascii.ttf    |   Bin 0 -> 15928 bytes
 .../mplus1mn/mplus1mn-regular-ascii-conums.ttf  |   Bin 0 -> 20024 bytes
 .../src/fonts/mplus1p-regular-fallback.ttf      |   Bin 0 -> 1405716 bytes
 solr/solr-ref-guide/src/format-of-solr-xml.adoc |   170 +
 solr/solr-ref-guide/src/function-queries.adoc   |   273 +
 solr/solr-ref-guide/src/further-assistance.adoc |    23 +
 solr/solr-ref-guide/src/getting-assistance.adoc |    41 +
 .../src/getting-started-with-solrcloud.adoc     |   175 +
 solr/solr-ref-guide/src/getting-started.adoc    |    43 +
 solr/solr-ref-guide/src/graph-traversal.adoc    |   548 +
 .../src/hadoop-authentication-plugin.adoc       |   132 +
 solr/solr-ref-guide/src/highlighting.adoc       |   284 +
 .../solr-ref-guide/src/how-solrcloud-works.adoc |    53 +
 .../a-quick-overview/sample-client-app-arch.png |   Bin 0 -> 52100 bytes
 .../a-quick-overview/sample-client-app-arch.svg |   488 +
 .../images/analysis-screen/analysis_normal.png  |   Bin 0 -> 57653 bytes
 .../images/analysis-screen/analysis_verbose.png |   Bin 0 -> 66742 bytes
 .../src/images/cloud-screens/cloud-graph.png    |   Bin 0 -> 54929 bytes
 .../src/images/cloud-screens/cloud-radial.png   |   Bin 0 -> 62572 bytes
 .../src/images/cloud-screens/cloud-tree.png     |   Bin 0 -> 105371 bytes
 .../collection_dashboard.png                    |   Bin 0 -> 69978 bytes
 .../collections-core-admin/DeleteShard.png      |   Bin 0 -> 161077 bytes
 .../collections-core-admin/collection-admin.png |   Bin 0 -> 60968 bytes
 .../worddav4101c16174820e932b44baa22abcfcd1.png |   Bin 0 -> 54328 bytes
 .../core-specific-tools/core_dashboard.png      |   Bin 0 -> 84253 bytes
 .../CDCR_arch.png                               |   Bin 0 -> 83216 bytes
 .../src/images/dataimport-screen/dataimport.png |   Bin 0 -> 126440 bytes
 .../documents-screen/documents_add_screen.png   |   Bin 0 -> 58783 bytes
 .../src/images/draft-background.png             |   Bin 0 -> 5391 bytes
 .../src/images/files-screen/files-screen.png    |   Bin 0 -> 129388 bytes
 .../images/getting-assistance/Assistance.png    |   Bin 0 -> 6429 bytes
 .../src/images/icons/bullet_blue.gif            |   Bin 0 -> 60 bytes
 .../images/icons/contenttypes/home_page_16.png  |   Bin 0 -> 272 bytes
 .../src/images/icons/emoticons/warning.png      |   Bin 0 -> 444 bytes
 .../solr-ref-guide/src/images/icons/favicon.ico |   Bin 0 -> 3262 bytes
 .../worddav2b7e14725d898b4104cdd9c502fc77cd.png |   Bin 0 -> 26388 bytes
 .../images/java-properties/javaproperties.png   |   Bin 0 -> 86999 bytes
 .../src/images/logging/level_menu.png           |   Bin 0 -> 68035 bytes
 .../src/images/logging/logging.png              |   Bin 0 -> 49911 bytes
 .../other-parsers/graph_qparser_example.png     |   Bin 0 -> 46673 bytes
 .../other-parsers/graph_qparser_example.svg     |   606 +
 .../worddav16392965e726e04513a21641fabad474.png |   Bin 0 -> 54279 bytes
 .../worddav88969a784fb8a63d8c46e9c043f5f953.png |   Bin 0 -> 246343 bytes
 .../overview-of-the-solr-admin-ui/dashboard.png |   Bin 0 -> 92750 bytes
 .../images/parallel-sql-interface/cluster.png   |   Bin 0 -> 3067133 bytes
 solr/solr-ref-guide/src/images/ping/ping.png    |   Bin 0 -> 10064 bytes
 .../plugins-stats-screen/plugin-searcher.png    |   Bin 0 -> 103571 bytes
 .../src/images/query-screen/query-top.png       |   Bin 0 -> 112162 bytes
 .../images/replication-screen/replication.png   |   Bin 0 -> 55601 bytes
 .../result-clustering/carrot2-workbench.png     |   Bin 0 -> 210974 bytes
 .../src/images/result-clustering/carrot2.png    |   Bin 0 -> 403362 bytes
 .../images/running-solr/SolrAdminDashboard.png  |   Bin 0 -> 249171 bytes
 .../running-solr/solr34_responseHeader.png      |   Bin 0 -> 269440 bytes
 .../analysis_compare_0.png                      |   Bin 0 -> 57666 bytes
 .../analysis_compare_1.png                      |   Bin 0 -> 93162 bytes
 .../analysis_compare_2.png                      |   Bin 0 -> 85136 bytes
 .../analysis_compare_3.png                      |   Bin 0 -> 89766 bytes
 .../analysis_compare_4.png                      |   Bin 0 -> 97789 bytes
 .../schema_browser_terms.png                    |   Bin 0 -> 219326 bytes
 .../src/images/segments-info/segments_info.png  |   Bin 0 -> 40880 bytes
 .../zeppelin_solrjdbc_1.png                     |   Bin 0 -> 72998 bytes
 .../zeppelin_solrjdbc_2.png                     |   Bin 0 -> 41166 bytes
 .../zeppelin_solrjdbc_3.png                     |   Bin 0 -> 62482 bytes
 .../zeppelin_solrjdbc_4.png                     |   Bin 0 -> 62527 bytes
 .../zeppelin_solrjdbc_5.png                     |   Bin 0 -> 42257 bytes
 .../zeppelin_solrjdbc_6.png                     |   Bin 0 -> 44941 bytes
 .../dbvisualizer_solrjdbc_1.png                 |   Bin 0 -> 171124 bytes
 .../dbvisualizer_solrjdbc_11.png                |   Bin 0 -> 54439 bytes
 .../dbvisualizer_solrjdbc_12.png                |   Bin 0 -> 130739 bytes
 .../dbvisualizer_solrjdbc_13.png                |   Bin 0 -> 82449 bytes
 .../dbvisualizer_solrjdbc_14.png                |   Bin 0 -> 75971 bytes
 .../dbvisualizer_solrjdbc_15.png                |   Bin 0 -> 118023 bytes
 .../dbvisualizer_solrjdbc_16.png                |   Bin 0 -> 162783 bytes
 .../dbvisualizer_solrjdbc_17.png                |   Bin 0 -> 122613 bytes
 .../dbvisualizer_solrjdbc_19.png                |   Bin 0 -> 84112 bytes
 .../dbvisualizer_solrjdbc_2.png                 |   Bin 0 -> 115345 bytes
 .../dbvisualizer_solrjdbc_20.png                |   Bin 0 -> 145134 bytes
 .../dbvisualizer_solrjdbc_3.png                 |   Bin 0 -> 106194 bytes
 .../dbvisualizer_solrjdbc_4.png                 |   Bin 0 -> 110362 bytes
 .../dbvisualizer_solrjdbc_5.png                 |   Bin 0 -> 95829 bytes
 .../dbvisualizer_solrjdbc_6.png                 |   Bin 0 -> 106536 bytes
 .../dbvisualizer_solrjdbc_7.png                 |   Bin 0 -> 111281 bytes
 .../dbvisualizer_solrjdbc_9.png                 |   Bin 0 -> 117209 bytes
 .../squirrelsql_solrjdbc_1.png                  |   Bin 0 -> 42001 bytes
 .../squirrelsql_solrjdbc_10.png                 |   Bin 0 -> 53660 bytes
 .../squirrelsql_solrjdbc_11.png                 |   Bin 0 -> 59264 bytes
 .../squirrelsql_solrjdbc_12.png                 |   Bin 0 -> 47968 bytes
 .../squirrelsql_solrjdbc_13.png                 |   Bin 0 -> 43717 bytes
 .../squirrelsql_solrjdbc_14.png                 |   Bin 0 -> 44009 bytes
 .../squirrelsql_solrjdbc_15.png                 |   Bin 0 -> 92630 bytes
 .../squirrelsql_solrjdbc_2.png                  |   Bin 0 -> 56592 bytes
 .../squirrelsql_solrjdbc_3.png                  |   Bin 0 -> 52196 bytes
 .../squirrelsql_solrjdbc_4.png                  |   Bin 0 -> 42390 bytes
 .../squirrelsql_solrjdbc_5.png                  |   Bin 0 -> 56778 bytes
 .../squirrelsql_solrjdbc_7.png                  |   Bin 0 -> 62070 bytes
 .../squirrelsql_solrjdbc_9.png                  |   Bin 0 -> 63722 bytes
 .../src/images/solr-sunOnly-small.png           |   Bin 0 -> 7528 bytes
 .../src/images/spatial-search/bbox.png          |   Bin 0 -> 14893 bytes
 .../src/images/spatial-search/circle.png        |   Bin 0 -> 14843 bytes
 .../src/images/stream-screen/StreamScreen.png   |   Bin 0 -> 51471 bytes
 .../src/images/thread-dump/thread_dump_1.png    |   Bin 0 -> 106104 bytes
 .../src/images/thread-dump/thread_dump_2.png    |   Bin 0 -> 118045 bytes
 .../velocity-search-ui/techproducts_browse.png  |   Bin 0 -> 74854 bytes
 .../src/implicit-requesthandlers.adoc           |    77 +
 solr/solr-ref-guide/src/index-replication.adoc  |   309 +
 solr/solr-ref-guide/src/index.adoc              |    46 +
 .../src/indexconfig-in-solrconfig.adoc          |   214 +
 .../src/indexing-and-basic-data-operations.adoc |    49 +
 solr/solr-ref-guide/src/indexupgrader-tool.adoc |    39 +
 .../src/initparams-in-solrconfig.adoc           |   122 +
 solr/solr-ref-guide/src/installing-solr.adoc    |    56 +
 .../src/introduction-to-client-apis.adoc        |    31 +
 ...ntroduction-to-scaling-and-distribution.adoc |    45 +
 .../src/introduction-to-solr-indexing.adoc      |    56 +
 solr/solr-ref-guide/src/java-properties.adoc    |    24 +
 solr/solr-ref-guide/src/js/customscripts.js     |    56 +
 solr/solr-ref-guide/src/js/jekyll-search.js     |     1 +
 .../solr-ref-guide/src/js/jquery.navgoco.min.js |     8 +
 solr/solr-ref-guide/src/js/ref-guide-toc.js     |    36 +
 solr/solr-ref-guide/src/js/toc.js               |    82 +
 solr/solr-ref-guide/src/jvm-settings.adoc       |    54 +
 .../src/kerberos-authentication-plugin.adoc     |   395 +
 solr/solr-ref-guide/src/language-analysis.adoc  |  1646 +++
 solr/solr-ref-guide/src/learning-to-rank.adoc   |   760 ++
 .../src/legacy-scaling-and-distribution.adoc    |    34 +
 .../src/lib-directives-in-solrconfig.adoc       |    40 +
 .../src/local-parameters-in-queries.adoc        |    86 +
 solr/solr-ref-guide/src/logging.adoc            |    38 +
 .../major-changes-from-solr-5-to-solr-6.adoc    |    89 +
 .../src/making-and-restoring-backups.adoc       |   237 +
 solr/solr-ref-guide/src/managed-resources.adoc  |   298 +
 solr/solr-ref-guide/src/managing-solr.adoc      |    42 +
 .../src/mbean-request-handler.adoc              |    60 +
 solr/solr-ref-guide/src/merging-indexes.adoc    |    51 +
 solr/solr-ref-guide/src/metrics-reporting.adoc  |   397 +
 solr/solr-ref-guide/src/morelikethis.adoc       |    99 +
 .../src/near-real-time-searching.adoc           |   147 +
 solr/solr-ref-guide/src/other-parsers.adoc      |   983 ++
 .../src/other-schema-elements.adoc              |    99 +
 ...w-of-documents-fields-and-schema-design.adoc |    63 +
 .../src/overview-of-searching-in-solr.adoc      |    61 +
 .../src/overview-of-the-solr-admin-ui.adoc      |    38 +
 .../src/pagination-of-results.adoc              |   269 +
 .../src/parallel-sql-interface.adoc             |   434 +
 .../solr-ref-guide/src/parameter-reference.adoc |    67 +
 .../src/pdf/SolrRefGuide-all.adoc               |    31 +
 .../src/pdf/themes/refguide-theme.yml           |   259 +
 .../src/performance-statistics-reference.adoc   |   135 +
 solr/solr-ref-guide/src/phonetic-matching.adoc  |   130 +
 solr/solr-ref-guide/src/ping.adoc               |    82 +
 .../src/plugins-stats-screen.adoc               |    28 +
 solr/solr-ref-guide/src/post-tool.adoc          |   183 +
 .../src/putting-the-pieces-together.adoc        |    75 +
 solr/solr-ref-guide/src/query-re-ranking.adoc   |    71 +
 solr/solr-ref-guide/src/query-screen.adoc       |    58 +
 .../src/query-settings-in-solrconfig.adoc       |   233 +
 .../src/query-syntax-and-parsing.adoc           |    33 +
 .../read-and-write-side-fault-tolerance.adoc    |   115 +
 solr/solr-ref-guide/src/realtime-get.adoc       |   118 +
 solr/solr-ref-guide/src/relevance.adoc          |    47 +
 solr/solr-ref-guide/src/replication-screen.adoc |    37 +
 .../src/request-parameters-api.adoc             |   203 +
 .../src/requestdispatcher-in-solrconfig.adoc    |    98 +
 ...lers-and-searchcomponents-in-solrconfig.adoc |   183 +
 solr/solr-ref-guide/src/response-writers.adoc   |   340 +
 solr/solr-ref-guide/src/result-clustering.adoc  |   362 +
 solr/solr-ref-guide/src/result-grouping.adoc    |   255 +
 .../src/rule-based-authorization-plugin.adoc    |   241 +
 .../src/rule-based-replica-placement.adoc       |   197 +
 .../src/running-solr-on-hdfs.adoc               |   240 +
 solr/solr-ref-guide/src/running-solr.adoc       |   289 +
 .../src/running-your-analyzer.adoc              |    58 +
 solr/solr-ref-guide/src/schema-api.adoc         |  1186 ++
 .../src/schema-browser-screen.adoc              |    37 +
 ...schema-factory-definition-in-solrconfig.adoc |    97 +
 solr/solr-ref-guide/src/schemaless-mode.adoc    |   284 +
 solr/solr-ref-guide/src/search.json             |    21 +
 solr/solr-ref-guide/src/searching.adoc          |    57 +
 solr/solr-ref-guide/src/securing-solr.adoc      |    35 +
 solr/solr-ref-guide/src/segments-info.adoc      |    25 +
 ...tting-up-an-external-zookeeper-ensemble.adoc |   198 +
 .../shards-and-indexing-data-in-solrcloud.adoc  |   116 +
 solr/solr-ref-guide/src/sitemap.xml             |    17 +
 .../src/solr-control-script-reference.adoc      |   730 ++
 .../src/solr-cores-and-solr-xml.adoc            |    38 +
 solr/solr-ref-guide/src/solr-field-types.adoc   |    40 +
 solr/solr-ref-guide/src/solr-glossary.adoc      |   204 +
 .../src/solr-jdbc-apache-zeppelin.adoc          |    70 +
 .../src/solr-jdbc-dbvisualizer.adoc             |   136 +
 .../src/solr-jdbc-python-jython.adoc            |   142 +
 solr/solr-ref-guide/src/solr-jdbc-r.adoc        |    53 +
 .../src/solr-jdbc-squirrel-sql.adoc             |    96 +
 solr/solr-ref-guide/src/solr-plugins.adoc       |    26 +
 .../solrcloud-configuration-and-parameters.adoc |    34 +
 ...lrcloud-with-legacy-configuration-files.adoc |    71 +
 solr/solr-ref-guide/src/solrcloud.adoc          |    47 +
 solr/solr-ref-guide/src/spatial-search.adoc     |   371 +
 solr/solr-ref-guide/src/spell-checking.adoc     |   390 +
 solr/solr-ref-guide/src/stream-decorators.adoc  |   848 ++
 solr/solr-ref-guide/src/stream-evaluators.adoc  |   461 +
 solr/solr-ref-guide/src/stream-screen.adoc      |    28 +
 solr/solr-ref-guide/src/stream-sources.adoc     |   503 +
 .../src/streaming-expressions.adoc              |   146 +
 solr/solr-ref-guide/src/suggester.adoc          |   476 +
 .../src/taking-solr-to-production.adoc          |   303 +
 .../src/the-dismax-query-parser.adoc            |   231 +
 .../src/the-extended-dismax-query-parser.adoc   |   264 +
 .../src/the-query-elevation-component.adoc      |   154 +
 .../src/the-standard-query-parser.adoc          |   418 +
 .../solr-ref-guide/src/the-stats-component.adoc |   184 +
 .../src/the-term-vector-component.adoc          |   163 +
 .../solr-ref-guide/src/the-terms-component.adoc |   311 +
 .../src/the-well-configured-solr-instance.adoc  |    43 +
 solr/solr-ref-guide/src/thread-dump.adoc        |    49 +
 solr/solr-ref-guide/src/tokenizers.adoc         |   517 +
 .../transforming-and-indexing-custom-json.adoc  |   378 +
 .../src/transforming-result-documents.adoc      |   340 +
 solr/solr-ref-guide/src/uima-integration.adoc   |   126 +
 ...anding-analyzers-tokenizers-and-filters.adoc |    60 +
 .../src/update-request-processors.adoc          |   397 +
 .../src/updatehandlers-in-solrconfig.adoc       |   150 +
 .../src/updating-parts-of-documents.adoc        |   289 +
 .../src/upgrading-a-solr-cluster.adoc           |   105 +
 solr/solr-ref-guide/src/upgrading-solr.adoc     |    82 +
 .../src/uploading-data-with-index-handlers.adoc |   562 +
 ...g-data-with-solr-cell-using-apache-tika.adoc |   361 +
 ...store-data-with-the-data-import-handler.adoc |  1048 ++
 solr/solr-ref-guide/src/using-javascript.adoc   |    29 +
 .../solr-ref-guide/src/using-jmx-with-solr.adoc |   124 +
 solr/solr-ref-guide/src/using-python.adoc       |    77 +
 .../src/using-solr-from-ruby.adoc               |   116 +
 solr/solr-ref-guide/src/using-solrj.adoc        |   165 +
 ...-the-solr-administration-user-interface.adoc |    50 +
 ...zookeeper-to-manage-configuration-files.adoc |    97 +
 solr/solr-ref-guide/src/v2-api.adoc             |   193 +
 .../src/velocity-response-writer.adoc           |   123 +
 solr/solr-ref-guide/src/velocity-search-ui.adoc |    28 +
 ...king-with-currencies-and-exchange-rates.adoc |   104 +
 solr/solr-ref-guide/src/working-with-dates.adoc |   173 +
 .../src/working-with-enum-fields.adoc           |    76 +
 ...rking-with-external-files-and-processes.adoc |   310 +
 .../src/zookeeper-access-control.adoc           |   164 +
 .../tools/BuildNavAndPDFBody.java               |   283 +
 .../tools/CheckLinksAndAnchors.java             |   229 +
 solr/solr-ref-guide/tools/ReducePDFSize.java    |    90 +
 solr/solrj/ivy.xml                              |     1 +
 .../solr/client/solrj/impl/CloudSolrClient.java |   302 +-
 .../solrj/impl/ConcurrentUpdateSolrClient.java  |    74 +-
 .../impl/DelegationTokenHttpSolrClient.java     |    24 +-
 .../solr/client/solrj/impl/HttpSolrClient.java  |    59 +-
 .../client/solrj/impl/LBHttpSolrClient.java     |    76 +-
 .../solrj/impl/SolrClientDataProvider.java      |    39 +-
 .../impl/SolrHttpClientContextBuilder.java      |     8 -
 .../org/apache/solr/client/solrj/io/Tuple.java  |     8 +-
 .../solrj/io/comp/SingleValueComparator.java    |    65 +
 .../solrj/io/eval/AbsoluteValueEvaluator.java   |     3 -
 .../solr/client/solrj/io/eval/AddEvaluator.java |     7 +-
 .../solr/client/solrj/io/eval/AndEvaluator.java |     3 -
 .../client/solrj/io/eval/AnovaEvaluator.java    |    81 +
 .../solrj/io/eval/ArcCosineEvaluator.java       |     3 -
 .../client/solrj/io/eval/ArcSineEvaluator.java  |     3 -
 .../solrj/io/eval/ArcTangentEvaluator.java      |     3 -
 .../client/solrj/io/eval/ArrayEvaluator.java    |    63 +
 .../solrj/io/eval/ArraySortEvaluator.java       |    77 +
 .../client/solrj/io/eval/BooleanEvaluator.java  |     3 -
 .../client/solrj/io/eval/CeilingEvaluator.java  |     3 -
 .../client/solrj/io/eval/CoalesceEvaluator.java |     3 -
 .../client/solrj/io/eval/ColumnEvaluator.java   |    76 +
 .../client/solrj/io/eval/ComplexEvaluator.java  |     7 +
 .../solrj/io/eval/ConditionalEvaluator.java     |     3 -
 .../solrj/io/eval/ConvolutionEvaluator.java     |    86 +
 .../client/solrj/io/eval/CopyOfEvaluator.java   |    82 +
 .../solrj/io/eval/CopyOfRangeEvaluator.java     |    83 +
 .../solrj/io/eval/CorrelationEvaluator.java     |    80 +
 .../client/solrj/io/eval/CosineEvaluator.java   |     3 -
 .../solrj/io/eval/CovarianceEvaluator.java      |    80 +
 .../solrj/io/eval/CubedRootEvaluator.java       |     3 -
 .../io/eval/CumulativeProbabilityEvaluator.java |    66 +
 .../client/solrj/io/eval/DescribeEvaluator.java |    90 +
 .../client/solrj/io/eval/DistanceEvaluator.java |    80 +
 .../client/solrj/io/eval/DivideEvaluator.java   |     3 -
 .../io/eval/EmpiricalDistributionEvaluator.java |   127 +
 .../client/solrj/io/eval/EqualsEvaluator.java   |     3 -
 .../solrj/io/eval/ExclusiveOrEvaluator.java     |     3 -
 .../client/solrj/io/eval/FieldEvaluator.java    |    20 +-
 .../solrj/io/eval/FindDelayEvaluator.java       |    95 +
 .../client/solrj/io/eval/FloorEvaluator.java    |     3 -
 .../io/eval/GreaterThanEqualToEvaluator.java    |     3 -
 .../solrj/io/eval/GreaterThanEvaluator.java     |     3 -
 .../solrj/io/eval/HistogramEvaluator.java       |   100 +
 .../io/eval/HyperbolicCosineEvaluator.java      |     3 -
 .../solrj/io/eval/HyperbolicSineEvaluator.java  |     3 -
 .../io/eval/HyperbolicTangentEvaluator.java     |     3 -
 .../solrj/io/eval/IfThenElseEvaluator.java      |     3 -
 .../client/solrj/io/eval/LengthEvaluator.java   |    58 +
 .../solrj/io/eval/LessThanEqualToEvaluator.java |     3 -
 .../client/solrj/io/eval/LessThanEvaluator.java |     3 -
 .../client/solrj/io/eval/ModuloEvaluator.java   |     3 -
 .../solrj/io/eval/MovingAverageEvaluator.java   |    83 +
 .../client/solrj/io/eval/MultiplyEvaluator.java |     3 -
 .../solrj/io/eval/NaturalLogEvaluator.java      |     3 -
 .../solrj/io/eval/NormalizeEvaluator.java       |    74 +
 .../solr/client/solrj/io/eval/NotEvaluator.java |     3 -
 .../client/solrj/io/eval/NumberEvaluator.java   |    16 +-
 .../solr/client/solrj/io/eval/OrEvaluator.java  |     3 -
 .../solrj/io/eval/PercentileEvaluator.java      |    74 +
 .../client/solrj/io/eval/PowerEvaluator.java    |     3 -
 .../client/solrj/io/eval/PredictEvaluator.java  |    66 +
 .../client/solrj/io/eval/RankEvaluator.java     |    78 +
 .../client/solrj/io/eval/RawValueEvaluator.java |     3 -
 .../solrj/io/eval/RegressionEvaluator.java      |   110 +
 .../client/solrj/io/eval/ReverseEvaluator.java  |    70 +
 .../client/solrj/io/eval/RoundEvaluator.java    |     3 -
 .../client/solrj/io/eval/ScaleEvaluator.java    |    81 +
 .../client/solrj/io/eval/SequenceEvaluator.java |    77 +
 .../client/solrj/io/eval/SimpleEvaluator.java   |     6 +-
 .../client/solrj/io/eval/SineEvaluator.java     |     3 -
 .../solrj/io/eval/SquareRootEvaluator.java      |     3 -
 .../client/solrj/io/eval/StreamEvaluator.java   |    29 +-
 .../client/solrj/io/eval/SubtractEvaluator.java |     3 -
 .../client/solrj/io/eval/TangentEvaluator.java  |     3 -
 .../solrj/io/graph/ShortestPathStream.java      |    25 -
 .../solr/client/solrj/io/stream/CellStream.java |   152 +
 .../client/solrj/io/stream/CloudSolrStream.java |    21 -
 .../client/solrj/io/stream/FacetStream.java     |    16 -
 .../solr/client/solrj/io/stream/GetStream.java  |   125 +
 .../solr/client/solrj/io/stream/JDBCStream.java |   342 +-
 .../solr/client/solrj/io/stream/KnnStream.java  |   256 +
 .../solr/client/solrj/io/stream/LetStream.java  |   167 +
 .../solr/client/solrj/io/stream/ListStream.java |   145 +
 .../client/solrj/io/stream/RandomStream.java    |     4 +-
 .../solr/client/solrj/io/stream/SolrStream.java |    27 +-
 .../solr/client/solrj/io/stream/SqlStream.java  |   224 +
 .../client/solrj/io/stream/StatsStream.java     |    75 +-
 .../client/solrj/io/stream/StreamContext.java   |     5 +
 .../solrj/io/stream/TimeSeriesStream.java       |   413 +
 .../client/solrj/io/stream/TopicStream.java     |    19 -
 .../solr/client/solrj/io/stream/TupStream.java  |   218 +
 .../client/solrj/io/stream/TupleStream.java     |    37 +-
 .../io/stream/expr/StreamExpressionParser.java  |     2 +-
 .../solrj/io/stream/expr/StreamFactory.java     |    27 +-
 .../solrj/request/CollectionAdminRequest.java   |   967 +-
 .../solrj/request/CollectionApiMapping.java     |   407 +
 .../client/solrj/request/CoreApiMapping.java    |   118 +
 .../solr/client/solrj/request/V2Request.java    |   127 +
 .../solrj/request/schema/SchemaRequest.java     |    19 -
 .../client/solrj/response/TermsResponse.java    |     3 +-
 .../response/schema/SchemaRepresentation.java   |    20 -
 .../solrj/response/schema/SchemaResponse.java   |    33 -
 .../solr/client/solrj/util/ClientUtils.java     |    29 +
 .../org/apache/solr/cloud/autoscaling/Cell.java |    58 +-
 .../apache/solr/cloud/autoscaling/Clause.java   |   173 +-
 .../cloud/autoscaling/ClusterDataProvider.java  |     6 +-
 .../apache/solr/cloud/autoscaling/Operand.java  |    58 +-
 .../apache/solr/cloud/autoscaling/Policy.java   |    67 +-
 .../solr/cloud/autoscaling/PolicyHelper.java    |    18 +-
 .../solr/cloud/autoscaling/Preference.java      |    11 +-
 .../org/apache/solr/cloud/autoscaling/Row.java  |    13 +-
 .../apache/solr/common/cloud/DocCollection.java |    65 +-
 .../org/apache/solr/common/cloud/Replica.java   |    32 +
 .../org/apache/solr/common/cloud/Slice.java     |    21 +-
 .../apache/solr/common/cloud/SolrZkClient.java  |     7 +-
 .../apache/solr/common/cloud/ZkStateReader.java |    18 +-
 .../solr/common/cloud/rule/ImplicitSnitch.java  |    48 +-
 .../apache/solr/common/cloud/rule/Snitch.java   |     6 +-
 .../solr/common/cloud/rule/SnitchContext.java   |     3 +-
 .../solr/common/params/AnalysisParams.java      |     2 +-
 .../common/params/CollectionAdminParams.java    |    10 +
 .../solr/common/params/CollectionParams.java    |     1 +
 .../apache/solr/common/params/CommonParams.java |     4 +-
 .../solr/common/params/CoreAdminParams.java     |     5 +
 .../solr/common/params/HighlightParams.java     |    33 +-
 .../common/params/ModifiableSolrParams.java     |     4 +
 .../apache/solr/common/params/SolrParams.java   |    23 +-
 .../solr/common/util/CommandOperation.java      |   346 +
 .../apache/solr/common/util/ExecutorUtil.java   |    41 -
 .../solr/common/util/JsonRecordReader.java      |     1 +
 .../org/apache/solr/common/util/NamedList.java  |    23 +-
 .../solr/common/util/SimpleOrderedMap.java      |     9 +-
 .../java/org/apache/solr/common/util/Utils.java |    39 +-
 .../solrj/solr/collection1/conf/schema-sql.xml  |     1 -
 .../solrj/solr/collection1/conf/schema.xml      |     1 -
 .../solr/configsets/shared/conf/schema.xml      |     6 -
 .../solr/configsets/shared/conf/solrconfig.xml  |     6 +
 .../solr/configsets/streaming/conf/schema.xml   |     1 -
 .../configsets/streaming/conf/solrconfig.xml    |     8 +-
 .../solrj/solr/crazy-path-to-schema.xml         |     1 -
 .../solrj/solr/multicore/core0/conf/schema.xml  |     6 -
 .../solr/multicore/core0/conf/solrconfig.xml    |     6 +
 .../solrj/solr/multicore/core1/conf/schema.xml  |     6 -
 .../solr/multicore/core1/conf/solrconfig.xml    |     6 +
 ...ollectionAdminRequestRequiredParamsTest.java |   136 +-
 .../embedded/SolrExampleStreamingTest.java      |     2 +-
 .../solrj/impl/BasicHttpSolrClientTest.java     |    18 +-
 .../CloudSolrClientMultiConstructorTest.java    |     4 +-
 .../impl/ConcurrentUpdateSolrClientTest.java    |    23 +-
 .../solrj/io/graph/GraphExpressionTest.java     |     2 +-
 .../client/solrj/io/stream/JDBCStreamTest.java  |    34 +-
 .../solrj/io/stream/StreamExpressionTest.java   |  1692 ++-
 .../stream/eval/AbsoluteValueEvaluatorTest.java |    33 +-
 .../solrj/io/stream/eval/AddEvaluatorTest.java  |     6 -
 .../solr/client/solrj/request/SchemaTest.java   |    10 -
 .../request/TestCollectionAdminRequest.java     |    84 +-
 .../client/solrj/request/TestV2Request.java     |    89 +
 .../solr/cloud/autoscaling/TestPolicy.java      |   298 +-
 .../solr/BaseDistributedSearchTestCase.java     |     3 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |   172 +-
 .../cloud/AbstractFullDistribZkTestBase.java    |   287 +-
 .../java/org/apache/solr/cloud/ChaosMonkey.java |   159 +-
 .../apache/solr/cloud/SolrCloudTestCase.java    |     6 +-
 .../solr/cloud/StoppableCommitThread.java       |    69 +
 .../solr/cloud/StoppableIndexingThread.java     |     2 +-
 .../solr/cloud/StoppableSearchThread.java       |     2 +-
 .../org/apache/solr/util/SSLTestConfig.java     |    58 +-
 .../java/org/apache/solr/util/TestHarness.java  |    10 +-
 solr/webapp/web/WEB-INF/web.xml                 |     5 -
 solr/webapp/web/WEB-INF/weblogic.xml            |    28 -
 solr/webapp/web/css/angular/java-properties.css |    52 +
 solr/webapp/web/css/angular/plugins.css         |     6 +
 solr/webapp/web/css/chosen.css                  |   421 -
 solr/webapp/web/css/styles/analysis.css         |   311 -
 solr/webapp/web/css/styles/cloud.css            |   410 -
 solr/webapp/web/css/styles/common.css           |   731 --
 solr/webapp/web/css/styles/cores.css            |   244 -
 solr/webapp/web/css/styles/dashboard.css        |   155 -
 solr/webapp/web/css/styles/dataimport.css       |   403 -
 solr/webapp/web/css/styles/documents.css        |   197 -
 solr/webapp/web/css/styles/files.css            |    54 -
 solr/webapp/web/css/styles/index.css            |   207 -
 solr/webapp/web/css/styles/java-properties.css  |    52 -
 solr/webapp/web/css/styles/logging.css          |   391 -
 solr/webapp/web/css/styles/menu.css             |   329 -
 solr/webapp/web/css/styles/plugins.css          |   195 -
 solr/webapp/web/css/styles/query.css            |   173 -
 solr/webapp/web/css/styles/replication.css      |   515 -
 solr/webapp/web/css/styles/schema-browser.css   |   578 -
 solr/webapp/web/css/styles/segments.css         |   145 -
 solr/webapp/web/css/styles/threads.css          |   172 -
 solr/webapp/web/index.html                      |    10 +-
 solr/webapp/web/js/angular/app.js               |   334 -
 .../web/js/angular/controllers/analysis.js      |    10 -
 solr/webapp/web/js/angular/controllers/cloud.js |    98 -
 .../web/js/angular/controllers/core-overview.js |    32 -
 solr/webapp/web/js/angular/controllers/cores.js |   283 -
 .../webapp/web/js/angular/controllers/schema.js |    21 -
 solr/webapp/web/js/lib/ZeroClipboard.js         |   342 -
 solr/webapp/web/js/lib/chosen.js                |   982 --
 solr/webapp/web/js/lib/console.js               |    29 -
 solr/webapp/web/js/lib/d3.js                    |  9373 --------------
 solr/webapp/web/js/lib/highlight.js             |    31 -
 solr/webapp/web/js/lib/jquery-1.7.2.min.js      |    30 -
 solr/webapp/web/js/lib/jquery.ajaxfileupload.js |   184 -
 solr/webapp/web/js/lib/jquery.blockUI.js        |   523 -
 solr/webapp/web/js/lib/jquery.cookie.js         |    71 -
 solr/webapp/web/js/lib/jquery.form.js           |   806 --
 solr/webapp/web/js/lib/jquery.jstree.js         |  3534 -----
 solr/webapp/web/js/lib/jquery.sammy.js          |  1863 ---
 solr/webapp/web/js/lib/jquery.timeago.js        |   189 -
 solr/webapp/web/js/lib/linker.js                |    48 -
 solr/webapp/web/js/lib/naturalSort.js           |    82 -
 solr/webapp/web/js/lib/order.js                 |   216 -
 solr/webapp/web/js/main.js                      |    60 -
 solr/webapp/web/js/require.js                   | 11349 -----------------
 solr/webapp/web/js/scripts/analysis.js          |   545 -
 solr/webapp/web/js/scripts/app.js               |   669 -
 solr/webapp/web/js/scripts/cloud.js             |   877 --
 solr/webapp/web/js/scripts/cores.js             |   719 --
 solr/webapp/web/js/scripts/dashboard.js         |   562 -
 solr/webapp/web/js/scripts/dataimport.js        |   812 --
 solr/webapp/web/js/scripts/documents.js         |   362 -
 solr/webapp/web/js/scripts/files.js             |   270 -
 solr/webapp/web/js/scripts/index.js             |   340 -
 solr/webapp/web/js/scripts/java-properties.js   |   106 -
 solr/webapp/web/js/scripts/logging.js           |   578 -
 solr/webapp/web/js/scripts/ping.js              |    72 -
 solr/webapp/web/js/scripts/plugins.js           |   462 -
 solr/webapp/web/js/scripts/query.js             |   229 -
 solr/webapp/web/js/scripts/replication.js       |   527 -
 solr/webapp/web/js/scripts/schema-browser.js    |  1229 --
 solr/webapp/web/js/scripts/segments.js          |   206 -
 solr/webapp/web/js/scripts/threads.js           |   158 -
 solr/webapp/web/libs/jquery-1.7.2.min.js        |    30 +
 solr/webapp/web/old.html                        |   169 -
 solr/webapp/web/partials/plugins.html           |     6 +-
 solr/webapp/web/partials/schema.html            |     3 -
 solr/webapp/web/tpl/analysis.html               |    83 -
 solr/webapp/web/tpl/cloud.html                  |    87 -
 solr/webapp/web/tpl/cores.html                  |   226 -
 solr/webapp/web/tpl/dashboard.html              |   201 -
 solr/webapp/web/tpl/dataimport.html             |   183 -
 solr/webapp/web/tpl/documents.html              |   100 -
 solr/webapp/web/tpl/files.html                  |    44 -
 solr/webapp/web/tpl/index.html                  |   250 -
 solr/webapp/web/tpl/logging.html                |    23 -
 solr/webapp/web/tpl/plugins.html                |    39 -
 solr/webapp/web/tpl/query.html                  |   361 -
 solr/webapp/web/tpl/replication.html            |   216 -
 solr/webapp/web/tpl/schema-browser.html         |   192 -
 solr/webapp/web/tpl/segments.html               |    49 -
 solr/webapp/web/tpl/threads.html                |    56 -
 1464 files changed, 90368 insertions(+), 68423 deletions(-)
----------------------------------------------------------------------



[09/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-8668: In solrconfig.xml remove (and related and ) support in favor of the element introduced by SOLR-8621 in Solr 5.5.0. (Christine Poers

Posted by sh...@apache.org.
SOLR-8668: In solrconfig.xml remove <mergePolicy> (and related <mergeFactor> and <maxMergeDocs>)
support in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
(Christine Poerschke, hossman)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/c64f9d64
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/c64f9d64
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/c64f9d64

Branch: refs/heads/feature/autoscaling
Commit: c64f9d64b4edc8c3761368befc394e879b2284ff
Parents: 445ceda
Author: Christine Poerschke <cp...@apache.org>
Authored: Fri Jun 2 13:59:08 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Fri Jun 2 13:59:08 2017 +0100

----------------------------------------------------------------------
 solr/CHANGES.txt                                |   7 +
 .../org/apache/solr/update/SolrIndexConfig.java | 146 ++-----------------
 .../solr/collection1/conf/bad-mp-solrconfig.xml |  36 -----
 .../collection1/conf/solrconfig-delpolicy1.xml  |   3 +-
 .../collection1/conf/solrconfig-delpolicy2.xml  |   3 +-
 .../collection1/conf/solrconfig-indexconfig.xml |  31 ----
 .../conf/solrconfig-indexmetrics.xml            |   8 +-
 .../conf/solrconfig-logmergepolicy.xml          |  36 -----
 .../conf/solrconfig-mergepolicy-legacy.xml      |   1 -
 .../conf/solrconfig-mergepolicy-nocfs.xml       |  34 -----
 .../conf/solrconfig-spellcheckcomponent.xml     |   3 +-
 .../conf/solrconfig-tieredmergepolicy.xml       |  48 ------
 .../solr/collection1/conf/solrconfig-warmer.xml |  46 ------
 .../solrconfig.snippet.randomindexconfig.xml    |   3 +-
 .../org/apache/solr/TestGroupingSearch.java     |   3 -
 .../solr/cloud/TestAuthenticationFramework.java |  11 +-
 .../solr/cloud/TestMiniSolrCloudCluster.java    |  11 +-
 .../cloud/TestSolrCloudWithKerberosAlt.java     |  11 +-
 .../org/apache/solr/core/TestBadConfig.java     |   2 -
 .../test/org/apache/solr/core/TestConfig.java   |   9 +-
 .../apache/solr/core/TestMergePolicyConfig.java |  18 +--
 .../test/org/apache/solr/core/TestNRTOpen.java  |   3 -
 .../apache/solr/core/TestSolrIndexConfig.java   |   2 +-
 .../admin/SegmentsInfoRequestHandlerTest.java   |   2 -
 .../solr/schema/TestHalfAndHalfDocValues.java   |   4 -
 .../apache/solr/search/TestIndexSearcher.java   |   3 -
 .../solr/update/DirectUpdateHandlerTest.java    |   3 -
 .../solr/update/SolrCmdDistributorTest.java     |   3 -
 .../apache/solr/update/SolrIndexConfigTest.java |  36 ++---
 .../solr/update/TestInPlaceUpdatesDistrib.java  |   4 -
 .../update/TestInPlaceUpdatesStandalone.java    |   4 -
 .../java/org/apache/solr/SolrTestCaseJ4.java    |  35 -----
 32 files changed, 52 insertions(+), 517 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d8c9d04..195443d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -86,6 +86,9 @@ Upgrading from Solr 6.x
   this QParser untill Solr 8, you must explicitly register it in your solrconfig.xml:
      '<queryParser name="lucenePlusSort" class="solr.OldLuceneQParserPlugin"/>'
 
+* In solrconfig.xml the deprecated <mergePolicy> and <mergeFactor> and <maxMergeDocs> elements have
+  been removed in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
+
 New Features
 ----------------------
 * SOLR-9857, SOLR-9858: Collect aggregated metrics from nodes and shard leaders in overseer. (ab)
@@ -218,6 +221,10 @@ Other Changes
 * LUCENE-7852: Correct copyright year(s) in solr/LICENSE.txt file.
   (Christine Poerschke, Steve Rowe)
 
+* SOLR-8668: In solrconfig.xml remove <mergePolicy> (and related <mergeFactor> and <maxMergeDocs>)
+  support in favor of the <mergePolicyFactory> element introduced by SOLR-8621 in Solr 5.5.0.
+  (Christine Poerschke, hossman)
+
 ==================  6.7.0 ==================
 
 Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this release.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
index 26b9839..c663783 100644
--- a/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
+++ b/solr/core/src/java/org/apache/solr/update/SolrIndexConfig.java
@@ -27,10 +27,8 @@ import org.apache.lucene.analysis.DelegatingAnalyzerWrapper;
 import org.apache.lucene.index.ConcurrentMergeScheduler;
 import org.apache.lucene.index.IndexWriter.IndexReaderWarmer;
 import org.apache.lucene.index.IndexWriterConfig;
-import org.apache.lucene.index.LogMergePolicy;
 import org.apache.lucene.index.MergePolicy;
 import org.apache.lucene.index.MergeScheduler;
-import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.search.Sort;
 import org.apache.lucene.util.InfoStream;
 import org.apache.lucene.util.Version;
@@ -66,17 +64,14 @@ public class SolrIndexConfig implements MapSerializable {
   public static final String DEFAULT_MERGE_SCHEDULER_CLASSNAME = ConcurrentMergeScheduler.class.getName();
   public final Version luceneVersion;
 
-  private boolean effectiveUseCompoundFileSetting;
+  public final boolean useCompoundFile;
 
   public final int maxBufferedDocs;
-  public final int maxMergeDocs;
-  public final int mergeFactor;
 
   public final double ramBufferSizeMB;
 
   public final int writeLockTimeout;
   public final String lockType;
-  public final PluginInfo mergePolicyInfo;
   public final PluginInfo mergePolicyFactoryInfo;
   public final PluginInfo mergeSchedulerInfo;
   public final PluginInfo metricsInfo;
@@ -90,14 +85,11 @@ public class SolrIndexConfig implements MapSerializable {
    */
   private SolrIndexConfig(SolrConfig solrConfig) {
     luceneVersion = solrConfig.luceneMatchVersion;
-    effectiveUseCompoundFileSetting = false;
+    useCompoundFile = false;
     maxBufferedDocs = -1;
-    maxMergeDocs = -1;
-    mergeFactor = -1;
     ramBufferSizeMB = 100;
     writeLockTimeout = -1;
     lockType = DirectoryFactory.LOCK_TYPE_NATIVE;
-    mergePolicyInfo = null;
     mergePolicyFactoryInfo = null;
     mergeSchedulerInfo = null;
     mergedSegmentWarmerInfo = null;
@@ -132,17 +124,15 @@ public class SolrIndexConfig implements MapSerializable {
     assertWarnOrFail("The <mergeScheduler>myclass</mergeScheduler> syntax is no longer supported in solrconfig.xml. Please use syntax <mergeScheduler class=\"myclass\"/> instead.",
         !((solrConfig.getNode(prefix + "/mergeScheduler", false) != null) && (solrConfig.get(prefix + "/mergeScheduler/@class", null) == null)),
         true);
-    assertWarnOrFail("The <mergePolicy>myclass</mergePolicy> syntax is no longer supported in solrconfig.xml. Please use syntax <mergePolicy class=\"myclass\"/> instead.",
+    assertWarnOrFail("Beginning with Solr 7.0, <mergePolicy>myclass</mergePolicy> is no longer supported, use <mergePolicyFactory> instead.",
         !((solrConfig.getNode(prefix + "/mergePolicy", false) != null) && (solrConfig.get(prefix + "/mergePolicy/@class", null) == null)),
         true);
     assertWarnOrFail("The <luceneAutoCommit>true|false</luceneAutoCommit> parameter is no longer valid in solrconfig.xml.",
         solrConfig.get(prefix + "/luceneAutoCommit", null) == null,
         true);
 
-    effectiveUseCompoundFileSetting = solrConfig.getBool(prefix+"/useCompoundFile", def.getUseCompoundFile());
+    useCompoundFile = solrConfig.getBool(prefix+"/useCompoundFile", def.useCompoundFile);
     maxBufferedDocs=solrConfig.getInt(prefix+"/maxBufferedDocs",def.maxBufferedDocs);
-    maxMergeDocs=solrConfig.getInt(prefix+"/maxMergeDocs",def.maxMergeDocs);
-    mergeFactor=solrConfig.getInt(prefix+"/mergeFactor",def.mergeFactor);
     ramBufferSizeMB = solrConfig.getDouble(prefix+"/ramBufferSizeMB", def.ramBufferSizeMB);
 
     writeLockTimeout=solrConfig.getInt(prefix+"/writeLockTimeout", def.writeLockTimeout);
@@ -155,24 +145,17 @@ public class SolrIndexConfig implements MapSerializable {
       metricsInfo = infos.get(0);
     }
     mergeSchedulerInfo = getPluginInfo(prefix + "/mergeScheduler", solrConfig, def.mergeSchedulerInfo);
-    mergePolicyInfo = getPluginInfo(prefix + "/mergePolicy", solrConfig, def.mergePolicyInfo);
     mergePolicyFactoryInfo = getPluginInfo(prefix + "/mergePolicyFactory", solrConfig, def.mergePolicyFactoryInfo);
-    if (mergePolicyInfo != null && mergePolicyFactoryInfo != null) {
-      throw new IllegalArgumentException("<mergePolicy> and <mergePolicyFactory> are mutually exclusive.");
-    }
-    if (maxMergeDocs != def.maxMergeDocs && mergePolicyFactoryInfo != null) {
-      throw new IllegalArgumentException("<maxMergeDocs> and <mergePolicyFactory> are mutually exclusive.");
-    }
-    if (mergeFactor != def.mergeFactor && mergePolicyFactoryInfo != null) {
-      throw new IllegalArgumentException("<mergeFactor> and <mergePolicyFactory> are mutually exclusive.");
-    }
 
-    assertWarnOrFail("Beginning with Solr 5.5, <mergePolicy> is deprecated, use <mergePolicyFactory> instead.",
-        (mergePolicyInfo == null), false);
-    assertWarnOrFail("Beginning with Solr 5.5, <maxMergeDocs> is deprecated, configure it on the relevant <mergePolicyFactory> instead.",
-        (maxMergeDocs == def.maxMergeDocs), false);
-    assertWarnOrFail("Beginning with Solr 5.5, <mergeFactor> is deprecated, configure it on the relevant <mergePolicyFactory> instead.",
-        (mergeFactor == def.mergeFactor), false);
+    assertWarnOrFail("Beginning with Solr 7.0, <mergePolicy> is no longer supported, use <mergePolicyFactory> instead.",
+        getPluginInfo(prefix + "/mergePolicy", solrConfig, null) == null,
+        true);
+    assertWarnOrFail("Beginning with Solr 7.0, <maxMergeDocs> is no longer supported, configure it on the relevant <mergePolicyFactory> instead.",
+        solrConfig.getInt(prefix+"/maxMergeDocs", 0) == 0,
+        true);
+    assertWarnOrFail("Beginning with Solr 7.0, <mergeFactor> is no longer supported, configure it on the relevant <mergePolicyFactory> instead.",
+        solrConfig.getInt(prefix+"/mergeFactor", 0) == 0,
+        true);
 
     String val = solrConfig.get(prefix + "/termIndexInterval", null);
     if (val != null) {
@@ -198,10 +181,8 @@ public class SolrIndexConfig implements MapSerializable {
 
   @Override
   public Map<String, Object> toMap(Map<String, Object> map) {
-    Map<String, Object> m = Utils.makeMap("useCompoundFile", effectiveUseCompoundFileSetting,
+    Map<String, Object> m = Utils.makeMap("useCompoundFile", useCompoundFile,
         "maxBufferedDocs", maxBufferedDocs,
-        "maxMergeDocs", maxMergeDocs,
-        "mergeFactor", mergeFactor,
         "ramBufferSizeMB", ramBufferSizeMB,
         "writeLockTimeout", writeLockTimeout,
         "lockType", lockType,
@@ -210,9 +191,7 @@ public class SolrIndexConfig implements MapSerializable {
     if (metricsInfo != null) {
       m.put("metrics", metricsInfo);
     }
-    if (mergePolicyInfo != null) {
-      m.put("mergePolicy", mergePolicyInfo);
-    } else if (mergePolicyFactoryInfo != null) {
+    if (mergePolicyFactoryInfo != null) {
       m.put("mergePolicyFactory", mergePolicyFactoryInfo);
     }
     if(mergedSegmentWarmerInfo != null) m.put("mergedSegmentWarmer",mergedSegmentWarmerInfo);
@@ -259,9 +238,7 @@ public class SolrIndexConfig implements MapSerializable {
       iwc.setIndexSort(indexSort);
     }
 
-    // do this after buildMergePolicy since the backcompat logic 
-    // there may modify the effective useCompoundFile
-    iwc.setUseCompoundFile(getUseCompoundFile());
+    iwc.setUseCompoundFile(useCompoundFile);
 
     if (mergedSegmentWarmerInfo != null) {
       // TODO: add infostream -> normal logging system (there is an issue somewhere)
@@ -276,19 +253,12 @@ public class SolrIndexConfig implements MapSerializable {
     return iwc;
   }
 
-  private boolean useMergePolicyInfo() {
-    return mergePolicyInfo != null || maxMergeDocs != -1 || mergeFactor != -1;
-  }
-
   /**
    * Builds a MergePolicy using the configured MergePolicyFactory
    * or if no factory is configured uses the configured mergePolicy PluginInfo.
    */
   @SuppressWarnings("unchecked")
   private MergePolicy buildMergePolicy(final IndexSchema schema) {
-    if (useMergePolicyInfo()) {
-      return buildMergePolicyFromInfo(schema);
-    }
 
     final String mpfClassName;
     final MergePolicyFactoryArgs mpfArgs;
@@ -311,59 +281,6 @@ public class SolrIndexConfig implements MapSerializable {
     return mpf.getMergePolicy();
   }
 
-  /**
-   * Builds a MergePolicy, may also modify the value returned by
-   * getUseCompoundFile() for use by the IndexWriterConfig if 
-   * "useCompoundFile" is specified as an init arg for 
-   * an out of the box MergePolicy that no longer supports it
-   *
-   * @see #fixUseCFMergePolicyInitArg
-   * @see #getUseCompoundFile
-   */
-  private MergePolicy buildMergePolicyFromInfo(IndexSchema schema) {
-    final MergePolicy policy;
-    if (mergePolicyInfo == null) {
-      final SolrResourceLoader resourceLoader = schema.getResourceLoader();
-      final MergePolicyFactoryArgs mpfArgs = new MergePolicyFactoryArgs();
-      final MergePolicyFactory defaultMergePolicyFactory = resourceLoader.newInstance(
-          DEFAULT_MERGE_POLICY_FACTORY_CLASSNAME,
-          MergePolicyFactory.class,
-          NO_SUB_PACKAGES,
-          new Class[] { SolrResourceLoader.class, MergePolicyFactoryArgs.class, IndexSchema.class },
-          new Object[] { resourceLoader, mpfArgs, schema });
-      policy = defaultMergePolicyFactory.getMergePolicy();
-    } else {
-      policy = schema.getResourceLoader().newInstance(mergePolicyInfo.className, MergePolicy.class);
-    }
-
-    if (policy instanceof LogMergePolicy) {
-      LogMergePolicy logMergePolicy = (LogMergePolicy) policy;
-      fixUseCFMergePolicyInitArg(LogMergePolicy.class);
-
-      if (maxMergeDocs != -1)
-        logMergePolicy.setMaxMergeDocs(maxMergeDocs);
-
-      if (mergeFactor != -1)
-        logMergePolicy.setMergeFactor(mergeFactor);
-    } else if (policy instanceof TieredMergePolicy) {
-      TieredMergePolicy tieredMergePolicy = (TieredMergePolicy) policy;
-      fixUseCFMergePolicyInitArg(TieredMergePolicy.class);
-
-      if (mergeFactor != -1) {
-        tieredMergePolicy.setMaxMergeAtOnce(mergeFactor);
-        tieredMergePolicy.setSegmentsPerTier(mergeFactor);
-      }
-    } else if (mergeFactor != -1) {
-      log.warn("Use of <mergeFactor> cannot be configured if merge policy is not an instance of LogMergePolicy or TieredMergePolicy. The configured policy's defaults will be used.");
-    }
-
-    if (mergePolicyInfo != null) {
-      SolrPluginUtils.invokeSetters(policy, mergePolicyInfo.initArgs);
-    }
-
-    return policy;
-  }
-
   private MergeScheduler buildMergeScheduler(IndexSchema schema) {
     String msClassName = mergeSchedulerInfo == null ? SolrIndexConfig.DEFAULT_MERGE_SCHEDULER_CLASSNAME : mergeSchedulerInfo.className;
     MergeScheduler scheduler = schema.getResourceLoader().newInstance(msClassName, MergeScheduler.class);
@@ -391,35 +308,4 @@ public class SolrIndexConfig implements MapSerializable {
     return scheduler;
   }
 
-  public boolean getUseCompoundFile() {
-    return effectiveUseCompoundFileSetting;
-  }
-
-  /**
-   * Lucene 4.4 removed the setUseCompoundFile(boolean) method from the two 
-   * conrete MergePolicies provided with Lucene/Solr and added it to the 
-   * IndexWriterConfig.  
-   * In the event that users have a value explicitly configured for this 
-   * setter in their MergePolicy init args, we remove it from the MergePolicy 
-   * init args, update the 'effective' useCompoundFile setting used by the 
-   * IndexWriterConfig, and warn about discontinuing to use this init arg.
-   * 
-   * @see #getUseCompoundFile
-   */
-  private void fixUseCFMergePolicyInitArg(Class c) {
-
-    if (null == mergePolicyInfo || null == mergePolicyInfo.initArgs) return;
-
-    Object useCFSArg = mergePolicyInfo.initArgs.remove("useCompoundFile");
-    if (null != useCFSArg) {
-      log.warn("Ignoring 'useCompoundFile' specified as an init arg for the <mergePolicy> since it is no directly longer supported by " + c.getSimpleName());
-      if (useCFSArg instanceof Boolean) {
-        boolean cfs = ((Boolean)useCFSArg).booleanValue();
-        log.warn("Please update your config to specify <useCompoundFile>"+cfs+"</useCompoundFile> directly in your <indexConfig> settings.");
-        effectiveUseCompoundFileSetting = cfs;
-      } else {
-        log.error("MergePolicy's 'useCompoundFile' init arg is not a boolean, can not apply back compat logic to apply to the IndexWriterConfig: " + useCFSArg.toString());
-      }
-    }
-  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/bad-mp-solrconfig.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/bad-mp-solrconfig.xml b/solr/core/src/test-files/solr/collection1/conf/bad-mp-solrconfig.xml
deleted file mode 100644
index 4e3504e..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/bad-mp-solrconfig.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-
-<config>
-
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
-
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-
-  <indexConfig>
-    <mergePolicy class="org.apache.solr.update.DummyMergePolicy"/>
-    <mergeFactor>8</mergeFactor>
-  </indexConfig>
-
-  <updateHandler class="solr.DirectUpdateHandler2"/>
-  <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>
-
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy1.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy1.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy1.xml
index 33faf8b..36b4b98 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy1.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy1.xml
@@ -30,8 +30,7 @@
          to configure an explicit deletion policy, but we still wnat to randomize as much 
          as possible. 
     -->
-    <mergePolicy enable="${solr.tests.useMergePolicy:true}" class="${solr.tests.mergePolicy:org.apache.solr.util.RandomMergePolicy}" />
-    <mergePolicyFactory enable="${solr.tests.useMergePolicyFactory:true}" class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
+    <mergePolicyFactory class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
     <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
 
     <maxBufferedDocs>${solr.tests.maxBufferedDocs}</maxBufferedDocs>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy2.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy2.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy2.xml
index 61adf1f..06352f3 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy2.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-delpolicy2.xml
@@ -27,8 +27,7 @@
          to configure an explicit deletion policy, but we still wnat to randomize as much 
          as possible. 
     -->
-    <mergePolicy enable="${solr.tests.useMergePolicy:true}" class="${solr.tests.mergePolicy:org.apache.solr.util.RandomMergePolicy}" />
-    <mergePolicyFactory enable="${solr.tests.useMergePolicyFactory:true}" class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
+    <mergePolicyFactory class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
     <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
 
     <maxBufferedDocs>${solr.tests.maxBufferedDocs}</maxBufferedDocs>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexconfig.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexconfig.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexconfig.xml
deleted file mode 100644
index 52fb28e..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexconfig.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-<config>
-  <dataDir>${solr.data.dir:}</dataDir>
-
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-
-  <indexConfig>
-    <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
-    <infoStream>true</infoStream>
-    <mergePolicy class="org.apache.solr.util.RandomMergePolicy" />
-  </indexConfig>
-
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexmetrics.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexmetrics.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexmetrics.xml
index 6cf54d5..6238e7d 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexmetrics.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-indexmetrics.xml
@@ -34,10 +34,14 @@
     </metrics>
     <!-- intentionally set very low values here to trigger multiple flushes and merges.
          DO NOT USE THESE ABSURD VALUES IN PRODUCTION. -->
-    <mergeFactor>3</mergeFactor>
     <maxBufferedDocs>100</maxBufferedDocs>
 
-    <mergePolicy class="org.apache.lucene.index.TieredMergePolicy"/>
+    <mergePolicyFactory class="org.apache.solr.index.TieredMergePolicyFactory">
+      <!-- intentionally set very low values here to trigger multiple flushes and merges.
+           DO NOT USE THESE ABSURD VALUES IN PRODUCTION. -->
+      <int name="maxMergeAtOnce">3</int>
+      <int name="segmentsPerTier">3</int>
+    </mergePolicyFactory>
   </indexConfig>
 
   <updateHandler class="solr.DirectUpdateHandler2">

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-logmergepolicy.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-logmergepolicy.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-logmergepolicy.xml
deleted file mode 100644
index 49eec42..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-logmergepolicy.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-
-<config>
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-  <indexConfig>
-    <!-- set some values to -1 to force the use of internal lucene defaults -->
-    <maxBufferedDocs>-1</maxBufferedDocs>
-    <ramBufferSizeMB>-1</ramBufferSizeMB>
-
-    <mergeFactor>11</mergeFactor>
-    <maxMergeDocs>456</maxMergeDocs>
-    <mergePolicy class="${solr.test.log.merge.policy}" />
-  </indexConfig>
-
-  <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>
-
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml
index 6e6c6fe..a7361cc 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-legacy.xml
@@ -23,7 +23,6 @@
   <schemaFactory class="ClassicIndexSchemaFactory"/>
 
   <indexConfig>
-    <mergeFactor>7</mergeFactor>
     <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
   </indexConfig>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-nocfs.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-nocfs.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-nocfs.xml
deleted file mode 100644
index b59cdc8..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-mergepolicy-nocfs.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-
-<config>
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-
-  <indexConfig>
-    <useCompoundFile>${testSetNoCFSMergePolicyConfig.useCompoundFile:false}</useCompoundFile>
-    <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
-      <double name="noCFSRatio">0.5</double>
-    </mergePolicy>
-  </indexConfig>
-
-  <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>
-
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-spellcheckcomponent.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-spellcheckcomponent.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-spellcheckcomponent.xml
index 5324a35..cf923c4 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-spellcheckcomponent.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig-spellcheckcomponent.xml
@@ -20,8 +20,7 @@
 <config>
   <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
   <indexConfig>
-    <mergePolicy enable="${solr.tests.useMergePolicy:true}" class="${solr.tests.mergePolicy:org.apache.solr.util.RandomMergePolicy}" />
-    <mergePolicyFactory enable="${solr.tests.useMergePolicyFactory:true}" class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
+    <mergePolicyFactory class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
     <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
     <maxBufferedDocs>${solr.tests.maxBufferedDocs}</maxBufferedDocs>
     <ramBufferSizeMB>${solr.tests.ramBufferSizeMB}</ramBufferSizeMB>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicy.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicy.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicy.xml
deleted file mode 100644
index 026b3c7..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-tieredmergepolicy.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-
-<config>
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-
-  <indexConfig>
-    <mergeFactor>7</mergeFactor>
-    <mergePolicy class="org.apache.lucene.index.TieredMergePolicy">
-      <int name="maxMergeAtOnceExplicit">19</int>
-      <int name="segmentsPerTier">9</int>
-      <double name="noCFSRatio">0.1</double>
-
-      <!-- Setter for this was moved from the MergePolicies to IndexWriterConfig
-           in Lucene 4.4, so we should treat it the same as a <useCompoundFile>
-           setting and log a warning (instead of failing because the setter is 
-           gone).
-      -->
-      <bool name="useCompoundFile">${useCompoundFile:false}</bool>
-
-    </mergePolicy>
-    <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler">
-      <int name="maxMergeCount">987</int>
-      <int name="maxThreadCount">42</int>
-    </mergeScheduler>
-  </indexConfig>
-
-  <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>
-
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig-warmer.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig-warmer.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig-warmer.xml
deleted file mode 100644
index 691c94b..0000000
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig-warmer.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" ?>
-
-<!--
- 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.
--->
-
-<!-- a basic solrconfig that tests can use when they want simple minimal solrconfig/schema
-     DO NOT ADD THINGS TO THIS CONFIG! -->
-<config>
-  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
-  <dataDir>${solr.data.dir:}</dataDir>
-  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
-  <schemaFactory class="ClassicIndexSchemaFactory"/>
-  <requestHandler name="standard" class="solr.StandardRequestHandler"></requestHandler>
-  
-  <indexConfig>
-    <!-- we don't use solrconfig.snippet.randomindexconfig.xml here
-         because we explicitly test that a mergedSegmentWarmer works, 
-         but we can still test some of the other randomized indexConfig 
-         settings
-    -->
-    <mergedSegmentWarmer class="org.apache.lucene.index.SimpleMergedSegmentWarmer"/>
-    <mergePolicy class="org.apache.solr.util.RandomMergePolicy" />
-  
-    <useCompoundFile>${useCompoundFile}</useCompoundFile>
-    <maxBufferedDocs>${solr.tests.maxBufferedDocs}</maxBufferedDocs>
-    <ramBufferSizeMB>${solr.tests.ramBufferSizeMB}</ramBufferSizeMB>
-    <mergeScheduler class="${solr.tests.mergeScheduler}" />
-    <writeLockTimeout>1000</writeLockTimeout>
-    <commitLockTimeout>10000</commitLockTimeout>
-    <lockType>single</lockType>
-  </indexConfig>
-</config>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml b/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
index ec5f54e..ecf1f14 100644
--- a/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/solrconfig.snippet.randomindexconfig.xml
@@ -26,8 +26,7 @@ A solrconfig.xml snippet containing indexConfig settings for randomized testing.
        the RandomMergePolicy in all tests - but some tests expect very specific
        Merge behavior, so those tests can set it as needed.
   -->
-  <mergePolicy enable="${solr.tests.useMergePolicy:true}" class="${solr.tests.mergePolicy:org.apache.solr.util.RandomMergePolicy}" />
-  <mergePolicyFactory enable="${solr.tests.useMergePolicyFactory:true}" class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
+  <mergePolicyFactory class="${solr.tests.mergePolicyFactory:org.apache.solr.util.RandomMergePolicyFactory}" />
   
   <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
index 2d46551..99dc63c 100644
--- a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
@@ -30,7 +30,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
-import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.solr.client.solrj.impl.BinaryResponseParser;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.GroupParams;
@@ -63,7 +62,6 @@ public class TestGroupingSearch extends SolrTestCaseJ4 {
   public static void beforeTests() throws Exception {
     // force LogDocMergePolicy so that we get a predictable doc order
     // when doing unsorted group collection
-    systemSetPropertySolrTestsMergePolicy(LogDocMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(LogDocMergePolicyFactory.class.getName());
 
     System.setProperty("enable.update.log", "false"); // schema12 doesn't support _version_
@@ -72,7 +70,6 @@ public class TestGroupingSearch extends SolrTestCaseJ4 {
 
   @AfterClass
   public static void afterTests() {
-    systemClearPropertySolrTestsMergePolicy();
     systemClearPropertySolrTestsMergePolicyFactory();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java b/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
index 5fd8e42..df3790d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestAuthenticationFramework.java
@@ -32,7 +32,6 @@ import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpRequestInterceptor;
 import org.apache.http.protocol.HttpContext;
-import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
 import org.apache.solr.SolrTestCaseJ4;
@@ -149,15 +148,7 @@ public class TestAuthenticationFramework extends LuceneTestCase {
     collectionProperties.putIfAbsent("solr.tests.maxBufferedDocs", "100000");
     collectionProperties.putIfAbsent("solr.tests.ramBufferSizeMB", "100");
     // use non-test classes so RandomizedRunner isn't necessary
-    if (random().nextBoolean()) {
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY, TieredMergePolicy.class.getName());
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "true");
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "false");
-    } else {
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-    }
+    collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
     collectionProperties.putIfAbsent("solr.tests.mergeScheduler", "org.apache.lucene.index.ConcurrentMergeScheduler");
     collectionProperties.putIfAbsent("solr.directoryFactory", (persistIndex ? "solr.StandardDirectoryFactory" : "solr.RAMDirectoryFactory"));
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudCluster.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudCluster.java b/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudCluster.java
index de18875..a8250f8 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudCluster.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestMiniSolrCloudCluster.java
@@ -27,7 +27,6 @@ import java.util.List;
 import java.util.Map;
 
 import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
-import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.SuppressSysoutChecks;
 import org.apache.solr.SolrTestCaseJ4;
@@ -102,15 +101,7 @@ public class TestMiniSolrCloudCluster extends LuceneTestCase {
     collectionProperties.putIfAbsent("solr.tests.maxBufferedDocs", "100000");
     collectionProperties.putIfAbsent("solr.tests.ramBufferSizeMB", "100");
     // use non-test classes so RandomizedRunner isn't necessary
-    if (random().nextBoolean()) {
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY, TieredMergePolicy.class.getName());
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "true");
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "false");
-    } else {
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-      collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-    }
+    collectionProperties.putIfAbsent(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
     collectionProperties.putIfAbsent("solr.tests.mergeScheduler", "org.apache.lucene.index.ConcurrentMergeScheduler");
     collectionProperties.putIfAbsent("solr.directoryFactory", (persistIndex ? "solr.StandardDirectoryFactory" : "solr.RAMDirectoryFactory"));
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/cloud/TestSolrCloudWithKerberosAlt.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestSolrCloudWithKerberosAlt.java b/solr/core/src/test/org/apache/solr/cloud/TestSolrCloudWithKerberosAlt.java
index 042c111..1758ae0 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestSolrCloudWithKerberosAlt.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestSolrCloudWithKerberosAlt.java
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.SolrTestCaseJ4;
@@ -180,15 +179,7 @@ public class TestSolrCloudWithKerberosAlt extends LuceneTestCase {
       properties.put("solr.tests.maxBufferedDocs", "100000");
       properties.put("solr.tests.ramBufferSizeMB", "100");
       // use non-test classes so RandomizedRunner isn't necessary
-      if (random().nextBoolean()) {
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY, TieredMergePolicy.class.getName());
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "true");
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "false");
-      } else {
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-        properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-      }
+      properties.put(SolrTestCaseJ4.SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, TieredMergePolicyFactory.class.getName());
       properties.put("solr.tests.mergeScheduler", "org.apache.lucene.index.ConcurrentMergeScheduler");
       properties.put("solr.directoryFactory", "solr.RAMDirectoryFactory");
       createRequest.setProperties(properties);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/core/TestBadConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestBadConfig.java b/solr/core/src/test/org/apache/solr/core/TestBadConfig.java
index 31361be..db04152 100644
--- a/solr/core/src/test/org/apache/solr/core/TestBadConfig.java
+++ b/solr/core/src/test/org/apache/solr/core/TestBadConfig.java
@@ -76,8 +76,6 @@ public class TestBadConfig extends AbstractBadConfigTestBase {
   }
 
   public void testBogusMergePolicy() throws Exception {
-    assertConfigs("bad-mp-solrconfig.xml", "schema-minimal.xml",
-                  "DummyMergePolicy");
     assertConfigs("bad-mpf-solrconfig.xml", "schema-minimal.xml",
                   "DummyMergePolicyFactory");
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/core/TestConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestConfig.java b/solr/core/src/test/org/apache/solr/core/TestConfig.java
index 094f013..87a453f 100644
--- a/solr/core/src/test/org/apache/solr/core/TestConfig.java
+++ b/solr/core/src/test/org/apache/solr/core/TestConfig.java
@@ -148,11 +148,9 @@ public class TestConfig extends SolrTestCaseJ4 {
     SolrConfig sc = new SolrConfig(new SolrResourceLoader(TEST_PATH().resolve("collection1")), "solrconfig-defaults.xml", null);
     SolrIndexConfig sic = sc.indexConfig;
 
-    ++numDefaultsTested; assertEquals("default useCompoundFile", false, sic.getUseCompoundFile());
+    ++numDefaultsTested; assertEquals("default useCompoundFile", false, sic.useCompoundFile);
 
     ++numDefaultsTested; assertEquals("default maxBufferedDocs", -1, sic.maxBufferedDocs);
-    ++numDefaultsTested; assertEquals("default maxMergeDocs", -1, sic.maxMergeDocs);
-    ++numDefaultsTested; assertEquals("default mergeFactor", -1, sic.mergeFactor);
 
     ++numDefaultsTested; assertEquals("default ramBufferSizeMB", 100.0D, sic.ramBufferSizeMB, 0.0D);
     ++numDefaultsTested; assertEquals("default writeLockTimeout", -1, sic.writeLockTimeout);
@@ -162,10 +160,7 @@ public class TestConfig extends SolrTestCaseJ4 {
 
     ++numDefaultsTested; assertNotNull("default metrics", sic.metricsInfo);
 
-    // mergePolicyInfo and mergePolicyFactoryInfo are mutually exclusive
-    // so ++ count them only once for both instead of individually
     ++numDefaultsTested; ++numNullDefaults;
-    assertNull("default mergePolicyInfo", sic.mergePolicyInfo);
     assertNull("default mergePolicyFactoryInfo", sic.mergePolicyFactoryInfo);
 
     ++numDefaultsTested; ++numNullDefaults; assertNull("default mergeSchedulerInfo", sic.mergeSchedulerInfo);
@@ -197,7 +192,7 @@ public class TestConfig extends SolrTestCaseJ4 {
                  Double.parseDouble(System.getProperty("solr.tests.ramBufferSizeMB")), 
                                     sic.ramBufferSizeMB, 0.0D);
     assertEquals("useCompoundFile sysprop", 
-                 Boolean.parseBoolean(System.getProperty("useCompoundFile")), sic.getUseCompoundFile());
+                 Boolean.parseBoolean(System.getProperty("useCompoundFile")), sic.useCompoundFile);
   }
 
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java b/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
index f8e232a..3de61be 100644
--- a/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
+++ b/solr/core/src/test/org/apache/solr/core/TestMergePolicyConfig.java
@@ -50,7 +50,7 @@ public class TestMergePolicyConfig extends SolrTestCaseJ4 {
     final boolean useCompoundFile = random().nextBoolean();
     System.setProperty("testSetNoCFSMergePolicyConfig.useCompoundFile", String.valueOf(useCompoundFile));
     try {
-      initCore(random().nextBoolean() ? "solrconfig-mergepolicy-nocfs.xml" : "solrconfig-mergepolicyfactory-nocfs.xml","schema-minimal.xml");
+      initCore("solrconfig-mergepolicyfactory-nocfs.xml","schema-minimal.xml");
       IndexWriterConfig iwc = solrConfig.indexConfig.toIndexWriterConfig(h.getCore());
       assertEquals(useCompoundFile, iwc.getUseCompoundFile());
 
@@ -84,8 +84,8 @@ public class TestMergePolicyConfig extends SolrTestCaseJ4 {
 
     TieredMergePolicy tieredMP = assertAndCast(TieredMergePolicy.class, iwc.getMergePolicy());
 
-    assertEquals(7, tieredMP.getMaxMergeAtOnce());
-    assertEquals(7.0D, tieredMP.getSegmentsPerTier(), 0.0D);
+    assertEquals(10, tieredMP.getMaxMergeAtOnce());
+    assertEquals(10.0D, tieredMP.getSegmentsPerTier(), 0.0D);
 
     assertCommitSomeNewDocs();
     assertCompoundSegments(h.getCore(), expectCFS);
@@ -95,7 +95,7 @@ public class TestMergePolicyConfig extends SolrTestCaseJ4 {
     final boolean expectCFS 
       = Boolean.parseBoolean(System.getProperty("useCompoundFile"));
 
-    initCore(random().nextBoolean() ? "solrconfig-tieredmergepolicy.xml" : "solrconfig-tieredmergepolicyfactory.xml","schema-minimal.xml");
+    initCore("solrconfig-tieredmergepolicyfactory.xml","schema-minimal.xml");
     IndexWriterConfig iwc = solrConfig.indexConfig.toIndexWriterConfig(h.getCore());
     assertEquals(expectCFS, iwc.getUseCompoundFile());
 
@@ -148,16 +148,6 @@ public class TestMergePolicyConfig extends SolrTestCaseJ4 {
     assertEquals(mergePolicy, iwc.getMergePolicy());
   }
 
-  public void testLogMergePolicyConfig() throws Exception {
-    
-    final Class<? extends LogMergePolicy> mpClass = random().nextBoolean()
-      ? LogByteSizeMergePolicy.class : LogDocMergePolicy.class;
-
-    System.setProperty("solr.test.log.merge.policy", mpClass.getName());
-
-    implTestLogMergePolicyConfig("solrconfig-logmergepolicy.xml", mpClass);
-  }
-
   public void testLogMergePolicyFactoryConfig() throws Exception {
 
     final boolean byteSizeMP = random().nextBoolean();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/core/TestNRTOpen.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestNRTOpen.java b/solr/core/src/test/org/apache/solr/core/TestNRTOpen.java
index 0970953..910c618 100644
--- a/solr/core/src/test/org/apache/solr/core/TestNRTOpen.java
+++ b/solr/core/src/test/org/apache/solr/core/TestNRTOpen.java
@@ -23,7 +23,6 @@ import java.util.Set;
 
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.index.LogDocMergePolicyFactory;
 import org.apache.solr.search.SolrIndexSearcher;
@@ -41,7 +40,6 @@ public class TestNRTOpen extends SolrTestCaseJ4 {
     System.setProperty("solr.test.leavedatadir", "true");
     // set these so that merges won't break the test
     System.setProperty("solr.tests.maxBufferedDocs", "100000");
-    systemSetPropertySolrTestsMergePolicy(LogDocMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(LogDocMergePolicyFactory.class.getName());
     initCore("solrconfig-basic.xml", "schema-minimal.xml");
     // add a doc
@@ -62,7 +60,6 @@ public class TestNRTOpen extends SolrTestCaseJ4 {
     System.clearProperty("solr.test.leavedatadir");
     System.clearProperty("solr.directoryFactory");
     System.clearProperty("solr.tests.maxBufferedDocs");
-    systemClearPropertySolrTestsMergePolicy();
     systemClearPropertySolrTestsMergePolicyFactory();
   }
   

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java b/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java
index 978ad0f..2a2d8e6 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrIndexConfig.java
@@ -31,7 +31,7 @@ public class TestSolrIndexConfig extends SolrTestCaseJ4 {
 
   @BeforeClass
   public static void beforeClass() throws Exception {
-    initCore(random().nextBoolean() ? "solrconfig-indexconfig.xml" : "solrconfig-indexconfig-mergepolicyfactory.xml","schema.xml");
+    initCore("solrconfig-indexconfig-mergepolicyfactory.xml","schema.xml");
   }
 
   public void testLiveWriter() throws Exception {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/handler/admin/SegmentsInfoRequestHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/SegmentsInfoRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/SegmentsInfoRequestHandlerTest.java
index 1355e56..6de7835 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/SegmentsInfoRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/SegmentsInfoRequestHandlerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.handler.admin;
 
-import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.lucene.util.Version;
 import org.apache.solr.index.LogDocMergePolicyFactory;
 import org.apache.solr.util.AbstractSolrTestCase;
@@ -38,7 +37,6 @@ public class SegmentsInfoRequestHandlerTest extends AbstractSolrTestCase {
     // we need a consistent segmentation to ensure we don't get a random
     // merge that reduces the total num docs in all segments, or the number of deletes
     //
-    systemSetPropertySolrTestsMergePolicy(LogDocMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(LogDocMergePolicyFactory.class.getName());
     
     System.setProperty("enable.update.log", "false"); // no _version_ in our schema

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/schema/TestHalfAndHalfDocValues.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/schema/TestHalfAndHalfDocValues.java b/solr/core/src/test/org/apache/solr/schema/TestHalfAndHalfDocValues.java
index b0c3956..feb9236 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestHalfAndHalfDocValues.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestHalfAndHalfDocValues.java
@@ -42,10 +42,6 @@ public class TestHalfAndHalfDocValues extends SolrTestCaseJ4 {
     // segments with and without docvalues
     systemSetPropertySolrTestsMergePolicyFactory(NoMergePolicyFactory.class.getName());
 
-    // HACK: Don't use a RandomMergePolicy, but only use the mergePolicyFactory that we've just set
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-
     initCore("solrconfig-basic.xml", "schema-docValues.xml");
 
     // sanity check our schema meets our expectations

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java b/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
index c36066a..457129f 100644
--- a/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
+++ b/solr/core/src/test/org/apache/solr/search/TestIndexSearcher.java
@@ -32,7 +32,6 @@ import com.google.common.collect.ImmutableMap;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexReaderContext;
 import org.apache.lucene.index.LeafReaderContext;
-import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.lucene.index.ReaderUtil;
 import org.apache.lucene.queries.function.FunctionValues;
 import org.apache.lucene.queries.function.ValueSource;
@@ -61,7 +60,6 @@ public class TestIndexSearcher extends SolrTestCaseJ4 {
 
     // we need a consistent segmentation because reopen test validation
     // dependso n merges not happening when it doesn't expect
-    systemSetPropertySolrTestsMergePolicy(LogDocMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(LogDocMergePolicyFactory.class.getName());
 
     initCore("solrconfig.xml","schema.xml");
@@ -69,7 +67,6 @@ public class TestIndexSearcher extends SolrTestCaseJ4 {
   
   @AfterClass
   public static void afterClass() {
-    systemClearPropertySolrTestsMergePolicy();
     systemClearPropertySolrTestsMergePolicyFactory();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java b/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
index 7d97ee4..90bb6a0 100644
--- a/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/update/DirectUpdateHandlerTest.java
@@ -27,7 +27,6 @@ import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.Metric;
 import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.TieredMergePolicy;
 import org.apache.lucene.store.Directory;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.CommonParams;
@@ -62,14 +61,12 @@ public class DirectUpdateHandlerTest extends SolrTestCaseJ4 {
     savedFactory = System.getProperty("solr.DirectoryFactory");
     System.setProperty("solr.directoryFactory", "org.apache.solr.core.MockFSDirectoryFactory");
     System.setProperty("enable.update.log", "false"); // schema12 doesn't support _version_
-    systemSetPropertySolrTestsMergePolicy(TieredMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(TieredMergePolicyFactory.class.getName());
     initCore("solrconfig.xml", "schema12.xml");
   }
   
   @AfterClass
   public static void afterClass() {
-    systemClearPropertySolrTestsMergePolicy();
     systemClearPropertySolrTestsMergePolicyFactory();
     if (savedFactory == null) {
       System.clearProperty("solr.directoryFactory");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
index cb35e88..20c2f1a 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
@@ -25,7 +25,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.lucene.index.LogDocMergePolicy;
 import org.apache.solr.BaseDistributedSearchTestCase;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrQuery;
@@ -65,13 +64,11 @@ public class SolrCmdDistributorTest extends BaseDistributedSearchTestCase {
   public static void beforeClass() throws Exception {
     // we can't use the Randomized merge policy because the test depends on
     // being able to call optimize to have all deletes expunged.
-    systemSetPropertySolrTestsMergePolicy(LogDocMergePolicy.class.getName());
     systemSetPropertySolrTestsMergePolicyFactory(LogDocMergePolicyFactory.class.getName());
   }
 
   @AfterClass
   public static void afterClass() {
-    systemClearPropertySolrTestsMergePolicy();
     systemClearPropertySolrTestsMergePolicyFactory();
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
index 0f53f33..ec5719c 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrIndexConfigTest.java
@@ -46,9 +46,7 @@ import org.junit.Test;
 public class SolrIndexConfigTest extends SolrTestCaseJ4 {
 
   private static final String solrConfigFileName = "solrconfig.xml";
-  private static final String solrConfigFileNameWarmerRandomMergePolicy = "solrconfig-warmer.xml";
   private static final String solrConfigFileNameWarmerRandomMergePolicyFactory = "solrconfig-warmer-randommergepolicyfactory.xml";
-  private static final String solrConfigFileNameTieredMergePolicy = "solrconfig-tieredmergepolicy.xml";
   private static final String solrConfigFileNameTieredMergePolicyFactory = "solrconfig-tieredmergepolicyfactory.xml";
   private static final String solrConfigFileNameSortingMergePolicyFactory = "solrconfig-sortingmergepolicyfactory.xml";
   private static final String schemaFileName = "schema.xml";
@@ -63,7 +61,7 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
   @Test
   public void testFailingSolrIndexConfigCreation() {
     try {
-      SolrConfig solrConfig = new SolrConfig(random().nextBoolean() ? "bad-mp-solrconfig.xml" : "bad-mpf-solrconfig.xml");
+      SolrConfig solrConfig = new SolrConfig("bad-mpf-solrconfig.xml");
       SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
       IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
       h.getCore().setLatestSchema(indexSchema);
@@ -76,7 +74,7 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
 
   @Test
   public void testTieredMPSolrIndexConfigCreation() throws Exception {
-    String solrConfigFileName = random().nextBoolean() ? solrConfigFileNameTieredMergePolicy : solrConfigFileNameTieredMergePolicyFactory;
+    String solrConfigFileName = solrConfigFileNameTieredMergePolicyFactory;
     SolrConfig solrConfig = new SolrConfig(instanceDir, solrConfigFileName, null);
     SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
     IndexSchema indexSchema = IndexSchemaFactory.buildIndexSchema(schemaFileName, solrConfig);
@@ -121,7 +119,7 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
   }
 
   public void testMergedSegmentWarmerIndexConfigCreation() throws Exception {
-    SolrConfig solrConfig = new SolrConfig(instanceDir, random().nextBoolean() ? solrConfigFileNameWarmerRandomMergePolicy : solrConfigFileNameWarmerRandomMergePolicyFactory, null);
+    SolrConfig solrConfig = new SolrConfig(instanceDir, solrConfigFileNameWarmerRandomMergePolicyFactory, null);
     SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
     assertNotNull(solrIndexConfig);
     assertNotNull(solrIndexConfig.mergedSegmentWarmerInfo);
@@ -134,20 +132,14 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
   }
 
   public void testToMap() throws Exception {
-    final String solrConfigFileNameWarmer = random().nextBoolean() ? solrConfigFileNameWarmerRandomMergePolicy : solrConfigFileNameWarmerRandomMergePolicyFactory;
-    final String solrConfigFileNameTMP = random().nextBoolean() ? solrConfigFileNameTieredMergePolicy : solrConfigFileNameTieredMergePolicyFactory;
+    final String solrConfigFileNameWarmer = solrConfigFileNameWarmerRandomMergePolicyFactory;
+    final String solrConfigFileNameTMP = solrConfigFileNameTieredMergePolicyFactory;
     final String solrConfigFileName = (random().nextBoolean() ? solrConfigFileNameWarmer : solrConfigFileNameTMP);
     SolrConfig solrConfig = new SolrConfig(instanceDir, solrConfigFileName, null);
     SolrIndexConfig solrIndexConfig = new SolrIndexConfig(solrConfig, null, null);
     assertNotNull(solrIndexConfig);
-    if (solrConfigFileName.equals(solrConfigFileNameTieredMergePolicyFactory) ||
-        solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
-      assertNotNull(solrIndexConfig.mergePolicyFactoryInfo);
-    } else {
-      assertNotNull(solrIndexConfig.mergePolicyInfo);
-    }
-    if (solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicy) ||
-        solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
+    assertNotNull(solrIndexConfig.mergePolicyFactoryInfo);
+    if (solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
       assertNotNull(solrIndexConfig.mergedSegmentWarmerInfo);
     } else {
       assertNull(solrIndexConfig.mergedSegmentWarmerInfo);
@@ -160,8 +152,6 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
     ++mSizeExpected; assertTrue(m.get("useCompoundFile") instanceof Boolean);
 
     ++mSizeExpected; assertTrue(m.get("maxBufferedDocs") instanceof Integer);
-    ++mSizeExpected; assertTrue(m.get("maxMergeDocs") instanceof Integer);
-    ++mSizeExpected; assertTrue(m.get("mergeFactor") instanceof Integer);
 
     ++mSizeExpected; assertTrue(m.get("ramBufferSizeMB") instanceof Double);
 
@@ -183,16 +173,8 @@ public class SolrIndexConfigTest extends SolrTestCaseJ4 {
     }
     
     ++mSizeExpected; assertTrue(m.get("mergeScheduler") instanceof MapSerializable);
-    if (solrConfigFileName.equals(solrConfigFileNameTieredMergePolicyFactory) ||
-        solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
-      assertNull(m.get("mergePolicy"));
-      ++mSizeExpected; assertTrue(m.get("mergePolicyFactory") instanceof MapSerializable);
-    } else {
-      ++mSizeExpected; assertTrue(m.get("mergePolicy") instanceof MapSerializable);
-      assertNull(m.get("mergePolicyFactory"));
-    }
-    if (solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicy) ||
-        solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
+    ++mSizeExpected; assertTrue(m.get("mergePolicyFactory") instanceof MapSerializable);
+    if (solrConfigFileName.equals(solrConfigFileNameWarmerRandomMergePolicyFactory)) {
       ++mSizeExpected; assertTrue(m.get("mergedSegmentWarmer") instanceof MapSerializable);
     } else {
       assertNull(m.get("mergedSegmentWarmer"));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
index 44b4a4e..588ecce 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
@@ -87,10 +87,6 @@ public class TestInPlaceUpdatesDistrib extends AbstractFullDistribZkTestBase {
     // asserting inplace updates happen by checking the internal [docid]
     systemSetPropertySolrTestsMergePolicyFactory(NoMergePolicyFactory.class.getName());
 
-    // HACK: Don't use a RandomMergePolicy, but only use the mergePolicyFactory that we've just set
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-
     initCore(configString, schemaString);
     
     // sanity check that autocommits are disabled

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
index aa075a4..88b1b6d 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
@@ -75,10 +75,6 @@ public class TestInPlaceUpdatesStandalone extends SolrTestCaseJ4 {
     // asserting inplace updates happen by checking the internal [docid]
     systemSetPropertySolrTestsMergePolicyFactory(NoMergePolicyFactory.class.getName());
 
-    // HACK: Don't use a RandomMergePolicy, but only use the mergePolicyFactory that we've just set
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-
     initCore("solrconfig-tlog.xml", "schema-inplace-updates.xml");
 
     // sanity check that autocommits are disabled

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c64f9d64/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index 419f94f..e9eefb0 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -171,16 +171,8 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
   public static final String DEFAULT_TEST_CORENAME = DEFAULT_TEST_COLLECTION_NAME;
   protected static final String CORE_PROPERTIES_FILENAME = "core.properties";
 
-  // keep solr.tests.mergePolicyFactory use i.e. do not remove with SOLR-8668
   public static final String SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY = "solr.tests.mergePolicyFactory";
-  @Deprecated // remove solr.tests.mergePolicy use with SOLR-8668
-  public static final String SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY = "solr.tests.mergePolicy";
 
-  @Deprecated // remove solr.tests.useMergePolicyFactory with SOLR-8668
-  public static final String SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY = "solr.tests.useMergePolicyFactory";
-  @Deprecated // remove solr.tests.useMergePolicy use with SOLR-8668
-  public static final String SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY = "solr.tests.useMergePolicy";
-  
   /**
    * The system property {@code "solr.tests.preferPointFields"} can be used to make tests use PointFields when possible. 
    * PointFields will only be used if the schema used by the tests uses "${solr.tests.TYPEClass}" when defining fields. 
@@ -2482,33 +2474,6 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
     waitForWarming(h.getCore());
   }
 
-  @BeforeClass
-  public static void chooseMPForMP() throws Exception {
-    if (random().nextBoolean()) {
-      System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "true");
-      System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "false");
-    } else {
-      System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY, "false");
-      System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY, "true");
-    }
-  }
-
-  @AfterClass
-  public static void unchooseMPForMP() {
-    System.clearProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICYFACTORY);
-    System.clearProperty(SYSTEM_PROPERTY_SOLR_TESTS_USEMERGEPOLICY);
-  }
-
-  @Deprecated // remove with SOLR-8668
-  protected static void systemSetPropertySolrTestsMergePolicy(String value) {
-    System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY, value);
-  }
-
-  @Deprecated // remove with SOLR-8668
-  protected static void systemClearPropertySolrTestsMergePolicy() {
-    System.clearProperty(SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICY);
-  }
-
   protected static void systemSetPropertySolrTestsMergePolicyFactory(String value) {
     System.setProperty(SYSTEM_PROPERTY_SOLR_TESTS_MERGEPOLICYFACTORY, value);
   }


[50/50] [abbrv] lucene-solr:feature/autoscaling: Completing merge from master

Posted by sh...@apache.org.
Completing merge from master


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/d158f694
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/d158f694
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/d158f694

Branch: refs/heads/feature/autoscaling
Commit: d158f694b7961f974842a8be84f1cb839b4b6c8b
Parents: d3b5adf
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Wed Jun 7 19:11:53 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Wed Jun 7 19:11:53 2017 +0530

----------------------------------------------------------------------
 solr/core/src/java/org/apache/solr/cloud/ZkController.java | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/d158f694/solr/core/src/java/org/apache/solr/cloud/ZkController.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index de41871..8fa3d1b 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -56,6 +56,7 @@ import org.apache.solr.cloud.overseer.SliceMutator;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.*;
+import org.apache.solr.common.cloud.Replica.Type;
 import org.apache.solr.common.params.CollectionParams;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.SolrParams;


[05/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-9735: validation for specific tags

Posted by sh...@apache.org.
SOLR-9735: validation for specific tags


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e2ae9992
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e2ae9992
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e2ae9992

Branch: refs/heads/feature/autoscaling
Commit: e2ae9992c5fdb3e729c987467ab6e121021f3319
Parents: b530c13
Author: Noble Paul <no...@apache.org>
Authored: Fri Jun 2 18:02:21 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Fri Jun 2 18:02:21 2017 +0930

----------------------------------------------------------------------
 .../apache/solr/cloud/autoscaling/Clause.java   | 79 ++++++++++++++++++++
 .../solr/cloud/autoscaling/TestPolicy.java      | 51 +++++++++++++
 2 files changed, 130 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e2ae9992/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
index 86839f8..bf0ebfb 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Clause.java
@@ -20,6 +20,7 @@ package org.apache.solr.cloud.autoscaling;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -31,10 +32,12 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.solr.cloud.autoscaling.Policy.ReplicaInfo;
 import org.apache.solr.common.MapWriter;
+import org.apache.solr.common.cloud.rule.ImplicitSnitch;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 
 import static java.util.Collections.singletonMap;
+import static java.util.Collections.unmodifiableSet;
 import static org.apache.solr.cloud.autoscaling.Clause.TestStatus.PASS;
 import static org.apache.solr.cloud.autoscaling.Operand.EQUAL;
 import static org.apache.solr.cloud.autoscaling.Operand.GREATER_THAN;
@@ -337,4 +340,80 @@ public class Clause implements MapWriter, Comparable<Clause> {
   }
 
   private static final Set<String> IGNORE_TAGS = new HashSet<>(Arrays.asList(REPLICA, COLLECTION, SHARD, "strict"));
+
+  static class ValidateInfo {
+    final Class type;
+    final Set<String> vals;
+    final Long min;
+    final Long max;
+
+
+    ValidateInfo(Class type, Set<String> vals, Long min, Long max) {
+      this.type = type;
+      this.vals = vals;
+      this.min = min;
+      this.max = max;
+    }
+  }
+
+
+  public static Object validate(String name, Object val) {
+    if (val == null) return null;
+    ValidateInfo info = validatetypes.get(name);
+    if (info == null && name.startsWith(ImplicitSnitch.SYSPROP)) info = validatetypes.get(null);
+    if (info == null) throw new RuntimeException("Unknown type :" + name);
+    if (info.type == Long.class) {
+      Long num = parseNumber(name, val);
+      if (info.min != null)
+        if (num < info.min) throw new RuntimeException(name + ": " + val + " must be greater than " + info.min);
+      if (info.max != null)
+        if (num > info.max) throw new RuntimeException(name + ": " + val + " must be less than " + info.max);
+      return num;
+    } else if (info.type == String.class) {
+      if (info.vals != null && !info.vals.contains(val))
+        throw new RuntimeException(name + ": " + val + " must be one of " + StrUtils.join(info.vals, ','));
+      return val;
+    } else {
+      throw new RuntimeException("Invalid type ");
+    }
+
+  }
+
+  public static Long parseNumber(String name, Object val) {
+    if (val == null) return null;
+    Number num = 0;
+    if (val instanceof String) {
+      try {
+        num = Long.parseLong((String) val);
+      } catch (NumberFormatException e) {
+        try {
+          num = Double.parseDouble((String) val);
+        } catch (NumberFormatException e1) {
+          throw new RuntimeException(name + ": " + val + "not a valid number", e);
+        }
+      }
+
+    } else if (val instanceof Number) {
+      num = (Number) val;
+    }
+    return num.longValue();
+  }
+
+  private static final Map<String, ValidateInfo> validatetypes = new HashMap();
+
+  static {
+    validatetypes.put("collection", new ValidateInfo(String.class, null, null, null));
+    validatetypes.put("shard", new ValidateInfo(String.class, null, null, null));
+    validatetypes.put("replica", new ValidateInfo(Long.class, null, 0l, null));
+    validatetypes.put(ImplicitSnitch.PORT, new ValidateInfo(Long.class, null, 1024l, 65535l));
+    validatetypes.put(ImplicitSnitch.DISK, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
+    validatetypes.put(ImplicitSnitch.NODEROLE, new ValidateInfo(String.class, unmodifiableSet(new HashSet(Arrays.asList("overseer"))), null, null));
+    validatetypes.put(ImplicitSnitch.CORES, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
+    validatetypes.put(ImplicitSnitch.SYSLOADAVG, new ValidateInfo(Long.class, null, 0l, 100l));
+    validatetypes.put(ImplicitSnitch.HEAPUSAGE, new ValidateInfo(Long.class, null, 0l, Long.MAX_VALUE));
+    validatetypes.put(null, new ValidateInfo(String.class, null, null, null));
+    for (String ip : ImplicitSnitch.IP_SNITCHES) validatetypes.put(ip, new ValidateInfo(Long.class, null, 0l, 255l));
+
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e2ae9992/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
index 7ec9262..08e1e1b 100644
--- a/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
+++ b/solr/solrj/src/test/org/apache/solr/cloud/autoscaling/TestPolicy.java
@@ -110,6 +110,57 @@ public class TestPolicy extends SolrTestCaseJ4 {
     return result;
   }
 
+  public void testValidate() {
+    expectError("replica", -1, "must be greater than" );
+    expectError("replica","hello", "not a valid number" );
+    assertEquals( 1l,   Clause.validate("replica", "1"));
+    assertEquals("c",   Clause.validate("collection", "c"));
+    assertEquals( "s",   Clause.validate("shard", "s"));
+    assertEquals( "overseer",   Clause.validate("nodeRole", "overseer"));
+
+    expectError("nodeRole", "wrong","must be one of");
+
+    expectError("sysLoadAvg", "101","must be less than ");
+    expectError("sysLoadAvg", 101,"must be less than ");
+    expectError("sysLoadAvg", "-1","must be greater than");
+    expectError("sysLoadAvg", -1,"must be greater than");
+
+    assertEquals(12l,Clause.validate("sysLoadAvg", "12.46"));
+    assertEquals(12l,Clause.validate("sysLoadAvg", 12.46d));
+
+
+    expectError("ip_1", "300","must be less than ");
+    expectError("ip_1", 300,"must be less than ");
+    expectError("ip_1", "-1","must be greater than");
+    expectError("ip_1", -1,"must be greater than");
+
+    assertEquals(1l,Clause.validate("ip_1", "1"));
+
+    expectError("heapUsage", "-1","must be greater than");
+    expectError("heapUsage", -1,"must be greater than");
+    assertEquals(69l,Clause.validate("heapUsage", "69.9"));
+    assertEquals(69l,Clause.validate("heapUsage", 69.9d));
+
+    expectError("port", "70000","must be less than ");
+    expectError("port", 70000,"must be less than ");
+    expectError("port", "1000","must be greater than");
+    expectError("port", 1000,"must be greater than");
+
+    expectError("cores", "-1","must be greater than");
+
+
+  }
+
+  private static void expectError(String name, Object val, String msg){
+    try {
+      Clause.validate(name, val);
+      fail("expected exception containing "+msg);
+    } catch (Exception e) {
+      assertTrue("expected exception containing "+msg,e.getMessage().contains(msg));
+    }
+
+  }
+
   public void testOperands() {
     Clause c = new Clause((Map<String, Object>) Utils.fromJSONString("{replica:'<2', node:'#ANY'}"));
     assertFalse(c.replica.isPass(3));


[44/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10278: only long and double are used

Posted by sh...@apache.org.
SOLR-10278: only long and double are used


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/bd2203df
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/bd2203df
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/bd2203df

Branch: refs/heads/feature/autoscaling
Commit: bd2203df93b528b1eb4a5b0829ee9c052ffeda06
Parents: 790fb19
Author: Noble Paul <no...@apache.org>
Authored: Tue Jun 6 16:06:44 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Tue Jun 6 16:06:44 2017 +0930

----------------------------------------------------------------------
 .../java/org/apache/solr/cloud/autoscaling/Preference.java  | 4 +---
 .../src/java/org/apache/solr/cloud/autoscaling/Row.java     | 9 +++++----
 2 files changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bd2203df/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
index 60a6756..0566d25 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Preference.java
@@ -56,9 +56,7 @@ class Preference implements MapWriter {
     Object o1 = useApprox ? r1.cells[idx].approxVal : r1.cells[idx].val;
     Object o2 = useApprox ? r2.cells[idx].approxVal : r2.cells[idx].val;
     int result = 0;
-    if (o1 instanceof Integer && o2 instanceof Integer) result = ((Integer) o1).compareTo((Integer) o2);
-    else if (o1 instanceof Long && o2 instanceof Long) result = ((Long) o1).compareTo((Long) o2);
-    else if (o1 instanceof Float && o2 instanceof Float) result = ((Float) o1).compareTo((Float) o2);
+    if (o1 instanceof Long && o2 instanceof Long) result = ((Long) o1).compareTo((Long) o2);
     else if (o1 instanceof Double && o2 instanceof Double) result = ((Double) o1).compareTo((Double) o2);
     else if (!o1.getClass().getName().equals(o2.getClass().getName()))  {
       throw new RuntimeException("Unable to compare " + o1 + " of type: " + o1.getClass().getName() + " from " + r1.cells[idx].toString() + " and " + o2 + " of type: " + o2.getClass().getName() + " from " + r2.cells[idx].toString());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bd2203df/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
index 463d434..f7ab5ca 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Row.java
@@ -91,10 +91,8 @@ class Row implements MapWriter {
   // this adds a replica to the replica info
   Row addReplica(String coll, String shard) {
     Row row = copy();
-    Map<String, List<ReplicaInfo>> c = row.collectionVsShardVsReplicas.get(coll);
-    if (c == null) row.collectionVsShardVsReplicas.put(coll, c = new HashMap<>());
-    List<ReplicaInfo> replicas = c.get(shard);
-    if (replicas == null) c.put(shard, replicas = new ArrayList<>());
+    Map<String, List<ReplicaInfo>> c = row.collectionVsShardVsReplicas.computeIfAbsent(coll, k -> new HashMap<>());
+    List<ReplicaInfo> replicas = c.computeIfAbsent(shard, k -> new ArrayList<>());
     replicas.add(new ReplicaInfo("" + new Random().nextInt(1000) + 1000, coll, shard, new HashMap<>()));
     for (Cell cell : row.cells) {
       if (cell.name.equals("cores")) cell.val = ((Number) cell.val).longValue() + 1;
@@ -109,6 +107,9 @@ class Row implements MapWriter {
     if (c == null) return null;
     List<ReplicaInfo> s = c.get(shard);
     if (s == null || s.isEmpty()) return null;
+    for (Cell cell : row.cells) {
+      if (cell.name.equals("cores")) cell.val = ((Number) cell.val).longValue() -1;
+    }
     return new Pair(row, s.remove(0));
 
   }


[13/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10446, SOLR-6736: Ref guide documentation

Posted by sh...@apache.org.
SOLR-10446, SOLR-6736: Ref guide documentation


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2eb324f9
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2eb324f9
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2eb324f9

Branch: refs/heads/feature/autoscaling
Commit: 2eb324f9bae1553c9c68c4a740a4f865b0ec6da5
Parents: c64f9d6
Author: Ishan Chattopadhyaya <is...@apache.org>
Authored: Fri Jun 2 20:55:05 2017 +0530
Committer: Ishan Chattopadhyaya <is...@apache.org>
Committed: Fri Jun 2 20:56:15 2017 +0530

----------------------------------------------------------------------
 solr/solr-ref-guide/src/configsets-api.adoc | 46 ++++++++++++++++++++++++
 solr/solr-ref-guide/src/using-solrj.adoc    |  4 +++
 2 files changed, 50 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2eb324f9/solr/solr-ref-guide/src/configsets-api.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/configsets-api.adoc b/solr/solr-ref-guide/src/configsets-api.adoc
index 1bf76f7..2270eb6 100644
--- a/solr/solr-ref-guide/src/configsets-api.adoc
+++ b/solr/solr-ref-guide/src/configsets-api.adoc
@@ -32,6 +32,7 @@ The base URL for all API calls is `\http://<hostname>:<port>/solr`.
 * `/admin/configs?action=CREATE`: <<ConfigSetsAPI-create,create>> a ConfigSet, based on an existing ConfigSet
 * `/admin/configs?action=DELETE`: <<ConfigSetsAPI-delete,delete>> a ConfigSet
 * `/admin/configs?action=LIST`: <<ConfigSetsAPI-list,list>> all ConfigSets
+* `/admin/configs?action=UPLOAD`: <<ConfigSetsAPI-upload,upload>> a ConfigSet
 
 [[ConfigSetsAPI-createCreateaConfigSet]]
 
@@ -169,3 +170,48 @@ http://localhost:8983/solr/admin/configs?action=LIST&wt=json
   "configSets":["myConfigSet1",
     "myConfig2"]}
 ----
+
+[[ConfigSetsAPI-uploadCreateaConfigSet]]
+
+[[ConfigSetsAPI-upload]]
+== Upload a ConfigSet
+
+`/admin/configs?action=UPLOAD&name=_name_`
+
+Upload a ConfigSet, sent in as a zipped file. Please note that a ConfigSet is uploaded in a "trusted" mode if authentication is enabled and this upload operation is performed as an authenticated request. Without authentication, a ConfigSet is uploaded in an "untrusted" mode. Upon creation of a collection using an "untrusted" ConfigSet, the following functionality would not work:
+
+ * RunExecutableListener does not initialize, if specified in the ConfigSet.
+ * DataImportHandler's ScriptTransformer does not initialize, if specified in the ConfigSet.
+ * XSLT transformer (tr parameter) cannot be used at request processing time.
+ * StatelessScriptUpdateProcessor does not initialize, if specified in the ConfigSet.
+
+[[ConfigSetsAPI-Input]]
+=== Input
+
+// TODO: Change column width to %autowidth.spread when https://github.com/asciidoctor/asciidoctor-pdf/issues/599 is fixed
+
+[cols="20,15,10,15,40",options="header"]
+|===
+|Key |Type |Required |Default |Description
+|name |String |Yes | |ConfigSet to be created
+|===
+
+The body of the request should contain a zipped config set.
+
+[[ConfigSetsAPI-Output]]
+=== Output
+
+*Output Content*
+
+The output will include the status of the request. If the status is anything other than "success", an error message will explain why the request failed.
+
+[[ConfigSetsAPI-Examples]]
+=== Examples
+
+Create a ConfigSet named 'myConfigSet' based on a 'predefinedTemplate' ConfigSet, overriding the immutable property to false.
+
+[source,text]
+----
+curl -X POST -d @myconfigset.zip http://localhost:8983/solr/admin/configs?action=CREATE&name=myConfigSet --header "Content-Type:text/xml"
+----
+

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2eb324f9/solr/solr-ref-guide/src/using-solrj.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/using-solrj.adoc b/solr/solr-ref-guide/src/using-solrj.adoc
index 7850776..fb92bd9 100644
--- a/solr/solr-ref-guide/src/using-solrj.adoc
+++ b/solr/solr-ref-guide/src/using-solrj.adoc
@@ -35,8 +35,12 @@ SolrClient solr = new HttpSolrClient.Builder(urlString).build();
 .SolrCloud client
 [source,java]
 ----
+// Using a ZK Host String
 String zkHostString = "zkServerA:2181,zkServerB:2181,zkServerC:2181/solr";
 SolrClient solr = new CloudSolrClient.Builder().withZkHost(zkHostString).build();
+
+// Using already running Solr nodes
+SolrClient solr = new CloudSolrClient.Builder().withSolrUrl("http://localhost:8983/solr").build();
 ----
 
 Once you have a `SolrClient`, you can use it by calling methods like `query()`, `add()`, and `commit()`.


[45/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10782: Skip asserting that sysLoadAvg is positive on windows as this metrics is not available on that platform

Posted by sh...@apache.org.
SOLR-10782: Skip asserting that sysLoadAvg is positive on windows as this metrics is not available on that platform


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/ea79c668
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/ea79c668
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/ea79c668

Branch: refs/heads/feature/autoscaling
Commit: ea79c668c7e0b4d6d64d5cc32db99f17ac4f1936
Parents: bd2203d
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue Jun 6 16:31:43 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Tue Jun 6 16:31:43 2017 +0530

----------------------------------------------------------------------
 .../org/apache/solr/cloud/autoscaling/TestPolicyCloud.java     | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ea79c668/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
index ddb9d11..b584e49 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/TestPolicyCloud.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.lucene.util.Constants;
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.solr.client.solrj.SolrRequest;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -169,7 +170,10 @@ public class TestPolicyCloud extends SolrCloudTestCase {
     assertTrue(((Number) val.get("cores")).intValue() > 0);
     assertTrue("freedisk value is " + ((Number) val.get("freedisk")).doubleValue(),  Double.compare(((Number) val.get("freedisk")).doubleValue(), 0.0d) > 0);
     assertTrue("heapUsage value is " + ((Number) val.get("heapUsage")).doubleValue(), Double.compare(((Number) val.get("heapUsage")).doubleValue(), 0.0d) > 0);
-    assertTrue("sysLoadAvg value is " + ((Number) val.get("sysLoadAvg")).doubleValue(), Double.compare(((Number) val.get("sysLoadAvg")).doubleValue(), 0.0d) > 0);
+    if (!Constants.WINDOWS)  {
+      // the system load average metrics is not available on windows platform
+      assertTrue("sysLoadAvg value is " + ((Number) val.get("sysLoadAvg")).doubleValue(), Double.compare(((Number) val.get("sysLoadAvg")).doubleValue(), 0.0d) > 0);
+    }
     String overseerNode = OverseerTaskProcessor.getLeaderNode(cluster.getZkClient());
     cluster.getSolrClient().request(CollectionAdminRequest.addRole(overseerNode, "overseer"));
     for (int i = 0; i < 10; i++) {


[19/50] [abbrv] lucene-solr:feature/autoscaling: Ref Guide: fix duplicate anchors for internal links

Posted by sh...@apache.org.
Ref Guide: fix duplicate anchors for internal links


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/07bcd4df
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/07bcd4df
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/07bcd4df

Branch: refs/heads/feature/autoscaling
Commit: 07bcd4df1f70fd0ce41e1aed7a94aa72a1bbf656
Parents: 038baae
Author: Cassandra Targett <ct...@apache.org>
Authored: Fri Jun 2 14:37:00 2017 -0500
Committer: Cassandra Targett <ct...@apache.org>
Committed: Fri Jun 2 14:52:02 2017 -0500

----------------------------------------------------------------------
 solr/solr-ref-guide/src/collections-api.adoc |  4 ++--
 solr/solr-ref-guide/src/configsets-api.adoc  | 11 +++--------
 2 files changed, 5 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/07bcd4df/solr/solr-ref-guide/src/collections-api.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/collections-api.adoc b/solr/solr-ref-guide/src/collections-api.adoc
index 35300a3..25df02f 100644
--- a/solr/solr-ref-guide/src/collections-api.adoc
+++ b/solr/solr-ref-guide/src/collections-api.adoc
@@ -541,12 +541,12 @@ http://localhost:8983/solr/admin/collections?action=DELETEALIAS&name=testalias
 
 `/admin/collections?action=LISTALIASES`
 
-[[CollectionsAPI-Output.6]]
+[[CollectionsAPI-Output.27]]
 === Output
 
 The output will contain a list of aliases with the corresponding collection names.
 
-[[CollectionsAPI-Examples.6]]
+[[CollectionsAPI-Examples.27]]
 === Examples
 
 *Output*

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/07bcd4df/solr/solr-ref-guide/src/configsets-api.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/configsets-api.adoc b/solr/solr-ref-guide/src/configsets-api.adoc
index 2270eb6..dcc3c33 100644
--- a/solr/solr-ref-guide/src/configsets-api.adoc
+++ b/solr/solr-ref-guide/src/configsets-api.adoc
@@ -140,8 +140,6 @@ http://localhost:8983/solr/admin/configs?action=DELETE&name=myConfigSet
 </response>
 ----
 
-[[ConfigSetsAPI-listListConfigSets]]
-
 [[ConfigSetsAPI-list]]
 == List ConfigSets
 
@@ -171,8 +169,6 @@ http://localhost:8983/solr/admin/configs?action=LIST&wt=json
     "myConfig2"]}
 ----
 
-[[ConfigSetsAPI-uploadCreateaConfigSet]]
-
 [[ConfigSetsAPI-upload]]
 == Upload a ConfigSet
 
@@ -185,7 +181,7 @@ Upload a ConfigSet, sent in as a zipped file. Please note that a ConfigSet is up
  * XSLT transformer (tr parameter) cannot be used at request processing time.
  * StatelessScriptUpdateProcessor does not initialize, if specified in the ConfigSet.
 
-[[ConfigSetsAPI-Input]]
+[[ConfigSetsAPI-Input.3]]
 === Input
 
 // TODO: Change column width to %autowidth.spread when https://github.com/asciidoctor/asciidoctor-pdf/issues/599 is fixed
@@ -198,14 +194,14 @@ Upload a ConfigSet, sent in as a zipped file. Please note that a ConfigSet is up
 
 The body of the request should contain a zipped config set.
 
-[[ConfigSetsAPI-Output]]
+[[ConfigSetsAPI-Output.3]]
 === Output
 
 *Output Content*
 
 The output will include the status of the request. If the status is anything other than "success", an error message will explain why the request failed.
 
-[[ConfigSetsAPI-Examples]]
+[[ConfigSetsAPI-Examples.3]]
 === Examples
 
 Create a ConfigSet named 'myConfigSet' based on a 'predefinedTemplate' ConfigSet, overriding the immutable property to false.
@@ -214,4 +210,3 @@ Create a ConfigSet named 'myConfigSet' based on a 'predefinedTemplate' ConfigSet
 ----
 curl -X POST -d @myconfigset.zip http://localhost:8983/solr/admin/configs?action=CREATE&name=myConfigSet --header "Content-Type:text/xml"
 ----
-


[22/50] [abbrv] lucene-solr:feature/autoscaling: LUCENE-7705: Allow CharTokenizer-derived tokenizers and KeywordTokenizer to configure the max token len (test fix)

Posted by sh...@apache.org.
LUCENE-7705: Allow CharTokenizer-derived tokenizers and KeywordTokenizer to configure the max token len (test fix)


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/15a8a241
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/15a8a241
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/15a8a241

Branch: refs/heads/feature/autoscaling
Commit: 15a8a2415280d50c982fcd4fca893a3c3224da14
Parents: 393a2ed
Author: Erick <er...@apache.org>
Authored: Fri Jun 2 14:11:11 2017 -0700
Committer: Erick <er...@apache.org>
Committed: Fri Jun 2 14:11:11 2017 -0700

----------------------------------------------------------------------
 .../collection1/conf/schema-tokenizer-test.xml  | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/15a8a241/solr/core/src/test-files/solr/collection1/conf/schema-tokenizer-test.xml
----------------------------------------------------------------------
diff --git a/solr/core/src/test-files/solr/collection1/conf/schema-tokenizer-test.xml b/solr/core/src/test-files/solr/collection1/conf/schema-tokenizer-test.xml
index f3d3196..af28016 100644
--- a/solr/core/src/test-files/solr/collection1/conf/schema-tokenizer-test.xml
+++ b/solr/core/src/test-files/solr/collection1/conf/schema-tokenizer-test.xml
@@ -50,7 +50,7 @@ more concise example.
 
   <!-- Seperate analyzers for index and query time -->
 
-  <fieldType name="letterfieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="letterfieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
       <analyzer type="index">
         <tokenizer class="solr.LetterTokenizerFactory" maxTokenLen="3" />
       </analyzer>
@@ -59,7 +59,7 @@ more concise example.
       </analyzer>
   </fieldType>
 
-  <fieldType name="lowerCasefieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="lowerCasefieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer type="index">
       <tokenizer class="solr.LowerCaseTokenizerFactory" maxTokenLen="3" />
     </analyzer>
@@ -68,7 +68,7 @@ more concise example.
     </analyzer>
   </fieldType>
 
-  <fieldType name="whiteSpfieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="whiteSpfieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer type="index">
       <tokenizer class="solr.WhitespaceTokenizerFactory" maxTokenLen="3" />
     </analyzer>
@@ -77,7 +77,7 @@ more concise example.
     </analyzer>
   </fieldType>
 
-  <fieldType name="uniWhiteSpfieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="uniWhiteSpfieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer type="index">
       <tokenizer class="solr.WhitespaceTokenizerFactory" maxTokenLen="3" />
     </analyzer>
@@ -86,7 +86,7 @@ more concise example.
     </analyzer>
   </fieldType>
 
-  <fieldType name="keywordfieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="keywordfieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer index="index">
       <tokenizer class="solr.KeywordTokenizerFactory" maxTokenLen="3" />
     </analyzer>
@@ -97,31 +97,31 @@ more concise example.
 
   <!-- Same analyzers for both index and query time -->
 
-  <fieldType name="letter0fieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="letter0fieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer>
       <tokenizer class="solr.LetterTokenizerFactory" maxTokenLen="3" />
     </analyzer>
   </fieldType>
 
-  <fieldType name="lowerCase0fieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="lowerCase0fieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer>
       <tokenizer class="solr.LowerCaseTokenizerFactory" maxTokenLen="3" />
     </analyzer>
   </fieldType>
 
-  <fieldType name="whiteSp0fieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="whiteSp0fieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer>
       <tokenizer class="solr.WhitespaceTokenizerFactory" maxTokenLen="3" />
     </analyzer>
   </fieldType>
 
-  <fieldType name="uniWhiteSp0fieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="uniWhiteSp0fieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer>
       <tokenizer class="solr.WhitespaceTokenizerFactory" maxTokenLen="3" />
     </analyzer>
   </fieldType>
 
-  <fieldType name="keyword0fieldType" class="solr.TextField" positionIncrementGap="100">
+  <fieldType name="keyword0fieldType" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false">
     <analyzer>
       <tokenizer class="solr.KeywordTokenizerFactory"  maxTokenLen="3" />
     </analyzer>


[08/50] [abbrv] lucene-solr:feature/autoscaling: LUCENE-7858: checkJavadocLinks.py to mention common root causes of broken links

Posted by sh...@apache.org.
LUCENE-7858: checkJavadocLinks.py to mention common root causes of broken links


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/445ceda0
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/445ceda0
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/445ceda0

Branch: refs/heads/feature/autoscaling
Commit: 445ceda01cb5355d4a21a095a19fe1af2b28959e
Parents: cccf97c
Author: Christine Poerschke <cp...@apache.org>
Authored: Fri Jun 2 10:40:53 2017 +0100
Committer: Christine Poerschke <cp...@apache.org>
Committed: Fri Jun 2 10:40:53 2017 +0100

----------------------------------------------------------------------
 dev-tools/scripts/checkJavadocLinks.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/445ceda0/dev-tools/scripts/checkJavadocLinks.py
----------------------------------------------------------------------
diff --git a/dev-tools/scripts/checkJavadocLinks.py b/dev-tools/scripts/checkJavadocLinks.py
index e5ff2f3..2e3cdea 100644
--- a/dev-tools/scripts/checkJavadocLinks.py
+++ b/dev-tools/scripts/checkJavadocLinks.py
@@ -266,7 +266,10 @@ def checkAll(dirName):
 if __name__ == '__main__':
   if checkAll(sys.argv[1]):
     print()
-    print('Broken javadocs links were found!')
+    print('Broken javadocs links were found! Common root causes:')
+    # please feel free to add to this list
+    print('* A typo of some sort for manually created links.')
+    print('* Public methods referencing non-public classes in their signature.')
     sys.exit(1)
   sys.exit(0)
   


[48/50] [abbrv] lucene-solr:feature/autoscaling: Completing merge from master

Posted by sh...@apache.org.
Completing merge from master


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2d540259
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2d540259
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2d540259

Branch: refs/heads/feature/autoscaling
Commit: 2d540259dc4455850ee4814f8bc2784949272298
Parents: 6a8768e
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Tue Jun 6 19:32:03 2017 +0530
Committer: Shalin Shekhar Mangar <sh...@apache.org>
Committed: Tue Jun 6 19:32:03 2017 +0530

----------------------------------------------------------------------
 .../org/apache/solr/cloud/ZkController.java     |  4 +-
 .../cloud/autoscaling/AutoScalingHandler.java   |  2 +
 .../apache/solr/metrics/SolrMetricReporter.java | 11 ----
 .../org/apache/solr/cloud/ShardSplitTest.java   |  7 ---
 .../autoscaling/AutoScalingHandlerTest.java     | 34 +++++------
 .../org/apache/solr/cloud/autoscaling/Cell.java | 60 ++++++++++++++++++--
 .../apache/solr/common/cloud/ZkStateReader.java |  2 +
 .../solr/common/params/CollectionParams.java    |  1 -
 .../apache/solr/util/ReadOnlyCoresLocator.java  |  6 --
 9 files changed, 79 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/core/src/java/org/apache/solr/cloud/ZkController.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index b859599..086c150 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -665,6 +665,8 @@ public class ZkController {
     cmdExecutor.ensureExists(ZkStateReader.LIVE_NODES_ZKNODE, zkClient);
     cmdExecutor.ensureExists(ZkStateReader.COLLECTIONS_ZKNODE, zkClient);
     cmdExecutor.ensureExists(ZkStateReader.ALIASES, zkClient);
+    cmdExecutor.ensureExists(ZkStateReader.SOLR_AUTOSCALING_EVENTS_PATH, zkClient);
+    cmdExecutor.ensureExists(ZkStateReader.SOLR_AUTOSCALING_TRIGGER_STATE_PATH, zkClient);
     byte[] emptyJson = "{}".getBytes(StandardCharsets.UTF_8);
     cmdExecutor.ensureExists(ZkStateReader.CLUSTER_STATE, emptyJson, CreateMode.PERSISTENT, zkClient);
     cmdExecutor.ensureExists(ZkStateReader.SOLR_SECURITY_CONF_PATH, emptyJson, CreateMode.PERSISTENT, zkClient);
@@ -1842,7 +1844,7 @@ public class ZkController {
     }
   }
 
-  CoreContainer getCoreContainer() {
+  public CoreContainer getCoreContainer() {
     return cc;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
index ff101f3..f1effd3 100644
--- a/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
+++ b/solr/core/src/java/org/apache/solr/cloud/autoscaling/AutoScalingHandler.java
@@ -24,7 +24,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java b/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
index 78931a2..222377b 100644
--- a/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
+++ b/solr/core/src/java/org/apache/solr/metrics/SolrMetricReporter.java
@@ -86,17 +86,6 @@ public abstract class SolrMetricReporter implements Closeable, PluginInfoInitial
   }
 
   /**
-   * Enable reporting, defaults to true. Implementations should check this flag in
-   * {@link #validate()} and accordingly enable or disable reporting.
-   * @param enabled enable, defaults to true when null or not set.
-   */
-  public void setEnabled(Boolean enabled) {
-    if (enabled != null) {
-      this.enabled = enabled;
-    }
-  }
-
-  /**
    * Get the effective {@link PluginInfo} instance that was used for
    * initialization of this plugin.
    * @return plugin info, or null if not yet initialized.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
index 4de011b..e23a8bf 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ShardSplitTest.java
@@ -86,12 +86,6 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     useFactory(null);
   }
 
-  //TODO for now, onlyLeaderIndexes do not work with ShardSplitTest
-  @Override
-  protected int getRealtimeReplicas() {
-    return -1;
-  }
-
   @Test
   public void test() throws Exception {
 
@@ -1031,4 +1025,3 @@ public class ShardSplitTest extends BasicDistributedZkTest {
     return client;
   }
 }
-

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
index 2f02df9..25e42eb 100644
--- a/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/autoscaling/AutoScalingHandlerTest.java
@@ -76,11 +76,11 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t}\n" +
         "}";
     // these should be no-ops because there are no triggers, and it should succeed
-    SolrRequest req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, suspendEachCommand);
+    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendEachCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[]");
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, resumeEachCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeEachCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[]");
@@ -91,7 +91,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'event' : 'nodeLost'," +
         "'waitFor' : '10m'," +
         "'enabled' : true}}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -103,7 +103,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'enabled' : true" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 
@@ -112,7 +112,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"name\" : \"node_lost_trigger\"\n" +
         "\t}\n" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, suspendTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     assertEquals(response.get("changed").toString(), "[node_lost_trigger]");
@@ -136,7 +136,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : '" + Policy.EACH + "'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, suspendTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     List<String> changed = (List<String>)response.get("changed");
@@ -159,7 +159,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_added_trigger'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, resumeTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>)response.get("changed");
@@ -182,7 +182,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : '" + Policy.EACH + "'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, resumeTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, resumeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>)response.get("changed");
@@ -206,7 +206,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'timeout' : '1h'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, suspendTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, suspendTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     changed = (List<String>)response.get("changed");
@@ -242,7 +242,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'class' : 'solr.LogPlanAction'," +
         "'collection' : '.system'" +
         "}]}}";
-    SolrRequest req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
 
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
@@ -267,7 +267,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'waitFor' : '20m'," +
         "'enabled' : false" +
         "}}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -295,7 +295,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'url' : 'http://xyz.com/on_node_lost?node={$LOST_NODE_NAME}'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setListenerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -313,7 +313,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_lost_trigger'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, removeTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeTriggerCommand);
     try {
       response = solrClient.request(req);
       fail("Trying to remove trigger which has listeners registered should have failed");
@@ -326,7 +326,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "\t\t\"name\" : \"xyz\"\n" +
         "\t}\n" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, removeListenerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeListenerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -340,7 +340,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'name' : 'node_lost_trigger'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, removeTriggerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, removeTriggerCommand);
     response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
     data = zkClient().getData(SOLR_AUTOSCALING_CONF_PATH, null, null, true);
@@ -359,7 +359,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'url' : 'http://xyz.com/on_node_lost?node={$LOST_NODE_NAME}'" +
         "}" +
         "}";
-    req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setListenerCommand);
+    req = createAutoScalingRequest(SolrRequest.METHOD.POST, setListenerCommand);
     try {
       response = solrClient.request(req);
       fail("Adding a listener on a non-existent trigger should have failed");
@@ -504,7 +504,7 @@ public class AutoScalingHandlerTest extends SolrCloudTestCase {
         "'waitFor' : '0s'," +
         "'enabled' : true" +
         "}}";
-    SolrRequest req = new AutoScalingRequest(SolrRequest.METHOD.POST, path, setTriggerCommand);
+    SolrRequest req = createAutoScalingRequest(SolrRequest.METHOD.POST, setTriggerCommand);
     NamedList<Object> response = solrClient.request(req);
     assertEquals(response.get("result").toString(), "success");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
index d1a3626..3590f52 100644
--- a/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
+++ b/solr/solrj/src/java/org/apache/solr/cloud/autoscaling/Cell.java
@@ -1,7 +1,57 @@
+/*
+ * 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.
+ */
+
 package org.apache.solr.cloud.autoscaling;
 
-/**
- * Created by shalin on 6/6/17.
- */
-public class Cell {
-}
+import java.io.IOException;
+import java.util.HashMap;
+
+import org.apache.solr.common.MapWriter;
+import org.apache.solr.common.util.Utils;
+
+class Cell implements MapWriter {
+  final int index;
+  final String name;
+  Object val, approxVal;
+
+  Cell(int index, String name, Object val) {
+    this.index = index;
+    this.name = name;
+    this.val = val;
+  }
+
+  Cell(int index, String name, Object val, Object approxVal) {
+    this.index = index;
+    this.name = name;
+    this.val = val;
+    this.approxVal = approxVal;
+  }
+
+  @Override
+  public void writeMap(EntryWriter ew) throws IOException {
+    ew.put(name, val);
+  }
+
+  @Override
+  public String toString() {
+    return Utils.toJSONString(this.toMap(new HashMap<>()));
+  }
+
+  public Cell copy() {
+    return new Cell(index, name, val, approxVal);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index 1b03534..c1bfd87 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -94,6 +94,8 @@ public class ZkStateReader implements Closeable {
   public static final String REJOIN_AT_HEAD_PROP = "rejoinAtHead";
   public static final String SOLR_SECURITY_CONF_PATH = "/security.json";
   public static final String SOLR_AUTOSCALING_CONF_PATH = "/autoscaling.json";
+  public static final String SOLR_AUTOSCALING_EVENTS_PATH = "/autoscaling/events";
+  public static final String SOLR_AUTOSCALING_TRIGGER_STATE_PATH = "/autoscaling/triggerState";
 
   public static final String REPLICATION_FACTOR = "replicationFactor";
   public static final String MAX_SHARDS_PER_NODE = "maxShardsPerNode";

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
index 285edf5..d79fafa 100644
--- a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
+++ b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java
@@ -96,7 +96,6 @@ public interface CollectionParams {
     CREATESNAPSHOT(true, LockLevel.COLLECTION),
     DELETESNAPSHOT(true, LockLevel.COLLECTION),
     LISTSNAPSHOTS(false, LockLevel.NONE),
-    MOVEREPLICA(false, LockLevel.SHARD),
     //only for testing. it just waits for specified time
     // these are not exposed via collection API commands
     // but the overseer is aware of these tasks

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2d540259/solr/test-framework/src/java/org/apache/solr/util/ReadOnlyCoresLocator.java
----------------------------------------------------------------------
diff --git a/solr/test-framework/src/java/org/apache/solr/util/ReadOnlyCoresLocator.java b/solr/test-framework/src/java/org/apache/solr/util/ReadOnlyCoresLocator.java
index 3ad3ce2..3d11ff7 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/ReadOnlyCoresLocator.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/ReadOnlyCoresLocator.java
@@ -47,10 +47,4 @@ public abstract class ReadOnlyCoresLocator implements CoresLocator {
     // no-op
   }
 
-  @Override
-  public CoreDescriptor reload(CoreContainer cc, CoreDescriptor cd) {
-    return null; // no-op
-  }
-
-
 }


[40/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10651: Update CHANGES.txt for completed subtasks

Posted by sh...@apache.org.
SOLR-10651: Update CHANGES.txt for completed subtasks


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/4f55b43d
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/4f55b43d
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/4f55b43d

Branch: refs/heads/feature/autoscaling
Commit: 4f55b43daa8e21fcd44d50d3e7e0932767db82e3
Parents: 7646f91
Author: Joel Bernstein <jb...@apache.org>
Authored: Mon Jun 5 20:02:46 2017 -0400
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Jun 5 20:02:46 2017 -0400

----------------------------------------------------------------------
 solr/CHANGES.txt | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4f55b43d/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index df071eb..b0da3b8 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -278,6 +278,44 @@ New Features
 
 * SOLR-3702: concat(...) function query (Andrey Kudryavtsev via Mikhail Khludnev)
 
+* SOLR-10767: Add movingAvg Stream Evaluator (Joel Bernstein)
+
+* SOLR-10813: Add arraySort Stream Evaluator (Joel Bernstein)
+
+* SOLR-10696: Add cumulative probability function (Joel Bernstein)
+
+* SOLR-10765: Add anova Stream Evaluator (Joel Bernstein)
+
+* SOLR-10754: Add hist Stream Evaluator (Joel Bernstein)
+
+* SOLR-10753: Add array Stream Evaluator (Joel Bernstein)
+
+* SOLR-10747: Allow /stream handler to execute Stream Evaluators directly (Joel Bernstein)
+
+* SOLR-10743: Add sequence StreamEvaluator (Joel Bernstein)
+
+* SOLR-10684: Add finddelay Stream Evaluator (Joel Bernstein)
+
+* SOLR-10731: Add knn Streaming Expression (Joel Bernstein)
+
+* SOLR-10724: Add describe Stream Evaluator (Joel Bernstein)
+
+* SOLR-10693: Add copyOfRange Stream Evaluator (Joel Bernstein)
+
+* SOLR-10623: Add sql Streaming Expression (Joel Bernstein)
+
+* SOLR-10661: Add copyOf Stream Evaluator (Joel Bernstein)
+
+* SOLR-10663: Add distance Stream Evaluator (Joel Bernstein)
+
+* SOLR-10664: Add scale Stream Evaluator (Joel Bernstein)
+
+* SOLR-10666: Add rank transformation Stream Evaluator (Joel Bernstein)
+
+* SOLR-10662: Add length Stream Evaluator (Joel Bernstein)
+
+* SOLR-10660: Add reverse Stream Evaluator (Joel Bernstein)
+
 Bug Fixes
 ----------------------
 * SOLR-10723 JSON Facet API: resize() implemented incorrectly for CountSlotAcc, HllAgg.NumericAcc


[39/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10521: documenting sort=childfield(field) asc

Posted by sh...@apache.org.
SOLR-10521: documenting sort=childfield(field) asc


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/7646f910
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/7646f910
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/7646f910

Branch: refs/heads/feature/autoscaling
Commit: 7646f91097c54890348b2f9dda9cf4e554c3f77d
Parents: 357f4df
Author: Mikhail Khludnev <mk...@apache.org>
Authored: Tue Jun 6 00:27:15 2017 +0300
Committer: Mikhail Khludnev <mk...@apache.org>
Committed: Tue Jun 6 00:31:10 2017 +0300

----------------------------------------------------------------------
 solr/solr-ref-guide/src/function-queries.adoc | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7646f910/solr/solr-ref-guide/src/function-queries.adoc
----------------------------------------------------------------------
diff --git a/solr/solr-ref-guide/src/function-queries.adoc b/solr/solr-ref-guide/src/function-queries.adoc
index 624406f..7e03ae3 100644
--- a/solr/solr-ref-guide/src/function-queries.adoc
+++ b/solr/solr-ref-guide/src/function-queries.adoc
@@ -86,6 +86,10 @@ The table below summarizes the functions available for function queries.
 |===
 |Function |Description |Syntax Examples
 |abs |Returns the absolute value of the specified value or function. |`abs(x)` `abs(-5)`
+|childfield(field)|Returns the value of the given field for one of the matched child docs when searching by <<other-parsers.adoc#OtherParsers-BlockJoinParentQueryParser,{!parent}>>. It can be used only in `sort` parameter|
+* `sort=childfield(name) asc` implies `$q` as a second argument and therefor it assumes `q={!parent ..}..`;
+* `sort=childfield(field,$bjq) asc` refers to a separate parameter `bjq={!parent ..}..`;
+* `sort=childfield(field,{!parent of=...}...) desc` allows to inline block join parent query 
 |concat(v,f..)|concatenates the given string fields, literals and other functions |`concat(name," ",$param,def(opt,"-"))`
 |"constant" |Specifies a floating point constant. |`1.5`
 |def |`def` is short for default. Returns the value of field "field", or if the field does not exist, returns the default value specified. and yields the first value where `exists()==true`.) |`def(rating,5):` This `def()` function returns the rating, or if no rating specified in the doc, returns 5 `def(myfield, 1.0):` equivalent to `if(exists(myfield),myfield,1.0)`


[28/50] [abbrv] lucene-solr:feature/autoscaling: SOLR-10744: use the new flags in json parsing and add tests

Posted by sh...@apache.org.
SOLR-10744: use the new flags in json parsing and add tests


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/1f437fe5
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/1f437fe5
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/1f437fe5

Branch: refs/heads/feature/autoscaling
Commit: 1f437fe5ab8892e102792a30c3621d005a36a024
Parents: 67876b3
Author: Noble Paul <no...@apache.org>
Authored: Mon Jun 5 13:34:07 2017 +0930
Committer: Noble Paul <no...@apache.org>
Committed: Mon Jun 5 13:34:07 2017 +0930

----------------------------------------------------------------------
 .../test/org/apache/solr/util/TestUtils.java    | 27 +++++++++++++++++++-
 .../java/org/apache/solr/common/util/Utils.java | 16 +++++++++---
 2 files changed, 39 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1f437fe5/solr/core/src/test/org/apache/solr/util/TestUtils.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/util/TestUtils.java b/solr/core/src/test/org/apache/solr/util/TestUtils.java
index 7b209ea..5c55cd7 100644
--- a/solr/core/src/test/org/apache/solr/util/TestUtils.java
+++ b/solr/core/src/test/org/apache/solr/util/TestUtils.java
@@ -16,6 +16,9 @@
  */
 package org.apache.solr.util;
 
+import java.io.IOException;
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -23,11 +26,14 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.junit.Assert;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 /**
  *
  */
@@ -154,7 +160,26 @@ public class TestUtils extends SolrTestCaseJ4 {
     assertEquals( num, NumberUtils.SortableStr2long(sortable, 0, sortable.length() ) );
     assertEquals( Long.toString(num), NumberUtils.SortableStr2long(sortable) );
   }
-  
+
+  public void testNoggitFlags() throws IOException {
+    String s = "a{b:c, d [{k1:v1}{k2:v2}]}";
+    assertNoggitJsonValues((Map) Utils.fromJSON(s.getBytes(UTF_8)));
+    assertNoggitJsonValues((Map) Utils.fromJSONString(s));
+    List<CommandOperation> commands = CommandOperation.parse(new StringReader(s + s));
+    assertEquals(2, commands.size());
+    for (CommandOperation command : commands) {
+      assertEquals("a", command.name);
+      assertEquals( "v1" ,Utils.getObjectByPath(command.getDataMap(), true, "d[0]/k1"));command.getDataMap();
+      assertEquals( "v2" ,Utils.getObjectByPath(command.getDataMap(), true, "d[1]/k2"));command.getDataMap();
+    }
+  }
+
+  private void assertNoggitJsonValues(Map m) {
+    assertEquals( "c" ,Utils.getObjectByPath(m, true, "/a/b"));
+    assertEquals( "v1" ,Utils.getObjectByPath(m, true, "/a/d[0]/k1"));
+    assertEquals( "v2" ,Utils.getObjectByPath(m, true, "/a/d[1]/k2"));
+  }
+
   public void testUtilsJSPath(){
     
     String json = "{\n" +

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1f437fe5/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index 4cb6b8e..01b7870 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -19,6 +19,7 @@ package org.apache.solr.common.util;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.io.Reader;
 import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
@@ -104,6 +105,9 @@ public class Utils {
     CharArr chars = new CharArr();
     ByteUtils.UTF8toUTF16(utf8, 0, utf8.length, chars);
     JSONParser parser = new JSONParser(chars.getArray(), chars.getStart(), chars.length());
+    parser.setFlags(parser.getFlags() |
+        JSONParser.ALLOW_MISSING_COLON_COMMA_BEFORE_OBJECT |
+        JSONParser.OPTIONAL_OUTER_BRACES);
     try {
       return ObjectBuilder.getVal(parser);
     } catch (IOException e) {
@@ -124,7 +128,7 @@ public class Utils {
 
   public static Object fromJSON(InputStream is){
     try {
-      return new ObjectBuilder(new JSONParser(new InputStreamReader(is, StandardCharsets.UTF_8))).getObject();
+      return new ObjectBuilder(getJSONParser((new InputStreamReader(is, StandardCharsets.UTF_8)))).getObject();
     } catch (IOException e) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Parse error", e);
     }
@@ -135,11 +139,17 @@ public class Utils {
         .getContextClassLoader().getResourceAsStream(resourceName));
 
   }
+  public static JSONParser getJSONParser(Reader reader){
+    JSONParser parser = new JSONParser(reader);
+    parser.setFlags(parser.getFlags() |
+        JSONParser.ALLOW_MISSING_COLON_COMMA_BEFORE_OBJECT |
+        JSONParser.OPTIONAL_OUTER_BRACES);
+    return parser;
+  }
 
   public static Object fromJSONString(String json)  {
     try {
-      return new ObjectBuilder(new JSONParser(new StringReader(
-          json))).getObject();
+      return new ObjectBuilder(getJSONParser(new StringReader(json))).getObject();
     } catch (IOException e) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Parse error", e);
     }