You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2017/02/16 13:46:51 UTC

[01/50] lucene-solr:jira/solr-9858: Upgrade Avatica and Calcite. Fix NPE bug

Repository: lucene-solr
Updated Branches:
  refs/heads/jira/solr-9858 4fea121b3 -> 69187b7a4


Upgrade Avatica and Calcite. Fix NPE bug


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

Branch: refs/heads/jira/solr-9858
Commit: 28fb5855f4529589ab2a9a19f8ba53ca4d9ac120
Parents: 3856ce4
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Oct 31 10:14:09 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Nov 1 11:19:48 2016 -0500

----------------------------------------------------------------------
 lucene/ivy-versions.properties                  |   4 +-
 .../config/CalciteConnectionProperty.java       | 182 -------------------
 .../org/apache/solr/handler/SQLHandler.java     |   2 +-
 .../solr/handler/sql/CalciteSolrDriver.java     |   4 +
 .../avatica-core-1.9.0-SNAPSHOT.jar.sha1        |   1 -
 solr/licenses/avatica-core-1.9.0.jar.sha1       |   1 +
 solr/licenses/calcite-core-1.10.0.jar.sha1      |   1 -
 .../calcite-core-1.11.0-SNAPSHOT.jar.sha1       |   1 +
 solr/licenses/calcite-linq4j-1.10.0.jar.sha1    |   1 -
 .../calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1     |   1 +
 10 files changed, 10 insertions(+), 188 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/lucene/ivy-versions.properties
----------------------------------------------------------------------
diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties
index cf930ac..f42e701 100644
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@ -99,8 +99,8 @@ io.netty.netty-all.version = 4.0.36.Final
 /org.apache.ant/ant = 1.8.2
 /org.apache.avro/avro = 1.7.5
 
-org.apache.calcite.version = 1.10.0
-org.apache.calcite.avatica.version = 1.9.0-SNAPSHOT
+org.apache.calcite.version = 1.11.0-SNAPSHOT
+org.apache.calcite.avatica.version = 1.9.0
 /org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version}
 /org.apache.calcite/calcite-core = ${org.apache.calcite.version}
 /org.apache.calcite/calcite-linq4j = ${org.apache.calcite.version}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/core/src/java/org/apache/calcite/config/CalciteConnectionProperty.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/calcite/config/CalciteConnectionProperty.java b/solr/core/src/java/org/apache/calcite/config/CalciteConnectionProperty.java
deleted file mode 100644
index b532c83..0000000
--- a/solr/core/src/java/org/apache/calcite/config/CalciteConnectionProperty.java
+++ /dev/null
@@ -1,182 +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.calcite.config;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.calcite.avatica.ConnectionProperty;
-import org.apache.calcite.avatica.util.Casing;
-import org.apache.calcite.avatica.util.Quoting;
-import org.apache.calcite.model.JsonSchema;
-import org.apache.calcite.sql.validate.SqlConformance;
-
-import static org.apache.calcite.avatica.ConnectionConfigImpl.PropEnv;
-import static org.apache.calcite.avatica.ConnectionConfigImpl.parse;
-
-/**
- * Properties that may be specified on the JDBC connect string.
- */
-public enum CalciteConnectionProperty implements ConnectionProperty {
-  /** Whether to store query results in temporary tables. */
-  AUTO_TEMP("autoTemp", Type.BOOLEAN, false, false),
-
-  /** Whether Calcite should use materializations. */
-  MATERIALIZATIONS_ENABLED("materializationsEnabled", Type.BOOLEAN, true,
-      false),
-
-  /** Whether Calcite should create materializations. */
-  CREATE_MATERIALIZATIONS("createMaterializations", Type.BOOLEAN, true, false),
-
-  /** How NULL values should be sorted if neither NULLS FIRST nor NULLS LAST are
-   * specified. The default, HIGH, sorts NULL values the same as Oracle. */
-  DEFAULT_NULL_COLLATION("defaultNullCollation", Type.ENUM, NullCollation.HIGH, NullCollation.class,
-      true),
-
-  /** How many rows the Druid adapter should fetch at a time when executing
-   * "select" queries. */
-  DRUID_FETCH("druidFetch", Type.NUMBER, 16384, false),
-
-  /** URI of the model. */
-  MODEL("model", Type.STRING, null, false),
-
-  /** Lexical policy. */
-  LEX("lex", Type.ENUM, Lex.ORACLE, Lex.class, false),
-
-  /** Collection of built-in functions and operators. Valid values include
-   * "standard" and "oracle". */
-  FUN("fun", Type.STRING, "standard", true),
-
-  /** How identifiers are quoted.
-   *  If not specified, value from {@link #LEX} is used. */
-  QUOTING("quoting", Type.ENUM, null, Quoting.class, false),
-
-  /** How identifiers are stored if they are quoted.
-   *  If not specified, value from {@link #LEX} is used. */
-  QUOTED_CASING("quotedCasing", Type.ENUM, null, Casing.class, false),
-
-  /** How identifiers are stored if they are not quoted.
-   *  If not specified, value from {@link #LEX} is used. */
-  UNQUOTED_CASING("unquotedCasing", Type.ENUM, null, Casing.class, false),
-
-  /** Whether identifiers are matched case-sensitively.
-   *  If not specified, value from {@link #LEX} is used. */
-  CASE_SENSITIVE("caseSensitive", Type.BOOLEAN, null, false),
-
-  /** Name of initial schema. */
-  SCHEMA("schema", Type.STRING, null, false),
-
-  /** Schema factory.
-   *
-   * <p>The name of a class that implements
-   * {@link org.apache.calcite.schema.SchemaFactory}.
-   *
-   * <p>Ignored if {@link #MODEL} is specified. */
-  SCHEMA_FACTORY("schemaFactory", Type.PLUGIN, null, false),
-
-  /** Schema type.
-   *
-   * <p>Value may be null, "MAP", "JDBC", or "CUSTOM"
-   * (implicit if {@link #SCHEMA_FACTORY} is specified).
-   * The value "NONE" is converted to null.
-   *
-   * <p>Ignored if {@link #MODEL} is specified. */
-  SCHEMA_TYPE("schemaType", Type.ENUM, JsonSchema.Type.NONE, JsonSchema.Type.class, false),
-
-  /** Specifies whether Spark should be used as the engine for processing that
-   * cannot be pushed to the source system. If false (the default), Calcite
-   * generates code that implements the Enumerable interface. */
-  SPARK("spark", Type.BOOLEAN, false, false),
-
-  /** Time zone, for example 'gmt-3'. Default is the JVM's time zone. */
-  TIME_ZONE("timeZone", Type.STRING, null, false),
-
-  /** If the planner should try de-correlating as much as it is possible.
-   * If true (the default), Calcite de-correlates the plan. */
-  FORCE_DECORRELATE("forceDecorrelate", Type.BOOLEAN, true, false),
-
-  /** Type system. The name of a class that implements
-   * {@link org.apache.calcite.rel.type.RelDataTypeSystem} and has a public
-   * default constructor or an {@code INSTANCE} constant. */
-  TYPE_SYSTEM("typeSystem", Type.PLUGIN, null, false),
-
-  /** SQL conformance level. */
-  CONFORMANCE("conformance", Type.ENUM, SqlConformance.DEFAULT, SqlConformance.class, false);
-
-  private final String camelName;
-  private final Type type;
-  private final Object defaultValue;
-  private final Class valueClass;
-  private final boolean required;
-
-  private static final Map<String, CalciteConnectionProperty> NAME_TO_PROPS;
-
-  /** Deprecated; use {@link #TIME_ZONE}. */
-  @Deprecated // to be removed before 2.0
-  public static final CalciteConnectionProperty TIMEZONE = TIME_ZONE;
-
-  static {
-    NAME_TO_PROPS = new HashMap<>();
-    for (CalciteConnectionProperty p : CalciteConnectionProperty.values()) {
-      NAME_TO_PROPS.put(p.camelName.toUpperCase(), p);
-      NAME_TO_PROPS.put(p.name(), p);
-    }
-  }
-
-  CalciteConnectionProperty(String camelName, Type type, Object defaultValue,
-                            boolean required) {
-    this(camelName, type, defaultValue, type.defaultValueClass(), required);
-  }
-
-  CalciteConnectionProperty(String camelName, Type type, Object defaultValue,
-                            Class valueClass, boolean required) {
-    this.camelName = camelName;
-    this.type = type;
-    this.defaultValue = defaultValue;
-    this.valueClass = valueClass;
-    this.required = required;
-    assert defaultValue == null || type.valid(defaultValue, valueClass);
-  }
-
-  public String camelName() {
-    return camelName;
-  }
-
-  public Object defaultValue() {
-    return defaultValue;
-  }
-
-  public Type type() {
-    return type;
-  }
-
-  public boolean required() {
-    return required;
-  }
-
-  public Class valueClass() {
-    return valueClass;
-  }
-
-  public PropEnv wrap(Properties properties) {
-    return new PropEnv(parse(properties, NAME_TO_PROPS), this);
-  }
-
-}
-
-// End CalciteConnectionProperty.java

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
index 61d0340..7b72a4c 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -101,7 +101,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
         throw new Exception("stmt parameter cannot be null");
       }
 
-      String url = "jdbc:calcitesolr:";
+      String url = CalciteSolrDriver.CONNECT_STRING_PREFIX;
 
       Properties properties = new Properties();
       // Add all query parameters

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/core/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java b/solr/core/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
index 3dd30cc..3a7640d 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/CalciteSolrDriver.java
@@ -47,6 +47,10 @@ public class CalciteSolrDriver extends Driver {
 
   @Override
   public Connection connect(String url, Properties info) throws SQLException {
+    if(!this.acceptsURL(url)) {
+      return null;
+    }
+
     Connection connection = super.connect(url, info);
     CalciteConnection calciteConnection = (CalciteConnection) connection;
     final SchemaPlus rootSchema = calciteConnection.getRootSchema();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/avatica-core-1.9.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/avatica-core-1.9.0-SNAPSHOT.jar.sha1 b/solr/licenses/avatica-core-1.9.0-SNAPSHOT.jar.sha1
deleted file mode 100644
index 574e17b..0000000
--- a/solr/licenses/avatica-core-1.9.0-SNAPSHOT.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bbddcaa253f82976cde4f7db115731e96a05c00a

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/avatica-core-1.9.0.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/avatica-core-1.9.0.jar.sha1 b/solr/licenses/avatica-core-1.9.0.jar.sha1
new file mode 100644
index 0000000..b44a615
--- /dev/null
+++ b/solr/licenses/avatica-core-1.9.0.jar.sha1
@@ -0,0 +1 @@
+c16b346eef02495f2f4b429fe04c33e526ec0229

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/calcite-core-1.10.0.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-1.10.0.jar.sha1 b/solr/licenses/calcite-core-1.10.0.jar.sha1
deleted file mode 100644
index 9ead56b..0000000
--- a/solr/licenses/calcite-core-1.10.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-06550935a70e0d503ae1a11a251066dbb1bc20bb

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..3cb15dd
--- /dev/null
+++ b/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+1f21f343b06236702bb8b5dad167374b7b13768b

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/calcite-linq4j-1.10.0.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-1.10.0.jar.sha1 b/solr/licenses/calcite-linq4j-1.10.0.jar.sha1
deleted file mode 100644
index 16751a3..0000000
--- a/solr/licenses/calcite-linq4j-1.10.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cb161081f3cca51d7a2089df746d771a8af2a577

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/28fb5855/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
new file mode 100644
index 0000000..c1c9b39
--- /dev/null
+++ b/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
@@ -0,0 +1 @@
+2be11a01e467b25e6f8925e4dfa94a77ec9746dd


[20/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 918fd97fd0fdd66e845ee58fc6643cd375f06677
Parents: 1c2eabd b37a72d
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Dec 20 10:39:21 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Dec 20 10:39:21 2016 -0600

----------------------------------------------------------------------
 .../dot.settings/org.eclipse.jdt.core.prefs     |    1 +
 .../idea/solr/contrib/analytics/analytics.iml   |    1 +
 lucene/CHANGES.txt                              |    9 +
 .../CompressingStoredFieldsWriter.java          |   68 +-
 .../lucene50/Lucene50StoredFieldsFormat.java    |    2 +-
 .../codecs/lucene60/Lucene60PointsWriter.java   |   11 +-
 .../lucene/index/BinaryDocValuesWriter.java     |   39 +-
 .../lucene/index/DefaultIndexingChain.java      |  116 +-
 .../org/apache/lucene/index/DocConsumer.java    |    2 +-
 .../apache/lucene/index/DocValuesWriter.java    |    4 +-
 .../lucene/index/DocumentsWriterPerThread.java  |   31 +-
 .../lucene/index/FreqProxTermsWriter.java       |    8 +-
 .../org/apache/lucene/index/IndexWriter.java    |    8 +-
 .../org/apache/lucene/index/MergeState.java     |    8 +-
 .../apache/lucene/index/NormValuesWriter.java   |   17 +-
 .../lucene/index/NumericDocValuesWriter.java    |   51 +-
 .../apache/lucene/index/PointValuesWriter.java  |   96 +-
 .../lucene/index/SortedDocValuesWriter.java     |   76 +-
 .../index/SortedNumericDocValuesWriter.java     |   64 +-
 .../lucene/index/SortedSetDocValuesWriter.java  |   98 +-
 .../java/org/apache/lucene/index/Sorter.java    |   57 +-
 .../apache/lucene/index/SortingLeafReader.java  |   21 +-
 .../index/SortingStoredFieldsConsumer.java      |  206 +++
 .../index/SortingTermVectorsConsumer.java       |  181 ++
 .../lucene/index/StoredFieldsConsumer.java      |   85 +
 .../lucene/index/TermVectorsConsumer.java       |    7 +-
 .../java/org/apache/lucene/index/TermsHash.java |    4 +-
 .../TrackingTmpOutputDirectoryWrapper.java      |   53 +
 .../apache/lucene/index/TestIndexSorting.java   |    2 -
 .../org/apache/lucene/facet/FacetQuery.java     |   52 +
 .../apache/lucene/facet/MultiFacetQuery.java    |   61 +
 .../org/apache/lucene/facet/TestFacetQuery.java |  103 ++
 lucene/ivy-versions.properties                  |    2 +
 .../apache/lucene/search/DocValuesStats.java    |  215 ++-
 .../search/TestDocValuesStatsCollector.java     |  271 ++-
 .../asserting/AssertingLiveDocsFormat.java      |    9 +-
 lucene/tools/javadoc/ecj.javadocs.prefs         |    2 +-
 solr/CHANGES.txt                                |   26 +
 .../plugin/AnalyticsStatisticsCollector.java    |    4 +-
 .../solr/collection1/conf/solrconfig.xml        |    5 -
 solr/contrib/ltr/README.md                      |   36 +-
 solr/contrib/ltr/example/solrconfig.xml         | 1722 ------------------
 .../org/apache/solr/ltr/CSVFeatureLogger.java   |   62 +
 .../java/org/apache/solr/ltr/FeatureLogger.java |  134 +-
 .../java/org/apache/solr/ltr/LTRRescorer.java   |    2 +-
 .../org/apache/solr/ltr/LTRScoringQuery.java    |    2 +-
 .../solr/ltr/SolrQueryRequestContextUtils.java  |    6 +-
 .../org/apache/solr/ltr/model/LinearModel.java  |   10 +
 .../ltr/model/MultipleAdditiveTreesModel.java   |    5 +
 .../LTRFeatureLoggerTransformerFactory.java     |  105 +-
 solr/contrib/ltr/src/java/overview.html         |    2 +-
 .../solr/collection1/conf/solrconfig-ltr.xml    |    5 +-
 .../collection1/conf/solrconfig-ltr_Th10_10.xml |    5 +-
 .../collection1/conf/solrconfig-multiseg.xml    |   12 +-
 .../apache/solr/ltr/FeatureLoggerTestUtils.java |   44 +
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java |   17 +-
 .../solr/ltr/TestSelectiveWeightCreation.java   |   11 +-
 .../solr/ltr/feature/TestExternalFeatures.java  |   12 +-
 .../ltr/feature/TestExternalValueFeatures.java  |    4 +-
 .../solr/ltr/feature/TestFeatureLogging.java    |   99 +-
 .../solr/ltr/feature/TestFieldValueFeature.java |   13 +-
 .../solr/ltr/feature/TestFilterSolrFeature.java |    6 +-
 .../ltr/feature/TestNoMatchSolrFeature.java     |    6 +-
 .../ltr/feature/TestOriginalScoreFeature.java   |    9 +-
 .../solr/solrcloud/conf/solrconfig.xml          |   11 -
 .../solr/SolrMorphlineZkAliasTest.java          |    7 -
 solr/core/ivy.xml                               |    1 -
 .../org/apache/solr/cloud/CreateAliasCmd.java   |   21 +-
 .../apache/solr/cloud/OverseerStatusCmd.java    |    4 +-
 .../org/apache/solr/core/CoreContainer.java     |   66 +-
 .../java/org/apache/solr/core/NodeConfig.java   |   18 +-
 .../java/org/apache/solr/core/PluginInfo.java   |    4 +-
 .../java/org/apache/solr/core/SolrConfig.java   |    2 +-
 .../src/java/org/apache/solr/core/SolrCore.java |  161 +-
 .../org/apache/solr/core/SolrInfoMBean.java     |   10 +-
 .../org/apache/solr/core/SolrXmlConfig.java     |   14 +-
 .../apache/solr/handler/RequestHandlerBase.java |   58 +-
 .../solr/handler/admin/CollectionsHandler.java  |    2 +-
 .../solr/handler/admin/MetricsHandler.java      |  164 ++
 .../solr/metrics/SolrCoreMetricManager.java     |  154 ++
 .../org/apache/solr/metrics/SolrMetricInfo.java |  104 ++
 .../apache/solr/metrics/SolrMetricManager.java  |  669 +++++++
 .../apache/solr/metrics/SolrMetricProducer.java |   38 +
 .../apache/solr/metrics/SolrMetricReporter.java |   83 +
 .../org/apache/solr/metrics/package-info.java   |   23 +
 .../solr/metrics/reporters/SolrJmxReporter.java |  284 +++
 .../solr/metrics/reporters/package-info.java    |   22 +
 .../security/AttributeOnlyServletContext.java   |  291 +++
 .../ConfigurableInternodeAuthHadoopPlugin.java  |   68 +
 .../security/DelegationTokenKerberosFilter.java |    6 +-
 .../solr/security/GenericHadoopAuthPlugin.java  |  266 +++
 .../apache/solr/security/HadoopAuthFilter.java  |  198 ++
 .../apache/solr/security/HadoopAuthPlugin.java  |  241 +++
 .../apache/solr/security/KerberosFilter.java    |    6 +-
 .../apache/solr/security/KerberosPlugin.java    |  314 +---
 .../solr/security/PermissionNameProvider.java   |    1 +
 ...tContinuesRecorderAuthenticationHandler.java |   71 +
 .../apache/solr/servlet/SolrDispatchFilter.java |   27 +
 .../src/java/org/apache/solr/util/JmxUtil.java  |   78 +
 .../org/apache/solr/util/stats/MetricUtils.java |  144 ++
 .../org/apache/solr/util/stats/TimerUtils.java  |   58 -
 .../solr/collection1/conf/solrconfig_perf.xml   |    1 -
 .../solr/security/hadoop_kerberos_config.json   |   16 +
 .../hadoop_simple_auth_with_delegation.json     |   29 +
 .../src/test-files/solr/solr-metricreporter.xml |   57 +
 .../apache/solr/cloud/AliasIntegrationTest.java |   50 +-
 .../TestSolrCloudWithSecureImpersonation.java   |    8 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |   97 +
 .../solr/metrics/SolrCoreMetricManagerTest.java |  172 ++
 .../solr/metrics/SolrMetricManagerTest.java     |  273 +++
 .../solr/metrics/SolrMetricReporterTest.java    |   69 +
 .../solr/metrics/SolrMetricTestUtils.java       |  140 ++
 .../metrics/SolrMetricsIntegrationTest.java     |  143 ++
 .../metrics/reporters/MockMetricReporter.java   |   80 +
 .../metrics/reporters/SolrJmxReporterTest.java  |  156 ++
 .../org/apache/solr/search/TestRealTimeGet.java |    2 +-
 .../apache/solr/search/TestStressLucene.java    |    2 +-
 .../apache/solr/search/TestStressRecovery.java  |    2 +-
 .../apache/solr/search/TestStressReorder.java   |    5 +-
 .../solr/search/TestStressUserVersions.java     |    4 +-
 .../apache/solr/search/TestStressVersions.java  |    2 +-
 .../solr/security/hadoop/ImpersonationUtil.java |   73 +
 .../hadoop/ImpersonatorCollectionsHandler.java  |   60 +
 .../hadoop/TestDelegationWithHadoopAuth.java    |  400 ++++
 .../hadoop/TestImpersonationWithHadoopAuth.java |  215 +++
 .../TestSolrCloudWithHadoopAuthPlugin.java      |  136 ++
 .../apache/solr/util/stats/MetricUtilsTest.java |   58 +
 .../apache/solr/util/stats/TimerUtilsTest.java  |   58 -
 .../example-DIH/solr/db/conf/solrconfig.xml     |   11 -
 .../example-DIH/solr/mail/conf/solrconfig.xml   |   11 -
 .../example-DIH/solr/rss/conf/solrconfig.xml    |   11 -
 .../example-DIH/solr/solr/conf/solrconfig.xml   |   11 -
 .../example-DIH/solr/tika/conf/solrconfig.xml   |   11 -
 solr/example/files/conf/solrconfig.xml          |   11 -
 solr/licenses/metrics-jetty-LICENSE-ASL.txt     |  203 +++
 solr/licenses/metrics-jetty-NOTICE.txt          |   12 +
 solr/licenses/metrics-jetty9-3.1.2.jar.sha1     |    1 +
 solr/licenses/metrics-json-LICENSE-ASL.txt      |  203 +++
 solr/licenses/metrics-json-NOTICE.txt           |   12 +
 solr/licenses/metrics-jvm-3.1.2.jar.sha1        |    1 +
 solr/licenses/metrics-jvm-LICENSE-ASL.txt       |  203 +++
 solr/licenses/metrics-jvm-NOTICE.txt            |   12 +
 solr/licenses/metrics-servlets-LICENSE-ASL.txt  |  203 +++
 solr/licenses/metrics-servlets-NOTICE.txt       |   12 +
 solr/server/build.xml                           |    4 +-
 solr/server/etc/jetty.xml                       |   20 +-
 solr/server/ivy.xml                             |   11 +-
 .../basic_configs/conf/solrconfig.xml           |   11 -
 .../conf/solrconfig.xml                         |   11 -
 .../conf/solrconfig.xml                         |   65 +-
 .../impl/DelegationTokenHttpSolrClient.java     |   34 +-
 .../solrj/impl/HttpClientBuilderFactory.java    |   41 +
 .../solr/client/solrj/impl/HttpSolrClient.java  |   56 +-
 .../solrj/impl/Krb5HttpClientBuilder.java       |   10 +-
 .../apache/solr/common/params/CommonParams.java |    4 +-
 .../solr/client/solrj/LargeVolumeTestBase.java  |    3 +-
 .../solr/client/solrj/SolrExampleTestBase.java  |    1 -
 .../solrj/impl/BasicHttpSolrClientTest.java     |   31 +
 .../solr/client/solrj/io/sql/JdbcTest.java      |    7 +-
 .../client/solrj/io/stream/JDBCStreamTest.java  |    9 +-
 .../solrj/io/stream/StreamExpressionTest.java   |    7 +-
 .../client/solrj/io/stream/StreamingTest.java   |   10 +-
 .../java/org/apache/solr/SolrJettyTestBase.java |    2 -
 .../java/org/apache/solr/SolrTestCaseJ4.java    |    2 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java |   29 +-
 .../apache/solr/cloud/SolrCloudTestCase.java    |   30 +-
 .../java/org/apache/solr/util/TestHarness.java  |    9 +
 167 files changed, 8847 insertions(+), 2890 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/918fd97f/lucene/ivy-versions.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/918fd97f/solr/core/ivy.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/918fd97f/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/918fd97f/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/918fd97f/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
----------------------------------------------------------------------


[12/50] lucene-solr:jira/solr-9858: Update to newer calcite SNAPSHOT release

Posted by ab...@apache.org.
Update to newer calcite SNAPSHOT release


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

Branch: refs/heads/jira/solr-9858
Commit: 1366fcdb2e0caded5c59febe9f4b7b59aa60bc32
Parents: 3c62f81
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Nov 15 09:45:25 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Nov 15 09:45:25 2016 -0600

----------------------------------------------------------------------
 solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1   | 2 +-
 solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1 | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1366fcdb/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
index 3cb15dd..f00eb05 100644
--- a/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
+++ b/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
@@ -1 +1 @@
-1f21f343b06236702bb8b5dad167374b7b13768b
+9e4602dbaac8a35f922e63a7f207ca1272479159

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1366fcdb/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
index c1c9b39..9c06c41 100644
--- a/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
+++ b/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
@@ -1 +1 @@
-2be11a01e467b25e6f8925e4dfa94a77ec9746dd
+0ceeb60b30b113dc2e64d393724b56b06e5db332


[28/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 292e518878c29cb81d300cf48dcf657ef5438397
Parents: 483bfa6 205f9cc
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Jan 16 16:07:54 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Jan 16 16:07:54 2017 -0500

----------------------------------------------------------------------
 .../dot.settings/org.eclipse.jdt.core.prefs     |   8 +-
 lucene/CHANGES.txt                              |  36 ++-
 .../miscellaneous/FixBrokenOffsetsFilter.java   |  78 +++++++
 .../FixBrokenOffsetsFilterFactory.java          |  39 ++++
 .../analysis/ngram/EdgeNGramTokenFilter.java    |  16 +-
 .../lucene/analysis/ngram/NGramTokenFilter.java |  18 +-
 ...ache.lucene.analysis.util.TokenFilterFactory |   1 +
 .../TestFixBrokenOffsetsFilter.java             |  50 +++++
 .../lucene/analysis/ngram/TestNGramFilters.java |  47 ++++
 .../apache/lucene/index/FixBrokenOffsets.java   | 125 +++++++++++
 .../java/org/apache/lucene/index/package.html   |  27 +++
 .../lucene/index/TestFixBrokenOffsets.java      | 115 ++++++++++
 .../lucene/index/index.630.brokenoffsets.zip    | Bin 0 -> 3203 bytes
 .../org/apache/lucene/index/CheckIndex.java     |  29 ++-
 .../lucene/index/DefaultIndexingChain.java      |  20 +-
 .../apache/lucene/index/SortedDocValues.java    |  22 ++
 .../apache/lucene/index/SortedSetDocValues.java |  22 ++
 .../lucene/search/DoubleValuesSource.java       |  92 ++++++--
 .../lucene/search/MultiCollectorManager.java    |   6 +-
 .../java/org/apache/lucene/util/Version.java    |   7 +
 .../org/apache/lucene/index/TestCheckIndex.java |   5 -
 .../search/highlight/TokenSourcesTest.java      |   2 +-
 lucene/ivy-versions.properties                  |   5 +-
 .../queries/function/FunctionMatchQuery.java    |  99 +++++++++
 .../queries/function/FunctionScoreQuery.java    | 151 +++++++++++++
 .../function/TestFunctionMatchQuery.java        |  61 ++++++
 .../function/TestFunctionScoreExplanations.java | 105 +++++++++
 .../function/TestFunctionScoreQuery.java        | 114 ++++++++++
 .../lucene/queryparser/xml/CoreParser.java      |   2 -
 .../lucene/search/TestTermAutomatonQuery.java   |   3 +
 .../index/BaseDocValuesFormatTestCase.java      |  32 +++
 .../index/BaseTermVectorsFormatTestCase.java    |  17 +-
 .../apache/lucene/index/BaseTestCheckIndex.java |  19 --
 .../java/org/apache/lucene/util/TestUtil.java   |   4 +-
 solr/CHANGES.txt                                |  34 ++-
 .../handler/dataimport/TestJdbcDataSource.java  |   7 +
 solr/contrib/morphlines-core/ivy.xml            |   8 +-
 solr/core/ivy.xml                               |   4 +-
 .../solr/handler/admin/MetricsHandler.java      |  92 +++++---
 .../solr/highlight/LuceneRegexFragmenter.java   | 217 +++++++++++++++++++
 .../apache/solr/highlight/RegexFragmenter.java  | 196 -----------------
 .../apache/solr/metrics/SolrMetricManager.java  |  30 ++-
 .../apache/solr/schema/PreAnalyzedField.java    |  11 +
 .../org/apache/solr/cloud/ClusterStateTest.java |   8 +
 ...verseerCollectionConfigSetProcessorTest.java |   4 +-
 .../solr/core/BlobRepositoryMockingTest.java    |   9 +-
 .../org/apache/solr/core/CoreSorterTest.java    |   7 +
 .../solr/handler/admin/MetricsHandlerTest.java  |  26 ++-
 .../solr/index/hdfs/CheckHdfsIndexTest.java     |   5 -
 .../ApacheLuceneSolrNearQueryBuilder.java       |   1 -
 .../apache/solr/search/GoodbyeQueryBuilder.java |   1 -
 .../apache/solr/search/HandyQueryBuilder.java   |   1 -
 .../apache/solr/search/HelloQueryBuilder.java   |   1 -
 .../security/TestPKIAuthenticationPlugin.java   |   8 +
 .../solr/servlet/SolrRequestParserTest.java     |   3 +
 solr/licenses/byte-buddy-1.6.2.jar.sha1         |   1 +
 solr/licenses/byte-buddy-LICENSE-ASL.txt        | 202 +++++++++++++++++
 solr/licenses/byte-buddy-NOTICE.txt             |   4 +
 solr/licenses/mockito-core-1.9.5.jar.sha1       |   1 -
 solr/licenses/mockito-core-2.6.2.jar.sha1       |   1 +
 solr/licenses/objenesis-1.2.jar.sha1            |   1 -
 solr/licenses/objenesis-2.5.jar.sha1            |   1 +
 .../solrj/impl/CloudSolrClientCacheTest.java    |   7 +
 .../solr/cloud/AbstractDistribZkTestBase.java   |   5 +-
 64 files changed, 1875 insertions(+), 398 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/292e5188/lucene/ivy-versions.properties
----------------------------------------------------------------------
diff --cc lucene/ivy-versions.properties
index 2b53454,6cb7f26..66c4b41
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@@ -94,7 -96,7 +94,8 @@@ io.netty.netty-all.version = 4.0.36.Fin
  /mecab/mecab-ipadic = 2.7.0-20070801
  /mecab/mecab-naist-jdic = 0.6.3b-20111013
  /net.arnx/jsonic = 1.2.7
+ /net.bytebuddy/byte-buddy = 1.6.2
 +/net.hydromatic/eigenbase-properties = 1.1.5
  /net.sf.ehcache/ehcache-core = 2.4.4
  /net.sf.saxon/Saxon-HE = 9.6.0-2
  /net.sourceforge.argparse4j/argparse4j = 0.4.3

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/292e5188/solr/core/ivy.xml
----------------------------------------------------------------------
diff --cc solr/core/ivy.xml
index ecebd97,074e35f..dc58ad5
--- a/solr/core/ivy.xml
+++ b/solr/core/ivy.xml
@@@ -51,15 -51,17 +51,17 @@@
      <dependency org="org.slf4j" name="slf4j-log4j12" rev="${/org.slf4j/slf4j-log4j12}" conf="compile"/>
      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" conf="compile"/>
  
+     <!-- TODO: Nuke those 2 deps, please!!!! -->
      <dependency org="org.easymock" name="easymock" rev="${/org.easymock/easymock}" conf="test"/>
      <dependency org="cglib" name="cglib-nodep" rev="${/cglib/cglib-nodep}" conf="test"/>
-     <dependency org="org.objenesis" name="objenesis" rev="${/org.objenesis/objenesis}" conf="test"/>
  
      <dependency org="org.mockito" name="mockito-core" rev="${/org.mockito/mockito-core}" conf="test"/>
+     <dependency org="net.bytebuddy" name="byte-buddy" rev="${/net.bytebuddy/byte-buddy}" conf="test"/>
+     <dependency org="org.objenesis" name="objenesis" rev="${/org.objenesis/objenesis}" conf="test"/>
  
      <dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="${/com.fasterxml.jackson.core/jackson-core}" conf="compile"/>
 -    <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="${/com.fasterxml.jackson.core/jackson-databind}" conf="test"/>
 -    <dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="${/com.fasterxml.jackson.core/jackson-annotations}" conf="test"/>
 +    <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="${/com.fasterxml.jackson.core/jackson-databind}" conf="compile"/>
 +    <dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="${/com.fasterxml.jackson.core/jackson-annotations}" conf="compile"/>
      <dependency org="com.fasterxml.jackson.dataformat" name="jackson-dataformat-smile" rev="${/com.fasterxml.jackson.dataformat/jackson-dataformat-smile}" conf="compile"/>
  
  


[41/50] lucene-solr:jira/solr-9858: Synchronize CHANGES entries.

Posted by ab...@apache.org.
Synchronize CHANGES entries.


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

Branch: refs/heads/jira/solr-9858
Commit: 3ec273ae0a66485f44737b0db54b5718fcb7ce1d
Parents: f3e19d8
Author: Adrien Grand <jp...@gmail.com>
Authored: Wed Feb 15 18:59:34 2017 +0100
Committer: Adrien Grand <jp...@gmail.com>
Committed: Wed Feb 15 18:59:34 2017 +0100

----------------------------------------------------------------------
 lucene/CHANGES.txt | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-
 solr/CHANGES.txt   |  7 +++++-
 2 files changed, 62 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3ec273ae/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index e4042da..6d09cc9 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -1135,7 +1135,62 @@ Other
   (Martijn van Groningen, Mike McCandless)
 
 ======================= Lucene 5.5.4 =======================
-(No Changes)
+
+Bug Fixes
+
+* LUCENE-7417: The standard Highlighter could throw an IllegalArgumentException when
+  trying to highlight a query containing a degenerate case of a MultiPhraseQuery with one
+  term.  (Thomas Kappler via David Smiley)
+
+* LUCENE-7657: Fixed potential memory leak in the case that a (Span)TermQuery
+  with a TermContext is cached. (Adrien Grand)
+
+* LUCENE-7647: Made stored fields reclaim native memory more aggressively when
+  configured with BEST_COMPRESSION. This could otherwise result in out-of-memory
+  issues. (Adrien Grand)
+
+* LUCENE-7562: CompletionFieldsConsumer sometimes throws
+  NullPointerException on ghost fields (Oliver Eilhard via Mike McCandless)
+
+* LUCENE-7547: JapaneseTokenizerFactory was failing to close the
+  dictionary file it opened (Markus via Mike McCandless)
+
+* LUCENE-6914: Fixed DecimalDigitFilter in case of supplementary code points.
+  (Hossman)
+
+* LUCENE-7440: Document id skipping (PostingsEnum.advance) could throw an
+  ArrayIndexOutOfBoundsException exception on large index segments (>1.8B docs)
+  with large skips. (yonik)
+
+* LUCENE-7570: IndexWriter may deadlock if a commit is running while
+  there are too many merges running and one of the merges hits a
+  tragic exception (Joey Echeverria via Mike McCandless)
+
+Other
+
+* LUCENE-6989: Backport MMapDirectory's unmapping code from Lucene 6.4 to use
+  MethodHandles. This allows it to work with Java 9 (EA build 150 and later).
+  (Uwe Schindler)
+
+Build
+
+* LUCENE-7543: Make changes-to-html target an offline operation, by moving the
+  Lucene and Solr DOAP RDF files into the Git source repository under
+  dev-tools/doap/ and then pulling release dates from those files, rather than
+  from JIRA. (Mano Kovacs, hossman, Steve Rowe)
+
+* LUCENE-7596: Update Groovy to version 2.4.8 to allow building with Java 9
+  build 148+. Also update JGit version for working-copy checks. This does not
+  fix all issues with Java 9, but allows to build the distribution.
+  (Uwe Schindler)
+
+* LUCENE-7651: Backport (Lucene 6.4.1) fix for Java 8u121 to allow documentation
+  build to inject "Google Code Prettify" without adding Javascript to Javadocs's
+  -bottom parameter. Unfortunately, this fix disables Prettify if Javadocs are
+  built with Java 7, as there is no generic way in Java 7 to inject Javascript
+  without breaking Java 8 (and possible paid Java 7 security updates). This
+  fix also updates Prettify to latest version to work around a Google Chrome
+  issue. (Uwe Schindler)
 
 ======================= Lucene 5.5.3 =======================
 (No Changes)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3ec273ae/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9fcc20c..1842e17 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -2030,7 +2030,12 @@ Apache ZooKeeper 3.4.6
 Jetty 9.3.14.v20161028
 
 
-(No Changes)
+Other Changes
+----------------------
+
+* SOLR-9819: Upgrade commons-fileupload to 1.3.2, fixing a potential vulnerability CVE-2016-3092 (Anshum Gupta)
+
+* SOLR-10031: Validation of filename params in ReplicationHandler (Hrishikesh Gadre, janhoy)
 
 
 ======================= 5.5.3 =======================


[26/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 737194712f1f5b4fa54efc7e84cc17c3b3b212b3
Parents: 4b17b82 6c6c077
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Jan 12 11:51:04 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Jan 12 11:51:04 2017 -0500

----------------------------------------------------------------------
 dev-tools/idea/lucene/suggest/suggest.iml       |   1 -
 lucene/CHANGES.txt                              |  31 +-
 .../lucene/analysis/TokenStreamToAutomaton.java |  11 +-
 .../lucene/search/DoubleValuesSource.java       |  27 +
 .../apache/lucene/search/LongValuesSource.java  |  27 +
 .../apache/lucene/search/TermInSetQuery.java    | 369 ++++++++++++
 .../search/UsageTrackingQueryCachingPolicy.java |   5 +-
 .../org/apache/lucene/store/MMapDirectory.java  |   2 +-
 .../lucene/analysis/TestGraphTokenizers.java    | 600 +++++++++++++++++++
 .../lucene/search/TermInSetQueryTest.java       | 328 ++++++++++
 .../demo/facet/DistanceFacetsExample.java       |  18 +-
 .../ExpressionAggregationFacetsExample.java     |   2 +-
 lucene/expressions/build.xml                    |  11 -
 .../org/apache/lucene/expressions/Bindings.java |  14 +-
 .../apache/lucene/expressions/Expression.java   |  21 +-
 .../expressions/ExpressionComparator.java       | 100 ----
 .../expressions/ExpressionFunctionValues.java   |  35 +-
 .../lucene/expressions/ExpressionRescorer.java  |  33 +-
 .../lucene/expressions/ExpressionSortField.java |  77 ---
 .../expressions/ExpressionValueSource.java      |  70 +--
 .../lucene/expressions/ScoreFunctionValues.java |  46 --
 .../lucene/expressions/ScoreValueSource.java    |  61 --
 .../lucene/expressions/SimpleBindings.java      |  30 +-
 .../expressions/js/JavascriptCompiler.java      |  15 +-
 .../apache/lucene/expressions/package-info.java |   5 +-
 .../lucene/expressions/TestDemoExpressions.java |  44 +-
 .../expressions/TestExpressionSortField.java    |   2 +-
 .../expressions/TestExpressionValueSource.java  | 111 +---
 .../expressions/js/TestCustomFunctions.java     |  20 +-
 .../expressions/js/TestJavascriptFunction.java  |   2 +-
 .../js/TestJavascriptOperations.java            |   2 +-
 .../org/apache/lucene/facet/DrillSideways.java  |  37 +-
 .../apache/lucene/facet/MultiFacetQuery.java    |  12 +-
 .../org/apache/lucene/facet/package-info.java   |   2 +-
 .../apache/lucene/facet/range/DoubleRange.java  |  28 +-
 .../facet/range/DoubleRangeFacetCounts.java     |  63 +-
 .../apache/lucene/facet/range/LongRange.java    |  28 +-
 .../facet/range/LongRangeFacetCounts.java       |  26 +-
 .../org/apache/lucene/facet/range/Range.java    |  31 -
 .../lucene/facet/taxonomy/FakeScorer.java       |  53 --
 .../taxonomy/TaxonomyFacetSumValueSource.java   | 114 ++--
 .../facet/range/TestRangeFacetCounts.java       |  61 +-
 .../TestTaxonomyFacetSumValueSource.java        |  54 +-
 .../AbstractAllGroupHeadsCollector.java         | 176 ------
 .../grouping/AbstractAllGroupsCollector.java    |  67 ---
 .../AbstractDistinctValuesCollector.java        |  59 --
 .../AbstractFirstPassGroupingCollector.java     | 354 -----------
 .../grouping/AbstractGroupFacetCollector.java   | 319 ----------
 .../AbstractSecondPassGroupingCollector.java    | 162 -----
 .../search/grouping/AllGroupHeadsCollector.java | 176 ++++++
 .../search/grouping/AllGroupsCollector.java     |  67 +++
 .../search/grouping/CollectedSearchGroup.java   |   2 +-
 .../grouping/DistinctValuesCollector.java       |  59 ++
 .../grouping/FirstPassGroupingCollector.java    | 363 +++++++++++
 .../lucene/search/grouping/GroupDocs.java       |   8 +-
 .../search/grouping/GroupFacetCollector.java    | 324 ++++++++++
 .../apache/lucene/search/grouping/Grouper.java  |  56 ++
 .../lucene/search/grouping/GroupingSearch.java  | 130 +---
 .../lucene/search/grouping/SearchGroup.java     |  23 +-
 .../grouping/SecondPassGroupingCollector.java   | 169 ++++++
 .../lucene/search/grouping/TopGroups.java       |  12 +-
 .../FunctionAllGroupHeadsCollector.java         |  32 +-
 .../function/FunctionAllGroupsCollector.java    |   4 +-
 .../FunctionDistinctValuesCollector.java        |  35 +-
 .../FunctionFirstPassGroupingCollector.java     |   6 +-
 .../grouping/function/FunctionGrouper.java      |  69 +++
 .../FunctionSecondPassGroupingCollector.java    |   6 +-
 .../term/TermAllGroupHeadsCollector.java        |  26 +-
 .../grouping/term/TermAllGroupsCollector.java   |   8 +-
 .../term/TermDistinctValuesCollector.java       |  26 +-
 .../term/TermFirstPassGroupingCollector.java    |   6 +-
 .../grouping/term/TermGroupFacetCollector.java  |  10 +-
 .../search/grouping/term/TermGrouper.java       |  81 +++
 .../term/TermSecondPassGroupingCollector.java   |   6 +-
 .../grouping/AllGroupHeadsCollectorTest.java    |  14 +-
 .../search/grouping/AllGroupsCollectorTest.java |   6 +-
 .../grouping/DistinctValuesCollectorTest.java   |  46 +-
 .../grouping/GroupFacetCollectorTest.java       |  10 +-
 .../lucene/search/grouping/TestGrouping.java    |  70 +--
 .../search/uhighlight/FieldHighlighter.java     |   4 +-
 .../uhighlight/LengthGoalBreakIterator.java     | 185 ++++++
 .../lucene/search/uhighlight/OffsetsEnum.java   |  45 +-
 .../lucene/search/uhighlight/Passage.java       |   1 +
 .../uhighlight/LengthGoalBreakIteratorTest.java | 104 ++++
 .../TestUnifiedHighlighterExtensibility.java    |  57 +-
 .../org/apache/lucene/queries/TermsQuery.java   | 381 ------------
 .../lucene/queries/function/ValueSource.java    | 111 ++++
 .../apache/lucene/queries/TermsQueryTest.java   | 339 -----------
 .../complexPhrase/ComplexPhraseQueryParser.java |   4 +-
 .../complexPhrase/TestComplexPhraseQuery.java   |   6 +
 .../prefix/TermQueryPrefixTreeStrategy.java     |  10 +-
 .../spatial/prefix/NumberRangeFacetsTest.java   |   6 +-
 lucene/suggest/build.xml                        |   4 +-
 .../suggest/DocumentValueSourceDictionary.java  |  58 +-
 .../DocumentValueSourceDictionaryTest.java      | 287 ++++++++-
 .../lucene/analysis/TestGraphTokenizers.java    | 588 ------------------
 solr/CHANGES.txt                                |  43 +-
 .../org/apache/solr/core/CoreContainer.java     |  10 +-
 .../org/apache/solr/core/DirectoryFactory.java  |   3 +-
 .../org/apache/solr/core/JmxMonitoredMap.java   |  63 +-
 .../solr/core/MetricsDirectoryFactory.java      |  60 +-
 .../src/java/org/apache/solr/core/SolrCore.java |   4 +-
 .../org/apache/solr/core/SolrInfoMBean.java     |   5 +-
 .../org/apache/solr/core/SolrXmlConfig.java     |   9 +-
 .../solr/core/StandardDirectoryFactory.java     |   3 +-
 .../apache/solr/handler/CdcrRequestHandler.java |   5 +
 .../org/apache/solr/handler/GraphHandler.java   |   1 +
 .../apache/solr/handler/PingRequestHandler.java |   5 +
 .../apache/solr/handler/ReplicationHandler.java |   5 +
 .../apache/solr/handler/RequestHandlerBase.java |   2 +-
 .../org/apache/solr/handler/SchemaHandler.java  |   5 +
 .../org/apache/solr/handler/SnapShooter.java    |   6 +-
 .../apache/solr/handler/SolrConfigHandler.java  |   2 +-
 .../org/apache/solr/handler/StreamHandler.java  |   1 +
 .../solr/handler/UpdateRequestHandler.java      |   5 +
 .../solr/handler/admin/CollectionsHandler.java  |   5 +
 .../solr/handler/admin/ConfigSetsHandler.java   |   5 +
 .../solr/handler/admin/CoreAdminHandler.java    |   5 +
 .../apache/solr/handler/admin/InfoHandler.java  |   5 +
 .../solr/handler/admin/LoggingHandler.java      |   6 +
 .../solr/handler/admin/LukeRequestHandler.java  |   5 +
 .../solr/handler/admin/MetricsHandler.java      |   5 +
 .../solr/handler/admin/PluginInfoHandler.java   |   5 +
 .../handler/admin/PropertiesRequestHandler.java |   5 +
 .../solr/handler/admin/SecurityConfHandler.java |   5 +
 .../admin/SegmentsInfoRequestHandler.java       |   5 +
 .../handler/admin/ShowFileRequestHandler.java   |   4 +
 .../handler/admin/SolrInfoMBeanHandler.java     |   5 +
 .../solr/handler/admin/SystemInfoHandler.java   |   7 +-
 .../solr/handler/admin/ThreadDumpHandler.java   |   5 +
 .../handler/admin/ZookeeperInfoHandler.java     |   5 +
 .../solr/handler/component/DebugComponent.java  |   5 +
 .../solr/handler/component/ExpandComponent.java |  30 +-
 .../solr/handler/component/FacetComponent.java  |   5 +
 .../handler/component/HighlightComponent.java   |   5 +
 .../component/HttpShardHandlerFactory.java      |  17 +-
 .../component/MoreLikeThisComponent.java        |   7 +-
 .../solr/handler/component/QueryComponent.java  |   5 +
 .../handler/component/RealTimeGetComponent.java |   5 +
 .../handler/component/SpellCheckComponent.java  |   5 +
 .../handler/component/TermVectorComponent.java  |   5 +
 .../solr/handler/component/TermsComponent.java  |   5 +
 .../solr/highlight/HighlightingPluginBase.java  |   2 +-
 .../solr/highlight/UnifiedSolrHighlighter.java  |  12 +-
 .../solr/metrics/SolrCoreMetricManager.java     |   3 +-
 .../metrics/reporters/JmxObjectNameFactory.java | 155 +++++
 .../solr/metrics/reporters/SolrJmxReporter.java | 105 ----
 .../org/apache/solr/request/SimpleFacets.java   |   4 +-
 .../java/org/apache/solr/schema/FieldType.java  |   4 +-
 .../org/apache/solr/search/CacheConfig.java     |   2 +-
 .../org/apache/solr/search/FastLRUCache.java    |   2 +-
 .../java/org/apache/solr/search/Grouping.java   |  14 +-
 .../apache/solr/search/TermsQParserPlugin.java  |   4 +-
 .../apache/solr/search/facet/FacetModule.java   |   5 +
 .../solr/search/grouping/CommandHandler.java    |   4 +-
 .../command/SearchGroupsFieldCommand.java       |   8 +-
 .../command/TopGroupsFieldCommand.java          |   4 +-
 .../org/apache/solr/search/join/GraphQuery.java |   4 +-
 .../apache/solr/search/mlt/CloudMLTQParser.java |  49 +-
 .../solr/search/mlt/SimpleMLTQParser.java       |  30 +-
 .../solr/security/PKIAuthenticationPlugin.java  |   6 +
 .../DocumentExpressionDictionaryFactory.java    |   6 +-
 .../solr/update/DirectUpdateHandler2.java       |   5 -
 .../java/org/apache/solr/update/PeerSync.java   |  42 +-
 .../org/apache/solr/update/UpdateHandler.java   |   5 +
 .../java/org/apache/solr/update/UpdateLog.java  |  74 ++-
 .../apache/solr/update/UpdateShardHandler.java  |  16 +-
 .../solr/update/UpdateShardHandlerConfig.java   |  14 +-
 .../AddSchemaFieldsUpdateProcessorFactory.java  |   3 +-
 .../SkipExistingDocumentsProcessorFactory.java  | 255 ++++++++
 .../src/java/org/apache/solr/util/DOMUtil.java  |   5 +
 .../stats/HttpClientMetricNameStrategy.java     |  28 +
 .../stats/InstrumentedHttpRequestExecutor.java  |  81 ++-
 .../resources/EditableSolrConfigAttributes.json |  16 +-
 ...dd-schema-fields-update-processor-chains.xml |   8 +-
 .../conf/solrconfig-cache-enable-disable.xml    |  80 +++
 .../collection1/conf/solrconfig-schemaless.xml  |  45 +-
 .../test-files/solr/solr-gangliareporter.xml    |   2 +-
 .../test-files/solr/solr-graphitereporter.xml   |   2 +-
 .../src/test-files/solr/solr-slf4jreporter.xml  |   4 +-
 .../solr/cloud/BasicDistributedZkTest.java      |   2 +-
 .../solr/cloud/PeerSyncReplicationTest.java     |  15 +
 .../apache/solr/cloud/TestCloudRecovery.java    |  26 +
 .../test/org/apache/solr/core/TestConfig.java   |  32 +
 .../solr/handler/admin/MBeansHandlerTest.java   |   4 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |  18 +-
 .../highlight/TestUnifiedSolrHighlighter.java   |  24 +-
 .../metrics/SolrMetricsIntegrationTest.java     |   2 +-
 .../reporters/SolrGangliaReporterTest.java      |   2 +-
 .../reporters/SolrGraphiteReporterTest.java     |   2 +-
 .../schema/TestSchemalessBufferedUpdates.java   | 160 +++++
 .../ApacheLuceneSolrNearQueryBuilder.java       |  51 ++
 .../org/apache/solr/search/TestRTGBase.java     |  12 -
 .../org/apache/solr/search/TestRecovery.java    | 179 +++++-
 .../apache/solr/search/TestRecoveryHdfs.java    |  11 -
 .../apache/solr/search/TestSolrCoreParser.java  | 110 ++++
 .../apache/solr/search/TestSolrQueryParser.java |  12 +-
 .../solr/search/mlt/CloudMLTQParserTest.java    |  23 +-
 .../solr/search/mlt/SimpleMLTQParserTest.java   |  33 +-
 .../apache/solr/update/CdcrUpdateLogTest.java   |  17 -
 .../solr/update/SolrIndexMetricsTest.java       |   4 +-
 ...ipExistingDocumentsProcessorFactoryTest.java | 335 +++++++++++
 solr/example/files/conf/solrconfig.xml          |   5 +-
 .../basic_configs/conf/solrconfig.xml           |   6 +-
 .../conf/solrconfig.xml                         |   5 +-
 .../solr/common/params/HighlightParams.java     |   2 +-
 .../client/solrj/impl/CloudSolrClientTest.java  |   6 +-
 .../solrj/io/graph/GraphExpressionTest.java     |   3 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |  22 +-
 .../java/org/apache/solr/util/TestHarness.java  |   3 +-
 solr/webapp/web/js/angular/services.js          |  46 +-
 211 files changed, 6402 insertions(+), 4097 deletions(-)
----------------------------------------------------------------------



[42/50] lucene-solr:jira/solr-9858: Add bw 5.5.4 indices.

Posted by ab...@apache.org.
Add bw 5.5.4 indices.


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

Branch: refs/heads/jira/solr-9858
Commit: 59b2a622538dae6615e1ada2ee08f7fd968e8356
Parents: 3ec273a
Author: Adrien Grand <jp...@gmail.com>
Authored: Wed Feb 15 19:39:15 2017 +0100
Committer: Adrien Grand <jp...@gmail.com>
Committed: Wed Feb 15 19:39:15 2017 +0100

----------------------------------------------------------------------
 .../lucene/index/TestBackwardsCompatibility.java   |   4 +++-
 .../apache/lucene/index/unsupported.5.5.4-cfs.zip  | Bin 0 -> 13744 bytes
 .../lucene/index/unsupported.5.5.4-nocfs.zip       | Bin 0 -> 13749 bytes
 3 files changed, 3 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/59b2a622/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
index 63ba413..0b8f2c4 100644
--- a/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
+++ b/lucene/backward-codecs/src/test/org/apache/lucene/index/TestBackwardsCompatibility.java
@@ -426,7 +426,9 @@ public class TestBackwardsCompatibility extends LuceneTestCase {
       "5.5.2-cfs",
       "5.5.2-nocfs",
       "5.5.3-cfs",
-      "5.5.3-nocfs"
+      "5.5.3-nocfs",
+      "5.5.4-cfs",
+      "5.5.4-nocfs"
   };
 
   // TODO: on 6.0.0 release, gen the single segment indices and add here:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/59b2a622/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-cfs.zip
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-cfs.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-cfs.zip
new file mode 100644
index 0000000..476e4b6
Binary files /dev/null and b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-cfs.zip differ

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/59b2a622/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-nocfs.zip
----------------------------------------------------------------------
diff --git a/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-nocfs.zip b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-nocfs.zip
new file mode 100644
index 0000000..37b6626
Binary files /dev/null and b/lucene/backward-codecs/src/test/org/apache/lucene/index/unsupported.5.5.4-nocfs.zip differ


[43/50] lucene-solr:jira/solr-9858: SOLR-10094: /export handler (master only) loses the sort deep into the result set

Posted by ab...@apache.org.
SOLR-10094: /export handler (master only) loses the sort deep into the result set


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

Branch: refs/heads/jira/solr-9858
Commit: aa7e980d3b900613e0b403d470e87f367788523f
Parents: 59b2a62
Author: Joel Bernstein <jb...@apache.org>
Authored: Sat Feb 4 23:48:03 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 15 13:49:31 2017 -0500

----------------------------------------------------------------------
 .../java/org/apache/solr/handler/ExportWriter.java | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/aa7e980d/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
index e432f94..8bdd959 100644
--- a/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
@@ -1254,7 +1254,6 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   class StringValue implements SortValue {
 
     protected SortedDocValues vals;
-    protected SortedDocValues segmentVals[];
 
     protected MultiDocValues.OrdinalMap ordinalMap;
     protected LongValues globalOrds;
@@ -1264,11 +1263,11 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     protected int segment;
     protected int currentOrd;
     protected IntComp comp;
+    protected int lastDocID;
 
     public StringValue(SortedDocValues vals, String field, IntComp comp)  {
       this.vals = vals;
       if(vals instanceof MultiDocValues.MultiSortedDocValues) {
-        this.segmentVals = ((MultiDocValues.MultiSortedDocValues) vals).values;
         this.ordinalMap = ((MultiDocValues.MultiSortedDocValues) vals).mapping;
       }
       this.field = field;
@@ -1281,6 +1280,13 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     }
 
     public void setCurrentValue(int docId) throws IOException {
+
+      if (docId < lastDocID) {
+        throw new AssertionError("docs were sent out-of-order: lastDocID=" + lastDocID + " vs doc=" + docId);
+      }
+
+      lastDocID = docId;
+
       if (docId > currentVals.docID()) {
         currentVals.advance(docId);
       }
@@ -1301,14 +1307,13 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
       this.currentOrd = v.currentOrd;
     }
 
-    public void setNextReader(LeafReaderContext context) {
+    public void setNextReader(LeafReaderContext context) throws IOException {
       segment = context.ord;
       if(ordinalMap != null) {
         globalOrds = ordinalMap.getGlobalOrds(segment);
-        currentVals = segmentVals[segment];
-      } else {
-        currentVals = vals;
       }
+      currentVals = DocValues.getSorted(context.reader(), field);
+      lastDocID = 0;
     }
 
     public void reset() {


[14/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 750cf6d7a51dbf44342c2ca78910458ba63933fa
Parents: bda84d8 3c4315c
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Nov 18 10:42:14 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Nov 18 10:42:14 2016 -0600

----------------------------------------------------------------------
 dev-tools/scripts/smokeTestRelease.py           |  28 +-
 lucene/CHANGES.txt                              |  25 ++
 .../ASCIIFoldingFilterFactory.java              |  17 +-
 .../TestAsciiFoldingFilterFactory.java          |  54 ++++
 .../index/TestBackwardsCompatibility.java       |  82 ++++++
 .../org/apache/lucene/index/sorted.6.2.0.zip    | Bin 0 -> 157007 bytes
 .../org/apache/lucene/index/sorted.6.2.1.zip    | Bin 0 -> 100974 bytes
 .../org/apache/lucene/index/sorted.6.3.0.zip    | Bin 0 -> 71090 bytes
 .../org/apache/lucene/util/QueryBuilder.java    |   2 +-
 .../uhighlight/AnalysisOffsetStrategy.java      |   3 +
 .../uhighlight/DefaultPassageFormatter.java     | 204 +++++++-------
 .../search/uhighlight/FieldHighlighter.java     |  30 +-
 .../lucene/search/uhighlight/OffsetsEnum.java   |   8 +-
 .../lucene/search/uhighlight/Passage.java       | 276 ++++++++++---------
 .../uhighlight/TokenStreamOffsetStrategy.java   |   7 +-
 .../uhighlight/TestUnifiedHighlighterMTQ.java   |  14 +-
 .../lucene/queryparser/classic/QueryParser.java |  78 ++++--
 .../lucene/queryparser/classic/QueryParser.jj   |  28 ++
 .../queryparser/classic/QueryParserBase.java    |   2 +-
 .../queryparser/classic/TestQueryParser.java    |  14 +
 .../queryparser/util/QueryParserTestBase.java   |   4 +
 .../lucene/replicator/nrt/PrimaryNode.java      |   2 +-
 .../analyzing/AnalyzingInfixSuggester.java      |  82 +++++-
 .../document/CompletionFieldsConsumer.java      |   4 +
 .../analyzing/AnalyzingInfixSuggesterTest.java  | 111 ++++++++
 .../document/TestPrefixCompletionQuery.java     |  49 +++-
 .../index/BasePostingsFormatTestCase.java       |  45 +++
 solr/CHANGES.txt                                |  13 +-
 .../src/java/org/apache/solr/core/SolrCore.java |   6 +-
 .../solr/handler/component/QueryComponent.java  |  10 +-
 .../java/org/apache/solr/util/CryptoKeys.java   |   6 +-
 .../store/blockcache/BlockDirectoryTest.java    |   2 +-
 .../client/solrj/io/sql/ConnectionImpl.java     |   9 +
 .../apache/solr/common/util/JavaBinCodec.java   |   2 +-
 34 files changed, 890 insertions(+), 327 deletions(-)
----------------------------------------------------------------------



[09/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 99a6746011e98ab0e7965e146956bc215e3d42f5
Parents: 368204b 4a31b29
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Nov 14 10:06:29 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Nov 14 10:06:29 2016 -0600

----------------------------------------------------------------------
 .../org/apache/lucene/util/RollingBuffer.java   |   9 +-
 .../search/grouping/GroupingSearchTest.java     |  10 +-
 .../lucene/search/grouping/TestGrouping.java    |   2 -
 .../search/similarities/RandomSimilarity.java   |   3 +-
 solr/CHANGES.txt                                |   7 +
 .../org/apache/solr/handler/ExportWriter.java   |  10 +-
 .../solrj/io/stream/StreamExpressionTest.java   |   2 +-
 .../client/solrj/io/stream/StreamingTest.java   | 869 ++++++++++++-------
 .../solr/common/params/CommonParamsTest.java    |   8 +-
 9 files changed, 587 insertions(+), 333 deletions(-)
----------------------------------------------------------------------



[21/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 82350229c9c0b8b69a959aa5320f82cbffb9a4f9
Parents: 918fd97 f330678
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Jan 3 12:47:42 2017 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Jan 3 12:47:42 2017 -0600

----------------------------------------------------------------------
 build.xml                                       |   40 +-
 dev-tools/idea/lucene/suggest/suggest.iml       |    1 -
 .../lucene/analysis/common/pom.xml.template     |   36 +-
 .../maven/lucene/analysis/icu/pom.xml.template  |   42 +-
 .../lucene/analysis/kuromoji/pom.xml.template   |   38 +-
 .../lucene/analysis/morfologik/pom.xml.template |   38 +-
 .../lucene/analysis/phonetic/pom.xml.template   |   38 +-
 .../maven/lucene/analysis/pom.xml.template      |   36 +-
 .../lucene/analysis/smartcn/pom.xml.template    |   36 +-
 .../lucene/analysis/stempel/pom.xml.template    |   36 +-
 .../maven/lucene/analysis/uima/pom.xml.template |   36 +-
 .../lucene/backward-codecs/pom.xml.template     |   36 +-
 .../maven/lucene/benchmark/pom.xml.template     |   36 +-
 .../lucene/classification/pom.xml.template      |   36 +-
 dev-tools/maven/lucene/codecs/pom.xml.template  |   36 +-
 .../lucene/codecs/src/java/pom.xml.template     |   36 +-
 .../lucene/codecs/src/test/pom.xml.template     |   36 +-
 dev-tools/maven/lucene/core/pom.xml.template    |   36 +-
 .../maven/lucene/core/src/java/pom.xml.template |   36 +-
 .../maven/lucene/core/src/test/pom.xml.template |   36 +-
 dev-tools/maven/lucene/demo/pom.xml.template    |   36 +-
 .../maven/lucene/expressions/pom.xml.template   |   36 +-
 dev-tools/maven/lucene/facet/pom.xml.template   |   36 +-
 .../maven/lucene/grouping/pom.xml.template      |   36 +-
 .../maven/lucene/highlighter/pom.xml.template   |   36 +-
 dev-tools/maven/lucene/join/pom.xml.template    |   36 +-
 dev-tools/maven/lucene/memory/pom.xml.template  |   36 +-
 dev-tools/maven/lucene/misc/pom.xml.template    |   36 +-
 dev-tools/maven/lucene/pom.xml.template         |   36 +-
 dev-tools/maven/lucene/queries/pom.xml.template |   36 +-
 .../maven/lucene/queryparser/pom.xml.template   |   36 +-
 .../maven/lucene/replicator/pom.xml.template    |   38 +-
 dev-tools/maven/lucene/sandbox/pom.xml.template |   36 +-
 .../lucene/spatial-extras/pom.xml.template      |   36 +-
 dev-tools/maven/lucene/spatial/pom.xml.template |   38 +-
 .../maven/lucene/spatial3d/pom.xml.template     |   36 +-
 dev-tools/maven/lucene/suggest/pom.xml.template |   36 +-
 .../lucene/test-framework/pom.xml.template      |   36 +-
 dev-tools/maven/pom.xml.template                |   36 +-
 .../contrib/analysis-extras/pom.xml.template    |   36 +-
 .../solr/contrib/analytics/pom.xml.template     |   36 +-
 .../solr/contrib/clustering/pom.xml.template    |   36 +-
 .../dataimporthandler-extras/pom.xml.template   |   36 +-
 .../contrib/dataimporthandler/pom.xml.template  |   36 +-
 .../solr/contrib/extraction/pom.xml.template    |   36 +-
 .../maven/solr/contrib/langid/pom.xml.template  |   36 +-
 .../maven/solr/contrib/ltr/pom.xml.template     |   36 +-
 .../solr/contrib/map-reduce/pom.xml.template    |   36 +-
 .../contrib/morphlines-cell/pom.xml.template    |   36 +-
 .../contrib/morphlines-core/pom.xml.template    |   36 +-
 dev-tools/maven/solr/contrib/pom.xml.template   |   36 +-
 .../maven/solr/contrib/uima/pom.xml.template    |   36 +-
 .../solr/contrib/velocity/pom.xml.template      |   36 +-
 dev-tools/maven/solr/core/pom.xml.template      |   36 +-
 .../maven/solr/core/src/java/pom.xml.template   |   36 +-
 .../maven/solr/core/src/test/pom.xml.template   |   36 +-
 dev-tools/maven/solr/pom.xml.template           |   36 +-
 dev-tools/maven/solr/solrj/pom.xml.template     |   36 +-
 .../maven/solr/solrj/src/java/pom.xml.template  |   36 +-
 .../maven/solr/solrj/src/test/pom.xml.template  |   36 +-
 .../maven/solr/test-framework/pom.xml.template  |   36 +-
 lucene/CHANGES.txt                              |   52 +
 .../lucene/analysis/custom/CustomAnalyzer.java  |    2 +-
 .../analysis/synonym/FlattenGraphFilter.java    |  417 ++++
 .../synonym/FlattenGraphFilterFactory.java      |   44 +
 .../lucene/analysis/synonym/SynonymFilter.java  |    4 +
 .../analysis/synonym/SynonymFilterFactory.java  |    4 +
 .../analysis/synonym/SynonymGraphFilter.java    |  586 ++++++
 .../synonym/SynonymGraphFilterFactory.java      |  204 ++
 .../lucene/analysis/synonym/SynonymMap.java     |    7 +-
 .../lucene/analysis/util/CharTokenizer.java     |    6 +-
 ...ache.lucene.analysis.util.TokenFilterFactory |    2 +
 .../lucene/analysis/core/TestRandomChains.java  |  177 +-
 .../analysis/custom/TestCustomAnalyzer.java     |   21 +
 .../apache/lucene/analysis/custom/mapping1.txt  |    1 +
 .../apache/lucene/analysis/custom/mapping2.txt  |    1 +
 .../miscellaneous/TestWordDelimiterFilter.java  |   56 +-
 .../synonym/TestFlattenGraphFilter.java         |  284 +++
 .../synonym/TestSynonymGraphFilter.java         | 1956 ++++++++++++++++++
 .../PackedTokenAttributeImpl.java               |    9 +-
 .../apache/lucene/codecs/DocValuesConsumer.java |   10 +-
 .../org/apache/lucene/codecs/NormsConsumer.java |    2 +-
 .../lucene/codecs/StoredFieldsWriter.java       |    2 +-
 .../apache/lucene/codecs/TermVectorsWriter.java |    2 +-
 .../CompressingStoredFieldsWriter.java          |    2 +-
 .../org/apache/lucene/document/DoublePoint.java |   30 +-
 .../org/apache/lucene/document/FloatPoint.java  |   30 +-
 .../org/apache/lucene/index/DocIDMerger.java    |  211 +-
 .../lucene/index/DocumentsWriterPerThread.java  |   16 +-
 .../lucene/index/MappingMultiPostingsEnum.java  |    2 +-
 .../TrackingTmpOutputDirectoryWrapper.java      |    2 +-
 .../org/apache/lucene/search/DoubleValues.java  |   38 +
 .../lucene/search/DoubleValuesSource.java       |  313 +++
 .../org/apache/lucene/search/GraphQuery.java    |  136 ++
 .../lucene/search/LeafFieldComparator.java      |    2 +-
 .../org/apache/lucene/search/LongValues.java    |   38 +
 .../apache/lucene/search/LongValuesSource.java  |  217 ++
 .../lucene/search/MultiCollectorManager.java    |  105 +
 .../lucene/search/SimpleFieldComparator.java    |    2 +-
 .../org/apache/lucene/store/MMapDirectory.java  |  124 +-
 .../org/apache/lucene/util/QueryBuilder.java    |  113 +-
 .../apache/lucene/util/automaton/Automaton.java |    5 +-
 .../lucene/util/automaton/Operations.java       |    6 +-
 .../apache/lucene/util/automaton/StatePair.java |    4 +-
 .../org/apache/lucene/util/bkd/BKDWriter.java   |   53 +-
 .../graph/GraphTokenStreamFiniteStrings.java    |  230 ++
 .../apache/lucene/util/graph/package-info.java  |   21 +
 .../lucene/index/Test4GBStoredFields.java       |    2 +
 .../apache/lucene/index/TestDocIDMerger.java    |    4 +-
 .../apache/lucene/index/TestIndexWriter.java    |    3 +-
 .../lucene/search/TestDoubleValuesSource.java   |  167 ++
 .../apache/lucene/search/TestGraphQuery.java    |   79 +
 .../apache/lucene/search/TestLRUQueryCache.java |    7 +
 .../lucene/search/TestLongValuesSource.java     |  149 ++
 .../apache/lucene/search/TestPointQueries.java  |   28 +
 .../org/apache/lucene/store/TestDirectory.java  |   13 +-
 .../apache/lucene/store/TestMmapDirectory.java  |    3 +-
 .../org/apache/lucene/store/TestMultiMMap.java  |    3 +-
 .../apache/lucene/util/TestQueryBuilder.java    |   15 +-
 .../org/apache/lucene/util/bkd/TestBKD.java     |   48 +-
 .../org/apache/lucene/util/fst/Test2BFST.java   |    2 +
 .../TestGraphTokenStreamFiniteStrings.java      |  217 ++
 .../org/apache/lucene/facet/DrillSideways.java  |  338 ++-
 .../lucene/facet/FacetsCollectorManager.java    |   55 +
 .../apache/lucene/facet/TestDrillSideways.java  |  315 +--
 .../lucene/facet/TestParallelDrillSideways.java |   90 +
 .../lucene/search/grouping/TestGrouping.java    |    9 -
 lucene/ivy-versions.properties                  |    3 +
 .../queryparser/classic/QueryParserBase.java    |   42 +-
 .../classic/TestMultiFieldQueryParser.java      |   11 +-
 .../queryparser/classic/TestQueryParser.java    |  131 +-
 .../lucene/document/TestHalfFloatPoint.java     |    2 +
 .../lucene/spatial3d/geom/GeoBBoxFactory.java   |   34 +-
 .../lucene/spatial3d/geom/GeoCircleFactory.java |    2 +-
 .../spatial3d/geom/GeoPolygonFactory.java       |    6 +-
 .../apache/lucene/spatial3d/geom/Vector.java    |    4 +
 lucene/suggest/build.xml                        |    6 +-
 .../analyzing/AnalyzingInfixSuggester.java      |  137 +-
 .../suggest/analyzing/FreeTextSuggester.java    |   45 -
 .../analysis/BaseTokenStreamTestCase.java       |   37 +-
 .../apache/lucene/analysis/MockTokenizer.java   |    3 +-
 .../index/BaseStoredFieldsFormatTestCase.java   |    2 +
 .../org/apache/lucene/index/RandomCodec.java    |    2 +-
 .../org/apache/lucene/util/LuceneTestCase.java  |  110 +-
 .../org/apache/lucene/util/RamUsageTester.java  |  102 +-
 lucene/tools/junit4/tests.policy                |    1 -
 solr/CHANGES.txt                                |   59 +-
 solr/bin/solr                                   |   26 +-
 solr/bin/solr.cmd                               |   36 +-
 .../solr/handler/dataimport/JdbcDataSource.java |    4 +-
 .../handler/dataimport/SolrEntityProcessor.java |  192 +-
 .../dataimport/MockSolrEntityProcessor.java     |   18 +-
 .../handler/dataimport/TestJdbcDataSource.java  |   43 +-
 .../TestSolrEntityProcessorEndToEnd.java        |   27 +-
 .../dataimport/TestSolrEntityProcessorUnit.java |   70 +
 solr/contrib/ltr/README.md                      |    2 +-
 .../LTRFeatureLoggerTransformerFactory.java     |   29 +-
 .../solr/collection1/conf/solrconfig-ltr.xml    |    1 +
 .../apache/solr/ltr/TestLTRQParserExplain.java  |    2 +-
 .../apache/solr/ltr/TestLTRQParserPlugin.java   |    5 +-
 .../org/apache/solr/ltr/TestLTRWithFacet.java   |    2 +-
 .../org/apache/solr/ltr/TestLTRWithSort.java    |    2 +-
 .../org/apache/solr/ltr/TestRerankBase.java     |   54 +-
 .../solr/ltr/TestSelectiveWeightCreation.java   |    2 +-
 .../ltr/feature/TestEdisMaxSolrFeature.java     |    2 +-
 .../solr/ltr/feature/TestExternalFeatures.java  |   37 +-
 .../ltr/feature/TestExternalValueFeatures.java  |   21 +-
 .../solr/ltr/feature/TestFeatureLogging.java    |   30 +-
 .../ltr/feature/TestFeatureLtrScoringModel.java |    2 +-
 .../solr/ltr/feature/TestFeatureStore.java      |    2 +-
 .../ltr/feature/TestFieldLengthFeature.java     |    2 +-
 .../solr/ltr/feature/TestFieldValueFeature.java |    2 +-
 .../solr/ltr/feature/TestFilterSolrFeature.java |    6 +-
 .../ltr/feature/TestNoMatchSolrFeature.java     |   94 +-
 .../ltr/feature/TestOriginalScoreFeature.java   |    2 +-
 .../solr/ltr/feature/TestRankingFeature.java    |    2 +-
 .../ltr/feature/TestUserTermScoreWithQ.java     |    2 +-
 .../ltr/feature/TestUserTermScorerQuery.java    |    2 +-
 .../ltr/feature/TestUserTermScorereQDF.java     |    2 +-
 .../solr/ltr/feature/TestValueFeature.java      |    2 +-
 .../apache/solr/ltr/model/TestLinearModel.java  |    2 +-
 .../model/TestMultipleAdditiveTreesModel.java   |    2 +-
 .../solr/ltr/store/rest/TestModelManager.java   |    2 +-
 .../store/rest/TestModelManagerPersistence.java |    2 +-
 .../java/org/apache/solr/cloud/Overseer.java    |    2 +-
 .../org/apache/solr/core/CoreContainer.java     |   23 +-
 .../org/apache/solr/core/DirectoryFactory.java  |   26 +
 .../apache/solr/core/HdfsDirectoryFactory.java  |   29 +
 .../solr/core/MetricsDirectoryFactory.java      |  511 +++++
 .../src/java/org/apache/solr/core/SolrCore.java |   24 +-
 .../apache/solr/core/SolrDeletionPolicy.java    |    6 +
 .../org/apache/solr/core/SolrInfoMBean.java     |    2 +-
 .../solr/core/StandardDirectoryFactory.java     |   45 +-
 .../org/apache/solr/handler/IndexFetcher.java   |   25 +-
 .../org/apache/solr/handler/StreamHandler.java  |    3 +-
 .../solr/handler/admin/CoreAdminHandler.java    |   13 +-
 .../solr/handler/admin/LukeRequestHandler.java  |   18 +-
 .../admin/SegmentsInfoRequestHandler.java       |    1 +
 .../handler/component/HttpShardHandler.java     |   48 +-
 .../component/HttpShardHandlerFactory.java      |  154 +-
 .../solr/handler/component/QueryComponent.java  |   18 +-
 .../component/QueryElevationComponent.java      |    4 +-
 .../solr/handler/component/ResponseBuilder.java |    1 -
 .../solr/handler/component/SearchHandler.java   |    2 +-
 .../solr/handler/component/ShardHandler.java    |    5 +-
 .../solr/highlight/UnifiedSolrHighlighter.java  |  459 ++--
 .../solr/metrics/OperatingSystemMetricSet.java  |   92 +
 .../metrics/reporters/SolrGangliaReporter.java  |  144 ++
 .../metrics/reporters/SolrGraphiteReporter.java |  129 ++
 .../metrics/reporters/SolrSlf4jReporter.java    |  127 ++
 .../apache/solr/parser/SolrQueryParserBase.java |   16 +-
 .../solr/response/JSONResponseWriter.java       |   86 +-
 .../org/apache/solr/schema/SchemaManager.java   |   99 +-
 .../solr/search/CollapsingQParserPlugin.java    |   14 +-
 .../search/grouping/GroupingSpecification.java  |   18 +-
 .../apache/solr/servlet/SolrDispatchFilter.java |    8 +-
 .../solr/spelling/DirectSolrSpellChecker.java   |   18 +-
 .../org/apache/solr/update/SolrIndexConfig.java |   16 +-
 .../org/apache/solr/update/SolrIndexWriter.java |  144 ++
 .../apache/solr/update/UpdateShardHandler.java  |   72 +-
 .../src/java/org/apache/solr/util/SolrCLI.java  |   65 +-
 .../src/java/org/apache/solr/util/TimeOut.java  |   13 +-
 .../stats/InstrumentedHttpRequestExecutor.java  |  129 ++
 ...entedPoolingHttpClientConnectionManager.java |  113 +
 .../org/apache/solr/util/stats/MetricUtils.java |   88 +-
 .../schema-minimal-with-another-uniqkey.xml     |   23 +
 .../conf/solrconfig-indexmetrics.xml            |   57 +
 .../test-files/solr/solr-gangliareporter.xml    |   32 +
 .../test-files/solr/solr-graphitereporter.xml   |   31 +
 .../src/test-files/solr/solr-slf4jreporter.xml  |   35 +
 .../TestReversedWildcardFilterFactory.java      |   56 +-
 .../apache/solr/cloud/CdcrBootstrapTest.java    |   25 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |  470 ++---
 .../DeleteLastCustomShardedReplicaTest.java     |  104 +-
 .../org/apache/solr/cloud/DeleteShardTest.java  |  211 +-
 .../solr/cloud/DocValuesNotIndexedTest.java     |   10 -
 .../cloud/LeaderFailoverAfterPartitionTest.java |    2 +-
 .../cloud/LeaderFailureAfterFreshStartTest.java |   68 +-
 .../cloud/OverseerModifyCollectionTest.java     |   92 +-
 .../apache/solr/cloud/OverseerRolesTest.java    |  165 +-
 .../apache/solr/cloud/OverseerStatusTest.java   |   55 +-
 .../solr/cloud/PeerSyncReplicationTest.java     |   55 +-
 .../apache/solr/cloud/RemoteQueryErrorTest.java |   53 +-
 .../solr/cloud/TestDownShardTolerantSearch.java |   40 +-
 .../TestExclusionRuleCollectionAccess.java      |   38 +-
 .../apache/solr/cloud/TestStressLiveNodes.java  |    2 +-
 .../solr/core/MockShardHandlerFactory.java      |    2 +-
 .../test/org/apache/solr/core/TestConfig.java   |    2 +
 .../solr/handler/TestReplicationHandler.java    |   20 +-
 .../admin/CoreMergeIndexesAdminHandlerTest.java |   10 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |    6 +-
 .../admin/SegmentsInfoRequestHandlerTest.java   |   17 +-
 .../solr/handler/admin/StatsReloadRaceTest.java |   82 +-
 .../highlight/TestUnifiedSolrHighlighter.java   |   10 +
 .../org/apache/solr/metrics/JvmMetricsTest.java |   68 +
 .../reporters/SolrGangliaReporterTest.java      |   82 +
 .../reporters/SolrGraphiteReporterTest.java     |  116 ++
 .../reporters/SolrSlf4jReporterTest.java        |   77 +
 .../apache/solr/response/JSONWriterTest.java    |   20 +-
 .../TestSubQueryTransformerDistrib.java         |   55 +-
 .../PKIAuthenticationIntegrationTest.java       |   40 +-
 .../TestSolrCloudWithHadoopAuthPlugin.java      |    4 +-
 .../org/apache/solr/update/AutoCommitTest.java  |    2 +-
 .../apache/solr/update/SoftAutoCommitTest.java  |    2 +-
 .../apache/solr/update/SolrIndexConfigTest.java |    1 +
 .../solr/update/SolrIndexMetricsTest.java       |   94 +
 .../apache/solr/util/stats/MetricUtilsTest.java |   24 +-
 solr/licenses/gmetric4j-1.0.7.jar.sha1          |    1 +
 solr/licenses/gmetric4j-LICENSE-BSD.txt         |   31 +
 solr/licenses/gmetric4j-NOTICE.txt              |    0
 solr/licenses/metrics-ganglia-3.1.2.jar.sha1    |    1 +
 solr/licenses/metrics-ganglia-LICENSE-ASL.txt   |  203 ++
 solr/licenses/metrics-ganglia-NOTICE.txt        |   12 +
 solr/licenses/metrics-graphite-3.1.2.jar.sha1   |    1 +
 solr/licenses/metrics-graphite-LICENSE-ASL.txt  |  203 ++
 solr/licenses/metrics-graphite-NOTICE.txt       |   12 +
 solr/server/ivy.xml                             |    3 +
 .../solr/client/solrj/impl/HttpClientUtil.java  |   35 +-
 .../client/solrj/io/stream/CloudSolrStream.java |    4 +
 .../solr/client/solrj/io/stream/NullStream.java |  155 ++
 .../client/solrj/io/stream/PriorityStream.java  |  161 ++
 .../solrj/request/CollectionAdminRequest.java   |    2 +
 .../solr/common/params/HighlightParams.java     |    2 +-
 .../client/solrj/impl/CloudSolrClientTest.java  |    2 +-
 .../solrj/io/stream/StreamExpressionTest.java   |  224 ++
 .../solr/common/params/CommonParamsTest.java    |    2 +
 .../solr/cloud/AbstractDistribZkTestBase.java   |   31 +-
 .../java/org/apache/solr/cloud/ChaosMonkey.java |    2 -
 .../component/TrackingShardHandlerFactory.java  |    2 +-
 289 files changed, 13357 insertions(+), 3649 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/82350229/lucene/ivy-versions.properties
----------------------------------------------------------------------

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

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/82350229/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------


[22/50] lucene-solr:jira/solr-9858: Upgrade to Calcite 1.11.0

Posted by ab...@apache.org.
Upgrade to Calcite 1.11.0


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

Branch: refs/heads/jira/solr-9858
Commit: 7a53e9a152657aa553dc674f6468a0c0b4396213
Parents: 8235022
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 6 15:32:18 2017 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 6 15:32:18 2017 -0600

----------------------------------------------------------------------
 lucene/default-nested-ivy-settings.xml                | 2 --
 lucene/ivy-versions.properties                        | 7 ++++---
 solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1   | 1 -
 solr/licenses/calcite-core-1.11.0.jar.sha1            | 1 +
 solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1 | 1 -
 solr/licenses/calcite-linq4j-1.11.0.jar.sha1          | 1 +
 6 files changed, 6 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/lucene/default-nested-ivy-settings.xml
----------------------------------------------------------------------
diff --git a/lucene/default-nested-ivy-settings.xml b/lucene/default-nested-ivy-settings.xml
index 908a380..522fd29 100644
--- a/lucene/default-nested-ivy-settings.xml
+++ b/lucene/default-nested-ivy-settings.xml
@@ -32,7 +32,6 @@
   <caches lockStrategy="${ivy.lock-strategy}" resolutionCacheDir="${ivy.resolution-cache.dir}" />
 
   <resolvers>
-    <ibiblio name="apache-snapshot" root="https://repository.apache.org/content/repositories/snapshots" m2compatible="true" />
     <ibiblio name="sonatype-releases" root="https://oss.sonatype.org/content/repositories/releases" m2compatible="true" />
     <ibiblio name="maven.restlet.org" root="http://maven.restlet.org" m2compatible="true" />
     <ibiblio name="releases.cloudera.com" root="http://repository.cloudera.com/content/repositories/releases" m2compatible="true" />
@@ -51,7 +50,6 @@
       <resolver ref="local"/>
       <!-- <resolver ref="local-maven-2" /> -->
       <resolver ref="main"/>
-      <resolver ref="apache-snapshot" />
       <resolver ref="maven.restlet.org" />
       <resolver ref="sonatype-releases" />
       <resolver ref="releases.cloudera.com"/>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/lucene/ivy-versions.properties
----------------------------------------------------------------------
diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties
index a0ab1f4..2b53454 100644
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@ -105,12 +105,13 @@ io.netty.netty-all.version = 4.0.36.Final
 /org.apache.ant/ant = 1.8.2
 /org.apache.avro/avro = 1.7.5
 
-org.apache.calcite.version = 1.11.0-SNAPSHOT
-org.apache.calcite.avatica.version = 1.9.0
-/org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version}
+org.apache.calcite.version = 1.11.0
 /org.apache.calcite/calcite-core = ${org.apache.calcite.version}
 /org.apache.calcite/calcite-linq4j = ${org.apache.calcite.version}
 
+org.apache.calcite.avatica.version = 1.9.0
+/org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version}
+
 /org.apache.commons/commons-compress = 1.11
 /org.apache.commons/commons-exec = 1.3
 /org.apache.commons/commons-math3 = 3.4.1

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
deleted file mode 100644
index f00eb05..0000000
--- a/solr/licenses/calcite-core-1.11.0-SNAPSHOT.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9e4602dbaac8a35f922e63a7f207ca1272479159

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/solr/licenses/calcite-core-1.11.0.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-1.11.0.jar.sha1 b/solr/licenses/calcite-core-1.11.0.jar.sha1
new file mode 100644
index 0000000..980c772
--- /dev/null
+++ b/solr/licenses/calcite-core-1.11.0.jar.sha1
@@ -0,0 +1 @@
+d0f90841119f1ec02a64ef029ff525171a320cff

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1 b/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
deleted file mode 100644
index 9c06c41..0000000
--- a/solr/licenses/calcite-linq4j-1.11.0-SNAPSHOT.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0ceeb60b30b113dc2e64d393724b56b06e5db332

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/7a53e9a1/solr/licenses/calcite-linq4j-1.11.0.jar.sha1
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-1.11.0.jar.sha1 b/solr/licenses/calcite-linq4j-1.11.0.jar.sha1
new file mode 100644
index 0000000..9839632
--- /dev/null
+++ b/solr/licenses/calcite-linq4j-1.11.0.jar.sha1
@@ -0,0 +1 @@
+b09e988f64c69c21cc61aa734e9955736a07e016


[07/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: c3400e8a2ee8dd2e6ed6ced7a7f04fd40f6b577d
Parents: 1489fb9 c4c5e86
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 10 16:15:06 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 10 16:15:06 2016 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |   25 +-
 lucene/analysis/kuromoji/ivy.xml                |    2 +-
 .../ja/dict/TokenInfoDictionary$fst.dat         |  Bin 1716198 -> 1698563 bytes
 .../analysis/ja/util/ConnectionCostsWriter.java |    1 -
 .../ja/util/TokenInfoDictionaryBuilder.java     |    4 +-
 .../index/TestBackwardsCompatibility.java       |    4 +-
 .../org/apache/lucene/index/index.6.3.0-cfs.zip |  Bin 0 -> 15869 bytes
 .../apache/lucene/index/index.6.3.0-nocfs.zip   |  Bin 0 -> 15876 bytes
 .../blocktreeords/OrdsBlockTreeTermsWriter.java |    4 +-
 .../codecs/memory/MemoryPostingsFormat.java     |   18 +-
 .../codecs/blocktree/BlockTreeTermsWriter.java  |    4 +-
 .../GrowableByteArrayDataOutput.java            |    2 +-
 .../lucene/index/BinaryDocValuesWriter.java     |   15 +-
 .../lucene/index/DefaultIndexingChain.java      |    4 +
 .../apache/lucene/index/DocsWithFieldSet.java   |   62 +
 .../org/apache/lucene/index/IndexWriter.java    |    8 +
 .../apache/lucene/index/NormValuesWriter.java   |   15 +-
 .../lucene/index/NumericDocValuesWriter.java    |   15 +-
 .../lucene/index/SortedDocValuesWriter.java     |   15 +-
 .../index/SortedNumericDocValuesWriter.java     |   15 +-
 .../lucene/index/SortedSetDocValuesWriter.java  |   15 +-
 .../org/apache/lucene/search/PhraseQuery.java   |    2 +-
 .../search/similarities/BM25Similarity.java     |   20 +-
 .../search/similarities/BooleanSimilarity.java  |   95 +
 .../search/similarities/ClassicSimilarity.java  |   13 +
 .../search/similarities/TFIDFSimilarity.java    |   12 +-
 .../lucene/search/spans/SpanNotQuery.java       |   14 +-
 .../java/org/apache/lucene/util/BytesRef.java   |    2 +-
 .../org/apache/lucene/util/BytesRefBuilder.java |    4 +-
 .../org/apache/lucene/util/UnicodeUtil.java     |    5 +
 .../org/apache/lucene/util/fst/Builder.java     |   28 +-
 .../java/org/apache/lucene/util/fst/FST.java    |  633 +-----
 .../apache/lucene/util/fst/package-info.java    |    1 -
 .../TestGrowableByteArrayDataOutput.java        |    4 +-
 .../lucene/index/TestDocsWithFieldSet.java      |   80 +
 .../apache/lucene/index/TestIndexWriter.java    |   30 +
 .../similarities/TestBooleanSimilarity.java     |  117 ++
 .../apache/lucene/search/spans/TestBasics.java  |   30 +-
 .../apache/lucene/search/spans/TestSpans.java   |   79 +-
 .../org/apache/lucene/util/TestUnicodeUtil.java |    6 +-
 .../lucene/util/automaton/TestUTF32ToUTF8.java  |    2 +-
 .../org/apache/lucene/util/fst/Test2BFST.java   |   17 +-
 .../org/apache/lucene/util/fst/TestFSTs.java    |   27 +-
 .../uhighlight/AnalysisOffsetStrategy.java      |   15 +-
 .../uhighlight/MultiTermHighlighting.java       |   32 +-
 .../lucene/search/uhighlight/PhraseHelper.java  |   19 +-
 .../search/uhighlight/UnifiedHighlighter.java   |   35 +-
 .../uhighlight/TestUnifiedHighlighterMTQ.java   |   88 +
 .../TestUnifiedHighlighterStrictPhrases.java    |   77 +
 lucene/ivy-versions.properties                  |    2 +-
 .../idversion/VersionBlockTreeTermsWriter.java  |    4 +-
 .../lucene/search/TermAutomatonQuery.java       |   86 +-
 .../lucene/search/TestTermAutomatonQuery.java   |  193 +-
 .../suggest/fst/FSTCompletionBuilder.java       |    4 +-
 .../org/apache/lucene/search/CheckHits.java     |   10 +-
 .../search/similarities/RandomSimilarity.java   |    1 +
 .../util/TestRuleSetupAndRestoreClassEnv.java   |    3 +-
 .../org/apache/lucene/util/fst/FSTTester.java   |   14 +-
 solr/CHANGES.txt                                |   43 +-
 solr/bin/solr                                   |   14 +-
 .../handler/clustering/ClusteringComponent.java |   12 +-
 .../carrot2/CarrotClusteringEngine.java         |   29 +-
 .../clustering/carrot2/CarrotParams.java        |   10 +-
 .../SolrStopwordsCarrot2LexicalDataFactory.java |   49 +-
 .../carrot2/CarrotClusteringEngineTest.java     |   27 +-
 .../carrot2/EchoClusteringAlgorithm.java        |    5 +-
 .../carrot2/EchoStemsClusteringAlgorithm.java   |    5 +-
 .../carrot2/EchoTokensClusteringAlgorithm.java  |    5 +-
 ...exicalResourcesCheckClusteringAlgorithm.java |    5 +-
 .../carrot2/MockClusteringAlgorithm.java        |    4 +-
 .../java/org/apache/solr/cloud/BackupCmd.java   |  140 +-
 .../org/apache/solr/cloud/RecoveryStrategy.java |   49 +-
 .../java/org/apache/solr/cloud/RestoreCmd.java  |    2 +-
 .../src/java/org/apache/solr/core/SolrCore.java |   18 +-
 .../apache/solr/core/backup/BackupManager.java  |    3 +-
 .../solr/core/snapshots/SolrSnapshotsTool.java  |  468 +++++
 .../org/apache/solr/handler/ExportHandler.java  |   48 +
 .../org/apache/solr/handler/ExportWriter.java   | 1711 +++++++++++++++++
 .../solr/handler/admin/CollectionsHandler.java  |    6 +
 .../solr/handler/admin/PrepRecoveryOp.java      |    3 +
 .../handler/component/HttpShardHandler.java     |   50 +-
 .../component/HttpShardHandlerFactory.java      |   21 +-
 .../solr/handler/component/QueryComponent.java  |    3 +-
 .../component/ReplicaListTransformer.java       |   35 +
 .../ShufflingReplicaListTransformer.java        |   39 +
 .../apache/solr/request/DocValuesFacets.java    |   13 +-
 .../solr/request/macro/MacroExpander.java       |    2 +
 .../solr/response/JSONResponseWriter.java       |   64 +-
 .../solr/response/SortingResponseWriter.java    | 1805 ------------------
 .../solr/response/TextResponseWriter.java       |   30 +-
 .../solr/search/facet/FacetProcessor.java       |   67 +-
 .../apache/solr/search/facet/FacetRequest.java  |   19 +
 .../org/apache/solr/util/TestInjection.java     |   32 +
 solr/core/src/resources/ImplicitPlugins.json    |    6 +-
 .../AbstractCloudBackupRestoreTestCase.java     |   16 +
 .../apache/solr/cloud/TestCloudRecovery.java    |    8 +
 .../solr/cloud/TestHdfsCloudBackupRestore.java  |   56 +
 .../test/org/apache/solr/core/SolrCoreTest.java |    2 +-
 .../component/ReplicaListTransformerTest.java   |  163 ++
 .../ShufflingReplicaListTransformerTest.java    |   76 +
 .../solr/request/macro/TestMacroExpander.java   |   13 +
 .../apache/solr/response/JSONWriterTest.java    |    9 +-
 .../apache/solr/response/TestExportWriter.java  |  195 ++
 .../apache/solr/response/TestPushWriter.java    |   81 +
 .../response/TestSortingResponseWriter.java     |  190 --
 .../solr/search/facet/TestJsonFacets.java       |   57 +-
 solr/example/files/conf/update-script.js        |    9 +-
 solr/licenses/carrot2-mini-3.12.0.jar.sha1      |    1 -
 solr/licenses/carrot2-mini-3.15.0.jar.sha1      |    1 +
 .../scripts/cloud-scripts/snapshotscli.sh       |  176 ++
 .../org/apache/solr/client/solrj/io/Tuple.java  |   21 +-
 .../client/solrj/io/stream/TupleStream.java     |   67 +-
 .../solrj/io/stream/expr/Explanation.java       |    1 -
 .../solrj/request/CollectionAdminRequest.java   |   14 +
 .../solr/client/solrj/response/Cluster.java     |   48 +-
 .../solrj/response/ClusteringResponse.java      |   48 +-
 .../org/apache/solr/common/IteratorWriter.java  |   65 +
 .../java/org/apache/solr/common/MapWriter.java  |   90 +
 .../java/org/apache/solr/common/PushWriter.java |   42 +
 .../common/params/CollectionAdminParams.java    |   24 +
 .../apache/solr/common/util/JavaBinCodec.java   |  184 +-
 .../solrj/sampleClusteringResponse.xml          |   19 +
 .../solrj/response/TestClusteringResponse.java  |   62 +-
 .../java/org/apache/solr/util/TestHarness.java  |   27 +-
 solr/webapp/web/js/angular/app.js               |    2 +-
 125 files changed, 5413 insertions(+), 3228 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/c3400e8a/lucene/ivy-versions.properties
----------------------------------------------------------------------


[37/50] lucene-solr:jira/solr-9858: SOLR-10094: /export handler (master only) loses the sort deep into the result set

Posted by ab...@apache.org.
SOLR-10094: /export handler (master only) loses the sort deep into the result set


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

Branch: refs/heads/jira/solr-9858
Commit: a9cf1503b59c24e8093459609dd56bb5339cda54
Parents: 4ea97b0
Author: Joel Bernstein <jb...@apache.org>
Authored: Sat Feb 4 23:48:03 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 8 13:01:31 2017 -0500

----------------------------------------------------------------------
 .../java/org/apache/solr/handler/ExportWriter.java | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/a9cf1503/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
index e432f94..8bdd959 100644
--- a/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/ExportWriter.java
@@ -1254,7 +1254,6 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
   class StringValue implements SortValue {
 
     protected SortedDocValues vals;
-    protected SortedDocValues segmentVals[];
 
     protected MultiDocValues.OrdinalMap ordinalMap;
     protected LongValues globalOrds;
@@ -1264,11 +1263,11 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     protected int segment;
     protected int currentOrd;
     protected IntComp comp;
+    protected int lastDocID;
 
     public StringValue(SortedDocValues vals, String field, IntComp comp)  {
       this.vals = vals;
       if(vals instanceof MultiDocValues.MultiSortedDocValues) {
-        this.segmentVals = ((MultiDocValues.MultiSortedDocValues) vals).values;
         this.ordinalMap = ((MultiDocValues.MultiSortedDocValues) vals).mapping;
       }
       this.field = field;
@@ -1281,6 +1280,13 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     }
 
     public void setCurrentValue(int docId) throws IOException {
+
+      if (docId < lastDocID) {
+        throw new AssertionError("docs were sent out-of-order: lastDocID=" + lastDocID + " vs doc=" + docId);
+      }
+
+      lastDocID = docId;
+
       if (docId > currentVals.docID()) {
         currentVals.advance(docId);
       }
@@ -1301,14 +1307,13 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
       this.currentOrd = v.currentOrd;
     }
 
-    public void setNextReader(LeafReaderContext context) {
+    public void setNextReader(LeafReaderContext context) throws IOException {
       segment = context.ord;
       if(ordinalMap != null) {
         globalOrds = ordinalMap.getGlobalOrds(segment);
-        currentVals = segmentVals[segment];
-      } else {
-        currentVals = vals;
       }
+      currentVals = DocValues.getSorted(context.reader(), field);
+      lastDocID = 0;
     }
 
     public void reset() {


[06/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 1489fb936ff57628ef6531b049f63247302127f3
Parents: cd9a318 84171ec
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 19:04:31 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 19:04:31 2016 -0500

----------------------------------------------------------------------
 .../core/src/java/org/apache/solr/response/JSONResponseWriter.java | 1 -
 solr/core/src/java/org/apache/solr/response/PHPResponseWriter.java | 2 --
 2 files changed, 3 deletions(-)
----------------------------------------------------------------------



[33/50] lucene-solr:jira/solr-9858: Fix precommit

Posted by ab...@apache.org.
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/89b39e41
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/89b39e41
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/89b39e41

Branch: refs/heads/jira/solr-9858
Commit: 89b39e41c01c20f0003c0008e90440d0c0b2cde1
Parents: a9bdfde
Author: Kevin Risden <kr...@apache.org>
Authored: Sun Jan 29 11:30:28 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Sun Jan 29 12:18:34 2017 -0500

----------------------------------------------------------------------
 lucene/ivy-versions.properties                  |   9 +-
 .../apache/solr/handler/sql/SolrAggregate.java  |   1 -
 .../apache/solr/handler/sql/SolrEnumerator.java |   3 +-
 .../org/apache/solr/handler/sql/SolrRules.java  |   5 +-
 .../org/apache/solr/handler/sql/SolrSchema.java |   1 -
 .../handler/sql/SolrToEnumerableConverter.java  |   3 +-
 solr/licenses/avatica-core-LICENSE-ASL.txt      | 268 +++++++++++++++++++
 solr/licenses/avatica-core-NOTICE.txt           |   5 +
 solr/licenses/calcite-core-LICENSE-ASL.txt      | 268 +++++++++++++++++++
 solr/licenses/calcite-core-NOTICE.txt           |  12 +
 solr/licenses/calcite-linq4j-LICENSE-ASL.txt    | 268 +++++++++++++++++++
 solr/licenses/calcite-linq4j-NOTICE.txt         |  12 +
 solr/licenses/commons-compiler-LICENSE-BSD.txt  |  31 +++
 solr/licenses/commons-compiler-NOTICE.txt       |   5 +
 .../eigenbase-properties-LICENSE-ASL.txt        | 202 ++++++++++++++
 solr/licenses/eigenbase-properties-NOTICE.txt   |  20 ++
 solr/licenses/janino-LICENSE-BSD.txt            |  31 +++
 solr/licenses/janino-NOTICE.txt                 |   5 +
 18 files changed, 1136 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/lucene/ivy-versions.properties
----------------------------------------------------------------------
diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties
index ffa9f30..172b95b 100644
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@ -70,7 +70,6 @@ com.sun.jersey.version = 1.9
 /dom4j/dom4j = 1.6.1
 /hsqldb/hsqldb = 1.8.0.10
 /info.ganglia.gmetric4j/gmetric4j = 1.0.7
-/io.airlift/slice = 0.10
 
 io.dropwizard.metrics.version = 3.1.2
 /io.dropwizard.metrics/metrics-core = ${io.dropwizard.metrics.version}
@@ -106,13 +105,13 @@ io.netty.netty-all.version = 4.0.36.Final
 /org.apache.ant/ant = 1.8.2
 /org.apache.avro/avro = 1.7.5
 
+org.apache.calcite.avatica.version = 1.9.0
+/org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version}
+
 org.apache.calcite.version = 1.11.0
 /org.apache.calcite/calcite-core = ${org.apache.calcite.version}
 /org.apache.calcite/calcite-linq4j = ${org.apache.calcite.version}
 
-org.apache.calcite.avatica.version = 1.9.0
-/org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version}
-
 /org.apache.commons/commons-compress = 1.11
 /org.apache.commons/commons-exec = 1.3
 /org.apache.commons/commons-math3 = 3.4.1
@@ -251,8 +250,8 @@ org.codehaus.jackson.version = 1.9.13
 /org.codehaus.jackson/jackson-mapper-asl = ${org.codehaus.jackson.version}
 
 org.codehaus.janino.version = 2.7.6
-/org.codehaus.janino/janino = ${org.codehaus.janino.version}
 /org.codehaus.janino/commons-compiler = ${org.codehaus.janino.version}
+/org.codehaus.janino/janino = ${org.codehaus.janino.version}
 
 /org.codehaus.woodstox/stax2-api = 3.1.4
 /org.codehaus.woodstox/woodstox-core-asl = 4.4.1

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index 2512099..5068b2e 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -21,7 +21,6 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.AggregateCall;
-import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.util.ImmutableBitSet;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
index 4631788..4299e61 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
@@ -23,12 +23,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.lang.invoke.MethodHandles;
 import java.util.List;
 import java.util.Map;
 
 /** Enumerator that reads from a Solr collection. */
 class SolrEnumerator implements Enumerator<Object> {
-  private static final Logger logger = LoggerFactory.getLogger(SolrEnumerator.class);
+  private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final TupleStream tupleStream;
   private final List<Map.Entry<String, Class>> fields;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
index 78c447b..118ec1a 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -21,7 +21,6 @@ import org.apache.calcite.plan.*;
 import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterRule;
-import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.logical.LogicalFilter;
@@ -206,8 +205,8 @@ class SolrRules {
    * Rule to convert an {@link LogicalAggregate} to an {@link SolrAggregate}.
    */
   private static class SolrAggregateRule extends SolrConverterRule {
-    private static final Predicate<RelNode> AGGREGATE_PREDICTE = relNode ->
-        Aggregate.IS_SIMPLE.apply(((LogicalAggregate)relNode));// &&
+//    private static final Predicate<RelNode> AGGREGATE_PREDICTE = relNode ->
+//        Aggregate.IS_SIMPLE.apply(((LogicalAggregate)relNode));// &&
 //        !((LogicalAggregate)relNode).containsDistinctCall();
 
     private static final RelOptRule AGGREGATE_RULE = new SolrAggregateRule();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
index aecfd42..221c2b6 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@ -34,7 +34,6 @@ import java.io.IOException;
 import java.util.EnumSet;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
 
 class SolrSchema extends AbstractSchema {
   final Properties properties;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
index f69f3d5..9b18891 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
@@ -126,8 +126,7 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
   }
 
   /**
-   * E.g. {@code constantList("x", "y")} returns
-   * {@code {ConstantExpression("x"), ConstantExpression("y")}}.
+   * E.g. {@code constantList("x", "y")} returns "{ConstantExpression("x"), ConstantExpression("y")}".
    */
   private static <T> List<Expression> constantList(List<T> values) {
     return Lists.transform(values, Expressions::constant);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/avatica-core-LICENSE-ASL.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/avatica-core-LICENSE-ASL.txt b/solr/licenses/avatica-core-LICENSE-ASL.txt
new file mode 100644
index 0000000..f7b9863
--- /dev/null
+++ b/solr/licenses/avatica-core-LICENSE-ASL.txt
@@ -0,0 +1,268 @@
+
+                                 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 CALCITE SUBCOMPONENTS:
+
+The Apache Calcite project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+-----------------------------------------------------------------------
+ The MIT License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following files under the MIT License:
+
+- site
+    Parts of the web site generated by Jekyll (http://jekyllrb.com/)
+    Copyright (c) 2008-2015 Tom Preston-Werner
+- site/_sass/_font-awesome.scss
+    Font-awesome css files v4.1.0 (http://fortawesome.github.io/Font-Awesome/)
+    Copyright (c) 2013  Dave Gandy
+- site/_sass/_normalize.scss
+    normalize.css v3.0.2 | git.io/normalize
+    Copyright (c) Nicolas Gallagher and Jonathan Neal
+- site/_sass/_gridism.scss
+    Gridism: A simple, responsive, and handy CSS grid by @cobyism
+    https://github.com/cobyism/gridism
+    Copyright (c) 2013 Coby Chapple
+- site/js/html5shiv.min.js
+    HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem
+- site/js/respond.min.js
+    Respond.js v1.4.2: min/max-width media query polyfill
+    Copyright 2013 Scott Jehl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-----------------------------------------------------------------------
+ The Open Font License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following fonts under the
+SIL Open Font License (OFL) - http://scripts.sil.org/OFL/
+
+- site/fonts/fontawesome-webfont.*
+   Font-awesome font files v4.0.3 (http://fortawesome.github.io/Font-Awesome/)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/avatica-core-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/avatica-core-NOTICE.txt b/solr/licenses/avatica-core-NOTICE.txt
new file mode 100644
index 0000000..506738b
--- /dev/null
+++ b/solr/licenses/avatica-core-NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Calcite
+Copyright 2012-2016 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/89b39e41/solr/licenses/calcite-core-LICENSE-ASL.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-LICENSE-ASL.txt b/solr/licenses/calcite-core-LICENSE-ASL.txt
new file mode 100644
index 0000000..f7b9863
--- /dev/null
+++ b/solr/licenses/calcite-core-LICENSE-ASL.txt
@@ -0,0 +1,268 @@
+
+                                 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 CALCITE SUBCOMPONENTS:
+
+The Apache Calcite project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+-----------------------------------------------------------------------
+ The MIT License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following files under the MIT License:
+
+- site
+    Parts of the web site generated by Jekyll (http://jekyllrb.com/)
+    Copyright (c) 2008-2015 Tom Preston-Werner
+- site/_sass/_font-awesome.scss
+    Font-awesome css files v4.1.0 (http://fortawesome.github.io/Font-Awesome/)
+    Copyright (c) 2013  Dave Gandy
+- site/_sass/_normalize.scss
+    normalize.css v3.0.2 | git.io/normalize
+    Copyright (c) Nicolas Gallagher and Jonathan Neal
+- site/_sass/_gridism.scss
+    Gridism: A simple, responsive, and handy CSS grid by @cobyism
+    https://github.com/cobyism/gridism
+    Copyright (c) 2013 Coby Chapple
+- site/js/html5shiv.min.js
+    HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem
+- site/js/respond.min.js
+    Respond.js v1.4.2: min/max-width media query polyfill
+    Copyright 2013 Scott Jehl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-----------------------------------------------------------------------
+ The Open Font License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following fonts under the
+SIL Open Font License (OFL) - http://scripts.sil.org/OFL/
+
+- site/fonts/fontawesome-webfont.*
+   Font-awesome font files v4.0.3 (http://fortawesome.github.io/Font-Awesome/)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/calcite-core-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-core-NOTICE.txt b/solr/licenses/calcite-core-NOTICE.txt
new file mode 100644
index 0000000..589ab43
--- /dev/null
+++ b/solr/licenses/calcite-core-NOTICE.txt
@@ -0,0 +1,12 @@
+Apache Calcite
+Copyright 2012-2017 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product is based on source code originally developed
+by DynamoBI Corporation, LucidEra Inc., SQLstream Inc. and others
+under the auspices of the Eigenbase Foundation
+and released as the LucidDB project.
+
+The web site includes files generated by Jekyll.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/calcite-linq4j-LICENSE-ASL.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-LICENSE-ASL.txt b/solr/licenses/calcite-linq4j-LICENSE-ASL.txt
new file mode 100644
index 0000000..f7b9863
--- /dev/null
+++ b/solr/licenses/calcite-linq4j-LICENSE-ASL.txt
@@ -0,0 +1,268 @@
+
+                                 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 CALCITE SUBCOMPONENTS:
+
+The Apache Calcite project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+-----------------------------------------------------------------------
+ The MIT License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following files under the MIT License:
+
+- site
+    Parts of the web site generated by Jekyll (http://jekyllrb.com/)
+    Copyright (c) 2008-2015 Tom Preston-Werner
+- site/_sass/_font-awesome.scss
+    Font-awesome css files v4.1.0 (http://fortawesome.github.io/Font-Awesome/)
+    Copyright (c) 2013  Dave Gandy
+- site/_sass/_normalize.scss
+    normalize.css v3.0.2 | git.io/normalize
+    Copyright (c) Nicolas Gallagher and Jonathan Neal
+- site/_sass/_gridism.scss
+    Gridism: A simple, responsive, and handy CSS grid by @cobyism
+    https://github.com/cobyism/gridism
+    Copyright (c) 2013 Coby Chapple
+- site/js/html5shiv.min.js
+    HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem
+- site/js/respond.min.js
+    Respond.js v1.4.2: min/max-width media query polyfill
+    Copyright 2013 Scott Jehl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+-----------------------------------------------------------------------
+ The Open Font License
+-----------------------------------------------------------------------
+
+The Apache Calcite project bundles the following fonts under the
+SIL Open Font License (OFL) - http://scripts.sil.org/OFL/
+
+- site/fonts/fontawesome-webfont.*
+   Font-awesome font files v4.0.3 (http://fortawesome.github.io/Font-Awesome/)

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/calcite-linq4j-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/calcite-linq4j-NOTICE.txt b/solr/licenses/calcite-linq4j-NOTICE.txt
new file mode 100644
index 0000000..589ab43
--- /dev/null
+++ b/solr/licenses/calcite-linq4j-NOTICE.txt
@@ -0,0 +1,12 @@
+Apache Calcite
+Copyright 2012-2017 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product is based on source code originally developed
+by DynamoBI Corporation, LucidEra Inc., SQLstream Inc. and others
+under the auspices of the Eigenbase Foundation
+and released as the LucidDB project.
+
+The web site includes files generated by Jekyll.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/commons-compiler-LICENSE-BSD.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/commons-compiler-LICENSE-BSD.txt b/solr/licenses/commons-compiler-LICENSE-BSD.txt
new file mode 100644
index 0000000..ef871e2
--- /dev/null
+++ b/solr/licenses/commons-compiler-LICENSE-BSD.txt
@@ -0,0 +1,31 @@
+Janino - An embedded Java[TM] compiler
+
+Copyright (c) 2001-2016, Arno Unkrig
+Copyright (c) 2015-2016  TIBCO Software Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials
+      provided with the distribution.
+   3. Neither the name of JANINO nor the names of its contributors
+      may be used to endorse or promote products derived from this
+      software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/commons-compiler-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/commons-compiler-NOTICE.txt b/solr/licenses/commons-compiler-NOTICE.txt
new file mode 100644
index 0000000..203e2f9
--- /dev/null
+++ b/solr/licenses/commons-compiler-NOTICE.txt
@@ -0,0 +1,5 @@
+Janino - An embedded Java[TM] compiler
+
+Copyright (c) 2001-2016, Arno Unkrig
+Copyright (c) 2015-2016  TIBCO Software Inc.
+All rights reserved.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/eigenbase-properties-LICENSE-ASL.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/eigenbase-properties-LICENSE-ASL.txt b/solr/licenses/eigenbase-properties-LICENSE-ASL.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/solr/licenses/eigenbase-properties-LICENSE-ASL.txt
@@ -0,0 +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.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/eigenbase-properties-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/eigenbase-properties-NOTICE.txt b/solr/licenses/eigenbase-properties-NOTICE.txt
new file mode 100644
index 0000000..95ee3fd
--- /dev/null
+++ b/solr/licenses/eigenbase-properties-NOTICE.txt
@@ -0,0 +1,20 @@
+eigenbase-properties
+Copyright (C) 2012-2015, Julian Hyde
+
+This product includes software from the Eigenbase project, licensed from
+DynamoBI Corporation.
+
+Copyright (C) 2005 Dynamo BI Corporation
+
+===============================================================================
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this software 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/89b39e41/solr/licenses/janino-LICENSE-BSD.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/janino-LICENSE-BSD.txt b/solr/licenses/janino-LICENSE-BSD.txt
new file mode 100644
index 0000000..ef871e2
--- /dev/null
+++ b/solr/licenses/janino-LICENSE-BSD.txt
@@ -0,0 +1,31 @@
+Janino - An embedded Java[TM] compiler
+
+Copyright (c) 2001-2016, Arno Unkrig
+Copyright (c) 2015-2016  TIBCO Software Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+   2. Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials
+      provided with the distribution.
+   3. Neither the name of JANINO nor the names of its contributors
+      may be used to endorse or promote products derived from this
+      software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/89b39e41/solr/licenses/janino-NOTICE.txt
----------------------------------------------------------------------
diff --git a/solr/licenses/janino-NOTICE.txt b/solr/licenses/janino-NOTICE.txt
new file mode 100644
index 0000000..203e2f9
--- /dev/null
+++ b/solr/licenses/janino-NOTICE.txt
@@ -0,0 +1,5 @@
+Janino - An embedded Java[TM] compiler
+
+Copyright (c) 2001-2016, Arno Unkrig
+Copyright (c) 2015-2016  TIBCO Software Inc.
+All rights reserved.


[17/50] lucene-solr:jira/solr-9858: SOLR-8593: Refactoring and adding aggregationMode=facet methods

Posted by ab...@apache.org.
SOLR-8593: Refactoring and adding aggregationMode=facet methods


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

Branch: refs/heads/jira/solr-9858
Commit: 37fdc37fc3d88054634482d39b5774893751f91f
Parents: 05a6170
Author: Joel Bernstein <jb...@apache.org>
Authored: Thu Dec 15 16:11:12 2016 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Thu Dec 15 16:12:08 2016 -0500

----------------------------------------------------------------------
 .../apache/solr/handler/sql/SolrAggregate.java  |   3 +
 .../org/apache/solr/handler/sql/SolrFilter.java |  70 ++-
 .../org/apache/solr/handler/sql/SolrMethod.java |  11 +-
 .../org/apache/solr/handler/sql/SolrRel.java    |   5 +
 .../org/apache/solr/handler/sql/SolrTable.java  | 567 ++++++++++++++-----
 .../handler/sql/SolrToEnumerableConverter.java  |   9 +-
 .../org/apache/solr/handler/TestSQLHandler.java |  21 +-
 .../solr/client/solrj/io/ops/AndOperation.java  | 101 ++++
 .../client/solrj/io/ops/BooleanOperation.java   |  24 +
 .../client/solrj/io/ops/EqualsOperation.java    |  70 +++
 .../io/ops/GreaterThanEqualToOperation.java     |  70 +++
 .../solrj/io/ops/GreaterThanOperation.java      |  70 +++
 .../solr/client/solrj/io/ops/LeafOperation.java |  59 ++
 .../solrj/io/ops/LessThanEqualToOperation.java  |  70 +++
 .../client/solrj/io/ops/LessThanOperation.java  |  70 +++
 .../solr/client/solrj/io/ops/NotOperation.java  |  87 +++
 .../solr/client/solrj/io/ops/OrOperation.java   |  71 +++
 .../client/solrj/io/stream/FacetStream.java     |   1 +
 .../client/solrj/io/stream/HavingStream.java    | 190 +++++++
 19 files changed, 1413 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index f913585..2512099 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -21,6 +21,7 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.Aggregate;
 import org.apache.calcite.rel.core.AggregateCall;
+import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.sql.SqlAggFunction;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.util.ImmutableBitSet;
@@ -66,7 +67,9 @@ class SolrAggregate extends Aggregate implements SolrRel {
 
     final List<String> inNames = SolrRules.solrFieldNames(getInput().getRowType());
 
+
     for(Pair<AggregateCall, String> namedAggCall : getNamedAggCalls()) {
+
       AggregateCall aggCall = namedAggCall.getKey();
       Pair<String, String> metric = toSolrMetric(implementor, aggCall, inNames);
       implementor.addMetricPair(namedAggCall.getValue(), metric.getKey(), metric.getValue());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
index c6eb33c..5f30926 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -24,6 +24,7 @@ import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
 import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.util.Pair;
 
 import java.util.ArrayList;
@@ -56,38 +57,68 @@ class SolrFilter extends Filter implements SolrRel {
     Translator translator = new Translator(SolrRules.solrFieldNames(getRowType()));
     String query = translator.translateMatch(condition);
     implementor.addQuery(query);
+    implementor.setNegativeQuery(translator.negativeQuery);
   }
 
   /** Translates {@link RexNode} expressions into Solr query strings. */
   private static class Translator {
+
     private final List<String> fieldNames;
+    public boolean negativeQuery = true;
 
     Translator(List<String> fieldNames) {
       this.fieldNames = fieldNames;
     }
 
     private String translateMatch(RexNode condition) {
-      return translateOr(condition);
+      if(condition.getKind().belongsTo(SqlKind.COMPARISON)) {
+        return translateComparison(condition);
+      } else if(condition.isA(SqlKind.AND)) {
+        return "("+translateAnd(condition)+")";
+      } else if(condition.isA(SqlKind.OR)) {
+        return "(" + translateOr(condition) + ")";
+      } else {
+        return null;
+      }
     }
 
     private String translateOr(RexNode condition) {
       List<String> ors = new ArrayList<>();
       for (RexNode node : RelOptUtil.disjunctions(condition)) {
-        ors.add(translateAnd(node));
+        ors.add(translateMatch(node));
       }
       return String.join(" OR ", ors);
     }
 
+
+
     private String translateAnd(RexNode node0) {
-      List<String> ands = new ArrayList<>();
-      for (RexNode node : RelOptUtil.conjunctions(node0)) {
-        ands.add(translateMatch2(node));
+      List<String> andStrings = new ArrayList();
+      List<String> notStrings = new ArrayList();
+
+      List<RexNode> ands = new ArrayList();
+      List<RexNode> nots = new ArrayList();
+      RelOptUtil.decomposeConjunction(node0, ands, nots);
+
+
+      for(RexNode node: ands) {
+        andStrings.add(translateMatch(node));
       }
 
-      return String.join(" AND ", ands);
+      String andString = String.join(" AND ", andStrings);
+
+      if(nots.size() > 0) {
+        for(RexNode node: nots) {
+          notStrings.add(translateMatch(node));
+        }
+        String notString = String.join(" NOT ", notStrings);
+        return "("+ andString +") NOT ("+notString+")";
+      } else {
+        return andString;
+      }
     }
 
-    private String translateMatch2(RexNode node) {
+    private String translateComparison(RexNode node) {
       Pair<String, RexLiteral> binaryTranslated = null;
       if (((RexCall) node).getOperands().size() == 2) {
         binaryTranslated = translateBinary((RexCall) node);
@@ -95,19 +126,30 @@ class SolrFilter extends Filter implements SolrRel {
 
       switch (node.getKind()) {
         case NOT:
-          return "-"+translateMatch2(((RexCall) node).getOperands().get(0));
+          return "-"+translateComparison(((RexCall) node).getOperands().get(0));
         case EQUALS:
-          return binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2();
+          String terms = binaryTranslated.getValue().getValue2().toString().trim();
+          if(!terms.startsWith("(")){
+            terms = "\""+terms+"\"";
+          }
+
+          String clause = binaryTranslated.getKey() + ":" + terms;
+          this.negativeQuery = false;
+          return clause;
         case NOT_EQUALS:
-          return "-" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2();
+          return "-(" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2()+")";
         case LESS_THAN:
-          return binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " }";
+          this.negativeQuery = false;
+          return "("+binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " })";
         case LESS_THAN_OR_EQUAL:
-          return binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " ]";
+          this.negativeQuery = false;
+          return "("+binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " ])";
         case GREATER_THAN:
-          return binaryTranslated.getKey() + ": { " + binaryTranslated.getValue().getValue2() + " TO * ]";
+          this.negativeQuery = false;
+          return "("+binaryTranslated.getKey() + ": { " + binaryTranslated.getValue().getValue2() + " TO * ])";
         case GREATER_THAN_OR_EQUAL:
-          return binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue().getValue2() + " TO * ]";
+          this.negativeQuery = false;
+          return "("+binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue().getValue2() + " TO * ])";
         default:
           throw new AssertionError("cannot translate " + node);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
index 31c4548..4ec3fdb 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
@@ -25,8 +25,15 @@ import java.util.List;
  * Builtin methods in the Solr adapter.
  */
 enum SolrMethod {
-  SOLR_QUERYABLE_QUERY(SolrTable.SolrQueryable.class, "query", List.class, String.class, List.class, List.class,
-      List.class, String.class);
+  SOLR_QUERYABLE_QUERY(SolrTable.SolrQueryable.class,
+                       "query",
+                       List.class,
+                       String.class,
+                       List.class,
+                       List.class,
+                       List.class,
+                       String.class,
+                       String.class);
 
   public final Method method;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
index ea22951..b7843d7 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -36,6 +36,7 @@ interface SolrRel extends RelNode {
   class Implementor {
     final Map<String, String> fieldMappings = new HashMap<>();
     String query = null;
+    boolean negativeQuery;
     String limitValue = null;
     final List<Pair<String, String>> orders = new ArrayList<>();
     final List<String> buckets = new ArrayList<>();
@@ -54,6 +55,10 @@ interface SolrRel extends RelNode {
       this.query = query;
     }
 
+    void setNegativeQuery(boolean negativeQuery) {
+      this.negativeQuery = negativeQuery;
+    }
+
     void addOrder(String column, String direction) {
       column = this.fieldMappings.getOrDefault(column, column);
       this.orders.add(new Pair<>(column, direction));

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index e5fd88f..14e69e6 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -72,7 +72,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
   
   private Enumerable<Object> query(final Properties properties) {
     return query(properties, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(),
-        Collections.emptyList(), null);
+        Collections.emptyList(), null, null);
   }
 
   /** Executes a Solr query on the underlying table.
@@ -82,150 +82,58 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
    * @param query A string for the query
    * @return Enumerator of results
    */
-  private Enumerable<Object> query(final Properties properties, final List<Map.Entry<String, Class>> fields,
-                                   final String query, final List<Pair<String, String>> orders, final List<String> buckets,
-                                   final List<Pair<String, String>> metricPairs, final String limit) {
+  private Enumerable<Object> query(final Properties properties,
+                                   final List<Map.Entry<String, Class>> fields,
+                                   final String query,
+                                   final List<Pair<String, String>> orders,
+                                   final List<String> buckets,
+                                   final List<Pair<String, String>> metricPairs,
+                                   final String limit,
+                                   final String negativeQuery) {
     // SolrParams should be a ModifiableParams instead of a map
-    ModifiableSolrParams solrParams = new ModifiableSolrParams();
-    solrParams.add(CommonParams.OMIT_HEADER, "true");
+    boolean mapReduce = "map_reduce".equals(properties.getProperty("aggregationMode"));
+    boolean negative = Boolean.parseBoolean(negativeQuery);
+
+    String q = null;
 
     if (query == null) {
-      solrParams.add(CommonParams.Q, DEFAULT_QUERY);
+      q = DEFAULT_QUERY;
     } else {
-      solrParams.add(CommonParams.Q, DEFAULT_QUERY + " AND " + query);
-    }
-
-    // List<String> doesn't have add so must make a new ArrayList
-    List<String> fieldsList = new ArrayList<>(fields.size());
-    fieldsList.addAll(fields.stream().map(Map.Entry::getKey).collect(Collectors.toList()));
-    LinkedHashMap<String,String> ordersMap = new LinkedHashMap<>();
-    for (Pair<String,String> order : orders) {
-      ordersMap.put(order.getKey(), order.getValue());
-    }
-    List<Metric> metrics = buildMetrics(metricPairs);
-    List<Bucket> bucketsList = buckets.stream().map(Bucket::new).collect(Collectors.toList());
-
-    for(int i = buckets.size()-1; i >= 0; i--) {
-      if (!ordersMap.containsKey(buckets.get(i))) {
-        ordersMap.put(buckets.get(i), "asc");
-      }
-    }
-
-    boolean isReOrder = false;
-
-    for(Metric metric : metrics) {
-      String metricIdentifier = metric.getIdentifier();
-
-      ordersMap.remove(metricIdentifier);
-
-      if(fieldsList.contains(metricIdentifier)) {
-        fieldsList.remove(metricIdentifier);
-        isReOrder = true;
-      }
-
-      for(String column : metric.getColumns()) {
-        if (!fieldsList.contains(column)) {
-          fieldsList.add(column);
-        }
-
-        if (!ordersMap.containsKey(column)) {
-          ordersMap.put(column, "asc");
-        }
-      }
-    }
-
-    if (ordersMap.size() < 4) {
-      ordersMap.put(DEFAULT_VERSION_FIELD, "desc");
-
-      // Make sure the default sort field is in the field list
-      if (!fieldsList.contains(DEFAULT_VERSION_FIELD)) {
-        fieldsList.add(DEFAULT_VERSION_FIELD);
-      }
-    }
-
-    if(!ordersMap.isEmpty()) {
-      List<String> orderList = new ArrayList<>(ordersMap.size());
-      for(Map.Entry<String, String> order : ordersMap.entrySet()) {
-        String column = order.getKey();
-        if(!fieldsList.contains(column)) {
-          fieldsList.add(column);
-        }
-        orderList.add(column + " " + order.getValue());
+      if(negative) {
+        q = DEFAULT_QUERY + " AND " + query;
+      } else {
+        q = query;
       }
-      solrParams.add(CommonParams.SORT, String.join(",", orderList));
-    }
-
-    if (fieldsList.isEmpty()) {
-      solrParams.add(CommonParams.FL, "*");
-    } else {
-      solrParams.add(CommonParams.FL, String.join(",", fieldsList));
     }
 
     TupleStream tupleStream;
     String zk = properties.getProperty("zk");
     try {
-      if (metrics.isEmpty() && bucketsList.isEmpty()) {
-        solrParams.add(CommonParams.QT, "/export");
-        if (limit != null) {
-          solrParams.add(CommonParams.ROWS, limit);
-          tupleStream = new LimitStream(new CloudSolrStream(zk, collection, solrParams), Integer.parseInt(limit));
-        } else {
-          tupleStream = new CloudSolrStream(zk, collection, solrParams);
-        }
+      if (metricPairs.isEmpty() && buckets.isEmpty()) {
+        tupleStream = handleSelect(zk, collection, q, fields, orders, limit);
       } else {
-        Metric[] metricsArray = metrics.toArray(new Metric[metrics.size()]);
-        if(bucketsList.isEmpty()) {
-          solrParams.remove(CommonParams.FL);
-          solrParams.remove(CommonParams.SORT);
-          tupleStream = new StatsStream(zk, collection, solrParams, metricsArray);
+        if(buckets.isEmpty()) {
+          tupleStream = handleStats(zk, collection, q, metricPairs);
         } else {
-          solrParams.add(CommonParams.QT, "/export");
-
-          int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
-          if (numWorkers > 1) solrParams.add("partitionKeys",String.join(",", buckets));
-
-          tupleStream = new CloudSolrStream(zk, collection, solrParams);
-          tupleStream = new RollupStream(tupleStream, bucketsList.toArray(new Bucket[bucketsList.size()]), metricsArray);
-
-          if(numWorkers > 1) {
-            String workerZkHost = properties.getProperty("workerZkhost");
-            String workerCollection = properties.getProperty("workerCollection");
-            // Do the rollups in parallel
-            // Maintain the sort of the Tuples coming from the workers.
-            StreamComparator comp = bucketSortComp(bucketsList, ordersMap);
-
-            ParallelStream parallelStream = new ParallelStream(workerZkHost, workerCollection, tupleStream, numWorkers, comp);
-
-            StreamFactory factory = new StreamFactory()
-                .withFunctionName("search", CloudSolrStream.class)
-                .withFunctionName("parallel", ParallelStream.class)
-                .withFunctionName("rollup", RollupStream.class)
-                .withFunctionName("sum", SumMetric.class)
-                .withFunctionName("min", MinMetric.class)
-                .withFunctionName("max", MaxMetric.class)
-                .withFunctionName("avg", MeanMetric.class)
-                .withFunctionName("count", CountMetric.class);
-
-            parallelStream.setStreamFactory(factory);
-            tupleStream = parallelStream;
-            isReOrder = true;
-          }
-
-          if (isReOrder) {
-            int limitVal = limit == null ? 100 : Integer.parseInt(limit);
-            StreamComparator comp = getComp(orders);
-            if (orders.isEmpty() && !ordersMap.isEmpty()) {
-              // default order
-              comp = getComp(new ArrayList<>(ordersMap.entrySet()));
-            }
-            tupleStream = new RankStream(tupleStream, limitVal, comp);
+          if(mapReduce) {
+            tupleStream = handleGroupByMapReduce(zk,
+                                                 collection,
+                                                 properties,
+                                                 fields,
+                                                 q,
+                                                 orders,
+                                                 buckets,
+                                                 metricPairs,
+                                                 limit);
           } else {
-            // Sort is the same as the same as the underlying stream
-            // Only need to limit the result, not Rank the result
-            if (limit != null) {
-              solrParams.add(CommonParams.ROWS, limit);
-              tupleStream = new LimitStream(new CloudSolrStream(zk, collection, solrParams), Integer.parseInt(limit));
-            }
+            tupleStream = handleGroupByFacet(zk,
+                                             collection,
+                                             fields,
+                                             q,
+                                             orders,
+                                             buckets,
+                                             metricPairs,
+                                             limit);
           }
         }
       }
@@ -258,6 +166,21 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     }
   }
 
+  private static StreamComparator bucketSortComp(Bucket[] buckets, String dir) {
+    FieldComparator[] comps = new FieldComparator[buckets.length];
+    for(int i=0; i<buckets.length; i++) {
+      ComparatorOrder comparatorOrder = ascDescComp(dir);
+      String sortKey = buckets[i].toString();
+      comps[i] = new FieldComparator(sortKey, comparatorOrder);
+    }
+
+    if(comps.length == 1) {
+      return comps[0];
+    } else {
+      return new MultipleFieldComparator(comps);
+    }
+  }
+
   private String getSortDirection(Map.Entry<String, String> order) {
     String direction = order.getValue();
     return direction == null ? "asc" : direction;
@@ -283,6 +206,9 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
   private List<Metric> buildMetrics(List<Pair<String, String>> metricPairs) {
     List<Metric> metrics = new ArrayList<>(metricPairs.size());
     metrics.addAll(metricPairs.stream().map(this::getMetric).collect(Collectors.toList()));
+    if(metrics.size() == 0) {
+      metrics.add(new CountMetric());
+    }
     return metrics;
   }
 
@@ -304,6 +230,358 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     }
   }
 
+  private TupleStream handleSelect(String zk,
+                                   String collection,
+                                   String query,
+                                   List<Map.Entry<String, Class>> fields,
+                                   List<Pair<String, String>> orders,
+                                   String limit) throws IOException {
+
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add(CommonParams.Q, query);
+
+    if(orders.size() > 0) {
+      params.add(CommonParams.SORT, getSort(orders));
+    } else {
+      params.add(CommonParams.SORT, "_version_ desc");
+    }
+
+    if(fields.size() > 0) {
+      params.add(CommonParams.FL, getFields(fields));
+    }
+
+    if (limit != null) {
+      params.add(CommonParams.ROWS, limit);
+      return new LimitStream(new CloudSolrStream(zk, collection, params), Integer.parseInt(limit));
+    } else {
+      params.add(CommonParams.QT, "/export");
+      return new CloudSolrStream(zk, collection, params);
+    }
+  }
+
+  private String getSort(List<Pair<String, String>> orders) {
+    StringBuilder buf = new StringBuilder();
+    for(Pair<String, String> pair : orders) {
+      if(buf.length() > 0) {
+        buf.append(",");
+      }
+      buf.append(pair.getKey()).append(" ").append(pair.getValue());
+    }
+
+    return buf.toString();
+  }
+
+  private String getFields(List<Map.Entry<String, Class>> fields) {
+    StringBuilder buf = new StringBuilder();
+    boolean appendVersion = true;
+    for(Map.Entry<String, Class> field : fields) {
+
+      if(buf.length() > 0) {
+        buf.append(",");
+      }
+
+      if(field.getKey().equals("_version_")) {
+        appendVersion = false;
+      }
+
+      buf.append(field.getKey());
+    }
+
+    if(appendVersion){
+      buf.append(",_version_");
+    }
+
+    return buf.toString();
+  }
+
+  private String getFields(Set<String> fieldSet) {
+    StringBuilder buf = new StringBuilder();
+    boolean appendVersion = true;
+    for(String field : fieldSet) {
+
+      if(buf.length() > 0) {
+        buf.append(",");
+      }
+
+      if(field.equals("_version_")) {
+        appendVersion = false;
+      }
+
+      buf.append(field);
+    }
+
+    if(appendVersion){
+      buf.append(",_version_");
+    }
+
+    return buf.toString();
+  }
+
+
+  private Set<String> getFieldSet(Metric[] metrics, List<Map.Entry<String, Class>> fields) {
+    HashSet set = new HashSet();
+    for(Metric metric : metrics) {
+      for(String column : metric.getColumns()) {
+        set.add(column);
+      }
+    }
+
+    for(Map.Entry<String, Class> field : fields) {
+      if(field.getKey().indexOf('(') == -1) {
+        set.add(field.getKey());
+      }
+    }
+
+    return set;
+  }
+
+  private static String getSortDirection(List<Pair<String, String>> orders) {
+    if(orders != null && orders.size() > 0) {
+      for(Pair<String,String> item : orders) {
+        return item.getValue();
+      }
+    }
+
+    return "asc";
+  }
+
+  private static String bucketSort(Bucket[] buckets, String dir) {
+    StringBuilder buf = new StringBuilder();
+    boolean comma = false;
+    for(Bucket bucket : buckets) {
+      if(comma) {
+        buf.append(",");
+      }
+      buf.append(bucket.toString()).append(" ").append(dir);
+      comma = true;
+    }
+
+    return buf.toString();
+  }
+
+  private static String getPartitionKeys(Bucket[] buckets) {
+    StringBuilder buf = new StringBuilder();
+    boolean comma = false;
+    for(Bucket bucket : buckets) {
+      if(comma) {
+        buf.append(",");
+      }
+      buf.append(bucket.toString());
+      comma = true;
+    }
+    return buf.toString();
+  }
+
+  private static boolean sortsEqual(Bucket[] buckets, String direction, List<Pair<String, String>> orders) {
+
+    if(buckets.length != orders.size()) {
+      return false;
+    }
+
+    for(int i=0; i< buckets.length; i++) {
+      Bucket bucket = buckets[i];
+      Pair<String, String> order = orders.get(i);
+      if(!bucket.toString().equals(order.getKey())) {
+        return false;
+      }
+
+      if(!order.getValue().toLowerCase(Locale.ROOT).contains(direction.toLowerCase(Locale.ROOT))) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private TupleStream handleGroupByMapReduce(String zk,
+                                             String collection,
+                                             Properties properties,
+                                             final List<Map.Entry<String, Class>> fields,
+                                             final String query,
+                                             final List<Pair<String, String>> orders,
+                                             final List<String> _buckets,
+                                             final List<Pair<String, String>> metricPairs,
+                                             final String limit) throws IOException {
+
+    int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
+
+    Bucket[] buckets = buildBuckets(_buckets, fields);
+    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+
+    Set<String> fieldSet = getFieldSet(metrics, fields);
+
+    if(metrics.length == 0) {
+      throw new IOException("Group by queries must include atleast one aggregate function.");
+    }
+
+    String fl = getFields(fieldSet);
+    String sortDirection = getSortDirection(orders);
+    String sort = bucketSort(buckets, sortDirection);
+
+    ModifiableSolrParams params = new ModifiableSolrParams();
+
+    params.set(CommonParams.FL, fl);
+    params.set(CommonParams.Q, query);
+    //Always use the /export handler for Group By Queries because it requires exporting full result sets.
+    params.set(CommonParams.QT, "/export");
+
+    if(numWorkers > 1) {
+      params.set("partitionKeys", getPartitionKeys(buckets));
+    }
+
+    params.set("sort", sort);
+
+    TupleStream tupleStream = null;
+
+    CloudSolrStream cstream = new CloudSolrStream(zk, collection, params);
+    tupleStream = new RollupStream(cstream, buckets, metrics);
+
+    if(numWorkers > 1) {
+      // Do the rollups in parallel
+      // Maintain the sort of the Tuples coming from the workers.
+      StreamComparator comp = bucketSortComp(buckets, sortDirection);
+      ParallelStream parallelStream = new ParallelStream(zk, collection, tupleStream, numWorkers, comp);
+
+      StreamFactory factory = new StreamFactory()
+          .withFunctionName("search", CloudSolrStream.class)
+          .withFunctionName("parallel", ParallelStream.class)
+          .withFunctionName("rollup", RollupStream.class)
+          .withFunctionName("sum", SumMetric.class)
+          .withFunctionName("min", MinMetric.class)
+          .withFunctionName("max", MaxMetric.class)
+          .withFunctionName("avg", MeanMetric.class)
+          .withFunctionName("count", CountMetric.class);
+
+      parallelStream.setStreamFactory(factory);
+      tupleStream = parallelStream;
+    }
+
+    //TODO: This should be done on the workers, but it won't serialize because it relies on Presto classes.
+    // Once we make this a Expressionable the problem will be solved.
+
+
+    if(orders != null && orders.size() > 0) {
+      int lim = limit == null ? 100 : Integer.parseInt(limit);
+      if(!sortsEqual(buckets, sortDirection, orders)) {
+        StreamComparator comp = getComp(orders);
+        //Rank the Tuples
+        //If parallel stream is used ALL the Rolled up tuples from the workers will be ranked
+        //Providing a true Top or Bottom.
+        tupleStream = new RankStream(tupleStream, lim, comp);
+      } else {
+        // Sort is the same as the same as the underlying stream
+        // Only need to limit the result, not Rank the result
+        if(lim > -1) {
+          tupleStream = new LimitStream(tupleStream, lim);
+        }
+      }
+    }
+
+    return tupleStream;
+  }
+
+  private Bucket[] buildBuckets(List<String> buckets, List<Map.Entry<String, Class>> fields) {
+    Bucket[] bucketsArray = new Bucket[buckets.size()];
+
+    int i=0;
+    for(Map.Entry<String,Class> field : fields) {
+      String fieldName = field.getKey();
+      if(buckets.contains(fieldName)) {
+        bucketsArray[i++] = new Bucket(fieldName);
+      }
+    }
+
+    return bucketsArray;
+  }
+
+
+  private TupleStream handleGroupByFacet(String zkHost,
+                                         String collection,
+                                         final List<Map.Entry<String, Class>> fields,
+                                         final String query,
+                                         final List<Pair<String, String>> orders,
+                                         final List<String> bucketFields,
+                                         final List<Pair<String, String>> metricPairs,
+                                         final String lim) throws IOException {
+
+    ModifiableSolrParams solrParams = new ModifiableSolrParams();
+    solrParams.add(CommonParams.Q, query);
+
+    Bucket[] buckets = buildBuckets(bucketFields, fields);
+    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+    if(metrics.length == 0) {
+      metrics = new Metric[1];
+      metrics[0] = new CountMetric();
+    }
+
+    int limit = lim != null ? Integer.parseInt(lim) : 100;
+
+    FieldComparator[] sorts = null;
+
+    if(orders == null || orders.size() == 0) {
+      sorts = new FieldComparator[buckets.length];
+      for(int i=0; i<sorts.length; i++) {
+        sorts[i] = new FieldComparator("index", ComparatorOrder.ASCENDING);
+      }
+    } else {
+      sorts = getComps(orders);
+    }
+
+    TupleStream tupleStream = new FacetStream(zkHost,
+                                              collection,
+                                              solrParams,
+                                              buckets,
+                                              metrics,
+                                              sorts,
+                                              limit);
+
+
+    if(lim != null)
+    {
+      tupleStream = new LimitStream(tupleStream, limit);
+    }
+
+    return tupleStream;
+  }
+
+  private TupleStream handleSelectDistinctMapReduce(final Properties properties,
+                                                    final List<Map.Entry<String, Class>> fields,
+                                                    final String query,
+                                                    final List<Pair<String, String>> orders,
+                                                    final List<String> buckets,
+                                                    final List<Pair<String, String>> metricPairs,
+                                                    final String limit) {
+
+
+
+
+
+
+    return null;
+  }
+
+  private TupleStream handleSelectDistinctFacet(final Properties properties,
+                                                final List<Map.Entry<String, Class>> fields,
+                                                final String query,
+                                                final List<Pair<String, String>> orders,
+                                                final List<String> buckets,
+                                                final List<Pair<String, String>> metricPairs,
+                                                final String limit) {
+    return null;
+  }
+
+  private TupleStream handleStats(String zk,
+                                  String collection,
+                                  String query,
+                                  List<Pair<String, String>> metricPairs) {
+
+
+    ModifiableSolrParams solrParams = new ModifiableSolrParams();
+    solrParams.add(CommonParams.Q, query);
+    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+    return new StatsStream(zk, collection, solrParams, metrics);
+  }
+
   public <T> Queryable<T> asQueryable(QueryProvider queryProvider, SchemaPlus schema, String tableName) {
     return new SolrQueryable<>(queryProvider, schema, this, tableName);
   }
@@ -339,8 +617,29 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
      */
     @SuppressWarnings("UnusedDeclaration")
     public Enumerable<Object> query(List<Map.Entry<String, Class>> fields, String query, List<Pair<String, String>> order,
-                                    List<String> buckets, List<Pair<String, String>> metricPairs, String limit) {
-      return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit);
+                                    List<String> buckets, List<Pair<String, String>> metricPairs, String limit, String negativeQuery) {
+      return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit, negativeQuery);
+    }
+  }
+
+  private static FieldComparator[] getComps(List<Pair<String, String>> orders) {
+    FieldComparator[] comps = new FieldComparator[orders.size()];
+    for(int i=0; i<orders.size(); i++) {
+      Pair<String,String> sortItem = orders.get(i);
+      String ordering = sortItem.getValue();
+      ComparatorOrder comparatorOrder = ascDescComp(ordering);
+      String sortKey = sortItem.getKey();
+      comps[i] = new FieldComparator(sortKey, comparatorOrder);
+    }
+
+    return comps;
+  }
+
+  private static ComparatorOrder ascDescComp(String s) {
+    if(s.toLowerCase(Locale.ROOT).contains("desc")) {
+      return ComparatorOrder.DESCENDING;
+    } else {
+      return ComparatorOrder.ASCENDING;
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
index 6737977..f69f3d5 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
@@ -67,11 +67,13 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
             constantArrayList(
                 Pair.zip(generateFields(SolrRules.solrFieldNames(rowType), solrImplementor.fieldMappings),
                     new AbstractList<Class>() {
-                      @Override public Class get(int index) {
+                      @Override
+                      public Class get(int index) {
                         return physType.fieldClass(index);
                       }
 
-                      @Override public int size() {
+                      @Override
+                      public int size() {
                         return rowType.getFieldCount();
                       }
                     }),
@@ -81,8 +83,9 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
     final Expression buckets = list.append("buckets", constantArrayList(solrImplementor.buckets, String.class));
     final Expression metricPairs = list.append("metricPairs", constantArrayList(solrImplementor.metricPairs, Pair.class));
     final Expression limit = list.append("limit", Expressions.constant(solrImplementor.limitValue));
+    final Expression negativeQuery = list.append("negativeQuery", Expressions.constant(Boolean.toString(solrImplementor.negativeQuery), String.class));
     Expression enumerable = list.append("enumerable", Expressions.call(table, SolrMethod.SOLR_QUERYABLE_QUERY.method,
-        fields, query, orders, buckets, metricPairs, limit));
+        fields, query, orders, buckets, metricPairs, limit, negativeQuery));
     Hook.QUERY_PLAN.run(query);
     list.add(Expressions.return_(null, enumerable));
     return implementor.result(physType, list.toBlock());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
index 5b92c30..605abf5 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
@@ -104,9 +104,12 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexDoc(sdoc("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50"));
       indexDoc(sdoc("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60"));
       commit();
-      
+
+
+      System.out.println("############# testBasicSelect() ############");
+
       SolrParams sParams = mapParams(CommonParams.QT, "/sql", 
-          "stmt", "select id, field_i, str_s from collection1 where text='XXXX' order by field_i desc");
+          "stmt", "select id, field_i, str_s from collection1 where (text='(XXXX)' OR text='XXXX') AND text='XXXX' order by field_i desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
@@ -696,7 +699,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       sParams = mapParams(CommonParams.QT, "/sql",
         "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
-          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXY')) "
+          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT ((text='XXXY') AND (text='XXXY' OR text='XXXY'))) "
           + "group by str_s order by str_s desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -856,9 +859,12 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
           "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
 
+      System.out.println("######## selectDistinctFacets #######");
+
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
 
+      //assert(false);
       assert(tuples.size() == 6);
 
       Tuple tuple;
@@ -991,22 +997,29 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("field_i") == 1);
 
       tuple = tuples.get(1);
+
+
       assert(tuple.get("str_s").equals("a"));
       assert(tuple.getLong("field_i") == 20);
 
       tuple = tuples.get(2);
+
+
       assert(tuple.get("str_s").equals("b"));
       assert(tuple.getLong("field_i") == 2);
 
       tuple = tuples.get(3);
+
       assert(tuple.get("str_s").equals("c"));
       assert(tuple.getLong("field_i") == 30);
 
       tuple = tuples.get(4);
+
       assert(tuple.get("str_s").equals("c"));
       assert(tuple.getLong("field_i") == 50);
 
       tuple = tuples.get(5);
+
       assert(tuple.get("str_s").equals("c"));
       assert(tuple.getLong("field_i") == 60);
 
@@ -1053,6 +1066,8 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       SolrParams sParams = mapParams(CommonParams.QT, "/sql",
           "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
 
+      System.out.println("##################### testSelectDistinct()");
+
       TupleStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
new file mode 100644
index 0000000..f095f63
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
@@ -0,0 +1,101 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+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 AndOperation implements BooleanOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  protected BooleanOperation leftOperand;
+  protected BooleanOperation rightOperand;
+
+  public void operate(Tuple tuple) {
+    leftOperand.operate(tuple);
+    rightOperand.operate(tuple);
+  }
+
+  public AndOperation(BooleanOperation leftOperand, BooleanOperation rightOperand) {
+    this.leftOperand = leftOperand;
+    this.rightOperand = rightOperand;
+  }
+
+  public AndOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+      List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
+      if(operationExpressions != null && operationExpressions.size() == 2) {
+        StreamExpression left = operationExpressions.get(0);
+        StreamOperation leftOp = factory.constructOperation(left);
+        if(leftOp instanceof BooleanOperation) {
+          leftOperand = (BooleanOperation) leftOp;
+        } else {
+          throw new IOException("The And/Or Operation requires a BooleanOperation.");
+        }
+
+        StreamExpression right = operationExpressions.get(1);
+        StreamOperation rightOp = factory.constructOperation(right);
+        if(rightOp instanceof BooleanOperation) {
+          rightOperand = (BooleanOperation) rightOp;
+        } else {
+          throw new IOException("The And/Or Operation requires a BooleanOperation.");
+        }
+      } else {
+        throw new IOException("The And/Or Operation requires a BooleanOperations.");
+      }
+  }
+
+  public boolean evaluate() {
+    return leftOperand.evaluate() && rightOperand.evaluate();
+  }
+
+  @Override
+  public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    if(leftOperand instanceof Expressible) {
+      expression.addParameter(leftOperand.toExpression(factory));
+    } else {
+      throw new IOException("This left operand of the AndOperation contains a non-expressible operation - it cannot be converted to an expression");
+    }
+
+    if(rightOperand instanceof Expressible) {
+      expression.addParameter(rightOperand.toExpression(factory));
+    } else {
+      throw new IOException("This the right operand of the AndOperation contains a non-expressible operation - it cannot be converted to an expression");
+    }
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/BooleanOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/BooleanOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/BooleanOperation.java
new file mode 100644
index 0000000..609e4e1
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/BooleanOperation.java
@@ -0,0 +1,24 @@
+/*
+ * 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.ops;
+
+import org.apache.solr.client.solrj.io.Tuple;
+
+
+public interface BooleanOperation extends StreamOperation {
+  public abstract boolean evaluate();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
new file mode 100644
index 0000000..b7ea17d
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class EqualsOperation extends LeafOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public EqualsOperation(String field, double val) {
+    super(field, val);
+  }
+
+  public EqualsOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    Double d = tuple.getDouble(field);
+
+    if(d == null) {
+      return false;
+    }
+
+    return d == val;
+  }
+
+  public StreamExpression toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    expression.addParameter(field);
+    expression.addParameter(Double.toString(val));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
new file mode 100644
index 0000000..34bd521
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class GreaterThanEqualToOperation extends LeafOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public GreaterThanEqualToOperation(String field, double val) {
+    super(field, val);
+  }
+
+  public GreaterThanEqualToOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    Double d = tuple.getDouble(field);
+
+    if(d == null) {
+      return false;
+    }
+
+    return d >= val;
+  }
+
+  public StreamExpression toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    expression.addParameter(field);
+    expression.addParameter(Double.toString(val));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
new file mode 100644
index 0000000..a58ad01
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class GreaterThanOperation extends LeafOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public GreaterThanOperation(String field, double val) {
+    super(field, val);
+  }
+
+  public GreaterThanOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    Double d = tuple.getDouble(field);
+
+    if(d == null) {
+      return false;
+    }
+
+    return d > val;
+  }
+
+  public StreamExpression toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    expression.addParameter(field);
+    expression.addParameter(Double.toString(val));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
new file mode 100644
index 0000000..bcd979a
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
@@ -0,0 +1,59 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public abstract class LeafOperation implements BooleanOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  protected String field;
+  protected Double val;
+  protected Tuple tuple;
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public LeafOperation(String field, double val) {
+    this.field = field;
+    this.val = val;
+  }
+
+  public LeafOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    this.field = factory.getValueOperand(expression, 0);
+    this.val = Double.parseDouble(factory.getValueOperand(expression, 0));
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
new file mode 100644
index 0000000..6278f14
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class LessThanEqualToOperation extends LeafOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public LessThanEqualToOperation(String field, double val) {
+    super(field, val);
+  }
+
+  public LessThanEqualToOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    Double d = tuple.getDouble(field);
+
+    if(d == null) {
+      return true;
+    }
+
+    return d <= val;
+  }
+
+  public StreamExpression toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    expression.addParameter(field);
+    expression.addParameter(Double.toString(val));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
new file mode 100644
index 0000000..e37bee3
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+public class LessThanOperation extends LeafOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public void operate(Tuple tuple) {
+    this.tuple = tuple;
+  }
+
+  public LessThanOperation(String field, double val) {
+    super(field, val);
+  }
+
+  public LessThanOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    Double d = tuple.getDouble(field);
+
+    if(d == null) {
+      return true;
+    }
+    
+    return d < val;
+  }
+
+  public StreamExpression toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    expression.addParameter(field);
+    expression.addParameter(Double.toString(val));
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
new file mode 100644
index 0000000..c16e4b3
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
@@ -0,0 +1,87 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.UUID;
+
+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 NotOperation implements BooleanOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  protected BooleanOperation operand;
+
+  public void operate(Tuple tuple) {
+    operand.operate(tuple);
+  }
+
+  public NotOperation(BooleanOperation operand) {
+    this.operand = operand;
+  }
+
+  public NotOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
+    if(operationExpressions != null && operationExpressions.size() == 1) {
+      StreamExpression op = operationExpressions.get(0);
+      StreamOperation streamOp = factory.constructOperation(op);
+      if(op instanceof BooleanOperation) {
+        operand = (BooleanOperation) streamOp;
+      } else {
+        throw new IOException("The NotOperation requires a BooleanOperation.");
+      }
+
+    } else {
+      throw new IOException("The NotOperation requires a BooleanOperations.");
+    }
+  }
+
+  public boolean evaluate() {
+    return !operand.evaluate();
+  }
+
+  @Override
+  public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    if(operand instanceof Expressible) {
+      expression.addParameter(operand.toExpression(factory));
+    } else {
+      throw new IOException("The operand of the NotOperation contains a non-expressible operation - it cannot be converted to an expression");
+    }
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
new file mode 100644
index 0000000..faac5cd
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
@@ -0,0 +1,71 @@
+/*
+ * 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.ops;
+
+import java.io.IOException;
+import java.util.UUID;
+
+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 OrOperation extends AndOperation {
+
+  private static final long serialVersionUID = 1;
+  private UUID operationNodeId = UUID.randomUUID();
+
+  public OrOperation(BooleanOperation leftOperand, BooleanOperation rightOperand) {
+    super(leftOperand, rightOperand);
+  }
+
+  public OrOperation(StreamExpression expression, StreamFactory factory) throws IOException {
+    super(expression, factory);
+  }
+
+  public boolean evaluate() {
+    return leftOperand.evaluate() || rightOperand.evaluate();
+  }
+
+  @Override
+  public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+    if(leftOperand instanceof Expressible) {
+      expression.addParameter(leftOperand.toExpression(factory));
+    } else {
+      throw new IOException("This left operand of the OrOperation contains a non-expressible operation - it cannot be converted to an expression");
+    }
+
+    if(rightOperand instanceof Expressible) {
+      expression.addParameter(rightOperand.toExpression(factory));
+    } else {
+      throw new IOException("This the right operand of the OrOperation contains a non-expressible operation - it cannot be converted to an expression");
+    }
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+    return new Explanation(operationNodeId.toString())
+        .withExpressionType(ExpressionType.OPERATION)
+        .withFunctionName(factory.getFunctionName(getClass()))
+        .withImplementingClass(getClass().getName())
+        .withExpression(toExpression(factory).toString());
+  }
+}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
index 4e239e6..94d937d 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
@@ -234,6 +234,7 @@ public class FacetStream extends TupleStream implements Expressible  {
     this.zkHost  = zkHost;
     this.params = params;
     this.buckets = buckets;
+    System.out.println("####### Bucket count:"+buckets.length);
     this.metrics = metrics;
     this.bucketSizeLimit   = bucketSizeLimit;
     this.collection = collection;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/37fdc37f/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
new file mode 100644
index 0000000..9a79990
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
@@ -0,0 +1,190 @@
+/*
+ * 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.stream;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.solr.client.solrj.io.Tuple;
+import org.apache.solr.client.solrj.io.comp.FieldComparator;
+import org.apache.solr.client.solrj.io.comp.MultipleFieldComparator;
+import org.apache.solr.client.solrj.io.comp.StreamComparator;
+import org.apache.solr.client.solrj.io.eq.FieldEqualitor;
+import org.apache.solr.client.solrj.io.eq.MultipleFieldEqualitor;
+import org.apache.solr.client.solrj.io.eq.StreamEqualitor;
+import org.apache.solr.client.solrj.io.ops.BooleanOperation;
+import org.apache.solr.client.solrj.io.ops.StreamOperation;
+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.StreamExplanation;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionNamedParameter;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionValue;
+import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
+
+/**
+ *  Iterates over a TupleStream and buffers Tuples that are equal based on a comparator.
+ *  This allows tuples to be grouped by common field(s).
+ *
+ *  The read() method emits one tuple per group. The fields of the emitted Tuple reflect the first tuple
+ *  encountered in the group.
+ *
+ *  Use the Tuple.getMaps() method to return all the Tuples in the group. This method returns
+ *  a list of maps (including the group head), which hold the data for each Tuple in the group.
+ *
+ *  Note: The ReducerStream requires that it's underlying stream be sorted and partitioned by the same
+ *  fields as it's comparator.
+ *
+ **/
+
+public class HavingStream extends TupleStream implements Expressible {
+
+  private static final long serialVersionUID = 1;
+
+  private TupleStream stream;
+  private BooleanOperation op;
+
+  private transient Tuple currentGroupHead;
+
+  public HavingStream(TupleStream stream, BooleanOperation op) throws IOException {
+    init(stream, op);
+  }
+
+
+  public HavingStream(StreamExpression expression, StreamFactory factory) throws IOException{
+    // grab all parameters out
+    List<StreamExpression> streamExpressions = factory.getExpressionOperandsRepresentingTypes(expression, Expressible.class, TupleStream.class);
+    List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
+
+    // validate expression contains only what we want.
+    if(expression.getParameters().size() != streamExpressions.size() + 2){
+      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - unknown operands found", expression));
+    }
+
+    if(1 != streamExpressions.size()){
+      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - expecting a single stream but found %d",expression, streamExpressions.size()));
+    }
+
+
+    BooleanOperation booleanOperation = null;
+    if(operationExpressions != null && operationExpressions.size() == 1) {
+      StreamExpression ex = operationExpressions.get(0);
+      StreamOperation operation = factory.constructOperation(ex);
+      if(operation instanceof BooleanOperation) {
+        booleanOperation = (BooleanOperation) operation;
+      } else {
+        throw new IOException("The HavingStream requires a BooleanOperation. A StreamOperation was provided.");
+      }
+    } else {
+      throw new IOException("The HavingStream requires a BooleanOperation.");
+    }
+
+    init(factory.constructStream(streamExpressions.get(0)), booleanOperation);
+  }
+
+  private void init(TupleStream stream, BooleanOperation op) throws IOException{
+    this.stream = stream;
+    this.op = op;
+  }
+
+  @Override
+  public StreamExpression toExpression(StreamFactory factory) throws IOException{
+    return toExpression(factory, true);
+  }
+
+  private StreamExpression toExpression(StreamFactory factory, boolean includeStreams) throws IOException {
+    // function name
+    StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
+
+    // stream
+    if(includeStreams){
+      expression.addParameter(((Expressible) stream).toExpression(factory));
+    }
+    else{
+      expression.addParameter("<stream>");
+    }
+
+    if(op instanceof Expressible) {
+      expression.addParameter(op.toExpression(factory));
+    } else {
+      throw new IOException("This ReducerStream contains a non-expressible operation - it cannot be converted to an expression");
+    }
+
+    return expression;
+  }
+
+  @Override
+  public Explanation toExplanation(StreamFactory factory) throws IOException {
+
+    return new StreamExplanation(getStreamNodeId().toString())
+        .withChildren(new Explanation[]{
+            stream.toExplanation(factory)
+        })
+        .withFunctionName(factory.getFunctionName(this.getClass()))
+        .withImplementingClass(this.getClass().getName())
+        .withExpressionType(ExpressionType.STREAM_DECORATOR)
+        .withExpression(toExpression(factory, false).toString())
+        .withHelpers(new Explanation[]{
+            op.toExplanation(factory)
+        });
+  }
+
+  public void setStreamContext(StreamContext context) {
+    this.stream.setStreamContext(context);
+  }
+
+  public List<TupleStream> children() {
+    List<TupleStream> l =  new ArrayList<TupleStream>();
+    l.add(stream);
+    return l;
+  }
+
+  public void open() throws IOException {
+    stream.open();
+  }
+
+  public void close() throws IOException {
+    stream.close();
+  }
+
+  public Tuple read() throws IOException {
+    while(true) {
+      Tuple tuple = stream.read();
+      if(tuple.EOF) {
+        return tuple;
+      }
+
+      op.operate(tuple);
+
+      if(op.evaluate()) {
+        return tuple;
+      }
+    }
+  }
+
+  /** Return the stream sort - ie, the order in which records are returned */
+  public StreamComparator getStreamSort(){
+    return stream.getStreamSort();
+  }
+
+  public int getCost() {
+    return 0;
+  }
+}
\ No newline at end of file


[49/50] lucene-solr:jira/solr-9858: SOLR-10114: add _version_ field to child documents, fix reordered-dbq to not drop child docs

Posted by ab...@apache.org.
SOLR-10114: add _version_ field to child documents, fix reordered-dbq to not drop child 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/99188ae0
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/99188ae0
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/99188ae0

Branch: refs/heads/jira/solr-9858
Commit: 99188ae00c0c46d9af47b9773d492de40de4aa83
Parents: 4f29685
Author: yonik <yo...@apache.org>
Authored: Wed Feb 15 22:51:21 2017 -0500
Committer: yonik <yo...@apache.org>
Committed: Wed Feb 15 22:51:21 2017 -0500

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  3 +
 .../apache/solr/update/AddUpdateCommand.java    |  3 +
 .../solr/update/DirectUpdateHandler2.java       | 26 ++++--
 .../org/apache/solr/search/TestRecovery.java    | 98 ++++++++++++++++++--
 .../java/org/apache/solr/SolrTestCaseJ4.java    | 12 +++
 5 files changed, 126 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99188ae0/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 1842e17..3257602 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -53,6 +53,9 @@ Bug Fixes
 * SOLR-9837: Fix 55% performance regression of FieldCache uninvert time of
   numeric fields.  (yonik)
 
+* SOLR-10114: Reordered delete-by-query causes inconsistenties between shards that have 
+  child documents (Mano Kovacs, Mihaly Toth, yonik)
+
 
 Optimizations
 ----------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99188ae0/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
index db1d79b..0ede728 100644
--- a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
+++ b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
@@ -189,8 +189,11 @@ public class AddUpdateCommand extends UpdateCommand implements Iterable<Document
 
         String idField = getHashableId();
 
+        boolean isVersion = version != 0;
+
         for (SolrInputDocument sdoc : all) {
           sdoc.setField("_root_", idField);      // should this be a string or the same type as the ID?
+          if(isVersion) sdoc.setField(VersionInfo.VERSION_FIELD, version);
           // TODO: if possible concurrent modification exception (if SolrInputDocument not cloned and is being forwarded to replicas)
           // then we could add this field to the generated lucene document instead.
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99188ae0/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
index 9e65ebd..b926459 100644
--- a/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
+++ b/solr/core/src/java/org/apache/solr/update/DirectUpdateHandler2.java
@@ -259,7 +259,7 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState
 
   private void doNormalUpdate(AddUpdateCommand cmd) throws IOException {
     Term updateTerm;
-    Term idTerm = new Term(cmd.isBlock() ? "_root_" : idField.getName(), cmd.getIndexedId());
+    Term idTerm = getIdTerm(cmd);
     boolean del = false;
     if (cmd.updateTerm == null) {
       updateTerm = idTerm;
@@ -273,12 +273,7 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState
     try {
       IndexWriter writer = iw.get();
 
-      if (cmd.isBlock()) {
-        writer.updateDocuments(updateTerm, cmd);
-      } else {
-        updateDocOrDocValues(cmd, writer, updateTerm);
-      }
-      // SolrCore.verbose("updateDocument",updateTerm,"DONE");
+      updateDocOrDocValues(cmd, writer, updateTerm);
 
       if (del) { // ensure id remains unique
         BooleanQuery.Builder bq = new BooleanQuery.Builder();
@@ -323,7 +318,7 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState
     }
 
     Document luceneDocument = cmd.getLuceneDocument();
-    Term idTerm = new Term(idField.getName(), cmd.getIndexedId());
+    Term idTerm = getIdTerm(cmd);
 
     RefCounted<IndexWriter> iw = solrCoreState.getIndexWriter(core);
     try {
@@ -344,6 +339,10 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState
 
   }
 
+  private Term getIdTerm(AddUpdateCommand cmd) {
+    return new Term(cmd.isBlock() ? "_root_" : idField.getName(), cmd.getIndexedId());
+  }
+
   private void updateDeleteTrackers(DeleteUpdateCommand cmd) {
     if ((cmd.getFlags() & UpdateCommand.IGNORE_AUTOCOMMIT) == 0) {
       if (commitWithinSoftCommit) {
@@ -867,13 +866,22 @@ public class DirectUpdateHandler2 extends UpdateHandler implements SolrCoreState
       log.debug("updateDocValues({})", cmd);
       writer.updateDocValues(updateTerm, fieldsToUpdate.toArray(new Field[fieldsToUpdate.size()]));
     } else {
+      updateDocument(cmd, writer, updateTerm);
+    }
+  }
+
+  private void updateDocument(AddUpdateCommand cmd, IndexWriter writer, Term updateTerm) throws IOException {
+    if(cmd.isBlock()){
+      log.debug("updateDocuments({})", cmd);
+      writer.updateDocuments(updateTerm, cmd);
+    }else{
       Document luceneDocument = cmd.getLuceneDocument(false);
       log.debug("updateDocument({})", cmd);
       writer.updateDocument(updateTerm, luceneDocument);
     }
   }
 
-  
+
   /////////////////////////////////////////////////////////////////////
   // SolrInfoMBean stuff: Statistics and Module Info
   /////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99188ae0/solr/core/src/test/org/apache/solr/search/TestRecovery.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/search/TestRecovery.java b/solr/core/src/test/org/apache/solr/search/TestRecovery.java
index 29efa52..84ba2fa 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRecovery.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRecovery.java
@@ -23,6 +23,7 @@ import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.Metric;
 import com.codahale.metrics.MetricRegistry;
+import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.metrics.SolrMetricManager;
 import org.noggit.ObjectBuilder;
 
@@ -69,6 +70,9 @@ public class TestRecovery extends SolrTestCaseJ4 {
   // TODO: fix this test to not require FSDirectory
   static String savedFactory;
 
+
+  private interface RunnableWithException{void run () throws Exception;}
+
   @BeforeClass
   public static void beforeClass() throws Exception {
     savedFactory = System.getProperty("solr.DirectoryFactory");
@@ -290,6 +294,86 @@ public class TestRecovery extends SolrTestCaseJ4 {
 
   @Test
   public void testLogReplayWithReorderedDBQ() throws Exception {
+    testLogReplayWithReorderedDBQWrapper(() -> {
+          updateJ(jsonAdd(sdoc("id", "B1", "_version_", "1010")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          updateJ(jsonDelQ("id:B2"), params(DISTRIB_UPDATE_PARAM, FROM_LEADER, "_version_", "-1017")); // This should've arrived after the 1015th update
+          updateJ(jsonAdd(sdoc("id", "B2", "_version_", "1015")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          updateJ(jsonAdd(sdoc("id", "B3", "_version_", "1020")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+        },
+        () -> assertJQ(req("q", "*:*"), "/response/numFound==2")
+    );
+  }
+
+  @Test
+  public void testLogReplayWithReorderedDBQByAsterixAndChildDocs() throws Exception {
+    testLogReplayWithReorderedDBQWrapper(() -> {
+          // 1010 - will be deleted
+          updateJ(jsonAdd(sdocWithChildren("B1", "1010")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1018 - should be kept, including child docs
+          updateJ(jsonAdd(sdocWithChildren("B2", "1018")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1017 - delete should affect only 1010
+          updateJ(jsonDelQ("id:*"), params(DISTRIB_UPDATE_PARAM, FROM_LEADER, "_version_", "-1017")); // This should've arrived after the 1015th update
+          // 1012 - will be deleted
+          updateJ(jsonAdd(sdoc("id", "B3", "_version_", "1012")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1020 - should be untouched
+          updateJ(jsonAdd(sdocWithChildren("B4", "1020")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+        },
+        () -> assertJQ(req("q", "*:*"), "/response/numFound==6")
+    );
+  }
+
+  @Test
+  public void testLogReplayWithReorderedDBQByIdAndChildDocs() throws Exception {
+    testLogReplayWithReorderedDBQWrapper(() -> {
+          // 1010 - will be deleted
+          updateJ(jsonAdd(sdocWithChildren("B1", "1010")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1018 - should be kept, including child docs
+          updateJ(jsonAdd(sdocWithChildren("B2", "1018")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1017 - delete should affect only 1010
+          updateJ(jsonDelQ("id:B1 id:B2 id:B3 id:B4"), params(DISTRIB_UPDATE_PARAM, FROM_LEADER, "_version_", "-1017")); // This should've arrived after the 1015th update
+          // 1012 - will be deleted
+          updateJ(jsonAdd(sdoc("id", "B3", "_version_", "1012")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1020 - should be untouched
+          updateJ(jsonAdd(sdocWithChildren("B4", "1020")), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+        },
+        () -> assertJQ(req("q", "*:*"), "/response/numFound==8") // B2, B4 and 6 children docs (delete by id does not delete child docs)
+    );
+  }
+
+  @Test
+  public void testLogReplayWithReorderedDBQInsertingChildnodes() throws Exception {
+    testLogReplayWithReorderedDBQWrapper(() -> {
+          updateJ(jsonDelQ("id:B2"), params(DISTRIB_UPDATE_PARAM, FROM_LEADER, "_version_", "-1017"));
+          // test doc: B1
+          // 1013 - will be inserted with 3 children
+          updateJ(jsonAdd(sdocWithChildren("B1", "1013", 3)), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+        },
+        () -> assertJQ(req("q", "*:*"), "/response/numFound==4") // B1 and B2, plus 2x 3 children
+    );
+  }
+
+
+  @Test
+  public void testLogReplayWithReorderedDBQUpdateWithDifferentChildCount() throws Exception {
+    testLogReplayWithReorderedDBQWrapper(() -> {
+          // control
+          // 1013 - will be inserted with 3 children
+          updateJ(jsonAdd(sdocWithChildren("B1", "1011", 2)), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          // 1018 - this should be the final
+          updateJ(jsonAdd(sdocWithChildren("B1", "1012", 3)), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+
+          // 1013 - will be inserted with 3 children
+          updateJ(jsonAdd(sdocWithChildren("B2", "1013", 2)), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+          updateJ(jsonDelQ("id:B3"), params(DISTRIB_UPDATE_PARAM, FROM_LEADER, "_version_", "-1019"));
+          // 1018 - this should be the final
+          updateJ(jsonAdd(sdocWithChildren("B2", "1018", 3)), params(DISTRIB_UPDATE_PARAM, FROM_LEADER));
+        },
+        () -> assertJQ(req("q", "*:*"), "/response/numFound==8") // B1+3children+B2+3children
+    );
+  }
+
+  private void testLogReplayWithReorderedDBQWrapper(RunnableWithException act, RunnableWithException assrt) throws Exception {
+
     try {
 
       DirectUpdateHandler2.commitOnClose = false;
@@ -310,13 +394,11 @@ public class TestRecovery extends SolrTestCaseJ4 {
       clearIndex();
       assertU(commit());
 
-      updateJ(jsonAdd(sdoc("id","B1", "_version_","1010")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
-      updateJ(jsonDelQ("id:B2"), params(DISTRIB_UPDATE_PARAM,FROM_LEADER, "_version_","-1017")); // This should've arrived after the 1015th update
-      updateJ(jsonAdd(sdoc("id","B2", "_version_","1015")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
-      updateJ(jsonAdd(sdoc("id","B3", "_version_","1020")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
+      // Adding some documents
+      act.run();
 
 
-      assertJQ(req("q","*:*"),"/response/numFound==0");
+      assertJQ(req("q", "*:*"), "/response/numFound==0");
 
       h.close();
       createCore();
@@ -325,7 +407,7 @@ public class TestRecovery extends SolrTestCaseJ4 {
 
       // verify that previous close didn't do a commit
       // recovery should be blocked by our hook
-      assertJQ(req("q","*:*") ,"/response/numFound==0");
+      assertJQ(req("q", "*:*"), "/response/numFound==0");
 
       // unblock recovery
       logReplay.release(1000);
@@ -333,7 +415,9 @@ public class TestRecovery extends SolrTestCaseJ4 {
       // wait until recovery has finished
       assertTrue(logReplayFinish.tryAcquire(timeout, TimeUnit.SECONDS));
 
-      assertJQ(req("q","*:*") ,"/response/numFound==2");
+      // Asserting
+      assrt.run();
+
     } finally {
       DirectUpdateHandler2.commitOnClose = true;
       UpdateLog.testing_logReplayHook = null;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/99188ae0/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 1dcd529..c70195c 100644
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -1296,6 +1296,18 @@ public abstract class SolrTestCaseJ4 extends LuceneTestCase {
     return sd;
   }
 
+  public SolrInputDocument sdocWithChildren(String id, String version) {
+    return sdocWithChildren(id, version, 2);
+  }
+
+  public SolrInputDocument sdocWithChildren(String id, String version, int childCount) {
+    SolrInputDocument doc = sdoc("id", id, "_version_", version);
+    for (int i = 0; i < childCount; i++) {
+      doc.addChildDocument(sdoc("id", id + "_child" + i));
+    }
+    return doc;
+  }
+
   public static List<SolrInputDocument> sdocs(SolrInputDocument... docs) {
     return Arrays.asList(docs);
   }


[50/50] lucene-solr:jira/solr-9858: Merge branch 'master' into jira/solr-9858

Posted by ab...@apache.org.
Merge branch 'master' into jira/solr-9858


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

Branch: refs/heads/jira/solr-9858
Commit: 69187b7a4f1a144926b95d11c2e3f7c3dcfcf8e6
Parents: 4fea121 99188ae
Author: Andrzej Bialecki <ab...@apache.org>
Authored: Thu Feb 16 14:46:33 2017 +0100
Committer: Andrzej Bialecki <ab...@apache.org>
Committed: Thu Feb 16 14:46:33 2017 +0100

----------------------------------------------------------------------
 dev-tools/doap/lucene.rdf                       |    7 +
 dev-tools/doap/solr.rdf                         |    7 +
 lucene/CHANGES.txt                              |   57 +-
 .../index/TestBackwardsCompatibility.java       |    4 +-
 .../lucene/index/unsupported.5.5.4-cfs.zip      |  Bin 0 -> 13744 bytes
 .../lucene/index/unsupported.5.5.4-nocfs.zip    |  Bin 0 -> 13749 bytes
 lucene/ivy-versions.properties                  |   18 +-
 solr/CHANGES.txt                                |   10 +-
 solr/core/ivy.xml                               |   15 +-
 .../org/apache/solr/handler/ExportWriter.java   |   17 +-
 .../org/apache/solr/handler/SQLHandler.java     | 1703 +-----------------
 .../solr/handler/sql/CalciteSolrDriver.java     |   69 +
 .../apache/solr/handler/sql/LimitStream.java    |   89 +
 .../apache/solr/handler/sql/SolrAggregate.java  |  110 ++
 .../apache/solr/handler/sql/SolrEnumerator.java |  146 ++
 .../org/apache/solr/handler/sql/SolrFilter.java |  382 ++++
 .../org/apache/solr/handler/sql/SolrMethod.java |   44 +
 .../apache/solr/handler/sql/SolrProject.java    |   64 +
 .../org/apache/solr/handler/sql/SolrRel.java    |  104 ++
 .../org/apache/solr/handler/sql/SolrRules.java  |  234 +++
 .../org/apache/solr/handler/sql/SolrSchema.java |  128 ++
 .../org/apache/solr/handler/sql/SolrSort.java   |   79 +
 .../org/apache/solr/handler/sql/SolrTable.java  |  845 +++++++++
 .../apache/solr/handler/sql/SolrTableScan.java  |   81 +
 .../handler/sql/SolrToEnumerableConverter.java  |  135 ++
 .../sql/SolrToEnumerableConverterRule.java      |   39 +
 .../apache/solr/handler/sql/package-info.java   |   21 +
 .../apache/solr/update/AddUpdateCommand.java    |    3 +
 .../solr/update/DirectUpdateHandler2.java       |   26 +-
 .../org/apache/solr/handler/TestSQLHandler.java | 1282 +++++--------
 .../solr/rest/TestManagedResourceStorage.java   |    2 +-
 .../org/apache/solr/search/TestRecovery.java    |   98 +-
 solr/licenses/avatica-core-1.9.0.jar.sha1       |    1 +
 solr/licenses/avatica-core-LICENSE-ASL.txt      |  268 +++
 solr/licenses/avatica-core-NOTICE.txt           |    5 +
 solr/licenses/calcite-core-1.11.0.jar.sha1      |    1 +
 solr/licenses/calcite-core-LICENSE-ASL.txt      |  268 +++
 solr/licenses/calcite-core-NOTICE.txt           |   12 +
 solr/licenses/calcite-linq4j-1.11.0.jar.sha1    |    1 +
 solr/licenses/calcite-linq4j-LICENSE-ASL.txt    |  268 +++
 solr/licenses/calcite-linq4j-NOTICE.txt         |   12 +
 solr/licenses/commons-compiler-2.7.6.jar.sha1   |    1 +
 solr/licenses/commons-compiler-LICENSE-BSD.txt  |   31 +
 solr/licenses/commons-compiler-NOTICE.txt       |    5 +
 .../eigenbase-properties-1.1.5.jar.sha1         |    1 +
 .../eigenbase-properties-LICENSE-ASL.txt        |  202 +++
 solr/licenses/eigenbase-properties-NOTICE.txt   |   20 +
 solr/licenses/janino-2.7.6.jar.sha1             |    1 +
 solr/licenses/janino-LICENSE-BSD.txt            |   31 +
 solr/licenses/janino-NOTICE.txt                 |    5 +
 solr/licenses/presto-parser-0.122.jar.sha1      |    1 -
 solr/licenses/protobuf-java-2.5.0.jar.sha1      |    1 -
 solr/licenses/protobuf-java-3.1.0.jar.sha1      |    1 +
 solr/licenses/slice-0.10.jar.sha1               |    1 -
 .../solrj/io/sql/DatabaseMetaDataImpl.java      |   18 +-
 .../client/solrj/io/stream/FacetStream.java     |    1 +
 .../solr/client/solrj/io/stream/JDBCStream.java |   33 +-
 .../client/solrj/io/stream/RollupStream.java    |   16 +-
 .../client/solrj/io/stream/StatsStream.java     |   48 +-
 .../solrj/io/stream/metrics/CountMetric.java    |   47 +-
 .../solrj/solr/collection1/conf/schema-sql.xml  |    2 +-
 .../solr/configsets/streaming/conf/schema.xml   |    6 +-
 .../solr/client/solrj/io/sql/JdbcTest.java      |   92 +-
 .../solrj/io/stream/StreamExpressionTest.java   |    3 -
 .../client/solrj/io/stream/StreamingTest.java   |   17 +
 .../java/org/apache/solr/SolrTestCaseJ4.java    |   12 +
 66 files changed, 4701 insertions(+), 2550 deletions(-)
----------------------------------------------------------------------



[16/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 05a6170d12fec1effed05613d0bee5fac74f0a4c
Parents: de3ba41 bf424d1
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Nov 28 11:26:16 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Nov 28 11:26:16 2016 -0600

----------------------------------------------------------------------
 dev-tools/README.txt                            |  11 +-
 dev-tools/doap/README.txt                       |   3 +
 dev-tools/doap/lucene.rdf                       |  28 +-
 dev-tools/doap/solr.rdf                         |  36 +-
 lucene/CHANGES.txt                              |   5 +
 .../KNearestNeighborClassifier.java             |   8 +-
 .../KNearestNeighborDocumentClassifier.java     |   6 +-
 lucene/common-build.xml                         |   9 +-
 .../apache/lucene/codecs/DocValuesConsumer.java |  10 +-
 .../org/apache/lucene/codecs/NormsConsumer.java |   2 +-
 .../lucene/codecs/StoredFieldsWriter.java       |   2 +-
 .../apache/lucene/codecs/TermVectorsWriter.java |   2 +-
 .../CompressingStoredFieldsWriter.java          |   2 +-
 .../CompressingTermVectorsWriter.java           |   2 +-
 .../codecs/lucene60/Lucene60PointsWriter.java   |   2 +-
 .../lucene/index/MappingMultiPostingsEnum.java  |   2 +-
 .../org/apache/lucene/index/MergeState.java     |  76 +--
 .../org/apache/lucene/index/MultiSorter.java    |  14 +-
 .../apache/lucene/index/TestIndexSorting.java   | 192 ++++++-
 lucene/ivy-versions.properties                  |   9 +-
 ...jetty-continuation-9.3.14.v20161028.jar.sha1 |   1 +
 .../jetty-continuation-9.3.8.v20160314.jar.sha1 |   1 -
 .../jetty-http-9.3.14.v20161028.jar.sha1        |   1 +
 .../jetty-http-9.3.8.v20160314.jar.sha1         |   1 -
 .../licenses/jetty-io-9.3.14.v20161028.jar.sha1 |   1 +
 .../licenses/jetty-io-9.3.8.v20160314.jar.sha1  |   1 -
 .../jetty-server-9.3.14.v20161028.jar.sha1      |   1 +
 .../jetty-server-9.3.8.v20160314.jar.sha1       |   1 -
 .../jetty-servlet-9.3.14.v20161028.jar.sha1     |   1 +
 .../jetty-servlet-9.3.8.v20160314.jar.sha1      |   1 -
 .../jetty-util-9.3.14.v20161028.jar.sha1        |   1 +
 .../jetty-util-9.3.8.v20160314.jar.sha1         |   1 -
 lucene/site/changes/changes2html.pl             |  44 +-
 .../lucene/index/MockRandomMergePolicy.java     |   4 +-
 solr/CHANGES.txt                                | 195 ++++++-
 solr/bin/solr                                   |  80 ++-
 solr/bin/solr.cmd                               |  72 ++-
 solr/bin/solr.in.cmd                            |   6 +-
 solr/bin/solr.in.sh                             |   4 +
 .../plugin/AnalyticsStatisticsCollector.java    |  20 +-
 solr/contrib/morphlines-core/ivy.xml            |   4 +-
 .../UIMAUpdateRequestProcessorTest.java         |  62 +--
 solr/core/ivy.xml                               |   1 +
 .../org/apache/solr/cloud/DistributedQueue.java |  14 +-
 .../java/org/apache/solr/cloud/Overseer.java    |  13 +-
 .../apache/solr/cloud/OverseerStatusCmd.java    |  16 +-
 .../solr/cloud/OverseerTaskProcessor.java       |   6 +-
 .../apache/solr/cloud/OverseerTaskQueue.java    |   8 +-
 .../solr/cloud/overseer/ZkStateWriter.java      |   4 +-
 .../org/apache/solr/handler/ExportWriter.java   |  13 +-
 .../apache/solr/handler/RequestHandlerBase.java |  21 +-
 .../handler/component/HighlightComponent.java   | 108 +++-
 .../solr/handler/component/QueryComponent.java  |   3 +-
 .../solr/highlight/DefaultSolrHighlighter.java  |  15 +-
 .../solr/highlight/PostingsSolrHighlighter.java |   9 +-
 .../solr/highlight/UnifiedSolrHighlighter.java  | 365 +++++++++++++
 .../org/apache/solr/parser/QueryParser.java     |  11 +-
 .../java/org/apache/solr/parser/QueryParser.jj  |   7 +-
 .../apache/solr/parser/SolrQueryParserBase.java | 194 ++++++-
 .../org/apache/solr/request/NumericFacets.java  |   4 +-
 .../java/org/apache/solr/schema/FieldType.java  |  28 +-
 .../solr/search/ExtendedDismaxQParser.java      |   6 +-
 .../solr/search/FunctionRangeQParserPlugin.java |   4 +-
 .../apache/solr/search/JoinQParserPlugin.java   |   1 +
 .../java/org/apache/solr/search/QParser.java    |  29 +
 .../solr/search/facet/FacetProcessor.java       |   3 +
 .../apache/solr/search/facet/FacetRequest.java  |   1 +
 .../ClassificationUpdateProcessor.java          |  59 ++-
 .../ClassificationUpdateProcessorFactory.java   | 199 +++----
 .../ClassificationUpdateProcessorParams.java    | 112 ++++
 .../src/java/org/apache/solr/util/SolrCLI.java  |   3 +-
 .../org/apache/solr/util/SolrPluginUtils.java   |   6 +-
 .../java/org/apache/solr/util/stats/Clock.java  |  84 ---
 .../java/org/apache/solr/util/stats/EWMA.java   | 126 -----
 .../util/stats/ExponentiallyDecayingSample.java | 218 --------
 .../org/apache/solr/util/stats/Histogram.java   | 238 ---------
 .../java/org/apache/solr/util/stats/Meter.java  | 143 -----
 .../java/org/apache/solr/util/stats/Sample.java |  52 --
 .../org/apache/solr/util/stats/Snapshot.java    | 168 ------
 .../java/org/apache/solr/util/stats/Timer.java  | 203 -------
 .../apache/solr/util/stats/TimerContext.java    |  55 --
 .../org/apache/solr/util/stats/TimerUtils.java  |  58 ++
 .../apache/solr/util/stats/UniformSample.java   | 108 ----
 .../conf/schema-unifiedhighlight.xml            |  46 ++
 .../conf/solrconfig-classification.xml          |  15 +
 .../solr/cloud/DocValuesNotIndexedTest.java     | 527 +++++++++++++++++++
 .../org/apache/solr/cloud/OverseerTest.java     |  30 +-
 .../apache/solr/core/RequestHandlersTest.java   |   4 +-
 .../handler/admin/CoreAdminHandlerTest.java     |   2 +
 .../highlight/FastVectorHighlighterTest.java    |   9 +-
 .../apache/solr/highlight/HighlighterTest.java  |  26 +-
 .../highlight/TestPostingsSolrHighlighter.java  |   2 +-
 .../highlight/TestUnifiedSolrHighlighter.java   | 229 ++++++++
 .../apache/solr/response/SmileWriterTest.java   |  17 +-
 .../response/TestJavabinTupleStreamParser.java  | 195 +++++++
 .../solr/search/TestExtendedDismaxParser.java   |   4 +-
 .../apache/solr/search/TestSolrQueryParser.java | 198 ++++++-
 ...lassificationUpdateProcessorFactoryTest.java | 208 ++------
 ...ificationUpdateProcessorIntegrationTest.java | 192 +++++++
 .../ClassificationUpdateProcessorTest.java      | 506 ++++++++++++++++++
 .../SignatureUpdateProcessorFactoryTest.java    |  28 +-
 .../TestPartialUpdateDeduplication.java         |   2 -
 .../apache/solr/util/stats/TimerUtilsTest.java  |  58 ++
 ...jetty-continuation-9.3.14.v20161028.jar.sha1 |   1 +
 .../jetty-continuation-9.3.8.v20160314.jar.sha1 |   1 -
 .../jetty-deploy-9.3.14.v20161028.jar.sha1      |   1 +
 .../jetty-deploy-9.3.8.v20160314.jar.sha1       |   1 -
 .../jetty-http-9.3.14.v20161028.jar.sha1        |   1 +
 .../jetty-http-9.3.8.v20160314.jar.sha1         |   1 -
 .../licenses/jetty-io-9.3.14.v20161028.jar.sha1 |   1 +
 solr/licenses/jetty-io-9.3.8.v20160314.jar.sha1 |   1 -
 .../jetty-jmx-9.3.14.v20161028.jar.sha1         |   1 +
 .../licenses/jetty-jmx-9.3.8.v20160314.jar.sha1 |   1 -
 .../jetty-rewrite-9.3.14.v20161028.jar.sha1     |   1 +
 .../jetty-rewrite-9.3.8.v20160314.jar.sha1      |   1 -
 .../jetty-security-9.3.14.v20161028.jar.sha1    |   1 +
 .../jetty-security-9.3.8.v20160314.jar.sha1     |   1 -
 .../jetty-server-9.3.14.v20161028.jar.sha1      |   1 +
 .../jetty-server-9.3.8.v20160314.jar.sha1       |   1 -
 .../jetty-servlet-9.3.14.v20161028.jar.sha1     |   1 +
 .../jetty-servlet-9.3.8.v20160314.jar.sha1      |   1 -
 .../jetty-servlets-9.3.14.v20161028.jar.sha1    |   1 +
 .../jetty-servlets-9.3.8.v20160314.jar.sha1     |   1 -
 .../jetty-util-9.3.14.v20161028.jar.sha1        |   1 +
 .../jetty-util-9.3.8.v20160314.jar.sha1         |   1 -
 .../jetty-webapp-9.3.14.v20161028.jar.sha1      |   1 +
 .../jetty-webapp-9.3.8.v20160314.jar.sha1       |   1 -
 .../jetty-xml-9.3.14.v20161028.jar.sha1         |   1 +
 .../licenses/jetty-xml-9.3.8.v20160314.jar.sha1 |   1 -
 solr/licenses/metrics-core-3.0.1.jar.sha1       |   1 -
 solr/licenses/metrics-core-3.1.2.jar.sha1       |   1 +
 .../metrics-healthchecks-3.0.1.jar.sha1         |   1 -
 .../metrics-healthchecks-3.1.2.jar.sha1         |   1 +
 solr/licenses/start.jar.sha1                    |   2 +-
 solr/server/etc/jetty-ssl.xml                   |   4 +-
 solr/solrj/ivy.xml                              |   4 +
 .../solr/client/solrj/impl/CloudSolrClient.java | 345 ++++++------
 .../impl/ZkClientClusterStateProvider.java      | 188 +++++++
 .../io/stream/JavabinTupleStreamParser.java     | 189 +++++++
 .../solr/client/solrj/io/stream/SolrStream.java |   9 +-
 .../org/apache/solr/common/SolrDocument.java    |   4 +
 .../apache/solr/common/cloud/ClusterState.java  |   7 +
 .../apache/solr/common/cloud/ZkStateReader.java |  10 +-
 .../solr/common/params/HighlightParams.java     | 118 +++--
 .../apache/solr/common/util/JavaBinCodec.java   |  12 +-
 .../solrj/impl/CloudSolrClientCacheTest.java    | 205 ++++++++
 .../impl/TestCloudSolrClientConnections.java    |   4 +-
 .../client/solrj/io/stream/StreamingTest.java   |   2 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |  22 +
 .../apache/solr/cloud/SolrCloudTestCase.java    |   3 +-
 150 files changed, 4789 insertions(+), 2307 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/05a6170d/lucene/ivy-versions.properties
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/05a6170d/solr/core/ivy.xml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/05a6170d/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
----------------------------------------------------------------------


[36/50] lucene-solr:jira/solr-9858: SOLR-8593: Ensure the SolrSort is always pushed down

Posted by ab...@apache.org.
SOLR-8593: Ensure the SolrSort is always pushed down


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

Branch: refs/heads/jira/solr-9858
Commit: 4ea97b08de1b853b1fc2a0f306db9a202e22db67
Parents: 63eeced
Author: Joel Bernstein <jb...@apache.org>
Authored: Sat Feb 4 13:59:56 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 8 13:01:31 2017 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/sql/SolrFilter.java   |  2 +-
 .../org/apache/solr/handler/sql/SolrSort.java     |  3 ++-
 .../org/apache/solr/handler/sql/SolrTable.java    | 18 ++++++++++++------
 3 files changed, 15 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ea97b08/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
index 5f30926..01d3346 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -129,7 +129,7 @@ class SolrFilter extends Filter implements SolrRel {
           return "-"+translateComparison(((RexCall) node).getOperands().get(0));
         case EQUALS:
           String terms = binaryTranslated.getValue().getValue2().toString().trim();
-          if(!terms.startsWith("(")){
+          if(!terms.startsWith("(") && !terms.startsWith("[") && !terms.startsWith("{")){
             terms = "\""+terms+"\"";
           }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ea97b08/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
index 751e841..1c5274a 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
@@ -46,7 +46,7 @@ class SolrSort extends Sort implements SolrRel {
 
   @Override
   public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
-    return super.computeSelfCost(planner, mq).multiplyBy(0.05);
+    return planner.getCostFactory().makeZeroCost();
   }
 
   @Override
@@ -71,6 +71,7 @@ class SolrSort extends Sort implements SolrRel {
       }
     }
 
+
     if(fetch != null) {
       implementor.setLimit(((RexLiteral) fetch).getValue().toString());
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/4ea97b08/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index 14e69e6..fff6468 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -106,6 +106,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       }
     }
 
+    System.out.println("####### Limit:"+limit);
+
     TupleStream tupleStream;
     String zk = properties.getProperty("zk");
     try {
@@ -456,13 +458,12 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       tupleStream = parallelStream;
     }
 
-    //TODO: This should be done on the workers, but it won't serialize because it relies on Presto classes.
-    // Once we make this a Expressionable the problem will be solved.
-
+    //TODO: Currently we are not pushing down the having clause.
+    //      We need to push down the having clause to ensure that LIMIT does not cut off records prior to the having filter.
 
     if(orders != null && orders.size() > 0) {
-      int lim = limit == null ? 100 : Integer.parseInt(limit);
       if(!sortsEqual(buckets, sortDirection, orders)) {
+        int lim = (limit == null) ? 100 : Integer.parseInt(limit);
         StreamComparator comp = getComp(orders);
         //Rank the Tuples
         //If parallel stream is used ALL the Rolled up tuples from the workers will be ranked
@@ -471,10 +472,15 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       } else {
         // Sort is the same as the same as the underlying stream
         // Only need to limit the result, not Rank the result
-        if(lim > -1) {
-          tupleStream = new LimitStream(tupleStream, lim);
+        if(limit != null) {
+          tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
         }
       }
+    } else {
+      //No order by, check for limit
+      if(limit != null) {
+        tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
+      }
     }
 
     return tupleStream;


[15/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: de3ba418a5824015289bd1d98a9ecc13be93e1d1
Parents: 750cf6d 33ff6cd
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Nov 21 16:39:06 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Nov 21 16:39:06 2016 -0600

----------------------------------------------------------------------
 dev-tools/doap/README.txt                       |   5 +
 dev-tools/doap/lucene.rdf                       | 707 +++++++++++++++++++
 dev-tools/doap/solr.rdf                         | 455 ++++++++++++
 lucene/CHANGES.txt                              |   6 +
 lucene/build.xml                                |   5 +-
 lucene/common-build.xml                         |   5 +-
 .../org/apache/lucene/search/BooleanQuery.java  |  11 +-
 .../lucene/search/similarities/Axiomatic.java   | 159 +++++
 .../search/similarities/AxiomaticF1EXP.java     |  95 +++
 .../search/similarities/AxiomaticF1LOG.java     |  88 +++
 .../search/similarities/AxiomaticF2EXP.java     |  94 +++
 .../search/similarities/AxiomaticF2LOG.java     |  86 +++
 .../search/similarities/AxiomaticF3EXP.java     |  94 +++
 .../search/similarities/AxiomaticF3LOG.java     |  83 +++
 .../org/apache/lucene/util/QueryBuilder.java    |  23 +-
 .../similarities/TestAxiomaticSimilarity.java   |  86 +++
 lucene/site/changes/changes2html.pl             |  96 +--
 solr/CHANGES.txt                                |   2 +
 solr/build.xml                                  |   4 +-
 .../solr/response/JSONResponseWriter.java       |  14 +-
 .../apache/solr/response/JSONWriterTest.java    |  11 +-
 .../web/js/angular/controllers/analysis.js      |  12 +-
 solr/webapp/web/partials/analysis.html          |   2 +-
 23 files changed, 2038 insertions(+), 105 deletions(-)
----------------------------------------------------------------------



[31/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 934a92e730e188121fd5bbdcf9b24876df11f720
Parents: aaee751 0187838
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 27 10:19:38 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 27 10:19:38 2017 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |   24 +
 .../CompressingStoredFieldsWriter.java          |    5 +-
 .../codecs/compressing/CompressionMode.java     |   49 +-
 .../lucene/codecs/compressing/Compressor.java   |    3 +-
 .../org/apache/lucene/geo/GeoEncodingUtils.java |  140 +++
 .../java/org/apache/lucene/geo/GeoUtils.java    |   39 +
 .../org/apache/lucene/index/FieldInfos.java     |    6 +
 .../apache/lucene/index/IndexReaderContext.java |    7 +-
 .../org/apache/lucene/index/IndexWriter.java    |   16 +
 .../org/apache/lucene/index/TermContext.java    |   21 +-
 .../apache/lucene/search/BlendedTermQuery.java  |   12 +-
 .../org/apache/lucene/search/TermQuery.java     |    6 +-
 .../lucene/search/spans/SpanTermQuery.java      |    4 +-
 .../java/org/apache/lucene/util/Version.java    |    7 +
 .../document/LatLonDocValuesBoxQuery.java       |  145 +++
 .../document/LatLonDocValuesDistanceQuery.java  |  132 +++
 .../lucene/document/LatLonDocValuesField.java   |   46 +
 .../document/LatLonPointDistanceQuery.java      |   71 +-
 .../lucene/search/TermAutomatonQuery.java       |    2 +-
 .../search/TestLatLonDocValuesQueries.java      |   62 +
 lucene/site/changes/changes2html.pl             |    7 +-
 .../dummy/DummyCompressingCodec.java            |    3 +
 .../apache/lucene/geo/BaseGeoPointTestCase.java |   29 +-
 solr/CHANGES.txt                                |   24 +
 .../client/solrj/embedded/JettySolrRunner.java  |   58 +
 .../handler/component/RealTimeGetComponent.java |  369 +++++-
 .../handler/component/SpellCheckComponent.java  |   12 +-
 .../apache/solr/search/SolrIndexSearcher.java   |    6 +-
 .../apache/solr/update/AddUpdateCommand.java    |   36 +-
 .../solr/update/DirectUpdateHandler2.java       |   52 +-
 .../org/apache/solr/update/DocumentBuilder.java |  151 ++-
 .../java/org/apache/solr/update/PeerSync.java   |   10 +
 .../apache/solr/update/SolrCmdDistributor.java  |    4 +
 .../org/apache/solr/update/TransactionLog.java  |   43 +-
 .../java/org/apache/solr/update/UpdateLog.java  |  242 +++-
 .../org/apache/solr/update/VersionInfo.java     |    7 +
 .../processor/AtomicUpdateDocumentMerger.java   |  182 ++-
 .../processor/DistributedUpdateProcessor.java   |  258 +++-
 ...BasedVersionConstraintsProcessorFactory.java |    2 +-
 .../SkipExistingDocumentsProcessorFactory.java  |    5 +-
 .../collection1/conf/schema-inplace-updates.xml |   67 ++
 .../test-files/solr/collection1/conf/schema.xml |   14 +-
 .../solr/collection1/conf/schema15.xml          |    7 +-
 .../solrconfig-sortingmergepolicyfactory.xml    |    3 +-
 .../cloud/SegmentTerminateEarlyTestState.java   |   14 +-
 .../apache/solr/cloud/TestSegmentSorting.java   |  165 ++-
 .../solr/cloud/TestStressInPlaceUpdates.java    |  612 ++++++++++
 .../component/SpellCheckComponentTest.java      |   79 +-
 .../org/apache/solr/search/TestRecovery.java    |  149 ++-
 .../org/apache/solr/update/PeerSyncTest.java    |  152 ++-
 .../apache/solr/update/SolrIndexConfigTest.java |    4 +-
 .../solr/update/TestInPlaceUpdatesDistrib.java  | 1101 ++++++++++++++++++
 .../update/TestInPlaceUpdatesStandalone.java    | 1100 +++++++++++++++++
 .../test/org/apache/solr/update/TestUpdate.java |    2 +-
 .../org/apache/solr/update/UpdateLogTest.java   |  271 +++++
 .../update/processor/AtomicUpdatesTest.java     |  147 +++
 .../apache/solr/common/util/JavaBinCodec.java   |   10 +-
 .../web/js/angular/controllers/plugins.js       |    1 +
 58 files changed, 5836 insertions(+), 359 deletions(-)
----------------------------------------------------------------------



[03/50] lucene-solr:jira/solr-9858: Make SQLHandlerStream extend JDBCStream

Posted by ab...@apache.org.
Make SQLHandlerStream extend JDBCStream


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

Branch: refs/heads/jira/solr-9858
Commit: 0188345e84671b24286f000ec044a435b1a5e086
Parents: 5f3b423
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 10:22:20 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 10:22:20 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/SQLHandler.java     | 127 ++++---------------
 .../solr/client/solrj/io/stream/JDBCStream.java |   2 +-
 2 files changed, 24 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0188345e/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
index 7b72a4c..549efac 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -18,14 +18,9 @@ package org.apache.solr.handler;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-import java.sql.Statement;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -37,11 +32,7 @@ import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
 import org.apache.solr.client.solrj.io.stream.ExceptionStream;
 import org.apache.solr.client.solrj.io.stream.JDBCStream;
-import org.apache.solr.client.solrj.io.stream.StreamContext;
 import org.apache.solr.client.solrj.io.stream.TupleStream;
-import org.apache.solr.client.solrj.io.stream.expr.Explanation;
-import org.apache.solr.client.solrj.io.stream.expr.StreamExplanation;
-import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.core.CoreContainer;
@@ -55,7 +46,7 @@ import org.apache.solr.util.plugin.SolrCoreAware;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , PermissionNameProvider {
+public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, PermissionNameProvider {
 
   private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
@@ -118,15 +109,8 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
       String driverClass = CalciteSolrDriver.class.getCanonicalName();
 
       // JDBC driver requires metadata from the SQLHandler. Default to false since this adds a new Metadata stream.
-      if(params.getBool("includeMetadata", false)) {
-        /*
-         * Would be great to replace this with the JDBCStream. Can't do that currently since need to have metadata
-         * added to the stream for the JDBC driver. This could be fixed by using the Calcite Avatica server and client.
-         */
-        tupleStream = new SqlHandlerStream(url, sql, properties, driverClass);
-      } else {
-        tupleStream = new JDBCStream(url, sql, null, properties, driverClass);
-      }
+      boolean includeMetadata = params.getBool("includeMetadata", false);
+      tupleStream = new SqlHandlerStream(url, sql, null, properties, driverClass, includeMetadata);
 
       tupleStream = new StreamHandler.TimerStream(new ExceptionStream(tupleStream));
 
@@ -152,68 +136,32 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
   /*
    * Only necessary for SolrJ JDBC driver since metadata has to be passed back
    */
-  private class SqlHandlerStream extends TupleStream {
-    private final String url;
-    private final String sql;
-    private final Properties properties;
-    private final String driverClass;
+  private class SqlHandlerStream extends JDBCStream {
+    private final boolean includeMetadata;
     private boolean firstTuple = true;
-    private Connection connection;
-    private Statement statement;
-    private ResultSet resultSet;
-    private ResultSetMetaData resultSetMetaData;
-    private int numColumns;
-
-    SqlHandlerStream(String url, String sql, Properties properties, String driverClass) {
-      this.url = url;
-      this.sql = sql;
-      this.properties = properties;
-      this.driverClass = driverClass;
-    }
 
-    public List<TupleStream> children() {
-      return Collections.emptyList();
-    }
-
-    public void open() throws IOException {
-      try {
-        Class.forName(driverClass);
-      } catch (ClassNotFoundException e) {
-        throw new IOException(e);
-      }
+    SqlHandlerStream(String connectionUrl, String sqlQuery, StreamComparator definedSort,
+                     Properties connectionProperties, String driverClassName, boolean includeMetadata)
+        throws IOException {
+      super(connectionUrl, sqlQuery, definedSort, connectionProperties, driverClassName);
 
-      try {
-        connection = DriverManager.getConnection(url, properties);
-        statement = connection.createStatement();
-        resultSet = statement.executeQuery(sql);
-        resultSetMetaData = this.resultSet.getMetaData();
-        numColumns = resultSetMetaData.getColumnCount();
-      } catch (SQLException e) {
-        this.close();
-        throw new IOException(e);
-      }
+      this.includeMetadata = includeMetadata;
     }
 
     @Override
-    public Explanation toExplanation(StreamFactory factory) throws IOException {
-
-      return new StreamExplanation(getStreamNodeId().toString())
-          .withFunctionName("SQL Handler")
-          .withExpression("--non-expressible--")
-          .withImplementingClass(this.getClass().getName())
-          .withExpressionType(Explanation.ExpressionType.STREAM_DECORATOR);
-    }
-
-    // Return a metadata tuple as the first tuple and then pass through to the underlying stream.
     public Tuple read() throws IOException {
-      try {
-        Map<String, Object> fields = new HashMap<>();
-        if(firstTuple) {
+      // Return a metadata tuple as the first tuple and then pass through to the JDBCStream.
+      if(includeMetadata && firstTuple) {
+        try {
+          Map<String, Object> fields = new HashMap<>();
+
           firstTuple = false;
 
+          ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
+
           List<String> metadataFields = new ArrayList<>();
           Map<String, String> metadataAliases = new HashMap<>();
-          for(int i = 1; i <= numColumns; i++) {
+          for(int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
             String columnName = resultSetMetaData.getColumnName(i);
             String columnLabel = resultSetMetaData.getColumnLabel(i);
             metadataFields.add(columnName);
@@ -223,42 +171,13 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware , Pe
           fields.put("isMetadata", true);
           fields.put("fields", metadataFields);
           fields.put("aliases", metadataAliases);
-        } else {
-          if(this.resultSet.next()){
-            for(int i = 1; i <= numColumns; i++) {
-              fields.put(resultSetMetaData.getColumnLabel(i), this.resultSet.getObject(i));
-            }
-          } else {
-            fields.put("EOF", true);
-          }
-
-        }
-        return new Tuple(fields);
-      } catch (SQLException e) {
-        throw new IOException(e);
-      }
-    }
-
-    public StreamComparator getStreamSort() {
-      return null;
-    }
-
-    private void closeQuietly(AutoCloseable closeable) {
-      if(closeable != null) {
-        try {
-          closeable.close();
-        } catch (Exception ignore) {
+          return new Tuple(fields);
+        } catch (SQLException e) {
+          throw new IOException(e);
         }
+      } else {
+        return super.read();
       }
     }
-
-    public void close() throws IOException {
-      this.closeQuietly(this.resultSet);
-      this.closeQuietly(this.statement);
-      this.closeQuietly(this.connection);
-    }
-
-    public void setStreamContext(StreamContext context) {
-    }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0188345e/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
index 9763809..4f71e17f 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
@@ -85,8 +85,8 @@ public class JDBCStream extends TupleStream implements Expressible {
   private Connection connection;
   private Properties connectionProperties;
   private Statement statement;
-  private ResultSet resultSet;
   private ResultSetValueSelector[] valueSelectors;
+  protected ResultSet resultSet;
   protected transient StreamContext streamContext;
 
   public JDBCStream(String connectionUrl, String sqlQuery, StreamComparator definedSort) throws IOException {


[02/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 5f3b4237e0921356360e59955fef47514db1daa4
Parents: 28fb585 213a2a1
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 09:40:29 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 09:40:29 2016 -0500

----------------------------------------------------------------------
 dev-tools/idea/.idea/modules.xml                |    3 +-
 dev-tools/idea/.idea/workspace.xml              |   72 +-
 dev-tools/idea/solr/contrib/ltr/ltr.iml         |   37 +
 .../maven/solr/contrib/ltr/pom.xml.template     |   80 +
 dev-tools/maven/solr/contrib/pom.xml.template   |    1 +
 .../index/TestBackwardsCompatibility.java       |    1 +
 .../lucene/index/TestManyPointsInOldIndex.java  |   74 +
 .../org/apache/lucene/index/manypointsindex.zip |  Bin 0 -> 3739 bytes
 .../org/apache/lucene/index/CheckIndex.java     |   31 +-
 .../java/org/apache/lucene/util/Constants.java  |   10 +-
 .../org/apache/lucene/util/bkd/BKDReader.java   |   48 +-
 solr/CHANGES.txt                                |    6 +
 solr/contrib/ltr/README.md                      |  406 +++++
 solr/contrib/ltr/README.txt                     |    1 +
 solr/contrib/ltr/build.xml                      |   30 +
 solr/contrib/ltr/example/config.json            |   14 +
 solr/contrib/ltr/example/libsvm_formatter.py    |  124 ++
 solr/contrib/ltr/example/solrconfig.xml         | 1722 ++++++++++++++++++
 .../ltr/example/techproducts-features.json      |   26 +
 .../contrib/ltr/example/techproducts-model.json |   18 +
 .../ltr/example/train_and_upload_demo_model.py  |  163 ++
 solr/contrib/ltr/example/user_queries.txt       |    8 +
 solr/contrib/ltr/ivy.xml                        |   32 +
 .../src/java/org/apache/solr/ltr/DocInfo.java   |   42 +
 .../java/org/apache/solr/ltr/FeatureLogger.java |  193 ++
 .../java/org/apache/solr/ltr/LTRRescorer.java   |  249 +++
 .../org/apache/solr/ltr/LTRScoringQuery.java    |  738 ++++++++
 .../org/apache/solr/ltr/LTRThreadModule.java    |  163 ++
 .../solr/ltr/SolrQueryRequestContextUtils.java  |   83 +
 .../org/apache/solr/ltr/feature/Feature.java    |  335 ++++
 .../solr/ltr/feature/FeatureException.java      |   31 +
 .../solr/ltr/feature/FieldLengthFeature.java    |  152 ++
 .../solr/ltr/feature/FieldValueFeature.java     |  141 ++
 .../solr/ltr/feature/OriginalScoreFeature.java  |  118 ++
 .../apache/solr/ltr/feature/SolrFeature.java    |  320 ++++
 .../apache/solr/ltr/feature/ValueFeature.java   |  148 ++
 .../apache/solr/ltr/feature/package-info.java   |   21 +
 .../apache/solr/ltr/model/LTRScoringModel.java  |  298 +++
 .../org/apache/solr/ltr/model/LinearModel.java  |  147 ++
 .../apache/solr/ltr/model/ModelException.java   |   31 +
 .../ltr/model/MultipleAdditiveTreesModel.java   |  377 ++++
 .../org/apache/solr/ltr/model/package-info.java |   21 +
 .../solr/ltr/norm/IdentityNormalizer.java       |   53 +
 .../apache/solr/ltr/norm/MinMaxNormalizer.java  |  107 ++
 .../org/apache/solr/ltr/norm/Normalizer.java    |   64 +
 .../solr/ltr/norm/NormalizerException.java      |   31 +
 .../solr/ltr/norm/StandardNormalizer.java       |   99 +
 .../org/apache/solr/ltr/norm/package-info.java  |   23 +
 .../java/org/apache/solr/ltr/package-info.java  |   45 +
 .../org/apache/solr/ltr/store/FeatureStore.java |   67 +
 .../org/apache/solr/ltr/store/ModelStore.java   |   74 +
 .../org/apache/solr/ltr/store/package-info.java |   21 +
 .../ltr/store/rest/ManagedFeatureStore.java     |  215 +++
 .../solr/ltr/store/rest/ManagedModelStore.java  |  319 ++++
 .../solr/ltr/store/rest/package-info.java       |   22 +
 .../LTRFeatureLoggerTransformerFactory.java     |  254 +++
 .../solr/response/transform/package-info.java   |   23 +
 .../apache/solr/search/LTRQParserPlugin.java    |  233 +++
 .../org/apache/solr/search/package-info.java    |   23 +
 solr/contrib/ltr/src/java/overview.html         |   91 +
 .../featureExamples/comp_features.json          |   37 +
 .../featureExamples/external_features.json      |   51 +
 ...external_features_for_sparse_processing.json |   18 +
 .../featureExamples/features-linear-efi.json    |   17 +
 .../featureExamples/features-linear.json        |   51 +
 .../features-store-test-model.json              |   51 +
 .../test-files/featureExamples/fq_features.json |   16 +
 .../multipleadditivetreesmodel_features.json    |   16 +
 .../contrib/ltr/src/test-files/log4j.properties |   32 +
 .../modelExamples/external_model.json           |   12 +
 .../modelExamples/external_model_store.json     |   13 +
 .../src/test-files/modelExamples/fq-model.json  |   20 +
 .../modelExamples/linear-model-efi.json         |   14 +
 .../test-files/modelExamples/linear-model.json  |   30 +
 .../multipleadditivetreesmodel.json             |   38 +
 ...tivetreesmodel_external_binary_features.json |   38 +
 .../multipleadditivetreesmodel_no_feature.json  |   24 +
 .../multipleadditivetreesmodel_no_features.json |   14 +
 .../multipleadditivetreesmodel_no_left.json     |   22 +
 .../multipleadditivetreesmodel_no_params.json   |    8 +
 .../multipleadditivetreesmodel_no_right.json    |   22 +
 ...multipleadditivetreesmodel_no_threshold.json |   24 +
 .../multipleadditivetreesmodel_no_tree.json     |   15 +
 .../multipleadditivetreesmodel_no_trees.json    |   10 +
 .../multipleadditivetreesmodel_no_weight.json   |   24 +
 .../test-files/solr/collection1/conf/schema.xml |   88 +
 .../solr/collection1/conf/solrconfig-ltr.xml    |   65 +
 .../collection1/conf/solrconfig-ltr_Th10_10.xml |   69 +
 .../collection1/conf/solrconfig-multiseg.xml    |   62 +
 .../solr/collection1/conf/stopwords.txt         |   16 +
 .../solr/collection1/conf/synonyms.txt          |   28 +
 solr/contrib/ltr/src/test-files/solr/solr.xml   |   42 +
 .../org/apache/solr/ltr/TestLTROnSolrCloud.java |  211 +++
 .../apache/solr/ltr/TestLTRQParserExplain.java  |  152 ++
 .../apache/solr/ltr/TestLTRQParserPlugin.java   |  114 ++
 .../solr/ltr/TestLTRReRankingPipeline.java      |  300 +++
 .../apache/solr/ltr/TestLTRScoringQuery.java    |  319 ++++
 .../org/apache/solr/ltr/TestLTRWithFacet.java   |  103 ++
 .../org/apache/solr/ltr/TestLTRWithSort.java    |  102 ++
 .../solr/ltr/TestParallelWeightCreation.java    |   77 +
 .../org/apache/solr/ltr/TestRerankBase.java     |  429 +++++
 .../solr/ltr/TestSelectiveWeightCreation.java   |  251 +++
 .../ltr/feature/TestEdisMaxSolrFeature.java     |   76 +
 .../solr/ltr/feature/TestExternalFeatures.java  |  157 ++
 .../ltr/feature/TestExternalValueFeatures.java  |   86 +
 ...stFeatureExtractionFromMultipleSegments.java |  105 ++
 .../solr/ltr/feature/TestFeatureLogging.java    |  254 +++
 .../ltr/feature/TestFeatureLtrScoringModel.java |   71 +
 .../solr/ltr/feature/TestFeatureStore.java      |  106 ++
 .../ltr/feature/TestFieldLengthFeature.java     |  156 ++
 .../solr/ltr/feature/TestFieldValueFeature.java |  173 ++
 .../solr/ltr/feature/TestFilterSolrFeature.java |  105 ++
 .../ltr/feature/TestNoMatchSolrFeature.java     |  192 ++
 .../ltr/feature/TestOriginalScoreFeature.java   |  148 ++
 .../solr/ltr/feature/TestRankingFeature.java    |  123 ++
 .../ltr/feature/TestUserTermScoreWithQ.java     |   74 +
 .../ltr/feature/TestUserTermScorerQuery.java    |   74 +
 .../ltr/feature/TestUserTermScorereQDF.java     |   75 +
 .../solr/ltr/feature/TestValueFeature.java      |  165 ++
 .../apache/solr/ltr/model/TestLinearModel.java  |  207 +++
 .../model/TestMultipleAdditiveTreesModel.java   |  246 +++
 .../solr/ltr/norm/TestMinMaxNormalizer.java     |  120 ++
 .../solr/ltr/norm/TestStandardNormalizer.java   |  132 ++
 .../ltr/store/rest/TestManagedFeatureStore.java |   36 +
 .../solr/ltr/store/rest/TestModelManager.java   |  163 ++
 .../store/rest/TestModelManagerPersistence.java |  121 ++
 .../solr/response/JSONResponseWriter.java       |   17 +-
 .../apache/solr/response/PHPResponseWriter.java |    8 +
 .../solr/response/SmileResponseWriter.java      |    5 +
 .../solr/response/TextResponseWriter.java       |   43 +-
 .../solr/search/facet/FacetProcessor.java       |   30 +-
 .../apache/solr/search/facet/FacetRequest.java  |   39 +-
 .../apache/solr/update/HdfsTransactionLog.java  |    3 +-
 solr/core/src/resources/ImplicitPlugins.json    |    8 +-
 .../solr/cloud/hdfs/HdfsRecoveryZkTest.java     |    2 +
 .../apache/solr/response/JSONWriterTest.java    |   23 +-
 .../solr/search/facet/TestJsonFacets.java       |   20 +-
 .../solr/spelling/SpellCheckCollatorTest.java   |    9 +-
 .../org/apache/solr/client/solrj/io/Tuple.java  |   10 +-
 .../client/solrj/io/stream/JSONTupleStream.java |    3 +-
 .../solr/client/solrj/io/stream/SolrStream.java |   43 +-
 .../client/solrj/io/stream/TupleStream.java     |   53 +-
 .../solrj/io/stream/TupleStreamParser.java      |   27 +
 .../solrj/io/stream/expr/Explanation.java       |   19 +-
 .../solrj/io/stream/expr/StreamExplanation.java |    7 +-
 145 files changed, 14699 insertions(+), 159 deletions(-)
----------------------------------------------------------------------



[13/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: bda84d84420f179118cec0bbf85854724520f755
Parents: 1366fcd c20d129
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Nov 15 21:14:16 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Nov 15 21:14:16 2016 -0600

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |   13 +
 lucene/benchmark/conf/highlighters-postings.alg |    4 +-
 lucene/benchmark/conf/highlighters-tv.alg       |    2 +-
 lucene/build.xml                                |    2 +
 .../simpletext/SimpleTextSegmentInfoFormat.java |  148 ++-
 .../lucene62/Lucene62SegmentInfoFormat.java     |  118 +-
 .../apache/lucene/index/IndexWriterConfig.java  |    3 +-
 .../org/apache/lucene/index/MultiSorter.java    |   68 +-
 .../java/org/apache/lucene/index/Sorter.java    |  102 +-
 .../lucene/search/SortedNumericSortField.java   |    5 +
 .../apache/lucene/index/TestIndexSorting.java   | 1030 ++++++++++++++++--
 .../uhighlight/AnalysisOffsetStrategy.java      |  261 ++---
 .../CompositeOffsetsPostingsEnum.java           |  145 +++
 .../search/uhighlight/FieldOffsetStrategy.java  |  115 +-
 .../uhighlight/MemoryIndexOffsetStrategy.java   |  129 +++
 .../uhighlight/MultiTermHighlighting.java       |  190 ----
 .../uhighlight/MultiValueTokenStream.java       |  148 ---
 .../lucene/search/uhighlight/OffsetsEnum.java   |    1 +
 .../lucene/search/uhighlight/Passage.java       |    2 +-
 .../lucene/search/uhighlight/PhraseHelper.java  |    2 +-
 .../uhighlight/PostingsOffsetStrategy.java      |    3 +-
 .../PostingsWithTermVectorsOffsetStrategy.java  |    8 +-
 .../uhighlight/TermVectorOffsetStrategy.java    |   15 +-
 .../uhighlight/TokenStreamFromTermVector.java   |  395 -------
 .../uhighlight/TokenStreamOffsetStrategy.java   |  173 +++
 .../search/uhighlight/UnifiedHighlighter.java   |  103 +-
 .../uhighlight/TestUnifiedHighlighterMTQ.java   |   39 +-
 .../TestUnifiedHighlighterRanking.java          |    5 +-
 .../TestUnifiedHighlighterExtensibility.java    |   11 +-
 .../index/BaseSegmentInfoFormatTestCase.java    |   91 +-
 solr/CHANGES.txt                                |    6 +
 .../store/blockcache/BlockDirectoryTest.java    |   14 +-
 .../solr/client/solrj/io/sql/StatementImpl.java |    9 +-
 .../client/solrj/io/stream/CloudSolrStream.java |   54 +-
 .../io/stream/FeaturesSelectionStream.java      |    8 +-
 .../solr/client/solrj/io/stream/JDBCStream.java |   55 +-
 .../client/solrj/io/stream/ParallelStream.java  |    8 +-
 .../solr/client/solrj/io/stream/SolrStream.java |    2 -
 .../client/solrj/io/stream/TextLogitStream.java |   12 +-
 .../client/solrj/io/stream/TopicStream.java     |   41 +-
 .../client/solrj/response/LukeResponse.java     |   31 +
 .../solr/client/solrj/SolrExampleTests.java     |    3 +-
 .../solr/client/solrj/io/sql/JdbcTest.java      |   61 +-
 .../client/solrj/io/stream/JDBCStreamTest.java  |   61 +-
 .../solrj/io/stream/StreamExpressionTest.java   |  324 +++---
 .../client/solrj/io/stream/StreamingTest.java   |  588 +++++-----
 46 files changed, 2762 insertions(+), 1846 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bda84d84/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
index bb0ed2c,4039358..143143f
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
@@@ -206,7 -209,8 +209,8 @@@ public class JDBCStream extends TupleSt
      try{
        resultSet = statement.executeQuery(sqlQuery);
      } catch (SQLException e) {
-       throw new IOException(String.format(Locale.ROOT, "Failed to execute sqlQuery '%s' against JDBC connection '%s'.\n"+ e.getMessage(), sqlQuery, connectionUrl), e);
 -      throw new IOException(String.format(Locale.ROOT, "Failed to execute sqlQuery '%s' against JDBC connection '%s'",
 -          sqlQuery, connectionUrl), e);
++      throw new IOException(String.format(Locale.ROOT, "Failed to execute sqlQuery '%s' against JDBC connection '%s'.\n"
++          + e.getMessage(), sqlQuery, connectionUrl), e);
      }
      
      try{
@@@ -221,8 -226,9 +226,8 @@@
      ResultSetValueSelector[] valueSelectors = new ResultSetValueSelector[metadata.getColumnCount()];
      
      for(int columnIdx = 0; columnIdx < metadata.getColumnCount(); ++columnIdx){
--      
-       final int columnNumber = columnIdx + 1; // cause it starts at 1        
+       final int columnNumber = columnIdx + 1; // cause it starts at 1
+       // Use getColumnLabel instead of getColumnName to make sure fields renamed with AS as picked up properly
        final String columnName = metadata.getColumnLabel(columnNumber);
        String className = metadata.getColumnClassName(columnNumber);
        String typeName = metadata.getColumnTypeName(columnNumber);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bda84d84/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bda84d84/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
----------------------------------------------------------------------


[10/50] lucene-solr:jira/solr-9858: Merged Cao Manh Dat changes

Posted by ab...@apache.org.
Merged Cao Manh Dat changes


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

Branch: refs/heads/jira/solr-9858
Commit: 6da7e7b0b1d94e69b8c3eedfafe24e73e9f51408
Parents: 99a6746
Author: Kevin Risden <kr...@apache.org>
Authored: Sat Nov 12 13:15:52 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Nov 14 10:56:02 2016 -0600

----------------------------------------------------------------------
 .../apache/solr/handler/sql/SolrEnumerator.java |   9 +-
 .../org/apache/solr/handler/sql/SolrFilter.java |   9 +-
 .../org/apache/solr/handler/sql/SolrRel.java    |   4 +-
 .../org/apache/solr/handler/sql/SolrRules.java  |  45 +++--
 .../org/apache/solr/handler/sql/SolrSort.java   |   7 +-
 .../org/apache/solr/handler/sql/SolrTable.java  | 120 +++++--------
 .../apache/solr/handler/sql/SolrTableScan.java  |   6 +
 .../org/apache/solr/handler/TestSQLHandler.java | 169 ++++++++-----------
 .../solr/client/solrj/io/stream/JDBCStream.java |   2 +-
 .../client/solrj/io/stream/RollupStream.java    |  16 +-
 .../client/solrj/io/stream/StatsStream.java     |  48 +++---
 .../solr/client/solrj/io/sql/JdbcTest.java      |  65 ++++---
 .../client/solrj/io/stream/StreamingTest.java   |  17 ++
 13 files changed, 248 insertions(+), 269 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
index 1714e67..4631788 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
@@ -70,16 +70,13 @@ class SolrEnumerator implements Enumerator<Object> {
 
   private Object getter(Tuple tuple, Map.Entry<String, Class> field) {
     Object val = tuple.get(field.getKey());
-    Class clazz = field.getValue();
 
-    if(clazz.equals(Double.class)) {
-      return val == null ? 0D : val;
+    if(val == null) {
+      return null;
     }
 
+    Class clazz = field.getValue();
     if(clazz.equals(Long.class)) {
-      if(val == null) {
-        return 0L;
-      }
       if(val instanceof Double) {
         return this.getRealVal(val);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
index 8c8d9cc..c6eb33c 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -88,11 +88,14 @@ class SolrFilter extends Filter implements SolrRel {
     }
 
     private String translateMatch2(RexNode node) {
-      Pair<String, RexLiteral> binaryTranslated = translateBinary((RexCall) node);
+      Pair<String, RexLiteral> binaryTranslated = null;
+      if (((RexCall) node).getOperands().size() == 2) {
+        binaryTranslated = translateBinary((RexCall) node);
+      }
 
       switch (node.getKind()) {
-//        case NOT:
-//          return translateBinary("-", "-", (RexCall) node);
+        case NOT:
+          return "-"+translateMatch2(((RexCall) node).getOperands().get(0));
         case EQUALS:
           return binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2();
         case NOT_EQUALS:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
index ce67a30..ea22951 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -68,9 +68,9 @@ interface SolrRel extends RelNode {
       column = this.fieldMappings.getOrDefault(column, column);
       this.metricPairs.add(new Pair<>(metric, column));
 
-      String metricIdentifier = metric + "(" + column + ")";
+      String metricIdentifier = metric.toLowerCase(Locale.ROOT) + "(" + column + ")";
       if(outName != null) {
-        this.addFieldMapping(outName, metricIdentifier.toLowerCase(Locale.ROOT));
+        this.addFieldMapping(outName, metricIdentifier);
       }
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
index bd39620..78c447b 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -47,10 +47,10 @@ import java.util.function.Predicate;
  */
 class SolrRules {
   static final RelOptRule[] RULES = {
+      SolrSortRule.SORT_RULE,
       SolrFilterRule.FILTER_RULE,
       SolrProjectRule.PROJECT_RULE,
-      SolrSortRule.SORT_RULE,
-//      SolrAggregateRule.AGGREGATE_RULE,
+      SolrAggregateRule.AGGREGATE_RULE,
   };
 
   static List<String> solrFieldNames(final RelDataType rowType) {
@@ -105,7 +105,7 @@ class SolrRules {
 
   /** Base class for planner rules that convert a relational expression to Solr calling convention. */
   abstract static class SolrConverterRule extends ConverterRule {
-    final Convention out;
+    final Convention out = SolrRel.CONVENTION;
 
     SolrConverterRule(Class<? extends RelNode> clazz, String description) {
       this(clazz, relNode -> true, description);
@@ -113,7 +113,6 @@ class SolrRules {
 
     <R extends RelNode> SolrConverterRule(Class<R> clazz, Predicate<RelNode> predicate, String description) {
       super(clazz, predicate::test, Convention.NONE, SolrRel.CONVENTION, description);
-      this.out = SolrRel.CONVENTION;
     }
   }
 
@@ -121,13 +120,22 @@ class SolrRules {
    * Rule to convert a {@link LogicalFilter} to a {@link SolrFilter}.
    */
   private static class SolrFilterRule extends SolrConverterRule {
+    private static boolean isNotFilterByExpr(List<RexNode> rexNodes, List<String> fieldNames) {
+      // We dont have a way to filter by result of aggregator now
+      boolean result = true;
+      for (RexNode rexNode : rexNodes) {
+        if (rexNode instanceof RexCall) {
+          result = result && isNotFilterByExpr(((RexCall) rexNode).getOperands(), fieldNames);
+        } else if (rexNode instanceof RexInputRef) {
+          result = result && !fieldNames.get(((RexInputRef) rexNode).getIndex()).startsWith("EXPR$");
+        }
+      }
+      return result;
+    }
+
     private static final Predicate<RelNode> FILTER_PREDICATE = relNode -> {
       List<RexNode> filterOperands = ((RexCall) ((LogicalFilter) relNode).getCondition()).getOperands();
-      return filterOperands.size() == 2 &&
-          ((!filterOperands.get(0).getKind().equals(SqlKind.LITERAL)
-              && filterOperands.get(1).getKind().equals(SqlKind.LITERAL))
-            || (filterOperands.get(0).getKind().equals(SqlKind.LITERAL)
-              && !filterOperands.get(1).getKind().equals(SqlKind.LITERAL)));
+      return isNotFilterByExpr(filterOperands, SolrRules.solrFieldNames(relNode.getRowType()));
     };
 
     private static final SolrFilterRule FILTER_RULE = new SolrFilterRule();
@@ -159,27 +167,28 @@ class SolrRules {
 
     public RelNode convert(RelNode rel) {
       final LogicalProject project = (LogicalProject) rel;
+      final RelNode converted = convert(project.getInput(), out);
       final RelTraitSet traitSet = project.getTraitSet().replace(out);
       return new SolrProject(
           rel.getCluster(),
           traitSet,
-          convert(project.getInput(), out),
+          converted,
           project.getProjects(),
           project.getRowType());
     }
   }
 
   /**
-   * Rule to convert a {@link Sort} to a {@link SolrSort}.
+   * Rule to convert a {@link LogicalSort} to a {@link SolrSort}.
    */
   private static class SolrSortRule extends SolrConverterRule {
+    static final SolrSortRule SORT_RULE = new SolrSortRule(LogicalSort.class, "SolrSortRule");
 
-    static final SolrSortRule SORT_RULE = new SolrSortRule();
-
-    private SolrSortRule() {
-      super(LogicalSort.class, relNode -> true, "SolrSortRule");
+    SolrSortRule(Class<? extends RelNode> clazz, String description) {
+      super(clazz, description);
     }
 
+    @Override
     public RelNode convert(RelNode rel) {
       final Sort sort = (Sort) rel;
       final RelTraitSet traitSet = sort.getTraitSet().replace(out).replace(sort.getCollation());
@@ -188,6 +197,7 @@ class SolrRules {
           traitSet,
           convert(sort.getInput(), traitSet.replace(RelCollations.EMPTY)),
           sort.getCollation(),
+          sort.offset,
           sort.fetch);
     }
   }
@@ -203,10 +213,11 @@ class SolrRules {
     private static final RelOptRule AGGREGATE_RULE = new SolrAggregateRule();
 
     private SolrAggregateRule() {
-      super(LogicalAggregate.class, AGGREGATE_PREDICTE, "SolrAggregateRule");
+      super(LogicalAggregate.class, "SolrAggregateRule");
     }
 
-     public RelNode convert(RelNode rel) {
+    @Override
+    public RelNode convert(RelNode rel) {
       final LogicalAggregate agg = (LogicalAggregate) rel;
       final RelTraitSet traitSet = agg.getTraitSet().replace(out);
       return new SolrAggregate(

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
index 7deabeb..751e841 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSort.java
@@ -36,8 +36,9 @@ import java.util.List;
  */
 class SolrSort extends Sort implements SolrRel {
 
-  SolrSort(RelOptCluster cluster, RelTraitSet traitSet, RelNode child, RelCollation collation, RexNode fetch) {
-    super(cluster, traitSet, child, collation, null, fetch);
+  SolrSort(RelOptCluster cluster, RelTraitSet traitSet, RelNode child, RelCollation collation, RexNode offset,
+           RexNode fetch) {
+    super(cluster, traitSet, child, collation, offset, fetch);
 
     assert getConvention() == SolrRel.CONVENTION;
     assert getConvention() == child.getConvention();
@@ -50,7 +51,7 @@ class SolrSort extends Sort implements SolrRel {
 
   @Override
   public Sort copy(RelTraitSet traitSet, RelNode input, RelCollation newCollation, RexNode offset, RexNode fetch) {
-    return new SolrSort(getCluster(), traitSet, input, collation, fetch);
+    return new SolrSort(getCluster(), traitSet, input, collation, offset, fetch);
   }
 
   public void implement(Implementor implementor) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index 6e4631c..e5fd88f 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -98,28 +98,29 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     // List<String> doesn't have add so must make a new ArrayList
     List<String> fieldsList = new ArrayList<>(fields.size());
     fieldsList.addAll(fields.stream().map(Map.Entry::getKey).collect(Collectors.toList()));
-    List<Pair<String, String>> ordersList = new ArrayList<>(orders);
+    LinkedHashMap<String,String> ordersMap = new LinkedHashMap<>();
+    for (Pair<String,String> order : orders) {
+      ordersMap.put(order.getKey(), order.getValue());
+    }
     List<Metric> metrics = buildMetrics(metricPairs);
     List<Bucket> bucketsList = buckets.stream().map(Bucket::new).collect(Collectors.toList());
 
     for(int i = buckets.size()-1; i >= 0; i--) {
-      ordersList.add(0, new Pair<>(buckets.get(i), "asc"));
+      if (!ordersMap.containsKey(buckets.get(i))) {
+        ordersMap.put(buckets.get(i), "asc");
+      }
     }
 
+    boolean isReOrder = false;
+
     for(Metric metric : metrics) {
       String metricIdentifier = metric.getIdentifier();
 
-      List<Pair<String, String>> newOrders= new ArrayList<>();
-      for(Pair<String, String> order : ordersList) {
-        String column = order.getKey();
-        if(!column.startsWith(metricIdentifier)) {
-          newOrders.add(order);
-        }
-      }
-      ordersList = newOrders;
+      ordersMap.remove(metricIdentifier);
 
       if(fieldsList.contains(metricIdentifier)) {
         fieldsList.remove(metricIdentifier);
+        isReOrder = true;
       }
 
       for(String column : metric.getColumns()) {
@@ -127,23 +128,24 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
           fieldsList.add(column);
         }
 
-        Pair<String, String> order = new Pair<>(column, "asc");
-        if(!ordersList.contains(order)) {
-          ordersList.add(order);
+        if (!ordersMap.containsKey(column)) {
+          ordersMap.put(column, "asc");
         }
       }
     }
 
-    ordersList.add(new Pair<>(DEFAULT_VERSION_FIELD, "desc"));
+    if (ordersMap.size() < 4) {
+      ordersMap.put(DEFAULT_VERSION_FIELD, "desc");
 
-    // Make sure the default sort field is in the field list
-    if (!fieldsList.contains(DEFAULT_VERSION_FIELD)) {
-      fieldsList.add(DEFAULT_VERSION_FIELD);
+      // Make sure the default sort field is in the field list
+      if (!fieldsList.contains(DEFAULT_VERSION_FIELD)) {
+        fieldsList.add(DEFAULT_VERSION_FIELD);
+      }
     }
 
-    if(!ordersList.isEmpty()) {
-      List<String> orderList = new ArrayList<>(ordersList.size());
-      for(Pair<String, String> order : ordersList) {
+    if(!ordersMap.isEmpty()) {
+      List<String> orderList = new ArrayList<>(ordersMap.size());
+      for(Map.Entry<String, String> order : ordersMap.entrySet()) {
         String column = order.getKey();
         if(!fieldsList.contains(column)) {
           fieldsList.add(column);
@@ -162,13 +164,13 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     TupleStream tupleStream;
     String zk = properties.getProperty("zk");
     try {
-      if (metrics.isEmpty()) {
-        if (limit == null) {
-          solrParams.add(CommonParams.QT, "/export");
-          tupleStream = new CloudSolrStream(zk, collection, solrParams);
-        } else {
+      if (metrics.isEmpty() && bucketsList.isEmpty()) {
+        solrParams.add(CommonParams.QT, "/export");
+        if (limit != null) {
           solrParams.add(CommonParams.ROWS, limit);
           tupleStream = new LimitStream(new CloudSolrStream(zk, collection, solrParams), Integer.parseInt(limit));
+        } else {
+          tupleStream = new CloudSolrStream(zk, collection, solrParams);
         }
       } else {
         Metric[] metricsArray = metrics.toArray(new Metric[metrics.size()]);
@@ -178,18 +180,20 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
           tupleStream = new StatsStream(zk, collection, solrParams, metricsArray);
         } else {
           solrParams.add(CommonParams.QT, "/export");
+
+          int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
+          if (numWorkers > 1) solrParams.add("partitionKeys",String.join(",", buckets));
+
           tupleStream = new CloudSolrStream(zk, collection, solrParams);
           tupleStream = new RollupStream(tupleStream, bucketsList.toArray(new Bucket[bucketsList.size()]), metricsArray);
 
-          String sortDirection = getSortDirection(ordersList);
-
-          int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
           if(numWorkers > 1) {
             String workerZkHost = properties.getProperty("workerZkhost");
             String workerCollection = properties.getProperty("workerCollection");
             // Do the rollups in parallel
             // Maintain the sort of the Tuples coming from the workers.
-            StreamComparator comp = bucketSortComp(bucketsList, sortDirection);
+            StreamComparator comp = bucketSortComp(bucketsList, ordersMap);
+
             ParallelStream parallelStream = new ParallelStream(workerZkHost, workerCollection, tupleStream, numWorkers, comp);
 
             StreamFactory factory = new StreamFactory()
@@ -204,14 +208,16 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
 
             parallelStream.setStreamFactory(factory);
             tupleStream = parallelStream;
+            isReOrder = true;
           }
 
-          if (!sortsEqual(bucketsList, sortDirection, ordersList)) {
+          if (isReOrder) {
             int limitVal = limit == null ? 100 : Integer.parseInt(limit);
-            StreamComparator comp = getComp(ordersList);
-            //Rank the Tuples
-            //If parallel stream is used ALL the Rolled up tuples from the workers will be ranked
-            //Providing a true Top or Bottom.
+            StreamComparator comp = getComp(orders);
+            if (orders.isEmpty() && !ordersMap.isEmpty()) {
+              // default order
+              comp = getComp(new ArrayList<>(ordersMap.entrySet()));
+            }
             tupleStream = new RankStream(tupleStream, limitVal, comp);
           } else {
             // Sort is the same as the same as the underlying stream
@@ -237,10 +243,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     };
   }
 
-  private static StreamComparator bucketSortComp(List<Bucket> buckets, String dir) {
+  private static StreamComparator bucketSortComp(List<Bucket> buckets, Map<String,String> dirs) {
     FieldComparator[] comps = new FieldComparator[buckets.size()];
     for(int i=0; i<buckets.size(); i++) {
-      ComparatorOrder comparatorOrder = ComparatorOrder.fromString(dir);
+      ComparatorOrder comparatorOrder = ComparatorOrder.fromString(dirs.get(buckets.get(i).toString()));
       String sortKey = buckets.get(i).toString();
       comps[i] = new FieldComparator(sortKey, comparatorOrder);
     }
@@ -252,52 +258,18 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     }
   }
 
-  private boolean sortsEqual(List<Bucket> buckets, String direction, List<Pair<String, String>> orders) {
-    if(buckets.size() != orders.size()) {
-      return false;
-    }
-
-    for(int i=0; i< buckets.size(); i++) {
-      Bucket bucket = buckets.get(i);
-      Pair<String, String> order = orders.get(i);
-      if(!bucket.toString().equals(getSortField(order))) {
-        return false;
-      }
-
-
-      if(!getSortDirection(order).equalsIgnoreCase(direction)) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-
-
-  private String getSortDirection(List<Pair<String, String>> orders) {
-    for(Pair<String, String> order : orders) {
-      return getSortDirection(order);
-    }
-
-    return "asc";
-  }
-
-  private String getSortField(Pair<String, String> order) {
-    return order.getKey();
-  }
-
-  private String getSortDirection(Pair<String, String> order) {
+  private String getSortDirection(Map.Entry<String, String> order) {
     String direction = order.getValue();
     return direction == null ? "asc" : direction;
   }
 
-  private StreamComparator getComp(List<Pair<String, String>> orders) {
+  private StreamComparator getComp(List<? extends Map.Entry<String, String>> orders) {
     FieldComparator[] comps = new FieldComparator[orders.size()];
     for(int i = 0; i < orders.size(); i++) {
-      Pair<String, String> order = orders.get(i);
+      Map.Entry<String, String> order = orders.get(i);
       String direction = getSortDirection(order);
       ComparatorOrder comparatorOrder = ComparatorOrder.fromString(direction);
-      String sortKey = getSortField(order);
+      String sortKey = order.getKey();
       comps[i] = new FieldComparator(sortKey, comparatorOrder);
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/java/org/apache/solr/handler/sql/SolrTableScan.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTableScan.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTableScan.java
index b12fb02..88c53ac 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTableScan.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTableScan.java
@@ -19,6 +19,7 @@ package org.apache.solr.handler.sql;
 import org.apache.calcite.plan.*;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.TableScan;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 
 import java.util.List;
@@ -49,6 +50,11 @@ class SolrTableScan extends TableScan implements SolrRel {
     assert getConvention() == SolrRel.CONVENTION;
   }
 
+  @Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) {
+    final float f = projectRowType == null ? 1f : (float) projectRowType.getFieldCount() / 100f;
+    return super.computeSelfCost(planner, mq).multiplyBy(.1 * f);
+  }
+
   @Override
   public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) {
     assert inputs.isEmpty();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
index c5e469a..5b92c30 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
@@ -70,20 +70,21 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
   @Test
   public void doTest() throws Exception {
     waitForRecoveriesToFinish(false);
+
     testBasicSelect();
-//    testWhere();
-//    testMixedCaseFields();
+    testWhere();
+    testMixedCaseFields();
     testBasicGrouping();
-    testBasicGroupingFacets(); // TODO push down facets
-//    testSelectDistinct(); // TODO fails due to sort asc by default missing
-//    testSelectDistinctFacets(); // TODO push down facets and fails due to sort asc by default missing
+    testBasicGroupingFacets();
+    testSelectDistinct();
+    testSelectDistinctFacets();
     testAggregatesWithoutGrouping();
-//    testSQLException(); // TODO fix exception checking
-//    testTimeSeriesGrouping();
-//    testTimeSeriesGroupingFacet(); // TODO push down facets
+    testSQLException();
+    testTimeSeriesGrouping();
+    testTimeSeriesGroupingFacet();
     testParallelBasicGrouping();
-//    testParallelSelectDistinct();
-//    testParallelTimeSeriesGrouping();
+    testParallelSelectDistinct();
+    testParallelTimeSeriesGrouping();
   }
 
   private void testBasicSelect() throws Exception {
@@ -112,7 +113,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 8);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.getLong("id") == 8);
@@ -373,29 +374,30 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       tuple = tuples.get(6);
       assertEquals(8L, tuple.get("id"));
 
+      // TODO requires different Calcite SQL conformance level
       // Not Equals !=
-      sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select id from collection1 where id != 1 order by id asc limit 10");
-
-      solrStream = new SolrStream(jetty.url, sParams);
-      tuples = getTuples(solrStream);
-
-      assertEquals(7, tuples.size());
-
-      tuple = tuples.get(0);
-      assertEquals(2L, tuple.get("id"));
-      tuple = tuples.get(1);
-      assertEquals(3L, tuple.get("id"));
-      tuple = tuples.get(2);
-      assertEquals(4L, tuple.get("id"));
-      tuple = tuples.get(3);
-      assertEquals(5L, tuple.get("id"));
-      tuple = tuples.get(4);
-      assertEquals(6L, tuple.get("id"));
-      tuple = tuples.get(5);
-      assertEquals(7L, tuple.get("id"));
-      tuple = tuples.get(6);
-      assertEquals(8L, tuple.get("id"));
+//      sParams = mapParams(CommonParams.QT, "/sql",
+//          "stmt", "select id from collection1 where id != 1 order by id asc limit 10");
+//
+//      solrStream = new SolrStream(jetty.url, sParams);
+//      tuples = getTuples(solrStream);
+//
+//      assertEquals(7, tuples.size());
+//
+//      tuple = tuples.get(0);
+//      assertEquals(2L, tuple.get("id"));
+//      tuple = tuples.get(1);
+//      assertEquals(3L, tuple.get("id"));
+//      tuple = tuples.get(2);
+//      assertEquals(4L, tuple.get("id"));
+//      tuple = tuples.get(3);
+//      assertEquals(5L, tuple.get("id"));
+//      tuple = tuples.get(4);
+//      assertEquals(6L, tuple.get("id"));
+//      tuple = tuples.get(5);
+//      assertEquals(7L, tuple.get("id"));
+//      tuple = tuples.get(6);
+//      assertEquals(8L, tuple.get("id"));
 
       // Less than
       sParams = mapParams(CommonParams.QT, "/sql",
@@ -474,14 +476,14 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       commit();
 
       SolrParams sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select id, Field_i, Str_s from Collection1 where Text_t='XXXX' order by Field_i desc");
+          "stmt", "select id, Field_i, Str_s from collection1 where Text_t='XXXX' order by Field_i desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
 
       assert(tuples.size() == 8);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.getLong("id") == 8);
@@ -523,8 +525,9 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("Field_i") == 7);
       assert(tuple.get("Str_s").equals("a"));
 
-      sParams = mapParams(CommonParams.QT, "/sql", 
-          "stmt", "select Str_s, sum(Field_i) as `sum(Field_i)` from Collection1 where 'id'='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
+      // TODO get sum(Field_i) as named one
+      sParams = mapParams(CommonParams.QT, "/sql",
+          "stmt", "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
       tuples = getTuples(solrStream);
@@ -533,14 +536,14 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       tuple = tuples.get(0);
       assert(tuple.get("Str_s").equals("c"));
-      assert(tuple.getDouble("sum(Field_i)") == 60);
+      assert(tuple.getDouble("EXPR$1") == 60);
 
       tuple = tuples.get(1);
       assert(tuple.get("Str_s").equals("a"));
-      assert(tuple.getDouble("sum(Field_i)") == 7);
+      assert(tuple.getDouble("EXPR$1") == 7);
 
       sParams = mapParams(CommonParams.QT, "/sql",
-        "stmt", "select Str_s, sum(Field_i) as `sum(Field_i)` from Collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
+        "stmt", "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
       tuples = getTuples(solrStream);
@@ -549,11 +552,11 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       tuple = tuples.get(0);
       assert(tuple.get("Str_s").equals("c"));
-      assert(tuple.getDouble("sum(Field_i)") == 60);
+      assert(tuple.getDouble("EXPR$1") == 60);
 
       tuple = tuples.get(1);
       assert(tuple.get("Str_s").equals("a"));
-      assert(tuple.getDouble("sum(Field_i)") == 7);
+      assert(tuple.getDouble("EXPR$1") == 7);
     } finally {
       delete();
     }
@@ -579,14 +582,13 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       commit();
 
       SolrParams sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select id, field_i, str_s from collection1 where text='XXXX' order by field_iff desc");
+          "stmt", "select id, str_s from collection1 where text='XXXX' order by field_iff desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
       Tuple tuple = getTuple(new ExceptionStream(solrStream));
       assert(tuple.EOF);
       assert(tuple.EXCEPTION);
-      //A parse exception detected before being sent to the search engine
-      assert(tuple.getException().contains("Fields in the sort spec must be included in the field list"));
+      assert(tuple.getException().contains("Column 'field_iff' not found in any table"));
 
       sParams = mapParams(CommonParams.QT, "/sql",
         "stmt", "select id, field_iff, str_s from collection1 where text='XXXX' order by field_iff desc");
@@ -595,38 +597,26 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       tuple = getTuple(new ExceptionStream(solrStream));
       assert(tuple.EOF);
       assert(tuple.EXCEPTION);
-      //An exception not detected by the parser thrown from the /select handler
-      assert(tuple.getException().contains("sort param field can't be found:"));
 
-      sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select str_s, count(*), sum(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
-
-      solrStream = new SolrStream(jetty.url, sParams);
-      tuple = getTuple(new ExceptionStream(solrStream));
-      assert(tuple.EOF);
-      assert(tuple.EXCEPTION);
-      //An exception not detected by the parser thrown from the /export handler
-      assert(tuple.getException().contains("undefined field:"));
+      assert(tuple.getException().contains("Column 'field_iff' not found in any table"));
 
       sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select str_s, count(*), blah(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
+          "stmt", "select str_s, count(*), sum(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
 
       solrStream = new SolrStream(jetty.url, sParams);
       tuple = getTuple(new ExceptionStream(solrStream));
       assert(tuple.EOF);
       assert(tuple.EXCEPTION);
-      //An exception not detected by the parser thrown from the /export handler
-      assert(tuple.getException().contains("Invalid function: blah"));
+      assert(tuple.getException().contains("Column 'field_iff' not found in any table"));
 
       sParams = mapParams(CommonParams.QT, "/sql",
-          "stmt", "select str_s from collection1 where text='XXXX' group by str_s");
+          "stmt", "select str_s, count(*), blah(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_i) = 19) AND (min(field_i) = 8))");
 
       solrStream = new SolrStream(jetty.url, sParams);
       tuple = getTuple(new ExceptionStream(solrStream));
       assert(tuple.EOF);
       assert(tuple.EXCEPTION);
-      assert(tuple.getException().contains("Group by queries must include atleast one aggregate function."));
-
+      assert(tuple.getException().contains("No match found for function signature blah"));
     } finally {
       delete();
     }
@@ -649,6 +639,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "6", "text", "XXXX XXXX", "str_s", "c", "field_i", "40");
       indexr("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50");
       indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60");
+      indexr("id", "9", "text", "XXXX XXXY", "str_s", "d", "field_i", "70");
       commit();
 
       SolrParams sParams = mapParams(CommonParams.QT, "/sql",
@@ -660,7 +651,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       //Only two results because of the limit.
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("b"));
@@ -703,11 +694,9 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      // TODO fix test - Cannot apply 'NOT' to arguments of type 'NOT<JAVATYPE(CLASS JAVA.LANG.STRING)>'. Supported form(s): 'NOT<BOOLEAN>'
-      /*
       sParams = mapParams(CommonParams.QT, "/sql",
         "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
-          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXX XXX')) "
+          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXY')) "
           + "group by str_s order by str_s desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -740,14 +729,13 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$2") == 27); //sum(field_i)
       assert(tuple.getDouble("EXPR$3") == 7); //min(field_i)
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
-      assert(tuple.getDouble("avg(field_i)") == 13.5D); //avg(field_i)
 
-      // TODO fix test - Cannot apply 'NOT' to arguments of type 'NOT<JAVATYPE(CLASS JAVA.LANG.STRING)>'. Supported form(s): 'NOT<BOOLEAN>'
-      /*
+      assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
+
       sParams = mapParams(CommonParams.QT, "/sql",
           "stmt", "select str_s as myString, count(*) as myCount, sum(field_i) as mySum, min(field_i) as myMin, "
           + "max(field_i) as myMax, cast(avg(1.0 * field_i) as float) as myAvg from collection1 "
-          + "where (text='XXXX' AND NOT (text='XXXX XXX')) group by str_s order by str_s desc");
+          + "where (text='XXXX' AND NOT (text='XXXY')) group by str_s order by str_s desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
       tuples = getTuples(solrStream);
@@ -780,7 +768,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("myMin") == 7);
       assert(tuple.getDouble("myMax") == 20);
       assert(tuple.getDouble("myAvg") == 13.5D);
-      */
 
       sParams = mapParams(CommonParams.QT, "/sql",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) " +
@@ -874,7 +861,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 6);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("a"));
@@ -991,8 +978,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       // Test without a sort. Sort should be asc by default.
-      /*
-      // TODO figure out what should be sort asc by default (version?)
       sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
         "stmt", "select distinct str_s, field_i from collection1");
 
@@ -1024,7 +1009,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       tuple = tuples.get(5);
       assert(tuple.get("str_s").equals("c"));
       assert(tuple.getLong("field_i") == 60);
-      */
 
       // Test with a predicate.
       sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
@@ -1069,14 +1053,12 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       SolrParams sParams = mapParams(CommonParams.QT, "/sql",
           "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
 
-      SolrStream solrStream = new SolrStream(jetty.url, sParams);
+      TupleStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
 
       assert(tuples.size() == 6);
 
-      Tuple tuple = null;
-
-      tuple = tuples.get(0);
+      Tuple tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("a"));
       assert(tuple.getLong("field_i") == 1);
 
@@ -1269,7 +1251,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 6);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("a"));
@@ -1455,6 +1437,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "6", "text", "XXXX XXXX", "str_s", "c", "field_i", "40");
       indexr("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50");
       indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60");
+      indexr("id", "9", "text", "XXXX XXXY", "str_s", "d", "field_i", "70");
       commit();
 
       SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
@@ -1468,7 +1451,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       //Only two results because of the limit.
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("b"));
@@ -1486,11 +1469,9 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      // TODO fix test - Cannot apply 'NOT' to arguments of type 'NOT<JAVATYPE(CLASS JAVA.LANG.STRING)>'. Supported form(s): 'NOT<BOOLEAN>'
-      /*
       sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
         "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
-          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXX XXX')) "
+          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXY')) "
           + "group by str_s order by str_s desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1525,10 +1506,9 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      // TODO fix test - Cannot apply 'NOT' to arguments of type 'NOT<JAVATYPE(CLASS JAVA.LANG.STRING)>'. Supported form(s): 'NOT<BOOLEAN>'
       sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
         "stmt", "select str_s as myString, count(*), sum(field_i) as mySum, min(field_i), max(field_i), "
-          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXX XXX')) "
+          + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT (text='XXXY')) "
           + "group by str_s order by myString desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1562,7 +1542,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$3") == 7); //min(field_i)
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
-      */
 
       sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "facet",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
@@ -1660,7 +1639,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       //Only two results because of the limit.
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("b"));
@@ -2015,7 +1994,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
@@ -2034,8 +2013,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 3);
 
-      tuple = null;
-
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
       assert(tuple.getLong("month_i") == 11);
@@ -2060,8 +2037,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 6);
 
-      tuple = null;
-
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
       assert(tuple.getLong("month_i") == 11);
@@ -2131,7 +2106,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
@@ -2242,7 +2217,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 2);
 
-      Tuple tuple = null;
+      Tuple tuple;
 
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
@@ -2262,8 +2237,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 3);
 
-      tuple = null;
-
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
       assert(tuple.getLong("month_i") == 11);
@@ -2291,8 +2264,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuples.size() == 6);
 
-      tuple = null;
-
       tuple = tuples.get(0);
       assert(tuple.getLong("year_i") == 2015);
       assert(tuple.getLong("month_i") == 11);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
index 4f71e17f..bb0ed2c 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
@@ -206,7 +206,7 @@ public class JDBCStream extends TupleStream implements Expressible {
     try{
       resultSet = statement.executeQuery(sqlQuery);
     } catch (SQLException e) {
-      throw new IOException(String.format(Locale.ROOT, "Failed to execute sqlQuery '%s' against JDBC connection '%s'", sqlQuery, connectionUrl), e);
+      throw new IOException(String.format(Locale.ROOT, "Failed to execute sqlQuery '%s' against JDBC connection '%s'.\n"+ e.getMessage(), sqlQuery, connectionUrl), e);
     }
     
     try{

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/RollupStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/RollupStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/RollupStream.java
index c43f847..dddf701 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/RollupStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/RollupStream.java
@@ -72,9 +72,7 @@ public class RollupStream extends TupleStream implements Expressible {
     if(1 != streamExpressions.size()){
       throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - expecting a single stream but found %d",expression, streamExpressions.size()));
     }
-    if(0 == metricExpressions.size()){
-      throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - expecting at least 1 metric but found %d",expression, metricExpressions.size()));
-    }
+
     if(null == overExpression || !(overExpression.getParameter() instanceof StreamExpressionValue)){
       throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - expecting single 'over' parameter listing fields to rollup by but didn't find one",expression));
     }
@@ -247,12 +245,14 @@ public class RollupStream extends TupleStream implements Expressible {
           t = new Tuple(map);
         }
 
-        currentMetrics = new Metric[metrics.length];
         currentKey = hashKey;
-        for(int i=0; i<metrics.length; i++) {
-          Metric bucketMetric = metrics[i].newInstance();
-          bucketMetric.update(tuple);
-          currentMetrics[i]  = bucketMetric;
+        if (metrics != null) {
+          currentMetrics = new Metric[metrics.length];
+          for(int i=0; i<metrics.length; i++) {
+            Metric bucketMetric = metrics[i].newInstance();
+            bucketMetric.update(tuple);
+            currentMetrics[i]  = bucketMetric;
+          }
         }
 
         if(t != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
index c0f4b43..6538902 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
@@ -57,7 +57,6 @@ public class StatsStream extends TupleStream implements Expressible  {
   private SolrParams params;
   private String collection;
   private boolean done;
-  private long count;
   private boolean doCount;
   protected transient SolrClientCache cache;
   protected transient CloudSolrClient cloudSolrClient;
@@ -195,8 +194,7 @@ public class StatsStream extends TupleStream implements Expressible  {
   }
 
   public List<TupleStream> children() {
-    List<TupleStream> l =  new ArrayList();
-    return l;
+    return new ArrayList<>();
   }
 
   public void open() throws IOException {
@@ -233,10 +231,9 @@ public class StatsStream extends TupleStream implements Expressible  {
       done = true;
       return tuple;
     } else {
-      Map fields = new HashMap();
+      Map<String, Object> fields = new HashMap<>();
       fields.put("EOF", true);
-      Tuple tuple = new Tuple(fields);
-      return tuple;
+      return new Tuple(fields);
     }
   }
 
@@ -245,7 +242,7 @@ public class StatsStream extends TupleStream implements Expressible  {
   }
 
   private void addStats(ModifiableSolrParams params, Metric[] _metrics) {
-    Map<String, List<String>> m = new HashMap();
+    Map<String, List<String>> m = new HashMap<>();
     for(Metric metric : _metrics) {
       String metricId = metric.getIdentifier();
       if(metricId.contains("(")) {
@@ -255,8 +252,11 @@ public class StatsStream extends TupleStream implements Expressible  {
         String column = parts[1];
         List<String> stats = m.get(column);
 
-        if(stats == null && !column.equals("*")) {
-          stats = new ArrayList();
+        if(stats == null) {
+          stats = new ArrayList<>();
+        }
+
+        if(!column.equals("*")) {
           m.put(column, stats);
         }
 
@@ -290,34 +290,36 @@ public class StatsStream extends TupleStream implements Expressible  {
 
   private Tuple getTuple(NamedList response) {
 
-    Map map = new HashMap();
+    Map<String, Object> map = new HashMap<>();
+    SolrDocumentList solrDocumentList = (SolrDocumentList) response.get("response");
+
+    long count = solrDocumentList.getNumFound();
 
     if(doCount) {
-      SolrDocumentList solrDocumentList = (SolrDocumentList) response.get("response");
-      this.count = solrDocumentList.getNumFound();
-      map.put("count(*)", this.count);
+      map.put("count(*)", count);
     }
 
-    NamedList stats = (NamedList)response.get("stats");
-    NamedList statsFields = (NamedList)stats.get("stats_fields");
+    if(count != 0) {
+      NamedList stats = (NamedList)response.get("stats");
+      NamedList statsFields = (NamedList)stats.get("stats_fields");
 
-    for(int i=0; i<statsFields.size(); i++) {
-      String field = statsFields.getName(i);
-      NamedList theStats = (NamedList)statsFields.getVal(i);
-      for(int s=0; s<theStats.size(); s++) {
-        addStat(map, field, theStats.getName(s), theStats.getVal(s));
+      for(int i=0; i<statsFields.size(); i++) {
+        String field = statsFields.getName(i);
+        NamedList theStats = (NamedList)statsFields.getVal(i);
+        for(int s=0; s<theStats.size(); s++) {
+          addStat(map, field, theStats.getName(s), theStats.getVal(s));
+        }
       }
     }
 
-    Tuple tuple = new Tuple(map);
-    return tuple;
+    return new Tuple(map);
   }
 
   public int getCost() {
     return 0;
   }
 
-  private void addStat(Map map, String field, String stat, Object val) {
+  private void addStat(Map<String, Object> map, String field, String stat, Object val) {
     if(stat.equals("mean")) {
       map.put("avg("+field+")", val);
     } else {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index fb53035..cd722f1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -816,39 +816,38 @@ public class JdbcTest extends SolrCloudTestCase {
     assertEquals(9, rs.getByte(4), 0);
     assertFalse(rs.wasNull());
 
-    // TODO figure out null checks?
-//    assertEquals(null, rs.getObject("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(null, rs.getObject(5));
-//    assertTrue(rs.wasNull());
-//    assertEquals(null, rs.getString("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(null, rs.getString(5));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0D, rs.getDouble("testnull_i"), 0);
-//    assertTrue(rs.wasNull());
-//    assertEquals(0D, rs.getDouble(5), 0);
-//    assertTrue(rs.wasNull());
-//    assertEquals(0F, rs.getFloat("testnull_i"), 0);
-//    assertTrue(rs.wasNull());
-//    assertEquals(0F, rs.getFloat(5), 0);
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getInt("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getInt(5));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0L, rs.getLong("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0L, rs.getLong(5));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getShort("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getShort(5));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getByte("testnull_i"));
-//    assertTrue(rs.wasNull());
-//    assertEquals(0, rs.getByte(5));
-//    assertTrue(rs.wasNull());
+    assertEquals(null, rs.getObject("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(null, rs.getObject(5));
+    assertTrue(rs.wasNull());
+    assertEquals(null, rs.getString("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(null, rs.getString(5));
+    assertTrue(rs.wasNull());
+    assertEquals(0D, rs.getDouble("testnull_i"), 0);
+    assertTrue(rs.wasNull());
+    assertEquals(0D, rs.getDouble(5), 0);
+    assertTrue(rs.wasNull());
+    assertEquals(0F, rs.getFloat("testnull_i"), 0);
+    assertTrue(rs.wasNull());
+    assertEquals(0F, rs.getFloat(5), 0);
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getInt("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getInt(5));
+    assertTrue(rs.wasNull());
+    assertEquals(0L, rs.getLong("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(0L, rs.getLong(5));
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getShort("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getShort(5));
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getByte("testnull_i"));
+    assertTrue(rs.wasNull());
+    assertEquals(0, rs.getByte(5));
+    assertTrue(rs.wasNull());
 
     assertFalse(rs.next());
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6da7e7b0/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
index 7a33a10..9b1ebb5 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
@@ -1500,6 +1500,23 @@ public class StreamingTest extends SolrCloudTestCase {
     assertEquals(5.5, avgf.doubleValue(), 0.01);
     assertEquals(2, count.doubleValue(), 0.01);
 
+    // Test will null metrics
+    rollupStream = new RollupStream(stream, buckets, metrics);
+    tuples = getTuples(rollupStream);
+
+    assert(tuples.size() == 3);
+    tuple = tuples.get(0);
+    bucket = tuple.getString("a_s");
+    assertTrue(bucket.equals("hello0"));
+
+    tuple = tuples.get(1);
+    bucket = tuple.getString("a_s");
+    assertTrue(bucket.equals("hello3"));
+
+    tuple = tuples.get(2);
+    bucket = tuple.getString("a_s");
+    assertTrue(bucket.equals("hello4"));
+
 
     //Test will null value in the grouping field
     new UpdateRequest()


[19/50] lucene-solr:jira/solr-9858: SEARCH-8593: Add tests from the HavingStream

Posted by ab...@apache.org.
SEARCH-8593: Add tests from the HavingStream


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

Branch: refs/heads/jira/solr-9858
Commit: 1c2eabd4e9b1fba746205f771c7788fd0e00dd02
Parents: 6c0cafe
Author: Joel Bernstein <jb...@apache.org>
Authored: Fri Dec 16 11:26:55 2016 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Fri Dec 16 11:27:56 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/StreamHandler.java  |  19 +-
 .../client/solrj/io/ops/EqualsOperation.java    |   2 +-
 .../io/ops/GreaterThanEqualToOperation.java     |   2 +-
 .../solrj/io/ops/GreaterThanOperation.java      |   2 +-
 .../solr/client/solrj/io/ops/LeafOperation.java |   2 +-
 .../solrj/io/ops/LessThanEqualToOperation.java  |   2 +-
 .../client/solrj/io/ops/LessThanOperation.java  |   2 +-
 .../solr/client/solrj/io/ops/NotOperation.java  |   2 +-
 .../client/solrj/io/stream/HavingStream.java    |   2 +-
 .../solrj/io/stream/StreamExpressionTest.java   | 201 +++++++++++++++++++
 10 files changed, 227 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/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 c6f3c62..6d161ec 100644
--- a/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/StreamHandler.java
@@ -31,9 +31,17 @@ import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
 import org.apache.solr.client.solrj.io.graph.GatherNodesStream;
 import org.apache.solr.client.solrj.io.graph.ShortestPathStream;
+import org.apache.solr.client.solrj.io.ops.AndOperation;
 import org.apache.solr.client.solrj.io.ops.ConcatOperation;
 import org.apache.solr.client.solrj.io.ops.DistinctOperation;
+import org.apache.solr.client.solrj.io.ops.EqualsOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanOperation;
 import org.apache.solr.client.solrj.io.ops.GroupOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanOperation;
+import org.apache.solr.client.solrj.io.ops.NotOperation;
+import org.apache.solr.client.solrj.io.ops.OrOperation;
 import org.apache.solr.client.solrj.io.ops.ReplaceOperation;
 import org.apache.solr.client.solrj.io.stream.*;
 import org.apache.solr.client.solrj.io.stream.expr.Explanation;
@@ -153,7 +161,16 @@ public class StreamHandler extends RequestHandlerBase implements SolrCoreAware,
       
       // stream reduction operations
       .withFunctionName("group", GroupOperation.class)
-      .withFunctionName("distinct", DistinctOperation.class);
+      .withFunctionName("distinct", DistinctOperation.class)
+      .withFunctionName("having", HavingStream.class)
+      .withFunctionName("and", AndOperation.class)
+      .withFunctionName("or", OrOperation.class)
+      .withFunctionName("not", NotOperation.class)
+      .withFunctionName("gt", GreaterThanOperation.class)
+      .withFunctionName("lt", LessThanOperation.class)
+      .withFunctionName("eq", EqualsOperation.class)
+      .withFunctionName("lteq", LessThanEqualToOperation.class)
+      .withFunctionName("gteq", GreaterThanEqualToOperation.class);
 
      // This pulls all the overrides and additions from the config
      List<PluginInfo> pluginInfos = core.getSolrConfig().getPluginInfos(Expressible.class.getName());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
index b7ea17d..1958551 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/EqualsOperation.java
@@ -49,7 +49,7 @@ public class EqualsOperation extends LeafOperation {
       return false;
     }
 
-    return d == val;
+    return d.doubleValue() == val;
   }
 
   public StreamExpression toExpression(StreamFactory factory) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
index 34bd521..87c8364 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanEqualToOperation.java
@@ -49,7 +49,7 @@ public class GreaterThanEqualToOperation extends LeafOperation {
       return false;
     }
 
-    return d >= val;
+    return d.doubleValue() >= val;
   }
 
   public StreamExpression toExpression(StreamFactory factory) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
index a58ad01..664438a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/GreaterThanOperation.java
@@ -49,7 +49,7 @@ public class GreaterThanOperation extends LeafOperation {
       return false;
     }
 
-    return d > val;
+    return d.doubleValue() > val;
   }
 
   public StreamExpression toExpression(StreamFactory factory) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
index bcd979a..b6ad897 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LeafOperation.java
@@ -45,7 +45,7 @@ public abstract class LeafOperation implements BooleanOperation {
 
   public LeafOperation(StreamExpression expression, StreamFactory factory) throws IOException {
     this.field = factory.getValueOperand(expression, 0);
-    this.val = Double.parseDouble(factory.getValueOperand(expression, 0));
+    this.val = Double.parseDouble(factory.getValueOperand(expression, 1));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
index 6278f14..2da3274 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanEqualToOperation.java
@@ -49,7 +49,7 @@ public class LessThanEqualToOperation extends LeafOperation {
       return true;
     }
 
-    return d <= val;
+    return d.doubleValue() <= val;
   }
 
   public StreamExpression toExpression(StreamFactory factory) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
index e37bee3..c1cec95 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/LessThanOperation.java
@@ -49,7 +49,7 @@ public class LessThanOperation extends LeafOperation {
       return true;
     }
     
-    return d < val;
+    return d.doubleValue() < val;
   }
 
   public StreamExpression toExpression(StreamFactory factory) throws IOException {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
index c16e4b3..0e40b72 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/NotOperation.java
@@ -49,7 +49,7 @@ public class NotOperation implements BooleanOperation {
     if(operationExpressions != null && operationExpressions.size() == 1) {
       StreamExpression op = operationExpressions.get(0);
       StreamOperation streamOp = factory.constructOperation(op);
-      if(op instanceof BooleanOperation) {
+      if(streamOp instanceof BooleanOperation) {
         operand = (BooleanOperation) streamOp;
       } else {
         throw new IOException("The NotOperation requires a BooleanOperation.");

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
index 9a79990..36ca113 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/HavingStream.java
@@ -74,7 +74,7 @@ public class HavingStream extends TupleStream implements Expressible {
     List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
 
     // validate expression contains only what we want.
-    if(expression.getParameters().size() != streamExpressions.size() + 2){
+    if(expression.getParameters().size() != streamExpressions.size() + 1){
       throw new IOException(String.format(Locale.ROOT,"Invalid expression %s - unknown operands found", expression));
     }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/1c2eabd4/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 ff5a062..bb842bf 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
@@ -33,8 +33,16 @@ import org.apache.solr.client.solrj.io.SolrClientCache;
 import org.apache.solr.client.solrj.io.Tuple;
 import org.apache.solr.client.solrj.io.comp.ComparatorOrder;
 import org.apache.solr.client.solrj.io.comp.FieldComparator;
+import org.apache.solr.client.solrj.io.ops.AndOperation;
 import org.apache.solr.client.solrj.io.ops.ConcatOperation;
+import org.apache.solr.client.solrj.io.ops.EqualsOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanOperation;
 import org.apache.solr.client.solrj.io.ops.GroupOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanOperation;
+import org.apache.solr.client.solrj.io.ops.NotOperation;
+import org.apache.solr.client.solrj.io.ops.OrOperation;
 import org.apache.solr.client.solrj.io.ops.ReplaceOperation;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpression;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParser;
@@ -727,6 +735,199 @@ public class StreamExpressionTest extends SolrCloudTestCase {
 
   }
 
+
+  @Test
+  public void testHavingStream() throws Exception {
+
+    SolrClientCache solrClientCache = new SolrClientCache();
+
+    new UpdateRequest()
+        .add(id, "0", "a_s", "hello0", "a_i", "0", "a_f", "1", "subject", "blah blah blah 0")
+        .add(id, "2", "a_s", "hello0", "a_i", "2", "a_f", "2", "subject", "blah blah blah 2")
+        .add(id, "3", "a_s", "hello3", "a_i", "3", "a_f", "3", "subject", "blah blah blah 3")
+        .add(id, "4", "a_s", "hello4", "a_i", "4", "a_f", "4", "subject", "blah blah blah 4")
+        .add(id, "1", "a_s", "hello0", "a_i", "1", "a_f", "5", "subject", "blah blah blah 1")
+        .add(id, "5", "a_s", "hello3", "a_i", "5", "a_f", "6", "subject", "blah blah blah 5")
+        .add(id, "6", "a_s", "hello4", "a_i", "6", "a_f", "7", "subject", "blah blah blah 6")
+        .add(id, "7", "a_s", "hello3", "a_i", "7", "a_f", "8", "subject", "blah blah blah 7")
+        .add(id, "8", "a_s", "hello3", "a_i", "8", "a_f", "9", "subject", "blah blah blah 8")
+        .add(id, "9", "a_s", "hello0", "a_i", "9", "a_f", "10", "subject", "blah blah blah 9")
+        .commit(cluster.getSolrClient(), COLLECTIONORALIAS);
+
+    TupleStream stream;
+    List<Tuple> tuples;
+
+    StreamFactory factory = new StreamFactory()
+        .withCollectionZkHost(COLLECTIONORALIAS, cluster.getZkServer().getZkAddress())
+        .withFunctionName("search", CloudSolrStream.class)
+        .withFunctionName("having", HavingStream.class)
+        .withFunctionName("and", AndOperation.class)
+        .withFunctionName("or", OrOperation.class)
+        .withFunctionName("not", NotOperation.class)
+        .withFunctionName("gt", GreaterThanOperation.class)
+        .withFunctionName("lt", LessThanOperation.class)
+        .withFunctionName("eq", EqualsOperation.class)
+        .withFunctionName("lteq", LessThanEqualToOperation.class)
+        .withFunctionName("gteq", GreaterThanEqualToOperation.class);
+
+    stream = factory.constructStream("having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\"), eq(a_i, 9))");
+    StreamContext context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 1);
+    Tuple t = tuples.get(0);
+    assertTrue(t.getString("id").equals("9"));
+
+    stream = factory.constructStream("having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\"), and(eq(a_i, 9),lt(a_i, 10)))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 1);
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("9"));
+
+    stream = factory.constructStream("having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\"), or(eq(a_i, 9),eq(a_i, 8)))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 2);
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("8"));
+
+    t = tuples.get(1);
+    assertTrue(t.getString("id").equals("9"));
+
+
+    stream = factory.constructStream("having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\"), and(eq(a_i, 9),not(eq(a_i, 9))))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 0);
+
+
+    stream = factory.constructStream("having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\"), and(lteq(a_i, 9), gteq(a_i, 8)))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    System.out.println("####Tuples:"+tuples.size());
+    assert(tuples.size() == 2);
+
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("8"));
+
+    t = tuples.get(1);
+    assertTrue(t.getString("id").equals("9"));
+
+    solrClientCache.close();
+  }
+
+
+  @Test
+  public void testParallelHavingStream() throws Exception {
+
+    SolrClientCache solrClientCache = new SolrClientCache();
+
+    new UpdateRequest()
+        .add(id, "0", "a_s", "hello0", "a_i", "0", "a_f", "1", "subject", "blah blah blah 0")
+        .add(id, "2", "a_s", "hello0", "a_i", "2", "a_f", "2", "subject", "blah blah blah 2")
+        .add(id, "3", "a_s", "hello3", "a_i", "3", "a_f", "3", "subject", "blah blah blah 3")
+        .add(id, "4", "a_s", "hello4", "a_i", "4", "a_f", "4", "subject", "blah blah blah 4")
+        .add(id, "1", "a_s", "hello0", "a_i", "1", "a_f", "5", "subject", "blah blah blah 1")
+        .add(id, "5", "a_s", "hello3", "a_i", "5", "a_f", "6", "subject", "blah blah blah 5")
+        .add(id, "6", "a_s", "hello4", "a_i", "6", "a_f", "7", "subject", "blah blah blah 6")
+        .add(id, "7", "a_s", "hello3", "a_i", "7", "a_f", "8", "subject", "blah blah blah 7")
+        .add(id, "8", "a_s", "hello3", "a_i", "8", "a_f", "9", "subject", "blah blah blah 8")
+        .add(id, "9", "a_s", "hello0", "a_i", "9", "a_f", "10", "subject", "blah blah blah 9")
+        .commit(cluster.getSolrClient(), COLLECTIONORALIAS);
+
+    TupleStream stream;
+    List<Tuple> tuples;
+
+    StreamFactory factory = new StreamFactory()
+        .withCollectionZkHost(COLLECTIONORALIAS, cluster.getZkServer().getZkAddress())
+        .withFunctionName("search", CloudSolrStream.class)
+        .withFunctionName("having", HavingStream.class)
+        .withFunctionName("and", AndOperation.class)
+        .withFunctionName("or", OrOperation.class)
+        .withFunctionName("not", NotOperation.class)
+        .withFunctionName("gt", GreaterThanOperation.class)
+        .withFunctionName("lt", LessThanOperation.class)
+        .withFunctionName("eq", EqualsOperation.class)
+        .withFunctionName("lteq", LessThanEqualToOperation.class)
+        .withFunctionName("gteq", GreaterThanEqualToOperation.class)
+        .withFunctionName("parallel", ParallelStream.class);
+
+    stream = factory.constructStream("parallel(" + COLLECTIONORALIAS + ", workers=2, sort=\"a_f asc\", having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=id), eq(a_i, 9)))");
+    StreamContext context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 1);
+    Tuple t = tuples.get(0);
+    assertTrue(t.getString("id").equals("9"));
+
+    stream = factory.constructStream("parallel(" + COLLECTIONORALIAS + ", workers=2, sort=\"a_f asc\", having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=id), and(eq(a_i, 9),lt(a_i, 10))))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 1);
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("9"));
+
+    stream = factory.constructStream("parallel(" + COLLECTIONORALIAS + ", workers=2, sort=\"a_f asc\",having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=id), or(eq(a_i, 9),eq(a_i, 8))))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 2);
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("8"));
+
+    t = tuples.get(1);
+    assertTrue(t.getString("id").equals("9"));
+
+
+    stream = factory.constructStream("parallel(" + COLLECTIONORALIAS + ", workers=2, sort=\"a_f asc\", having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=id), and(eq(a_i, 9),not(eq(a_i, 9)))))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    assert(tuples.size() == 0);
+
+
+    stream = factory.constructStream("parallel(" + COLLECTIONORALIAS + ", workers=2, sort=\"a_f asc\",having(search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=id), and(lteq(a_i, 9), gteq(a_i, 8))))");
+    context = new StreamContext();
+    context.setSolrClientCache(solrClientCache);
+    stream.setStreamContext(context);
+    tuples = getTuples(stream);
+
+    System.out.println("####Tuples:"+tuples.size());
+    assert(tuples.size() == 2);
+
+    t = tuples.get(0);
+    assertTrue(t.getString("id").equals("8"));
+
+    t = tuples.get(1);
+    assertTrue(t.getString("id").equals("9"));
+
+    solrClientCache.close();
+  }
+
   @Test
   public void testFetchStream() throws Exception {
 


[48/50] lucene-solr:jira/solr-9858: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/lucene-solr

Posted by ab...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/lucene-solr


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

Branch: refs/heads/jira/solr-9858
Commit: 4f29685edb1c68af5b7435c2e8fbd04d9512a03a
Parents: dcf41b9 fe5c760
Author: Joel Bernstein <jb...@apache.org>
Authored: Wed Feb 15 15:31:24 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 15 15:31:24 2017 -0500

----------------------------------------------------------------------
 .../src/test/org/apache/solr/rest/TestManagedResourceStorage.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------



[04/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 4275bc7124c8f97a645f479fd1ba3e44ff718cb6
Parents: 0188345 78b768f
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 10:23:30 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 10:23:30 2016 -0500

----------------------------------------------------------------------
 .../src/java/org/apache/solr/response/JSONResponseWriter.java | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[35/50] lucene-solr:jira/solr-9858: Fix two test issues an NPE and ordering issue

Posted by ab...@apache.org.
Fix two test issues an NPE and ordering issue


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

Branch: refs/heads/jira/solr-9858
Commit: 63eecedbc16fb22c824a31b2d8a92ab250b5e2cb
Parents: 7a3dd46
Author: Kevin Risden <kr...@apache.org>
Authored: Wed Feb 1 12:27:59 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Wed Feb 1 12:27:59 2017 -0500

----------------------------------------------------------------------
 .../solr/client/solrj/io/sql/JdbcTest.java      | 35 ++++++++++++++++----
 1 file changed, 28 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63eecedb/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index 9461725..927856a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -25,6 +25,10 @@ import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.SortedSet;
@@ -32,10 +36,12 @@ import java.util.TreeSet;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.AbstractDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
+import org.apache.solr.common.cloud.Aliases;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
@@ -499,14 +505,19 @@ public class JdbcTest extends SolrCloudTestCase {
 //      assertEquals(0, databaseMetaData.getDriverMajorVersion());
 //      assertEquals(0, databaseMetaData.getDriverMinorVersion());
 
+
+      List<String> tableSchemas = new ArrayList<>(Arrays.asList(zkHost, "metadata"));
       try(ResultSet rs = databaseMetaData.getSchemas()) {
         assertTrue(rs.next());
-        assertEquals(zkHost, rs.getString("tableSchem"));
+        assertTrue(tableSchemas.contains(rs.getString("tableSchem")));
+        tableSchemas.remove(rs.getString("tableSchem"));
         assertNull(rs.getString("tableCat"));
         assertTrue(rs.next());
-        assertEquals("metadata", rs.getString("tableSchem"));
+        assertTrue(tableSchemas.contains(rs.getString("tableSchem")));
+        tableSchemas.remove(rs.getString("tableSchem"));
         assertNull(rs.getString("tableCat"));
         assertFalse(rs.next());
+        assertTrue(tableSchemas.isEmpty());
       }
 
       try(ResultSet rs = databaseMetaData.getCatalogs()) {
@@ -515,13 +526,23 @@ public class JdbcTest extends SolrCloudTestCase {
         assertFalse(rs.next());
       }
 
-      ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader();
+      CloudSolrClient solrClient = cluster.getSolrClient();
+      solrClient.connect();
+      ZkStateReader zkStateReader = solrClient.getZkStateReader();
 
       SortedSet<String> tables = new TreeSet<>();
-      Set<String> collections = zkStateReader.getClusterState().getCollectionsMap().keySet();
-      Set<String> aliases = zkStateReader.getAliases().getCollectionAliasMap().keySet();
-      tables.addAll(collections);
-      tables.addAll(aliases);
+
+      Set<String> collectionsSet = zkStateReader.getClusterState().getCollectionsMap().keySet();
+      tables.addAll(collectionsSet);
+
+      Aliases aliases = zkStateReader.getAliases();
+      if(aliases != null) {
+        Map<String, String> collectionAliasMap = aliases.getCollectionAliasMap();
+        if(collectionAliasMap != null) {
+          Set<String> aliasesSet = collectionAliasMap.keySet();
+          tables.addAll(aliasesSet);
+        }
+      }
 
       try(ResultSet rs = databaseMetaData.getTables(null, zkHost, "%", null)) {
         for(String table : tables) {


[11/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 3c62f81b79a135f900d0e374e567274bbc467f8d
Parents: 6da7e7b 212b1d8
Author: Kevin Risden <kr...@apache.org>
Authored: Tue Nov 15 09:40:50 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Tue Nov 15 09:40:50 2016 -0600

----------------------------------------------------------------------
 .../lucene/search/DocValuesRewriteMethod.java   |  35 +-
 .../lucene/search/RandomAccessWeight.java       |  76 ----
 .../apache/lucene/facet/TestDrillSideways.java  |  32 +-
 .../lucene/search/DocValuesNumbersQuery.java    |  44 +-
 .../lucene/search/DocValuesRangeQuery.java      |  68 ++-
 .../lucene/search/DocValuesTermsQuery.java      |  35 +-
 .../serialized/SerializedDVStrategy.java        |  30 +-
 solr/CHANGES.txt                                |  11 +
 .../java/org/apache/solr/schema/FieldType.java  |  20 +-
 .../solr/schema/FieldTypePluginLoader.java      |  59 ++-
 .../solr/schema/HasImplicitIndexAnalyzer.java   |  25 ++
 .../apache/solr/schema/PreAnalyzedField.java    |   2 +-
 .../org/apache/solr/search/FastLRUCache.java    |  28 +-
 .../java/org/apache/solr/search/LRUCache.java   |   4 +-
 .../org/apache/solr/servlet/HttpSolrCall.java   |  87 ++--
 .../solr/store/blockcache/BlockCache.java       |  16 +-
 .../store/blockcache/BlockDirectoryCache.java   |  29 +-
 .../apache/solr/util/ConcurrentLRUCache.java    | 427 ++++++++++++-------
 .../conf/managed-schema                         |  41 ++
 .../conf/solrconfig.xml                         |  51 +++
 .../PreAnalyzedFieldManagedSchemaCloudTest.java |  73 ++++
 .../solr/servlet/HttpSolrCallGetCoreTest.java   | 167 ++++++++
 .../store/blockcache/BlockDirectoryTest.java    |  13 +-
 .../basic_configs/conf/solrconfig.xml           |   3 +
 .../conf/solrconfig.xml                         |   3 +
 .../conf/solrconfig.xml                         |   5 +-
 .../apache/solr/common/cloud/DocCollection.java |  42 +-
 .../client/solrj/io/stream/StreamingTest.java   |   7 +-
 28 files changed, 982 insertions(+), 451 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3c62f81b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamingTest.java
----------------------------------------------------------------------


[44/50] lucene-solr:jira/solr-9858: Merge branch 'jira/solr-8593'

Posted by ab...@apache.org.
Merge branch 'jira/solr-8593'


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

Branch: refs/heads/jira/solr-9858
Commit: bfeb4e7f848221e946f51f96ebb2e900e84e787f
Parents: aa7e980 ec6ee96
Author: Joel Bernstein <jb...@apache.org>
Authored: Wed Feb 15 13:55:09 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 15 13:55:09 2017 -0500

----------------------------------------------------------------------
 lucene/ivy-versions.properties                  |   18 +-
 solr/core/ivy.xml                               |   15 +-
 .../org/apache/solr/handler/SQLHandler.java     | 1703 +-----------------
 .../solr/handler/sql/CalciteSolrDriver.java     |   69 +
 .../apache/solr/handler/sql/LimitStream.java    |   89 +
 .../apache/solr/handler/sql/SolrAggregate.java  |  110 ++
 .../apache/solr/handler/sql/SolrEnumerator.java |  146 ++
 .../org/apache/solr/handler/sql/SolrFilter.java |  382 ++++
 .../org/apache/solr/handler/sql/SolrMethod.java |   44 +
 .../apache/solr/handler/sql/SolrProject.java    |   64 +
 .../org/apache/solr/handler/sql/SolrRel.java    |  105 ++
 .../org/apache/solr/handler/sql/SolrRules.java  |  234 +++
 .../org/apache/solr/handler/sql/SolrSchema.java |  128 ++
 .../org/apache/solr/handler/sql/SolrSort.java   |   79 +
 .../org/apache/solr/handler/sql/SolrTable.java  |  842 +++++++++
 .../apache/solr/handler/sql/SolrTableScan.java  |   81 +
 .../handler/sql/SolrToEnumerableConverter.java  |  135 ++
 .../sql/SolrToEnumerableConverterRule.java      |   39 +
 .../apache/solr/handler/sql/package-info.java   |   21 +
 .../org/apache/solr/handler/TestSQLHandler.java | 1282 +++++--------
 solr/licenses/avatica-core-1.9.0.jar.sha1       |    1 +
 solr/licenses/avatica-core-LICENSE-ASL.txt      |  268 +++
 solr/licenses/avatica-core-NOTICE.txt           |    5 +
 solr/licenses/calcite-core-1.11.0.jar.sha1      |    1 +
 solr/licenses/calcite-core-LICENSE-ASL.txt      |  268 +++
 solr/licenses/calcite-core-NOTICE.txt           |   12 +
 solr/licenses/calcite-linq4j-1.11.0.jar.sha1    |    1 +
 solr/licenses/calcite-linq4j-LICENSE-ASL.txt    |  268 +++
 solr/licenses/calcite-linq4j-NOTICE.txt         |   12 +
 solr/licenses/commons-compiler-2.7.6.jar.sha1   |    1 +
 solr/licenses/commons-compiler-LICENSE-BSD.txt  |   31 +
 solr/licenses/commons-compiler-NOTICE.txt       |    5 +
 .../eigenbase-properties-1.1.5.jar.sha1         |    1 +
 .../eigenbase-properties-LICENSE-ASL.txt        |  202 +++
 solr/licenses/eigenbase-properties-NOTICE.txt   |   20 +
 solr/licenses/janino-2.7.6.jar.sha1             |    1 +
 solr/licenses/janino-LICENSE-BSD.txt            |   31 +
 solr/licenses/janino-NOTICE.txt                 |    5 +
 solr/licenses/presto-parser-0.122.jar.sha1      |    1 -
 solr/licenses/protobuf-java-2.5.0.jar.sha1      |    1 -
 solr/licenses/protobuf-java-3.1.0.jar.sha1      |    1 +
 solr/licenses/slice-0.10.jar.sha1               |    1 -
 .../solrj/io/sql/DatabaseMetaDataImpl.java      |   18 +-
 .../client/solrj/io/stream/FacetStream.java     |    1 +
 .../solr/client/solrj/io/stream/JDBCStream.java |   33 +-
 .../client/solrj/io/stream/RollupStream.java    |   16 +-
 .../client/solrj/io/stream/StatsStream.java     |   48 +-
 .../solrj/io/stream/metrics/CountMetric.java    |   47 +-
 .../solrj/solr/collection1/conf/schema-sql.xml  |    2 +-
 .../solr/configsets/streaming/conf/schema.xml   |    6 +-
 .../solr/client/solrj/io/sql/JdbcTest.java      |   92 +-
 .../solrj/io/stream/StreamExpressionTest.java   |    3 -
 .../client/solrj/io/stream/StreamingTest.java   |   17 +
 53 files changed, 4482 insertions(+), 2524 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/bfeb4e7f/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------


[40/50] lucene-solr:jira/solr-9858: Update DOAP files.

Posted by ab...@apache.org.
Update DOAP 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/f3e19d8f
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/f3e19d8f
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/f3e19d8f

Branch: refs/heads/jira/solr-9858
Commit: f3e19d8fc0c9eb03846892a1dafe14a6d1f91218
Parents: f51253a
Author: Adrien Grand <jp...@gmail.com>
Authored: Wed Feb 15 17:08:46 2017 +0100
Committer: Adrien Grand <jp...@gmail.com>
Committed: Wed Feb 15 17:09:01 2017 +0100

----------------------------------------------------------------------
 dev-tools/doap/lucene.rdf | 7 +++++++
 dev-tools/doap/solr.rdf   | 7 +++++++
 2 files changed, 14 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f3e19d8f/dev-tools/doap/lucene.rdf
----------------------------------------------------------------------
diff --git a/dev-tools/doap/lucene.rdf b/dev-tools/doap/lucene.rdf
index 1e7e2c6..4b57d6c 100644
--- a/dev-tools/doap/lucene.rdf
+++ b/dev-tools/doap/lucene.rdf
@@ -124,6 +124,13 @@
     </release>
     <release>
       <Version>
+        <name>lucene-5.5.4</name>
+        <created>2017-02-15</created>
+        <revision>5.5.4</revision>
+      </Version>
+    </release>
+    <release>
+      <Version>
         <name>lucene-5.5.3</name>
         <created>2016-09-09</created>
         <revision>5.5.3</revision>

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f3e19d8f/dev-tools/doap/solr.rdf
----------------------------------------------------------------------
diff --git a/dev-tools/doap/solr.rdf b/dev-tools/doap/solr.rdf
index 229d4ef..47a6652 100644
--- a/dev-tools/doap/solr.rdf
+++ b/dev-tools/doap/solr.rdf
@@ -124,6 +124,13 @@
     </release>
     <release>
       <Version>
+        <name>solr-5.5.4</name>
+        <created>2017-02-15</created>
+        <revision>5.5.4</revision>
+      </Version>
+    </release>
+    <release>
+      <Version>
         <name>solr-5.5.3</name>
         <created>2016-09-09</created>
         <revision>5.5.3</revision>


[23/50] lucene-solr:jira/solr-9858: Add collection alias support for Calcite

Posted by ab...@apache.org.
Add collection alias support for Calcite


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

Branch: refs/heads/jira/solr-9858
Commit: 5f6548765822d72ef6cea873b9df60bc1ee4bc6a
Parents: 7a53e9a
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 6 15:32:41 2017 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 6 15:32:41 2017 -0600

----------------------------------------------------------------------
 .../org/apache/solr/handler/sql/SolrSchema.java | 13 ++++++++++--
 .../solr/client/solrj/io/sql/JdbcTest.java      | 21 ++++++++++++--------
 2 files changed, 24 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5f654876/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
index 8c3eaa9..221ddf8 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@ -25,6 +25,8 @@ import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
 import org.apache.solr.client.solrj.request.LukeRequest;
 import org.apache.solr.client.solrj.response.LukeResponse;
+import org.apache.solr.common.cloud.ClusterState;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.luke.FieldFlag;
 
 import java.io.IOException;
@@ -46,12 +48,19 @@ class SolrSchema extends AbstractSchema {
     String zk = this.properties.getProperty("zk");
     try(CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder().withZkHost(zk).build()) {
       cloudSolrClient.connect();
-      Set<String> collections = cloudSolrClient.getZkStateReader().getClusterState().getCollectionsMap().keySet();
+      ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
+      ClusterState clusterState = zkStateReader.getClusterState();
 
       final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder();
-      for (String collection : collections) {
+
+      for (String collection : clusterState.getCollectionsMap().keySet()) {
         builder.put(collection, new SolrTable(this, collection));
       }
+
+      for (Map.Entry<String, String> alias : zkStateReader.getAliases().getCollectionAliasMap().entrySet()) {
+        builder.put(alias.getKey(), new SolrTable(this, alias.getValue()));
+      }
+
       return builder.build();
     } catch (IOException e) {
       throw new RuntimeException(e);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/5f654876/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
index 69d236f..9461725 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/sql/JdbcTest.java
@@ -25,10 +25,10 @@ import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
 import java.util.Properties;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 
 import org.apache.lucene.util.LuceneTestCase;
 import org.apache.lucene.util.LuceneTestCase.Slow;
@@ -36,6 +36,7 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.UpdateRequest;
 import org.apache.solr.cloud.AbstractDistribZkTestBase;
 import org.apache.solr.cloud.SolrCloudTestCase;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -514,16 +515,20 @@ public class JdbcTest extends SolrCloudTestCase {
         assertFalse(rs.next());
       }
 
-      List<String> collections = new ArrayList<>();
-      collections.addAll(cluster.getSolrClient().getZkStateReader().getClusterState().getCollectionsMap().keySet());
-      Collections.sort(collections);
+      ZkStateReader zkStateReader = cluster.getSolrClient().getZkStateReader();
+
+      SortedSet<String> tables = new TreeSet<>();
+      Set<String> collections = zkStateReader.getClusterState().getCollectionsMap().keySet();
+      Set<String> aliases = zkStateReader.getAliases().getCollectionAliasMap().keySet();
+      tables.addAll(collections);
+      tables.addAll(aliases);
 
       try(ResultSet rs = databaseMetaData.getTables(null, zkHost, "%", null)) {
-        for(String acollection : collections) {
+        for(String table : tables) {
           assertTrue(rs.next());
           assertNull(rs.getString("tableCat"));
           assertEquals(zkHost, rs.getString("tableSchem"));
-          assertEquals(acollection, rs.getString("tableName"));
+          assertEquals(table, rs.getString("tableName"));
           assertEquals("TABLE", rs.getString("tableType"));
           assertNull(rs.getString("remarks"));
         }


[27/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 483bfa642322c2558e9696dccabf0ea60b5724de
Parents: 7371947 5b3565e
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 13 14:35:53 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 13 14:35:53 2017 -0500

----------------------------------------------------------------------
 build.xml                                                 |  2 +-
 lucene/CHANGES.txt                                        |  3 +++
 lucene/common-build.xml                                   |  2 +-
 solr/contrib/ltr/README.md                                | 10 +++++-----
 solr/contrib/ltr/example/README.md                        |  2 +-
 .../sample_techproducts_configs/conf/solrconfig.xml       |  6 +++---
 .../solr/client/solrj/impl/CloudSolrClientTest.java       |  4 ++--
 7 files changed, 16 insertions(+), 13 deletions(-)
----------------------------------------------------------------------



[24/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 3793eb5ec637f110e1be2acb94169be16ef549cc
Parents: 5f65487 cd4f908
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 6 15:47:02 2017 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 6 15:47:02 2017 -0600

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  40 +-
 solr/contrib/ltr/README.md                      | 390 +------------------
 solr/contrib/ltr/example/README.md              |  60 +++
 solr/contrib/ltr/example/config.json            |  13 +-
 solr/contrib/ltr/example/exampleFeatures.json   |  26 ++
 solr/contrib/ltr/example/libsvm_formatter.py    |  12 +-
 .../ltr/example/techproducts-features.json      |  26 --
 .../contrib/ltr/example/techproducts-model.json |  18 -
 .../ltr/example/train_and_upload_demo_model.py  | 143 ++++---
 .../ltr/store/rest/ManagedFeatureStore.java     |   3 -
 .../solr/ltr/store/rest/ManagedModelStore.java  |   6 +-
 .../multipleadditivetreesmodel.json             |   2 +-
 .../org/apache/solr/ltr/TestRerankBase.java     |   9 +-
 .../model/TestMultipleAdditiveTreesModel.java   |   9 +-
 .../solr/ltr/store/rest/TestModelManager.java   |  47 ++-
 .../store/rest/TestModelManagerPersistence.java |   4 +-
 .../apache/solr/cloud/rule/ReplicaAssigner.java |  31 +-
 .../java/org/apache/solr/cloud/rule/Rule.java   |   4 +-
 .../org/apache/solr/core/CoreContainer.java     |   5 +-
 .../solr/core/MetricsDirectoryFactory.java      |   6 +-
 .../src/java/org/apache/solr/core/SolrCore.java |  20 +
 .../org/apache/solr/core/SolrInfoMBean.java     |   4 +-
 .../org/apache/solr/handler/GraphHandler.java   |   3 +-
 .../apache/solr/handler/ReplicationHandler.java |  20 +-
 .../apache/solr/handler/RequestHandlerBase.java |   5 +-
 .../org/apache/solr/handler/StreamHandler.java  |   1 +
 .../solr/handler/admin/CoreAdminHandler.java    |   6 +-
 .../solr/handler/admin/MetricsHandler.java      |  16 +-
 .../component/HttpShardHandlerFactory.java      |  50 +--
 .../org/apache/solr/handler/sql/SolrSchema.java |   8 +-
 .../solr/metrics/SolrCoreMetricManager.java     |   9 +-
 .../apache/solr/metrics/SolrMetricProducer.java |  12 +-
 .../apache/solr/parser/SolrQueryParserBase.java |  26 +-
 .../request/PerSegmentSingleValuedFaceting.java |   9 +-
 .../org/apache/solr/request/SimpleFacets.java   |  37 +-
 .../solr/search/ComplexPhraseQParserPlugin.java |  70 +++-
 .../org/apache/solr/search/facet/HLLAgg.java    |  13 +-
 .../apache/solr/search/facet/PercentileAgg.java |   7 +-
 .../org/apache/solr/search/facet/SlotAcc.java   |   5 +-
 .../apache/solr/search/facet/UniqueSlotAcc.java |   2 +-
 .../java/org/apache/solr/update/PeerSync.java   |   8 +-
 .../apache/solr/update/UpdateShardHandler.java  |  21 +-
 .../stats/InstrumentedHttpRequestExecutor.java  |  48 +--
 ...entedPoolingHttpClientConnectionManager.java |  43 +-
 .../org/apache/solr/util/stats/MetricUtils.java |  13 +-
 .../apache/solr/cloud/rule/RuleEngineTest.java  |   2 +-
 .../solr/handler/admin/MetricsHandlerTest.java  |  36 +-
 .../solr/metrics/SolrCoreMetricManagerTest.java |   7 +-
 .../solr/metrics/SolrMetricTestUtils.java       |  47 +--
 .../apache/solr/request/SimpleFacetsTest.java   |  12 +-
 .../TestComplexPhraseLeadingWildcard.java       | 113 ++++++
 .../solr/search/facet/TestJsonFacets.java       |  71 +++-
 .../client/solrj/io/ops/BooleanOperation.java   |   6 +-
 .../solr/client/solrj/io/ops/LeafOperation.java |   8 +
 .../client/solrj/io/stream/HavingStream.java    |  21 +-
 .../solrj/io/stream/expr/StreamFactory.java     |   2 +
 .../solrj/io/stream/StreamExpressionTest.java   |  36 +-
 .../java/org/apache/solr/SolrTestCaseHS.java    |   4 +
 58 files changed, 779 insertions(+), 896 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3793eb5e/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
index 221ddf8,0000000..aecfd42
mode 100644,000000..100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@@ -1,120 -1,0 +1,124 @@@
 +/*
 + * 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.handler.sql;
 +
 +import com.google.common.collect.ImmutableMap;
 +import org.apache.calcite.rel.type.*;
 +import org.apache.calcite.schema.Table;
 +import org.apache.calcite.schema.impl.AbstractSchema;
 +import org.apache.calcite.sql.type.SqlTypeFactoryImpl;
 +import org.apache.solr.client.solrj.SolrServerException;
 +import org.apache.solr.client.solrj.impl.CloudSolrClient;
 +import org.apache.solr.client.solrj.request.LukeRequest;
 +import org.apache.solr.client.solrj.response.LukeResponse;
++import org.apache.solr.common.cloud.Aliases;
 +import org.apache.solr.common.cloud.ClusterState;
 +import org.apache.solr.common.cloud.ZkStateReader;
 +import org.apache.solr.common.luke.FieldFlag;
 +
 +import java.io.IOException;
 +import java.util.EnumSet;
 +import java.util.Map;
 +import java.util.Properties;
 +import java.util.Set;
 +
 +class SolrSchema extends AbstractSchema {
 +  final Properties properties;
 +
 +  SolrSchema(Properties properties) {
 +    super();
 +    this.properties = properties;
 +  }
 +
 +  @Override
 +  protected Map<String, Table> getTableMap() {
 +    String zk = this.properties.getProperty("zk");
 +    try(CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder().withZkHost(zk).build()) {
 +      cloudSolrClient.connect();
 +      ZkStateReader zkStateReader = cloudSolrClient.getZkStateReader();
 +      ClusterState clusterState = zkStateReader.getClusterState();
 +
 +      final ImmutableMap.Builder<String, Table> builder = ImmutableMap.builder();
 +
 +      for (String collection : clusterState.getCollectionsMap().keySet()) {
 +        builder.put(collection, new SolrTable(this, collection));
 +      }
 +
-       for (Map.Entry<String, String> alias : zkStateReader.getAliases().getCollectionAliasMap().entrySet()) {
-         builder.put(alias.getKey(), new SolrTable(this, alias.getValue()));
++      Aliases aliases = zkStateReader.getAliases();
++      if(aliases.collectionAliasSize() > 0) {
++        for (Map.Entry<String, String> alias : aliases.getCollectionAliasMap().entrySet()) {
++          builder.put(alias.getKey(), new SolrTable(this, alias.getValue()));
++        }
 +      }
 +
 +      return builder.build();
 +    } catch (IOException e) {
 +      throw new RuntimeException(e);
 +    }
 +  }
 +
 +  private Map<String, LukeResponse.FieldInfo> getFieldInfo(String collection) {
 +    String zk = this.properties.getProperty("zk");
 +    try(CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder().withZkHost(zk).build()) {
 +      cloudSolrClient.connect();
 +      LukeRequest lukeRequest = new LukeRequest();
 +      lukeRequest.setNumTerms(0);
 +      LukeResponse lukeResponse = lukeRequest.process(cloudSolrClient, collection);
 +      return lukeResponse.getFieldInfo();
 +    } catch (SolrServerException | IOException e) {
 +      throw new RuntimeException(e);
 +    }
 +  }
 +
 +  RelProtoDataType getRelDataType(String collection) {
 +    // Temporary type factory, just for the duration of this method. Allowable
 +    // because we're creating a proto-type, not a type; before being used, the
 +    // proto-type will be copied into a real type factory.
 +    final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
 +    final RelDataTypeFactory.FieldInfoBuilder fieldInfo = typeFactory.builder();
 +    Map<String, LukeResponse.FieldInfo> luceneFieldInfoMap = getFieldInfo(collection);
 +    for(Map.Entry<String, LukeResponse.FieldInfo> entry : luceneFieldInfoMap.entrySet()) {
 +      LukeResponse.FieldInfo luceneFieldInfo = entry.getValue();
 +
 +      RelDataType type;
 +      switch (luceneFieldInfo.getType()) {
 +        case "string":
 +          type = typeFactory.createJavaType(String.class);
 +          break;
 +        case "int":
 +        case "long":
 +          type = typeFactory.createJavaType(Long.class);
 +          break;
 +        case "float":
 +        case "double":
 +          type = typeFactory.createJavaType(Double.class);
 +          break;
 +        default:
 +          type = typeFactory.createJavaType(String.class);
 +      }
 +
 +      EnumSet<FieldFlag> flags = luceneFieldInfo.getFlags();
 +      if(flags != null && flags.contains(FieldFlag.MULTI_VALUED)) {
 +        type = typeFactory.createArrayType(type, -1);
 +      }
 +
 +      fieldInfo.add(entry.getKey(), type).nullable(true);
 +    }
 +
 +    return RelDataTypeImpl.proto(fieldInfo.build());
 +  }
 +}

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/3793eb5e/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java
index fd088f1,5b806a8..e84cb69
--- 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
@@@ -904,6 -914,17 +914,16 @@@ public class StreamExpressionTest exten
      t = tuples.get(1);
      assertTrue(t.getString("id").equals("9"));
  
 -
+     stream = factory.constructStream("having(rollup(over=a_f, sum(a_i), search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\")), and(eq(sum(a_i), 9),eq(sum(a_i), 9)))");
+     context = new StreamContext();
+     context.setSolrClientCache(solrClientCache);
+     stream.setStreamContext(context);
+     tuples = getTuples(stream);
+ 
+     assert(tuples.size() == 1);
+     t = tuples.get(0);
+     assertTrue(t.getDouble("a_f") == 10.0D);
+ 
      solrClientCache.close();
    }
  
@@@ -1001,6 -1023,19 +1022,17 @@@
      t = tuples.get(1);
      assertTrue(t.getString("id").equals("9"));
  
+     stream = factory.constructStream("parallel("+COLLECTIONORALIAS+", workers=2, sort=\"a_f asc\", having(rollup(over=a_f, sum(a_i), search(" + COLLECTIONORALIAS + ", q=*:*, fl=\"id,a_s,a_i,a_f\", sort=\"a_f asc\", partitionKeys=a_f)), and(eq(sum(a_i), 9),eq(sum(a_i),9))))");
+     context = new StreamContext();
+     context.setSolrClientCache(solrClientCache);
+     stream.setStreamContext(context);
+     tuples = getTuples(stream);
+ 
+     assert(tuples.size() == 1);
+ 
+     t = tuples.get(0);
+     assertTrue(t.getDouble("a_f") == 10.0D);
+ 
 -
 -
      solrClientCache.close();
    }
  


[18/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 6c0cafedac053cce81811f4e38f0eb8d756069c8
Parents: 37fdc37 3b182aa
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Dec 15 15:34:57 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Dec 15 15:34:57 2016 -0600

----------------------------------------------------------------------
 .gitignore                                      |    1 +
 dev-tools/scripts/smokeTestRelease.py           |    1 -
 lucene/CHANGES.txt                              |   42 +
 .../classification/utils/DatasetSplitter.java   |    3 +-
 .../codecs/memory/DirectPostingsFormat.java     |    3 +
 .../lucene/codecs/memory/FSTOrdTermsReader.java |    3 +
 .../lucene/codecs/memory/FSTTermsReader.java    |    3 +
 .../codecs/simpletext/SimpleTextBKDReader.java  |  281 ++-
 .../codecs/simpletext/SimpleTextBKDWriter.java  | 1661 ++++++++++++++++++
 .../simpletext/SimpleTextPointsReader.java      |    5 +-
 .../simpletext/SimpleTextPointsWriter.java      |  190 +-
 .../lucene/codecs/blocktree/FieldReader.java    |    3 +
 .../CompressingStoredFieldsWriter.java          |   19 +-
 .../CompressingTermVectorsWriter.java           |   11 +-
 .../GrowableByteArrayDataOutput.java            |   83 -
 .../codecs/lucene60/Lucene60PointsFormat.java   |   10 +-
 .../lucene/codecs/lucene60/package-info.java    |    4 +-
 .../lucene/codecs/lucene62/package-info.java    |    4 +-
 .../lucene70/Lucene70DocValuesConsumer.java     |  163 +-
 .../lucene70/Lucene70DocValuesFormat.java       |    5 +-
 .../lucene70/Lucene70DocValuesProducer.java     |  220 ++-
 .../lucene/codecs/lucene70/package-info.java    |   15 +-
 .../org/apache/lucene/index/CheckIndex.java     |  312 ++--
 .../org/apache/lucene/index/IndexWriter.java    |   63 +-
 .../apache/lucene/index/IndexWriterConfig.java  |    3 +
 .../org/apache/lucene/index/LeafReader.java     |    2 +-
 .../lucene/index/LiveIndexWriterConfig.java     |   13 +
 .../apache/lucene/index/PrefixCodedTerms.java   |    4 +-
 .../apache/lucene/index/SegmentCoreReaders.java |    8 +
 .../org/apache/lucene/index/SegmentInfos.java   |    7 +-
 .../src/java/org/apache/lucene/index/Terms.java |    8 +-
 .../store/GrowableByteArrayDataOutput.java      |  103 ++
 .../org/apache/lucene/store/MMapDirectory.java  |    4 +-
 .../java/org/apache/lucene/util/LongValues.java |    9 +
 .../org/apache/lucene/util/bkd/BKDReader.java   |  654 ++++---
 .../org/apache/lucene/util/bkd/BKDWriter.java   |  370 +++-
 .../apache/lucene/util/bkd/DocIdsWriter.java    |    4 +-
 .../apache/lucene/util/bkd/HeapPointReader.java |    7 +-
 .../apache/lucene/util/bkd/HeapPointWriter.java |   22 +-
 .../util/bkd/MutablePointsReaderUtils.java      |   21 +-
 .../lucene/util/bkd/OfflinePointReader.java     |    8 +-
 .../lucene/util/bkd/OfflinePointWriter.java     |   10 +-
 .../org/apache/lucene/util/bkd/PointReader.java |   14 +-
 .../org/apache/lucene/util/bkd/PointWriter.java |    6 +-
 .../apache/lucene/util/packed/DirectWriter.java |    8 +-
 .../TestGrowableByteArrayDataOutput.java        |   80 -
 .../lucene70/TestLucene70DocValuesFormat.java   |  152 ++
 .../apache/lucene/index/TestIndexSorting.java   |   30 +-
 .../org/apache/lucene/index/TestTermsEnum.java  |   18 +
 .../index/TestTragicIndexWriterDeadlock.java    |   69 +-
 .../apache/lucene/search/TestPointQueries.java  |    3 +
 .../store/TestGrowableByteArrayDataOutput.java  |   80 +
 .../apache/lucene/util/bkd/Test2BBKDPoints.java |   11 +-
 .../org/apache/lucene/util/bkd/TestBKD.java     |   54 +
 .../org/apache/lucene/util/fst/TestFSTs.java    |    2 +-
 .../uhighlight/MemoryIndexOffsetStrategy.java   |   10 +-
 .../uhighlight/MultiTermHighlighting.java       |   37 +-
 .../lucene/search/uhighlight/PhraseHelper.java  |  158 +-
 .../search/uhighlight/UnifiedHighlighter.java   |   64 +-
 .../uhighlight/TestUnifiedHighlighter.java      |  275 +++
 .../TestUnifiedHighlighterExtensibility.java    |    3 +-
 lucene/ivy-versions.properties                  |    2 +-
 .../apache/lucene/search/DocValuesStats.java    |  202 +++
 .../lucene/search/DocValuesStatsCollector.java  |   64 +
 .../search/TestDocValuesStatsCollector.java     |  212 +++
 .../apache/lucene/document/NearestNeighbor.java |   44 +-
 .../apache/lucene/document/RangeFieldQuery.java |    1 +
 .../lucene/search/DocValuesNumbersQuery.java    |   26 +-
 .../lucene/search/DocValuesTermsQuery.java      |   49 +-
 .../org/apache/lucene/search/LongHashSet.java   |  156 ++
 .../search/BaseRangeFieldQueryTestCase.java     |    2 +-
 .../apache/lucene/search/LongHashSetTests.java  |  100 ++
 .../lucene/search/TestDocValuesTermsQuery.java  |    1 +
 .../org/apache/lucene/search/QueryUtils.java    |    4 -
 solr/CHANGES.txt                                |   48 +
 .../TestPlainTextEntityProcessor.java           |  106 ++
 solr/contrib/ltr/README.md                      |    6 +-
 .../java/org/apache/solr/ltr/FeatureLogger.java |   10 +-
 .../org/apache/solr/ltr/LTRScoringQuery.java    |   22 +-
 .../org/apache/solr/ltr/LTRThreadModule.java    |   29 +
 .../org/apache/solr/ltr/feature/Feature.java    |    3 +-
 .../solr/ltr/feature/FieldValueFeature.java     |   18 +-
 .../solr/ltr/feature/OriginalScoreFeature.java  |   12 +-
 .../apache/solr/ltr/feature/SolrFeature.java    |   17 +-
 .../ltr/store/rest/ManagedFeatureStore.java     |    1 -
 .../solr/ltr/store/rest/ManagedModelStore.java  |   32 +-
 .../test-files/solr/collection1/conf/schema.xml |    2 +
 .../solr/ltr/feature/TestFieldValueFeature.java |   48 +-
 .../ltr/feature/TestOriginalScoreScorer.java    |   47 +
 .../model/TestMultipleAdditiveTreesModel.java   |   44 +-
 .../solr/cloud/CloudConfigSetService.java       |   24 +-
 .../org/apache/solr/cloud/CloudDescriptor.java  |    2 +-
 .../apache/solr/cloud/CreateCollectionCmd.java  |  146 +-
 .../org/apache/solr/cloud/ElectionContext.java  |   20 +-
 .../org/apache/solr/cloud/LeaderElector.java    |    9 +-
 .../OverseerAutoReplicaFailoverThread.java      |    9 +-
 .../org/apache/solr/cloud/ZkController.java     |  128 +-
 .../apache/solr/cloud/ZkSolrResourceLoader.java |    2 +-
 .../org/apache/solr/core/ConfigSetService.java  |    7 +-
 .../org/apache/solr/core/CoreContainer.java     |    2 +-
 .../src/java/org/apache/solr/core/SolrCore.java |    8 -
 .../solr/handler/admin/CollectionsHandler.java  |    2 +
 .../solr/handler/admin/SystemInfoHandler.java   |   51 +-
 .../solr/handler/component/ExpandComponent.java |    6 +
 .../solr/handler/component/QueryComponent.java  |   34 +-
 .../component/QueryElevationComponent.java      |   28 +-
 .../java/org/apache/solr/schema/BoolField.java  |    4 +-
 .../solr/schema/ManagedIndexSchemaFactory.java  |   12 +
 .../org/apache/solr/schema/SchemaManager.java   |    2 +-
 .../apache/solr/search/SolrFieldCacheMBean.java |    4 +-
 .../apache/solr/search/SolrIndexSearcher.java   |   26 +
 .../java/org/apache/solr/search/SortSpec.java   |   10 +
 .../facet/FacetFieldProcessorByArrayDV.java     |   49 +-
 .../org/apache/solr/search/facet/FieldUtil.java |  147 ++
 .../search/grouping/GroupingSpecification.java  |   70 +-
 .../distributed/command/QueryCommand.java       |    2 +-
 .../SearchGroupShardResponseProcessor.java      |    4 +-
 .../TopGroupsShardResponseProcessor.java        |    8 +-
 .../GroupedEndResultTransformer.java            |    4 +-
 .../apache/solr/search/mlt/CloudMLTQParser.java |   19 +-
 .../apache/solr/servlet/SolrDispatchFilter.java |   15 +
 .../apache/solr/servlet/SolrRequestParsers.java |   31 +-
 .../org/apache/solr/uninverting/FieldCache.java |   16 +-
 .../apache/solr/uninverting/FieldCacheImpl.java |  182 +-
 .../uninverting/FieldCacheSanityChecker.java    |    3 +-
 .../solr/uninverting/UninvertingReader.java     |   23 +-
 .../processor/DistributedUpdateProcessor.java   |    8 +-
 .../apache/solr/util/RecordingJSONParser.java   |   17 +-
 .../solr/util/SolrFileCleaningTracker.java      |  147 ++
 .../solr/cloud/DocValuesNotIndexedTest.java     |   64 +-
 .../apache/solr/cloud/LeaderElectionTest.java   |    2 +
 ...verseerCollectionConfigSetProcessorTest.java |   33 +-
 .../cloud/SegmentTerminateEarlyTestState.java   |   12 +-
 .../solr/cloud/TestMiniSolrCloudCluster.java    |   50 -
 .../apache/solr/cloud/TestSegmentSorting.java   |  133 ++
 .../org/apache/solr/cloud/ZkSolrClientTest.java |   54 +
 .../handler/component/TestExpandComponent.java  |   15 +
 .../ManagedSchemaRoundRobinCloudTest.java       |   98 ++
 .../solr/search/TestSolrFieldCacheMBean.java    |    2 +
 solr/licenses/commons-fileupload-1.3.1.jar.sha1 |    1 -
 solr/licenses/commons-fileupload-1.3.2.jar.sha1 |    1 +
 .../solr/client/solrj/impl/CloudSolrClient.java |    4 +
 .../solrj/impl/ConcurrentUpdateSolrClient.java  |   16 +-
 .../java/org/apache/solr/common/PushWriter.java |    2 +-
 .../apache/solr/common/cloud/SolrZkClient.java  |   29 +-
 .../apache/solr/common/cloud/ZkCmdExecutor.java |   15 +-
 .../solr/client/solrj/SolrExampleTests.java     |    7 +-
 .../apache/solr/client/solrj/SolrQueryTest.java |    2 +-
 .../solr/common/util/TestJsonRecordReader.java  |   35 +-
 149 files changed, 6939 insertions(+), 1661 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/6c0cafed/lucene/ivy-versions.properties
----------------------------------------------------------------------


[25/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 4b17b82a919cce9eb5e10f10b03fe6cedff49e1e
Parents: 3793eb5 024c403
Author: Kevin Risden <kr...@apache.org>
Authored: Fri Jan 6 16:03:20 2017 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Fri Jan 6 16:03:20 2017 -0600

----------------------------------------------------------------------
 .../apache/lucene/index/AutomatonTermsEnum.java |   3 +
 .../org/apache/lucene/index/TestTermsEnum.java  |   8 ++
 solr/contrib/ltr/example/README.md              | 118 +++++++++++++++----
 solr/contrib/ltr/example/user_queries.txt       |  12 +-
 4 files changed, 112 insertions(+), 29 deletions(-)
----------------------------------------------------------------------



[29/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: db6a3393a9e629ff511faaffef2636d7ec0ab6cb
Parents: 292e518 71aa463
Author: Kevin Risden <kr...@apache.org>
Authored: Wed Jan 18 10:45:57 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Wed Jan 18 10:45:57 2017 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  29 +-
 .../analysis/core/FlattenGraphFilter.java       | 418 +++++++++
 .../core/FlattenGraphFilterFactory.java         |  44 +
 .../miscellaneous/WordDelimiterFilter.java      |   9 +-
 .../WordDelimiterFilterFactory.java             |   6 +
 .../miscellaneous/WordDelimiterGraphFilter.java | 706 +++++++++++++++
 .../WordDelimiterGraphFilterFactory.java        | 199 ++++
 .../miscellaneous/WordDelimiterIterator.java    |  59 +-
 .../analysis/synonym/FlattenGraphFilter.java    | 417 ---------
 .../synonym/FlattenGraphFilterFactory.java      |  44 -
 .../lucene/analysis/synonym/SynonymFilter.java  |   1 +
 .../analysis/synonym/SynonymFilterFactory.java  |   1 +
 .../analysis/synonym/SynonymGraphFilter.java    |  11 +-
 ...ache.lucene.analysis.util.TokenFilterFactory |   3 +-
 .../analysis/core/TestFlattenGraphFilter.java   | 284 ++++++
 .../miscellaneous/TestWordDelimiterFilter.java  |  69 ++
 .../TestWordDelimiterGraphFilter.java           | 897 +++++++++++++++++++
 .../synonym/TestFlattenGraphFilter.java         | 284 ------
 .../synonym/TestSynonymGraphFilter.java         |  51 +-
 .../codecs/simpletext/SimpleTextBKDReader.java  |  50 ++
 .../lucene/analysis/TokenStreamToAutomaton.java |  39 +-
 .../tokenattributes/OffsetAttributeImpl.java    |   2 +-
 .../PackedTokenAttributeImpl.java               |   2 +-
 .../PositionIncrementAttributeImpl.java         |   3 +-
 .../PositionLengthAttributeImpl.java            |   3 +-
 .../org/apache/lucene/codecs/PointsWriter.java  |   5 +
 .../org/apache/lucene/index/CheckIndex.java     |  37 +
 .../lucene/index/DefaultIndexingChain.java      |   5 +-
 .../org/apache/lucene/index/IndexWriter.java    |  10 +-
 .../org/apache/lucene/index/PointValues.java    |   7 +
 .../apache/lucene/index/PointValuesWriter.java  |  10 +
 .../apache/lucene/index/SortingLeafReader.java  |   7 +-
 .../lucene/search/Boolean2ScorerSupplier.java   | 217 +++++
 .../org/apache/lucene/search/BooleanWeight.java | 136 +--
 .../apache/lucene/search/ConjunctionDISI.java   |   2 +-
 .../apache/lucene/search/ConjunctionScorer.java |   3 +-
 .../lucene/search/ConstantScoreQuery.java       |  46 +-
 .../lucene/search/MinShouldMatchSumScorer.java  |  22 +-
 .../apache/lucene/search/PointRangeQuery.java   | 214 +++--
 .../apache/lucene/search/ScorerSupplier.java    |  47 +
 .../apache/lucene/search/TermInSetQuery.java    |  93 +-
 .../java/org/apache/lucene/search/Weight.java   |  25 +
 .../org/apache/lucene/util/bkd/BKDReader.java   |  96 ++
 .../org/apache/lucene/util/bkd/BKDWriter.java   |  14 +-
 .../lucene/analysis/TestGraphTokenizers.java    |  53 +-
 .../lucene60/TestLucene60PointsFormat.java      | 192 +++-
 .../lucene/search/TermInSetQueryTest.java       | 123 +--
 .../search/TestBoolean2ScorerSupplier.java      | 332 +++++++
 .../search/TestBooleanQueryVisitSubscorers.java |   4 +-
 .../apache/lucene/search/TestFilterWeight.java  |   3 +-
 .../apache/lucene/search/TestPointQueries.java  |  35 +
 .../apache/lucene/util/TestDocIdSetBuilder.java |   5 +
 .../org/apache/lucene/util/bkd/TestBKD.java     |  90 ++
 .../util/bkd/TestMutablePointsReaderUtils.java  |   5 +
 .../apache/lucene/facet/MultiFacetQuery.java    |  13 +-
 .../apache/lucene/index/memory/MemoryIndex.java |   5 +
 .../lucene/search/DocValuesRangeQuery.java      |  11 +-
 .../lucene/search/IndexOrDocValuesQuery.java    | 116 +++
 .../search/TestIndexOrDocValuesQuery.java       |  89 ++
 .../spatial/prefix/NumberRangeFacetsTest.java   |   8 +-
 .../suggest/analyzing/AnalyzingSuggester.java   |   3 +-
 .../analysis/BaseTokenStreamTestCase.java       | 114 ++-
 .../lucene/analysis/TokenStreamToDot.java       |   5 +-
 .../asserting/AssertingLiveDocsFormat.java      |   9 +-
 .../codecs/cranky/CrankyPointsFormat.java       |   5 +
 .../lucene/index/AssertingLeafReader.java       |   7 +
 .../apache/lucene/search/AssertingWeight.java   |  42 +-
 solr/CHANGES.txt                                |  18 +-
 .../solr/highlight/UnifiedSolrHighlighter.java  |  10 +-
 .../solrconfig.snippet.randomindexconfig.xml    |  47 -
 .../configsets/doc-expiry/conf/solrconfig.xml   |  15 +-
 .../admin/SegmentsInfoRequestHandlerTest.java   |  20 +-
 .../component/SpellCheckComponentTest.java      |  36 +
 .../highlight/TestUnifiedSolrHighlighter.java   |   7 +-
 .../apache/solr/search/TestSolrQueryParser.java |  15 +
 75 files changed, 4794 insertions(+), 1270 deletions(-)
----------------------------------------------------------------------



[08/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 368204bf464abad947410dfb0bd23e8ead47ae5b
Parents: c3400e8 4d94510
Author: Kevin Risden <kr...@apache.org>
Authored: Sat Nov 12 11:16:18 2016 -0600
Committer: Kevin Risden <kr...@apache.org>
Committed: Sat Nov 12 11:16:18 2016 -0600

----------------------------------------------------------------------
 dev-tools/scripts/smokeTestRelease.py           |  23 +-
 lucene/CHANGES.txt                              |  12 +
 .../analysis/ja/JapaneseTokenizerFactory.java   |  17 +-
 lucene/benchmark/build.xml                      |   6 +-
 lucene/build.xml                                |   2 +-
 lucene/common-build.xml                         |   6 +-
 .../search/grouping/GroupingSearchTest.java     |  10 +-
 .../lucene/search/grouping/TestGrouping.java    |   2 +
 solr/contrib/ltr/README.md                      |  10 +-
 solr/contrib/ltr/example/solrconfig.xml         |   4 +-
 .../LTRFeatureLoggerTransformerFactory.java     | 256 +++++++++++++++++++
 .../ltr/response/transform/package-info.java    |  23 ++
 .../solr/ltr/search/LTRQParserPlugin.java       | 241 +++++++++++++++++
 .../apache/solr/ltr/search/package-info.java    |  23 ++
 .../LTRFeatureLoggerTransformerFactory.java     | 254 ------------------
 .../solr/response/transform/package-info.java   |  23 --
 .../apache/solr/search/LTRQParserPlugin.java    | 233 -----------------
 .../org/apache/solr/search/package-info.java    |  23 --
 solr/contrib/ltr/src/java/overview.html         |   6 +-
 .../solr/collection1/conf/solrconfig-ltr.xml    |   4 +-
 .../collection1/conf/solrconfig-ltr_Th10_10.xml |   4 +-
 .../collection1/conf/solrconfig-multiseg.xml    |   6 +-
 .../apache/solr/ltr/TestLTRQParserPlugin.java   |  14 +
 .../solr/ltr/store/rest/TestModelManager.java   |   2 +-
 24 files changed, 628 insertions(+), 576 deletions(-)
----------------------------------------------------------------------



[47/50] lucene-solr:jira/solr-9858: SOLR-6443, SOLR-6444: correct @AwaitsFix link for TestManagedResourceStorage

Posted by ab...@apache.org.
SOLR-6443, SOLR-6444: correct @AwaitsFix link for TestManagedResourceStorage


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

Branch: refs/heads/jira/solr-9858
Commit: fe5c7604c4a185aa81a7110bbd1e38821140eedd
Parents: 59b2a62
Author: Christine Poerschke <cp...@apache.org>
Authored: Wed Feb 15 20:28:22 2017 +0000
Committer: Christine Poerschke <cp...@apache.org>
Committed: Wed Feb 15 20:28:22 2017 +0000

----------------------------------------------------------------------
 .../src/test/org/apache/solr/rest/TestManagedResourceStorage.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/fe5c7604/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java b/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
index bbf8453..7314753 100644
--- a/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
+++ b/solr/core/src/test/org/apache/solr/rest/TestManagedResourceStorage.java
@@ -39,7 +39,7 @@ import org.junit.Test;
  * Depends on ZK for testing ZooKeeper backed storage logic.
  */
 @Slow
-@AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-6444")
+@AwaitsFix(bugUrl = "https://issues.apache.org/jira/browse/SOLR-6443")
 public class TestManagedResourceStorage extends AbstractZkTestCase {
 
   /**


[39/50] lucene-solr:jira/solr-9858: SOLR-8593: Make SQL handler friendlier out of the box

Posted by ab...@apache.org.
SOLR-8593: Make SQL handler friendlier out of the box


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

Branch: refs/heads/jira/solr-9858
Commit: ec6ee96ae6df1fdb2fffd881b45cb48670a10c5b
Parents: de512d7
Author: Joel Bernstein <jb...@apache.org>
Authored: Mon Feb 13 11:46:08 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Mon Feb 13 11:46:08 2017 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/SQLHandler.java     |   2 +-
 .../apache/solr/handler/sql/SolrEnumerator.java |  13 ++
 .../org/apache/solr/handler/sql/SolrFilter.java |  26 +--
 .../org/apache/solr/handler/sql/SolrSchema.java |   7 +-
 .../org/apache/solr/handler/sql/SolrTable.java  | 207 ++++++++++++++++---
 .../org/apache/solr/handler/TestSQLHandler.java |  74 ++++---
 .../solr/client/solrj/io/stream/JDBCStream.java |  28 ++-
 7 files changed, 269 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
index 549efac..d65ea56 100644
--- a/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SQLHandler.java
@@ -79,7 +79,7 @@ public class SQLHandler extends RequestHandlerBase implements SolrCoreAware, Per
     params.set("numWorkers", params.getInt("numWorkers", 1));
     params.set("workerCollection", params.get("workerCollection", defaultWorkerCollection));
     params.set("workerZkhost", params.get("workerZkhost", defaultZkhost));
-    params.set("aggregationMode", params.get("aggregationMode", "map_reduce"));
+    params.set("aggregationMode", params.get("aggregationMode", "facet"));
 
     TupleStream tupleStream = null;
     try {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
index 4299e61..6f9dddf 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrEnumerator.java
@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.Map;
 
 /** Enumerator that reads from a Solr collection. */
@@ -34,6 +35,7 @@ class SolrEnumerator implements Enumerator<Object> {
   private final TupleStream tupleStream;
   private final List<Map.Entry<String, Class>> fields;
   private Tuple current;
+  private char sep = 31;
 
   /** Creates a SolrEnumerator.
    *
@@ -84,6 +86,17 @@ class SolrEnumerator implements Enumerator<Object> {
       return val;
     }
 
+    if(val instanceof ArrayList) {
+      ArrayList arrayList = (ArrayList) val;
+      StringBuilder buf = new StringBuilder();
+
+      for(Object o : arrayList) {
+        buf.append(sep);
+        buf.append(o.toString());
+      }
+      val = buf.toString();
+    }
+
     return val;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
index 50102b1..ce12aec 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -132,7 +132,8 @@ class SolrFilter extends Filter implements SolrRel {
         case NOT:
           return "-" + translateComparison(((RexCall) node).getOperands().get(0));
         case EQUALS:
-          String terms = binaryTranslated.getValue().getValue2().toString().trim();
+          String terms = binaryTranslated.getValue().toString().trim();
+          terms = terms.replace("'","");
           if (!terms.startsWith("(") && !terms.startsWith("[") && !terms.startsWith("{")) {
             terms = "\"" + terms + "\"";
           }
@@ -141,19 +142,19 @@ class SolrFilter extends Filter implements SolrRel {
           this.negativeQuery = false;
           return clause;
         case NOT_EQUALS:
-          return "-(" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2() + ")";
+          return "-(" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue() + ")";
         case LESS_THAN:
           this.negativeQuery = false;
-          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " })";
+          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue() + " })";
         case LESS_THAN_OR_EQUAL:
           this.negativeQuery = false;
-          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " ])";
+          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue() + " ])";
         case GREATER_THAN:
           this.negativeQuery = false;
-          return "(" + binaryTranslated.getKey() + ": { " + binaryTranslated.getValue().getValue2() + " TO * ])";
+          return "(" + binaryTranslated.getKey() + ": { " + binaryTranslated.getValue() + " TO * ])";
         case GREATER_THAN_OR_EQUAL:
           this.negativeQuery = false;
-          return "(" + binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue().getValue2() + " TO * ])";
+          return "(" + binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue() + " TO * ])";
         default:
           throw new AssertionError("cannot translate " + node);
       }
@@ -305,21 +306,20 @@ class SolrFilter extends Filter implements SolrRel {
       }
 
       switch (node.getKind()) {
-
         case EQUALS:
-          String terms = binaryTranslated.getValue().getValue2().toString().trim();
+          String terms = binaryTranslated.getValue().toString().trim();
           String clause = "eq(" + binaryTranslated.getKey() + "," + terms + ")";
           return clause;
         case NOT_EQUALS:
-          return "not(eq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + "))";
+          return "not(eq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue() + "))";
         case LESS_THAN:
-          return "lt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+          return "lt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue() + ")";
         case LESS_THAN_OR_EQUAL:
-          return "lteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+          return "lteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue() + ")";
         case GREATER_THAN:
-          return "gt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+          return "gt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue() + ")";
         case GREATER_THAN_OR_EQUAL:
-          return "gteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+          return "gteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue() + ")";
         default:
           throw new AssertionError("cannot translate " + node);
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
index 221c2b6..83fa537 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrSchema.java
@@ -90,6 +90,7 @@ class SolrSchema extends AbstractSchema {
     final RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
     final RelDataTypeFactory.FieldInfoBuilder fieldInfo = typeFactory.builder();
     Map<String, LukeResponse.FieldInfo> luceneFieldInfoMap = getFieldInfo(collection);
+
     for(Map.Entry<String, LukeResponse.FieldInfo> entry : luceneFieldInfoMap.entrySet()) {
       LukeResponse.FieldInfo luceneFieldInfo = entry.getValue();
 
@@ -110,13 +111,17 @@ class SolrSchema extends AbstractSchema {
           type = typeFactory.createJavaType(String.class);
       }
 
-      EnumSet<FieldFlag> flags = luceneFieldInfo.getFlags();
+      EnumSet<FieldFlag> flags = luceneFieldInfo.parseFlags(luceneFieldInfo.getSchema());
+      /*
       if(flags != null && flags.contains(FieldFlag.MULTI_VALUED)) {
         type = typeFactory.createArrayType(type, -1);
       }
+      */
 
       fieldInfo.add(entry.getKey(), type).nullable(true);
     }
+    fieldInfo.add("_query_",typeFactory.createJavaType(String.class));
+    fieldInfo.add("score",typeFactory.createJavaType(Double.class));
 
     return RelDataTypeImpl.proto(fieldInfo.build());
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index 5f64231..6784323 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -32,6 +32,9 @@ import org.apache.solr.client.solrj.io.comp.ComparatorOrder;
 import org.apache.solr.client.solrj.io.comp.FieldComparator;
 import org.apache.solr.client.solrj.io.comp.MultipleFieldComparator;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
+import org.apache.solr.client.solrj.io.eq.FieldEqualitor;
+import org.apache.solr.client.solrj.io.eq.MultipleFieldEqualitor;
+import org.apache.solr.client.solrj.io.eq.StreamEqualitor;
 import org.apache.solr.client.solrj.io.ops.AndOperation;
 import org.apache.solr.client.solrj.io.ops.BooleanOperation;
 import org.apache.solr.client.solrj.io.ops.EqualsOperation;
@@ -216,10 +219,10 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     }
   }
 
-  private List<Metric> buildMetrics(List<Pair<String, String>> metricPairs) {
+  private List<Metric> buildMetrics(List<Pair<String, String>> metricPairs, boolean ifEmptyCount) {
     List<Metric> metrics = new ArrayList<>(metricPairs.size());
     metrics.addAll(metricPairs.stream().map(this::getMetric).collect(Collectors.toList()));
-    if(metrics.size() == 0) {
+    if(metrics.size() == 0 && ifEmptyCount) {
       metrics.add(new CountMetric());
     }
     return metrics;
@@ -253,15 +256,35 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     ModifiableSolrParams params = new ModifiableSolrParams();
     params.add(CommonParams.Q, query);
 
+    //Validate the fields
+    for(Map.Entry<String, Class> entry : fields) {
+      String fname = entry.getKey();
+      if(limit == null && "score".equals(fname)) {
+        throw new IOException("score is not a valid field for unlimited queries.");
+      }
+
+      if(fname.contains("*")) {
+        throw new IOException("* is not supported for column selection.");
+      }
+    }
+
+    String fl = getFields(fields);
+
     if(orders.size() > 0) {
       params.add(CommonParams.SORT, getSort(orders));
     } else {
-      params.add(CommonParams.SORT, "_version_ desc");
+      if(limit == null) {
+        params.add(CommonParams.SORT, "_version_ desc");
+        fl = fl+",_version_";
+      } else {
+        params.add(CommonParams.SORT, "score desc");
+        if(fl.indexOf("score") == -1) {
+          fl = fl + ",score";
+        }
+      }
     }
 
-    if(fields.size() > 0) {
-      params.add(CommonParams.FL, getFields(fields));
-    }
+    params.add(CommonParams.FL, fl);
 
     if (limit != null) {
       params.add(CommonParams.ROWS, limit);
@@ -284,26 +307,23 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return buf.toString();
   }
 
+  private String getSingleSort(Pair<String, String> order) {
+    StringBuilder buf = new StringBuilder();
+    buf.append(order.getKey()).append(" ").append(order.getValue());
+    return buf.toString();
+  }
+
   private String getFields(List<Map.Entry<String, Class>> fields) {
     StringBuilder buf = new StringBuilder();
-    boolean appendVersion = true;
     for(Map.Entry<String, Class> field : fields) {
 
       if(buf.length() > 0) {
         buf.append(",");
       }
 
-      if(field.getKey().equals("_version_")) {
-        appendVersion = false;
-      }
-
       buf.append(field.getKey());
     }
 
-    if(appendVersion){
-      buf.append(",_version_");
-    }
-
     return buf.toString();
   }
 
@@ -420,7 +440,11 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
 
     Bucket[] buckets = buildBuckets(_buckets, fields);
-    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+    Metric[] metrics = buildMetrics(metricPairs, false).toArray(new Metric[0]);
+
+    if(metrics.length == 0) {
+      return handleSelectDistinctMapReduce(zk, collection, properties, fields, query, orders, buckets, limit);
+    }
 
     Set<String> fieldSet = getFieldSet(metrics, fields);
 
@@ -527,7 +551,6 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return bucketsArray;
   }
 
-
   private TupleStream handleGroupByFacet(String zkHost,
                                          String collection,
                                          final List<Map.Entry<String, Class>> fields,
@@ -542,13 +565,13 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     solrParams.add(CommonParams.Q, query);
 
     Bucket[] buckets = buildBuckets(bucketFields, fields);
-    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+    Metric[] metrics = buildMetrics(metricPairs, true).toArray(new Metric[0]);
     if(metrics.length == 0) {
       metrics = new Metric[1];
       metrics[0] = new CountMetric();
     }
 
-    int limit = lim != null ? Integer.parseInt(lim) : 100;
+    int limit = lim != null ? Integer.parseInt(lim) : 1000;
 
     FieldComparator[] sorts = null;
 
@@ -561,13 +584,15 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       sorts = getComps(orders);
     }
 
+    int overfetch = (int)(limit * 1.25);
+
     TupleStream tupleStream = new FacetStream(zkHost,
                                               collection,
                                               solrParams,
                                               buckets,
                                               metrics,
                                               sorts,
-                                              limit);
+                                              overfetch);
 
 
 
@@ -602,30 +627,144 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     return tupleStream;
   }
 
-  private TupleStream handleSelectDistinctMapReduce(final Properties properties,
+  private TupleStream handleSelectDistinctMapReduce(final String zkHost,
+                                                    final String collection,
+                                                    final Properties properties,
                                                     final List<Map.Entry<String, Class>> fields,
                                                     final String query,
                                                     final List<Pair<String, String>> orders,
-                                                    final List<String> buckets,
-                                                    final List<Pair<String, String>> metricPairs,
-                                                    final String limit) {
+                                                    final Bucket[] buckets,
+                                                    final String limit) throws IOException{
+
+    int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
+
+    String fl = getFields(fields);
+
+    String sort = null;
+    StreamEqualitor ecomp = null;
+    StreamComparator comp = null;
+
+    if(orders != null && orders.size() > 0) {
+      StreamComparator[] adjustedSorts = adjustSorts(orders, buckets);
+      // Because of the way adjustSorts works we know that each FieldComparator has a single
+      // field name. For this reason we can just look at the leftFieldName
+      FieldEqualitor[] fieldEqualitors = new FieldEqualitor[adjustedSorts.length];
+      StringBuilder buf = new StringBuilder();
+      for(int i=0; i<adjustedSorts.length; i++) {
+        FieldComparator fieldComparator = (FieldComparator)adjustedSorts[i];
+        fieldEqualitors[i] = new FieldEqualitor(fieldComparator.getLeftFieldName());
+        if(i>0) {
+          buf.append(",");
+        }
+        buf.append(fieldComparator.getLeftFieldName()).append(" ").append(fieldComparator.getOrder().toString());
+      }
+
+      sort = buf.toString();
+
+      if(adjustedSorts.length == 1) {
+        ecomp = fieldEqualitors[0];
+        comp = adjustedSorts[0];
+      } else {
+        ecomp = new MultipleFieldEqualitor(fieldEqualitors);
+        comp = new MultipleFieldComparator(adjustedSorts);
+      }
+    } else {
+      StringBuilder sortBuf = new StringBuilder();
+      FieldEqualitor[] equalitors = new FieldEqualitor[buckets.length];
+      StreamComparator[] streamComparators = new StreamComparator[buckets.length];
+      for(int i=0; i<buckets.length; i++) {
+        equalitors[i] = new FieldEqualitor(buckets[i].toString());
+        streamComparators[i] = new FieldComparator(buckets[i].toString(), ComparatorOrder.ASCENDING);
+        if(i>0) {
+          sortBuf.append(',');
+        }
+        sortBuf.append(buckets[i].toString()).append(" asc");
+      }
 
+      sort = sortBuf.toString();
 
+      if(equalitors.length == 1) {
+        ecomp = equalitors[0];
+        comp = streamComparators[0];
+      } else {
+        ecomp = new MultipleFieldEqualitor(equalitors);
+        comp = new MultipleFieldComparator(streamComparators);
+      }
+    }
 
+    ModifiableSolrParams params = new ModifiableSolrParams();
 
+    params.set(CommonParams.FL, fl);
+    params.set(CommonParams.Q, query);
+    //Always use the /export handler for Distinct Queries because it requires exporting full result sets.
+    params.set(CommonParams.QT, "/export");
 
+    if(numWorkers > 1) {
+      params.set("partitionKeys", getPartitionKeys(buckets));
+    }
 
-    return null;
+    params.set("sort", sort);
+
+    TupleStream tupleStream = null;
+
+    CloudSolrStream cstream = new CloudSolrStream(zkHost, collection, params);
+    tupleStream = new UniqueStream(cstream, ecomp);
+
+    if(numWorkers > 1) {
+      // Do the unique in parallel
+      // Maintain the sort of the Tuples coming from the workers.
+      ParallelStream parallelStream = new ParallelStream(zkHost, collection, tupleStream, numWorkers, comp);
+
+      StreamFactory factory = new StreamFactory()
+          .withFunctionName("search", CloudSolrStream.class)
+          .withFunctionName("parallel", ParallelStream.class)
+          .withFunctionName("unique", UniqueStream.class);
+
+      parallelStream.setStreamFactory(factory);
+      tupleStream = parallelStream;
+    }
+
+    if(limit != null) {
+      tupleStream = new LimitStream(tupleStream, Integer.parseInt(limit));
+    }
+
+    return tupleStream;
   }
 
-  private TupleStream handleSelectDistinctFacet(final Properties properties,
-                                                final List<Map.Entry<String, Class>> fields,
-                                                final String query,
-                                                final List<Pair<String, String>> orders,
-                                                final List<String> buckets,
-                                                final List<Pair<String, String>> metricPairs,
-                                                final String limit) {
-    return null;
+
+  private StreamComparator[] adjustSorts(List<Pair<String, String>> orders, Bucket[] buckets) throws IOException {
+    List<FieldComparator> adjustedSorts = new ArrayList();
+    Set<String> bucketFields = new HashSet();
+    Set<String> sortFields = new HashSet();
+
+    ComparatorOrder comparatorOrder = ComparatorOrder.ASCENDING;
+    for(Pair<String, String> order : orders) {
+      sortFields.add(order.getKey());
+      adjustedSorts.add(new FieldComparator(order.getKey(), ascDescComp(order.getValue())));
+      comparatorOrder = ascDescComp(order.getValue());
+    }
+
+    for(Bucket bucket : buckets) {
+      bucketFields.add(bucket.toString());
+    }
+
+    for(String sf : sortFields) {
+      if(!bucketFields.contains(sf)) {
+        throw new IOException("All sort fields must be in the field list.");
+      }
+    }
+
+    //Add sort fields if needed
+    if(sortFields.size() < buckets.length) {
+      for(Bucket bucket : buckets) {
+        String b = bucket.toString();
+        if(!sortFields.contains(b)) {
+          adjustedSorts.add(new FieldComparator(bucket.toString(), comparatorOrder));
+        }
+      }
+    }
+
+    return adjustedSorts.toArray(new FieldComparator[adjustedSorts.size()]);
   }
 
   private TupleStream handleStats(String zk,
@@ -636,7 +775,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
 
     ModifiableSolrParams solrParams = new ModifiableSolrParams();
     solrParams.add(CommonParams.Q, query);
-    Metric[] metrics = buildMetrics(metricPairs).toArray(new Metric[0]);
+    Metric[] metrics = buildMetrics(metricPairs, false).toArray(new Metric[0]);
     return new StatsStream(zk, collection, solrParams, metrics);
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
index 605abf5..35f7ad0 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java
@@ -115,7 +115,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       List<Tuple> tuples = getTuples(solrStream);
 
       assert(tuples.size() == 8);
-
       Tuple tuple;
 
       tuple = tuples.get(0);
@@ -478,7 +477,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexDoc(sdoc("id", "8", "Text_t", "XXXX XXXX", "Str_s", "c", "Field_i", "60"));
       commit();
 
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select id, Field_i, Str_s from collection1 where Text_t='XXXX' order by Field_i desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
@@ -545,7 +544,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.get("Str_s").equals("a"));
       assert(tuple.getDouble("EXPR$1") == 7);
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select Str_s, sum(Field_i) from collection1 where id='(1 8)' group by Str_s having (sum(Field_i) = 7 OR sum(Field_i) = 60) order by sum(Field_i) desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -584,7 +583,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexDoc(sdoc("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60"));
       commit();
 
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select id, str_s from collection1 where text='XXXX' order by field_iff desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
@@ -603,7 +602,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuple.getException().contains("Column 'field_iff' not found in any table"));
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_iff), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_iff) = 19) AND (min(field_i) = 8))");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -612,7 +611,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.EXCEPTION);
       assert(tuple.getException().contains("Column 'field_iff' not found in any table"));
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), blah(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having ((sum(field_i) = 19) AND (min(field_i) = 8))");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -645,7 +644,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "9", "text", "XXXX XXXY", "str_s", "d", "field_i", "70");
       commit();
 
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s order by sum(field_i) asc limit 2");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
@@ -653,7 +652,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       //Only two results because of the limit.
       assert(tuples.size() == 2);
-
       Tuple tuple;
 
       tuple = tuples.get(0);
@@ -672,7 +670,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s as myString, count(*), sum(field_i) as mySum, min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s order by mySum asc limit 2");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -697,7 +695,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 20); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), "
           + "cast(avg(1.0 * field_i) as float) from collection1 where (text='XXXX' AND NOT ((text='XXXY') AND (text='XXXY' OR text='XXXY'))) "
           + "group by str_s order by str_s desc");
@@ -735,7 +733,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s as myString, count(*) as myCount, sum(field_i) as mySum, min(field_i) as myMin, "
           + "max(field_i) as myMax, cast(avg(1.0 * field_i) as float) as myAvg from collection1 "
           + "where (text='XXXX' AND NOT (text='XXXY')) group by str_s order by str_s desc");
@@ -772,7 +770,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("myMax") == 20);
       assert(tuple.getDouble("myAvg") == 13.5D);
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) " +
           "from collection1 where text='XXXX' group by str_s having sum(field_i) = 19");
 
@@ -789,7 +787,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 9.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), cast(avg(1.0 * field_i) as float) " +
           "from collection1 where text='XXXX' group by str_s having ((sum(field_i) = 19) AND (min(field_i) = 8))");
 
@@ -806,7 +804,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 9.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i) as mySum, min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s " +
           "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
@@ -824,7 +822,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 9.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s " +
           "having ((sum(field_i) = 19) AND (min(field_i) = 100))");
@@ -1063,7 +1061,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60");
       commit();
 
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
 
       System.out.println("##################### testSelectDistinct()");
@@ -1071,8 +1069,8 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       TupleStream solrStream = new SolrStream(jetty.url, sParams);
       List<Tuple> tuples = getTuples(solrStream);
 
-      assert(tuples.size() == 6);
 
+      assert(tuples.size() == 6);
       Tuple tuple = tuples.get(0);
       assert(tuple.get("str_s").equals("a"));
       assert(tuple.getLong("field_i") == 1);
@@ -1099,7 +1097,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       //reverse the sort
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1134,7 +1132,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("field_i") == 1);
 
 
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1170,7 +1168,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       //test with limit
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1188,7 +1186,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       // Test without a sort. Sort should be asc by default.
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select distinct str_s, field_i from collection1");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1221,7 +1219,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("field_i") == 60);
 
       // Test with a predicate.
-      sParams = mapParams(CommonParams.QT, "/sql",
+      sParams = mapParams(CommonParams.QT, "/sql", "aggregationMode", "map_reduce",
           "stmt", "select distinct str_s, field_i from collection1 where str_s = 'a'");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1258,7 +1256,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "7", "text", "XXXX XXXX", "str_s", "c", "field_i", "50");
       indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60");
       commit();
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s, field_i from collection1 order by str_s asc, field_i asc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
@@ -1294,7 +1292,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       //reverse the sort
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1328,7 +1326,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       //reverse the sort
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s as myString, field_i from collection1 order by myString desc, field_i desc");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1364,7 +1362,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       //test with limit
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
         "stmt", "select distinct str_s, field_i from collection1 order by str_s desc, field_i desc limit 2");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1382,7 +1380,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
 
 
       // Test without a sort. Sort should be asc by default.
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select distinct str_s, field_i from collection1");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1415,7 +1413,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("field_i") == 60);
 
       // Test with a predicate.
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select distinct str_s, field_i from collection1 where str_s = 'a'");
 
       solrStream = new SolrStream(jetty.url, sParams);
@@ -1643,7 +1641,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "8", "text", "XXXX XXXX", "str_s", "c", "field_i", "60");
       commit();
 
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s " +
           "order by sum(field_i) asc limit 2");
@@ -1673,7 +1671,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i) as mySum, min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s order by mySum asc limit 2");
 
@@ -1700,7 +1698,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s order by str_s desc");
 
@@ -1737,7 +1735,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s as myString, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s order by myString desc");
 
@@ -1774,7 +1772,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$5") == 13.5D); //avg(field_i)
 
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s having sum(field_i) = 19");
 
@@ -1791,7 +1789,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 9.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s " +
           "having ((sum(field_i) = 19) AND (min(field_i) = 8))");
@@ -1809,7 +1807,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$4") == 11); //max(field_i)
       assert(tuple.getDouble("EXPR$5") == 9.5D); //avg(field_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select str_s, count(*), sum(field_i), min(field_i), max(field_i), " +
           "cast(avg(1.0 * field_i) as float) from collection1 where text='XXXX' group by str_s " +
           "having ((sum(field_i) = 19) AND (min(field_i) = 100))");
@@ -2224,7 +2222,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       indexr("id", "8", "year_i", "2014", "month_i", "4", "day_i", "2", "item_i", "1");
 
       commit();
-      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", 
+      SolrParams sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select year_i, sum(item_i) from collection1 group by year_i order by year_i desc");
 
       SolrStream solrStream = new SolrStream(jetty.url, sParams);
@@ -2243,7 +2241,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getLong("year_i") == 2014);
       assert(tuple.getDouble("EXPR$1") == 7); //sum(item_i)
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select year_i, month_i, sum(item_i) from collection1 group by year_i, month_i " +
           "order by year_i desc, month_i desc");
 
@@ -2270,7 +2268,7 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase {
       assert(tuple.getDouble("EXPR$2") == 7); //sum(item_i)
 
 
-      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2",
+      sParams = mapParams(CommonParams.QT, "/sql", "numWorkers", "2", "aggregationMode", "map_reduce",
           "stmt", "select year_i, month_i, day_i, sum(item_i) from collection1 group by year_i, month_i, day_i " +
           "order by year_i desc, month_i desc, day_i desc");
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/ec6ee96a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
index 143143f..0f95103 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/stream/JDBCStream.java
@@ -17,6 +17,7 @@
 package org.apache.solr.client.solrj.io.stream;
 
 import java.io.IOException;
+import java.sql.Array;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
@@ -88,6 +89,7 @@ public class JDBCStream extends TupleStream implements Expressible {
   private ResultSetValueSelector[] valueSelectors;
   protected ResultSet resultSet;
   protected transient StreamContext streamContext;
+  protected String sep = Character.toString((char)31);
 
   public JDBCStream(String connectionUrl, String sqlQuery, StreamComparator definedSort) throws IOException {
     this(connectionUrl, sqlQuery, definedSort, null, null);
@@ -231,12 +233,20 @@ public class JDBCStream extends TupleStream implements Expressible {
       final String columnName = metadata.getColumnLabel(columnNumber);
       String className = metadata.getColumnClassName(columnNumber);
       String typeName = metadata.getColumnTypeName(columnNumber);
-            
+      
       if(directSupportedTypes.contains(className)){
         valueSelectors[columnIdx] = new ResultSetValueSelector() {
           public Object selectValue(ResultSet resultSet) throws SQLException {
             Object obj = resultSet.getObject(columnNumber);
             if(resultSet.wasNull()){ return null; }
+            if(obj instanceof String) {
+              String s = (String)obj;
+              if(s.indexOf(sep) > -1) {
+                s = s.substring(1);
+                return s.split(sep);
+              }
+            }
+
             return obj;
           }
           public String getColumnName() {
@@ -276,6 +286,22 @@ public class JDBCStream extends TupleStream implements Expressible {
             return columnName;
           }
         };
+      } else if(Array.class.getName().equals(className)) {
+        valueSelectors[columnIdx] = new ResultSetValueSelector() {
+          public Object selectValue(ResultSet resultSet) throws SQLException {
+            Object o = resultSet.getObject(columnNumber);
+            if(resultSet.wasNull()){ return null; }
+            if(o instanceof Array) {
+              Array array = (Array)o;
+              return array.getArray();
+            } else {
+              return o;
+            }
+          }
+          public String getColumnName() {
+            return columnName;
+          }
+        };
       } else {
         throw new SQLException(String.format(Locale.ROOT,
             "Unable to determine the valueSelector for column '%s' (col #%d) of java class '%s' and type '%s'",


[38/50] lucene-solr:jira/solr-9858: SOLR-8593: Push down the HAVING clause

Posted by ab...@apache.org.
SOLR-8593: Push down the HAVING clause


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

Branch: refs/heads/jira/solr-9858
Commit: de512d7402024acb61917cacfd98e9aaaed4a456
Parents: a9cf150
Author: Joel Bernstein <jb...@apache.org>
Authored: Wed Feb 8 12:55:18 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 8 13:01:31 2017 -0500

----------------------------------------------------------------------
 .../apache/solr/handler/sql/SolrAggregate.java  |   3 +
 .../org/apache/solr/handler/sql/SolrFilter.java | 231 ++++++++++++++++---
 .../org/apache/solr/handler/sql/SolrMethod.java |   1 +
 .../org/apache/solr/handler/sql/SolrRel.java    |  14 ++
 .../org/apache/solr/handler/sql/SolrRules.java  |   4 +-
 .../org/apache/solr/handler/sql/SolrTable.java  |  90 ++++++--
 .../handler/sql/SolrToEnumerableConverter.java  |   3 +-
 .../solr/client/solrj/io/ops/AndOperation.java  |  59 ++---
 .../solr/client/solrj/io/ops/OrOperation.java   |  47 ++--
 9 files changed, 354 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index 5068b2e..983ab76 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -69,8 +69,11 @@ class SolrAggregate extends Aggregate implements SolrRel {
 
     for(Pair<AggregateCall, String> namedAggCall : getNamedAggCalls()) {
 
+
       AggregateCall aggCall = namedAggCall.getKey();
+
       Pair<String, String> metric = toSolrMetric(implementor, aggCall, inNames);
+      implementor.addReverseAggMapping(namedAggCall.getValue(), metric.getKey().toLowerCase()+"("+metric.getValue()+")");
       implementor.addMetricPair(namedAggCall.getValue(), metric.getKey(), metric.getValue());
       if(aggCall.getName() == null) {
         implementor.addFieldMapping(namedAggCall.getValue(),

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
index 01d3346..50102b1 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrFilter.java
@@ -29,6 +29,7 @@ import org.apache.calcite.util.Pair;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Implementation of a {@link org.apache.calcite.rel.core.Filter} relational expression in Solr.
@@ -54,13 +55,18 @@ class SolrFilter extends Filter implements SolrRel {
 
   public void implement(Implementor implementor) {
     implementor.visitChild(0, getInput());
-    Translator translator = new Translator(SolrRules.solrFieldNames(getRowType()));
-    String query = translator.translateMatch(condition);
-    implementor.addQuery(query);
-    implementor.setNegativeQuery(translator.negativeQuery);
+    if(getInput() instanceof SolrAggregate) {
+      HavingTranslator translator = new HavingTranslator(SolrRules.solrFieldNames(getRowType()), implementor.reverseAggMappings);
+      String havingPredicate = translator.translateMatch(condition);
+      implementor.setHavingPredicate(havingPredicate);
+    } else {
+      Translator translator = new Translator(SolrRules.solrFieldNames(getRowType()));
+      String query = translator.translateMatch(condition);
+      implementor.addQuery(query);
+      implementor.setNegativeQuery(translator.negativeQuery);
+    }
   }
 
-  /** Translates {@link RexNode} expressions into Solr query strings. */
   private static class Translator {
 
     private final List<String> fieldNames;
@@ -71,11 +77,11 @@ class SolrFilter extends Filter implements SolrRel {
     }
 
     private String translateMatch(RexNode condition) {
-      if(condition.getKind().belongsTo(SqlKind.COMPARISON)) {
+      if (condition.getKind().belongsTo(SqlKind.COMPARISON)) {
         return translateComparison(condition);
-      } else if(condition.isA(SqlKind.AND)) {
-        return "("+translateAnd(condition)+")";
-      } else if(condition.isA(SqlKind.OR)) {
+      } else if (condition.isA(SqlKind.AND)) {
+        return "(" + translateAnd(condition) + ")";
+      } else if (condition.isA(SqlKind.OR)) {
         return "(" + translateOr(condition) + ")";
       } else {
         return null;
@@ -90,8 +96,6 @@ class SolrFilter extends Filter implements SolrRel {
       return String.join(" OR ", ors);
     }
 
-
-
     private String translateAnd(RexNode node0) {
       List<String> andStrings = new ArrayList();
       List<String> notStrings = new ArrayList();
@@ -101,18 +105,18 @@ class SolrFilter extends Filter implements SolrRel {
       RelOptUtil.decomposeConjunction(node0, ands, nots);
 
 
-      for(RexNode node: ands) {
+      for (RexNode node : ands) {
         andStrings.add(translateMatch(node));
       }
 
       String andString = String.join(" AND ", andStrings);
 
-      if(nots.size() > 0) {
-        for(RexNode node: nots) {
+      if (nots.size() > 0) {
+        for (RexNode node : nots) {
           notStrings.add(translateMatch(node));
         }
         String notString = String.join(" NOT ", notStrings);
-        return "("+ andString +") NOT ("+notString+")";
+        return "(" + andString + ") NOT (" + notString + ")";
       } else {
         return andString;
       }
@@ -126,45 +130,217 @@ class SolrFilter extends Filter implements SolrRel {
 
       switch (node.getKind()) {
         case NOT:
-          return "-"+translateComparison(((RexCall) node).getOperands().get(0));
+          return "-" + translateComparison(((RexCall) node).getOperands().get(0));
         case EQUALS:
           String terms = binaryTranslated.getValue().getValue2().toString().trim();
-          if(!terms.startsWith("(") && !terms.startsWith("[") && !terms.startsWith("{")){
-            terms = "\""+terms+"\"";
+          if (!terms.startsWith("(") && !terms.startsWith("[") && !terms.startsWith("{")) {
+            terms = "\"" + terms + "\"";
           }
 
           String clause = binaryTranslated.getKey() + ":" + terms;
           this.negativeQuery = false;
           return clause;
         case NOT_EQUALS:
-          return "-(" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2()+")";
+          return "-(" + binaryTranslated.getKey() + ":" + binaryTranslated.getValue().getValue2() + ")";
         case LESS_THAN:
           this.negativeQuery = false;
-          return "("+binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " })";
+          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " })";
         case LESS_THAN_OR_EQUAL:
           this.negativeQuery = false;
-          return "("+binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " ])";
+          return "(" + binaryTranslated.getKey() + ": [ * TO " + binaryTranslated.getValue().getValue2() + " ])";
         case GREATER_THAN:
           this.negativeQuery = false;
-          return "("+binaryTranslated.getKey() + ": { " + binaryTranslated.getValue().getValue2() + " TO * ])";
+          return "(" + binaryTranslated.getKey() + ": { " + binaryTranslated.getValue().getValue2() + " TO * ])";
         case GREATER_THAN_OR_EQUAL:
           this.negativeQuery = false;
-          return "("+binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue().getValue2() + " TO * ])";
+          return "(" + binaryTranslated.getKey() + ": [ " + binaryTranslated.getValue().getValue2() + " TO * ])";
+        default:
+          throw new AssertionError("cannot translate " + node);
+      }
+    }
+
+    /**
+     * Translates a call to a binary operator, reversing arguments if necessary.
+     */
+    private Pair<String, RexLiteral> translateBinary(RexCall call) {
+      List<RexNode> operands = call.getOperands();
+      if (operands.size() != 2) {
+        throw new AssertionError("Invalid number of arguments - " + operands.size());
+      }
+      final RexNode left = operands.get(0);
+      final RexNode right = operands.get(1);
+      final Pair<String, RexLiteral> a = translateBinary2(left, right);
+      if (a != null) {
+        return a;
+      }
+      final Pair<String, RexLiteral> b = translateBinary2(right, left);
+      if (b != null) {
+        return b;
+      }
+      throw new AssertionError("cannot translate call " + call);
+    }
+
+    /**
+     * Translates a call to a binary operator. Returns whether successful.
+     */
+    private Pair<String, RexLiteral> translateBinary2(RexNode left, RexNode right) {
+      switch (right.getKind()) {
+        case LITERAL:
+          break;
+        default:
+          return null;
+      }
+      final RexLiteral rightLiteral = (RexLiteral) right;
+      switch (left.getKind()) {
+        case INPUT_REF:
+          final RexInputRef left1 = (RexInputRef) left;
+          String name = fieldNames.get(left1.getIndex());
+          return new Pair<>(name, rightLiteral);
+        case CAST:
+          return translateBinary2(((RexCall) left).operands.get(0), right);
+//        case OTHER_FUNCTION:
+//          String itemName = SolrRules.isItem((RexCall) left);
+//          if (itemName != null) {
+//            return translateOp2(op, itemName, rightLiteral);
+//          }
+        default:
+          return null;
+      }
+    }
+  }
+
+  private static class HavingTranslator {
+
+    private final List<String> fieldNames;
+    private Map<String,String> reverseAggMappings;
+
+    HavingTranslator(List<String> fieldNames, Map<String, String> reverseAggMappings) {
+      this.fieldNames = fieldNames;
+      this.reverseAggMappings = reverseAggMappings;
+    }
+
+    private String translateMatch(RexNode condition) {
+      if (condition.getKind().belongsTo(SqlKind.COMPARISON)) {
+        return translateComparison(condition);
+      } else if (condition.isA(SqlKind.AND)) {
+        return translateAnd(condition);
+      } else if (condition.isA(SqlKind.OR)) {
+        return translateOr(condition);
+      } else {
+        return null;
+      }
+    }
+
+    private String translateOr(RexNode condition) {
+      List<String> ors = new ArrayList<>();
+      for (RexNode node : RelOptUtil.disjunctions(condition)) {
+        ors.add(translateMatch(node));
+      }
+      StringBuilder builder = new StringBuilder();
+
+      builder.append("or(");
+      int i = 0;
+      for (i = 0; i < ors.size(); i++) {
+        if (i > 0) {
+          builder.append(",");
+        }
+
+        builder.append(ors.get(i));
+      }
+      builder.append(")");
+      return builder.toString();
+    }
+
+    private String translateAnd(RexNode node0) {
+      List<String> andStrings = new ArrayList();
+      List<String> notStrings = new ArrayList();
+
+      List<RexNode> ands = new ArrayList();
+      List<RexNode> nots = new ArrayList();
+
+      RelOptUtil.decomposeConjunction(node0, ands, nots);
+
+      for (RexNode node : ands) {
+        andStrings.add(translateMatch(node));
+      }
+
+      StringBuilder builder = new StringBuilder();
+
+      builder.append("and(");
+      for (int i = 0; i < andStrings.size(); i++) {
+        if (i > 0) {
+          builder.append(",");
+        }
+
+        builder.append(andStrings.get(i));
+      }
+      builder.append(")");
+
+
+      if (nots.size() > 0) {
+        for (RexNode node : nots) {
+          notStrings.add(translateMatch(node));
+        }
+
+        StringBuilder notBuilder = new StringBuilder();
+        for(int i=0; i< notStrings.size(); i++) {
+          if(i > 0) {
+            notBuilder.append(",");
+          }
+          notBuilder.append("not(");
+          notBuilder.append(notStrings.get(i));
+          notBuilder.append(")");
+        }
+
+        return "and(" + builder.toString() + ","+ notBuilder.toString()+")";
+      } else {
+        return builder.toString();
+      }
+    }
+
+    private String translateComparison(RexNode node) {
+      Pair<String, RexLiteral> binaryTranslated = null;
+      if (((RexCall) node).getOperands().size() == 2) {
+        binaryTranslated = translateBinary((RexCall) node);
+      }
+
+      switch (node.getKind()) {
+
+        case EQUALS:
+          String terms = binaryTranslated.getValue().getValue2().toString().trim();
+          String clause = "eq(" + binaryTranslated.getKey() + "," + terms + ")";
+          return clause;
+        case NOT_EQUALS:
+          return "not(eq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + "))";
+        case LESS_THAN:
+          return "lt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+        case LESS_THAN_OR_EQUAL:
+          return "lteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+        case GREATER_THAN:
+          return "gt(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
+        case GREATER_THAN_OR_EQUAL:
+          return "gteq(" + binaryTranslated.getKey() + "," + binaryTranslated.getValue().getValue2() + ")";
         default:
           throw new AssertionError("cannot translate " + node);
       }
     }
 
-    /** Translates a call to a binary operator, reversing arguments if necessary. */
+    /**
+     * Translates a call to a binary operator, reversing arguments if necessary.
+     */
     private Pair<String, RexLiteral> translateBinary(RexCall call) {
       List<RexNode> operands = call.getOperands();
-      if(operands.size() != 2) {
+      if (operands.size() != 2) {
         throw new AssertionError("Invalid number of arguments - " + operands.size());
       }
       final RexNode left = operands.get(0);
       final RexNode right = operands.get(1);
       final Pair<String, RexLiteral> a = translateBinary2(left, right);
+
       if (a != null) {
+        if(reverseAggMappings.containsKey(a.getKey())) {
+          return new Pair<String, RexLiteral>(reverseAggMappings.get(a.getKey()),a.getValue());
+        }
         return a;
       }
       final Pair<String, RexLiteral> b = translateBinary2(right, left);
@@ -174,7 +350,9 @@ class SolrFilter extends Filter implements SolrRel {
       throw new AssertionError("cannot translate call " + call);
     }
 
-    /** Translates a call to a binary operator. Returns whether successful. */
+    /**
+     * Translates a call to a binary operator. Returns whether successful.
+     */
     private Pair<String, RexLiteral> translateBinary2(RexNode left, RexNode right) {
       switch (right.getKind()) {
         case LITERAL:
@@ -182,6 +360,7 @@ class SolrFilter extends Filter implements SolrRel {
         default:
           return null;
       }
+
       final RexLiteral rightLiteral = (RexLiteral) right;
       switch (left.getKind()) {
         case INPUT_REF:

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
index 4ec3fdb..b0bf801 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrMethod.java
@@ -33,6 +33,7 @@ enum SolrMethod {
                        List.class,
                        List.class,
                        String.class,
+                       String.class,
                        String.class);
 
   public final Method method;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
index b7843d7..557cfe0 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -20,6 +20,7 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.util.Pair;
+import org.apache.solr.client.solrj.io.ops.BooleanOperation;
 
 import java.util.*;
 
@@ -35,7 +36,9 @@ interface SolrRel extends RelNode {
   /** Callback for the implementation process that converts a tree of {@link SolrRel} nodes into a Solr query. */
   class Implementor {
     final Map<String, String> fieldMappings = new HashMap<>();
+    final Map<String, String> reverseAggMappings = new HashMap<>();
     String query = null;
+    String havingPredicate;
     boolean negativeQuery;
     String limitValue = null;
     final List<Pair<String, String>> orders = new ArrayList<>();
@@ -51,6 +54,12 @@ interface SolrRel extends RelNode {
       }
     }
 
+    void addReverseAggMapping(String key, String val) {
+      if(key != null && !reverseAggMappings.containsKey(key)) {
+        this.reverseAggMappings.put(key, val);
+      }
+    }
+
     void addQuery(String query) {
       this.query = query;
     }
@@ -79,6 +88,11 @@ interface SolrRel extends RelNode {
       }
     }
 
+    void setHavingPredicate(String havingPredicate) {
+      this.havingPredicate = havingPredicate;
+    }
+
+
     void setLimit(String limit) {
       limitValue = limit;
     }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
index 118ec1a..4cbadda 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -111,7 +111,7 @@ class SolrRules {
     }
 
     <R extends RelNode> SolrConverterRule(Class<R> clazz, Predicate<RelNode> predicate, String description) {
-      super(clazz, predicate::test, Convention.NONE, SolrRel.CONVENTION, description);
+      super(clazz, Convention.NONE, SolrRel.CONVENTION, description);
     }
   }
 
@@ -120,8 +120,10 @@ class SolrRules {
    */
   private static class SolrFilterRule extends SolrConverterRule {
     private static boolean isNotFilterByExpr(List<RexNode> rexNodes, List<String> fieldNames) {
+
       // We dont have a way to filter by result of aggregator now
       boolean result = true;
+
       for (RexNode rexNode : rexNodes) {
         if (rexNode instanceof RexCall) {
           result = result && isNotFilterByExpr(((RexCall) rexNode).getOperands(), fieldNames);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index fff6468..5f64231 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -32,7 +32,17 @@ import org.apache.solr.client.solrj.io.comp.ComparatorOrder;
 import org.apache.solr.client.solrj.io.comp.FieldComparator;
 import org.apache.solr.client.solrj.io.comp.MultipleFieldComparator;
 import org.apache.solr.client.solrj.io.comp.StreamComparator;
+import org.apache.solr.client.solrj.io.ops.AndOperation;
+import org.apache.solr.client.solrj.io.ops.BooleanOperation;
+import org.apache.solr.client.solrj.io.ops.EqualsOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.GreaterThanOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanEqualToOperation;
+import org.apache.solr.client.solrj.io.ops.LessThanOperation;
+import org.apache.solr.client.solrj.io.ops.NotOperation;
+import org.apache.solr.client.solrj.io.ops.OrOperation;
 import org.apache.solr.client.solrj.io.stream.*;
+import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParser;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
 import org.apache.solr.client.solrj.io.stream.metrics.*;
 import org.apache.solr.common.params.CommonParams;
@@ -72,7 +82,7 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
   
   private Enumerable<Object> query(final Properties properties) {
     return query(properties, Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(),
-        Collections.emptyList(), null, null);
+        Collections.emptyList(), null, null, null);
   }
 
   /** Executes a Solr query on the underlying table.
@@ -89,7 +99,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                    final List<String> buckets,
                                    final List<Pair<String, String>> metricPairs,
                                    final String limit,
-                                   final String negativeQuery) {
+                                   final String negativeQuery,
+                                   final String havingPredicate) {
     // SolrParams should be a ModifiableParams instead of a map
     boolean mapReduce = "map_reduce".equals(properties.getProperty("aggregationMode"));
     boolean negative = Boolean.parseBoolean(negativeQuery);
@@ -106,8 +117,6 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
       }
     }
 
-    System.out.println("####### Limit:"+limit);
-
     TupleStream tupleStream;
     String zk = properties.getProperty("zk");
     try {
@@ -126,7 +135,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                                  orders,
                                                  buckets,
                                                  metricPairs,
-                                                 limit);
+                                                 limit,
+                                                 havingPredicate);
           } else {
             tupleStream = handleGroupByFacet(zk,
                                              collection,
@@ -135,7 +145,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                              orders,
                                              buckets,
                                              metricPairs,
-                                             limit);
+                                             limit,
+                                             havingPredicate);
           }
         }
       }
@@ -403,7 +414,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                              final List<Pair<String, String>> orders,
                                              final List<String> _buckets,
                                              final List<Pair<String, String>> metricPairs,
-                                             final String limit) throws IOException {
+                                             final String limit,
+                                             final String havingPredicate) throws IOException {
 
     int numWorkers = Integer.parseInt(properties.getProperty("numWorkers", "1"));
 
@@ -438,21 +450,36 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
     CloudSolrStream cstream = new CloudSolrStream(zk, collection, params);
     tupleStream = new RollupStream(cstream, buckets, metrics);
 
+    StreamFactory factory = new StreamFactory()
+        .withFunctionName("search", CloudSolrStream.class)
+        .withFunctionName("parallel", ParallelStream.class)
+        .withFunctionName("rollup", RollupStream.class)
+        .withFunctionName("sum", SumMetric.class)
+        .withFunctionName("min", MinMetric.class)
+        .withFunctionName("max", MaxMetric.class)
+        .withFunctionName("avg", MeanMetric.class)
+        .withFunctionName("count", CountMetric.class)
+        .withFunctionName("and", AndOperation.class)
+        .withFunctionName("or", OrOperation.class)
+        .withFunctionName("not", NotOperation.class)
+        .withFunctionName("eq", EqualsOperation.class)
+        .withFunctionName("gt", GreaterThanOperation.class)
+        .withFunctionName("lt", LessThanOperation.class)
+        .withFunctionName("lteq", LessThanEqualToOperation.class)
+        .withFunctionName("having", HavingStream.class)
+        .withFunctionName("gteq", GreaterThanEqualToOperation.class);
+
+    if(havingPredicate != null) {
+      BooleanOperation booleanOperation = (BooleanOperation)factory.constructOperation(StreamExpressionParser.parse(havingPredicate));
+      tupleStream = new HavingStream(tupleStream, booleanOperation);
+    }
+
     if(numWorkers > 1) {
       // Do the rollups in parallel
       // Maintain the sort of the Tuples coming from the workers.
       StreamComparator comp = bucketSortComp(buckets, sortDirection);
       ParallelStream parallelStream = new ParallelStream(zk, collection, tupleStream, numWorkers, comp);
 
-      StreamFactory factory = new StreamFactory()
-          .withFunctionName("search", CloudSolrStream.class)
-          .withFunctionName("parallel", ParallelStream.class)
-          .withFunctionName("rollup", RollupStream.class)
-          .withFunctionName("sum", SumMetric.class)
-          .withFunctionName("min", MinMetric.class)
-          .withFunctionName("max", MaxMetric.class)
-          .withFunctionName("avg", MeanMetric.class)
-          .withFunctionName("count", CountMetric.class);
 
       parallelStream.setStreamFactory(factory);
       tupleStream = parallelStream;
@@ -508,7 +535,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                          final List<Pair<String, String>> orders,
                                          final List<String> bucketFields,
                                          final List<Pair<String, String>> metricPairs,
-                                         final String lim) throws IOException {
+                                         final String lim,
+                                         final String havingPredicate) throws IOException {
 
     ModifiableSolrParams solrParams = new ModifiableSolrParams();
     solrParams.add(CommonParams.Q, query);
@@ -542,6 +570,30 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
                                               limit);
 
 
+
+    StreamFactory factory = new StreamFactory()
+        .withFunctionName("search", CloudSolrStream.class)
+        .withFunctionName("parallel", ParallelStream.class)
+        .withFunctionName("rollup", RollupStream.class)
+        .withFunctionName("sum", SumMetric.class)
+        .withFunctionName("min", MinMetric.class)
+        .withFunctionName("max", MaxMetric.class)
+        .withFunctionName("avg", MeanMetric.class)
+        .withFunctionName("count", CountMetric.class)
+        .withFunctionName("and", AndOperation.class)
+        .withFunctionName("or", OrOperation.class)
+        .withFunctionName("not", NotOperation.class)
+        .withFunctionName("eq", EqualsOperation.class)
+        .withFunctionName("gt", GreaterThanOperation.class)
+        .withFunctionName("lt", LessThanOperation.class)
+        .withFunctionName("lteq", LessThanEqualToOperation.class)
+        .withFunctionName("gteq", GreaterThanEqualToOperation.class);
+
+    if(havingPredicate != null) {
+      BooleanOperation booleanOperation = (BooleanOperation)factory.constructOperation(StreamExpressionParser.parse(havingPredicate));
+      tupleStream = new HavingStream(tupleStream, booleanOperation);
+    }
+
     if(lim != null)
     {
       tupleStream = new LimitStream(tupleStream, limit);
@@ -623,8 +675,8 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
      */
     @SuppressWarnings("UnusedDeclaration")
     public Enumerable<Object> query(List<Map.Entry<String, Class>> fields, String query, List<Pair<String, String>> order,
-                                    List<String> buckets, List<Pair<String, String>> metricPairs, String limit, String negativeQuery) {
-      return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit, negativeQuery);
+                                    List<String> buckets, List<Pair<String, String>> metricPairs, String limit, String negativeQuery, String havingPredicate) {
+      return getTable().query(getProperties(), fields, query, order, buckets, metricPairs, limit, negativeQuery, havingPredicate);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
index 9b18891..10d4d4c 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrToEnumerableConverter.java
@@ -84,8 +84,9 @@ class SolrToEnumerableConverter extends ConverterImpl implements EnumerableRel {
     final Expression metricPairs = list.append("metricPairs", constantArrayList(solrImplementor.metricPairs, Pair.class));
     final Expression limit = list.append("limit", Expressions.constant(solrImplementor.limitValue));
     final Expression negativeQuery = list.append("negativeQuery", Expressions.constant(Boolean.toString(solrImplementor.negativeQuery), String.class));
+    final Expression havingPredicate = list.append("havingTest", Expressions.constant(solrImplementor.havingPredicate, String.class));
     Expression enumerable = list.append("enumerable", Expressions.call(table, SolrMethod.SOLR_QUERYABLE_QUERY.method,
-        fields, query, orders, buckets, metricPairs, limit, negativeQuery));
+        fields, query, orders, buckets, metricPairs, limit, negativeQuery, havingPredicate));
     Hook.QUERY_PLAN.run(query);
     list.add(Expressions.return_(null, enumerable));
     return implementor.result(physType, list.toBlock());

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
index f095f63..bebc777 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/AndOperation.java
@@ -18,12 +18,12 @@ package org.apache.solr.client.solrj.io.ops;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.ArrayList;
 import java.util.UUID;
 
 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;
@@ -33,60 +33,47 @@ public class AndOperation implements BooleanOperation {
   private static final long serialVersionUID = 1;
   private UUID operationNodeId = UUID.randomUUID();
 
-  protected BooleanOperation leftOperand;
-  protected BooleanOperation rightOperand;
+  private List<BooleanOperation> booleanOperations = new ArrayList();
 
   public void operate(Tuple tuple) {
-    leftOperand.operate(tuple);
-    rightOperand.operate(tuple);
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      booleanOperation.operate(tuple);
+    }
   }
 
-  public AndOperation(BooleanOperation leftOperand, BooleanOperation rightOperand) {
-    this.leftOperand = leftOperand;
-    this.rightOperand = rightOperand;
+  public AndOperation(List<BooleanOperation> booleanOperations) {
+    this.booleanOperations = booleanOperations;
   }
 
   public AndOperation(StreamExpression expression, StreamFactory factory) throws IOException {
-      List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
-      if(operationExpressions != null && operationExpressions.size() == 2) {
-        StreamExpression left = operationExpressions.get(0);
-        StreamOperation leftOp = factory.constructOperation(left);
-        if(leftOp instanceof BooleanOperation) {
-          leftOperand = (BooleanOperation) leftOp;
-        } else {
-          throw new IOException("The And/Or Operation requires a BooleanOperation.");
-        }
-
-        StreamExpression right = operationExpressions.get(1);
-        StreamOperation rightOp = factory.constructOperation(right);
-        if(rightOp instanceof BooleanOperation) {
-          rightOperand = (BooleanOperation) rightOp;
-        } else {
-          throw new IOException("The And/Or Operation requires a BooleanOperation.");
-        }
+    List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
+    for(StreamExpression se : operationExpressions) {
+      StreamOperation op = factory.constructOperation(se);
+      if(op instanceof BooleanOperation) {
+        booleanOperations.add((BooleanOperation)op);
       } else {
-        throw new IOException("The And/Or Operation requires a BooleanOperations.");
+        throw new IOException("AndOperation requires BooleanOperation parameters");
       }
+    }
   }
 
   public boolean evaluate() {
-    return leftOperand.evaluate() && rightOperand.evaluate();
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      if(!booleanOperation.evaluate()) {
+        return false;
+      }
+    }
+    return true;
   }
 
   @Override
   public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
     StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
-    if(leftOperand instanceof Expressible) {
-      expression.addParameter(leftOperand.toExpression(factory));
-    } else {
-      throw new IOException("This left operand of the AndOperation contains a non-expressible operation - it cannot be converted to an expression");
-    }
 
-    if(rightOperand instanceof Expressible) {
-      expression.addParameter(rightOperand.toExpression(factory));
-    } else {
-      throw new IOException("This the right operand of the AndOperation contains a non-expressible operation - it cannot be converted to an expression");
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      expression.addParameter(booleanOperation.toExpression(factory));
     }
+
     return expression;
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/de512d74/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
index faac5cd..2325a58 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/ops/OrOperation.java
@@ -17,46 +17,63 @@
 package org.apache.solr.client.solrj.io.ops;
 
 import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.UUID;
 
+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 OrOperation extends AndOperation {
+public class OrOperation implements BooleanOperation {
 
   private static final long serialVersionUID = 1;
   private UUID operationNodeId = UUID.randomUUID();
 
-  public OrOperation(BooleanOperation leftOperand, BooleanOperation rightOperand) {
-    super(leftOperand, rightOperand);
+  private List<BooleanOperation> booleanOperations = new ArrayList();
+
+  public void operate(Tuple tuple) {
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      booleanOperation.operate(tuple);
+    }
+  }
+
+  public OrOperation(List<BooleanOperation> booleanOperations) {
+    this.booleanOperations = booleanOperations;
   }
 
   public OrOperation(StreamExpression expression, StreamFactory factory) throws IOException {
-    super(expression, factory);
+    List<StreamExpression> operationExpressions = factory.getExpressionOperandsRepresentingTypes(expression, BooleanOperation.class);
+    for(StreamExpression se : operationExpressions) {
+      StreamOperation op = factory.constructOperation(se);
+      if(op instanceof BooleanOperation) {
+        booleanOperations.add((BooleanOperation)op);
+      } else {
+        throw new IOException("AndOperation requires BooleanOperation parameters");
+      }
+    }
   }
 
   public boolean evaluate() {
-    return leftOperand.evaluate() || rightOperand.evaluate();
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      if(booleanOperation.evaluate()) {
+        return true;
+      }
+    }
+    return false;
   }
 
   @Override
   public StreamExpressionParameter toExpression(StreamFactory factory) throws IOException {
     StreamExpression expression = new StreamExpression(factory.getFunctionName(this.getClass()));
-    if(leftOperand instanceof Expressible) {
-      expression.addParameter(leftOperand.toExpression(factory));
-    } else {
-      throw new IOException("This left operand of the OrOperation contains a non-expressible operation - it cannot be converted to an expression");
-    }
 
-    if(rightOperand instanceof Expressible) {
-      expression.addParameter(rightOperand.toExpression(factory));
-    } else {
-      throw new IOException("This the right operand of the OrOperation contains a non-expressible operation - it cannot be converted to an expression");
+    for(BooleanOperation booleanOperation : booleanOperations) {
+      expression.addParameter(booleanOperation.toExpression(factory));
     }
+
     return expression;
   }
 


[05/50] lucene-solr:jira/solr-9858: Improve rules for Sort and Filter

Posted by ab...@apache.org.
Improve rules for Sort and Filter


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

Branch: refs/heads/jira/solr-9858
Commit: cd9a3183184e6a88a05d4d5b7842be006ed79264
Parents: 4275bc7
Author: Kevin Risden <kr...@apache.org>
Authored: Thu Nov 3 19:03:20 2016 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Thu Nov 3 19:03:20 2016 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/sql/SolrRules.java  | 60 ++++++--------------
 1 file changed, 18 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cd9a3183/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
index 7d1aa59..bd39620 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRules.java
@@ -26,6 +26,7 @@ import org.apache.calcite.rel.core.Sort;
 import org.apache.calcite.rel.logical.LogicalAggregate;
 import org.apache.calcite.rel.logical.LogicalFilter;
 import org.apache.calcite.rel.logical.LogicalProject;
+import org.apache.calcite.rel.logical.LogicalSort;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexInputRef;
@@ -47,9 +48,8 @@ import java.util.function.Predicate;
 class SolrRules {
   static final RelOptRule[] RULES = {
       SolrFilterRule.FILTER_RULE,
-      SolrFilterRule.FILTER_PROJECT_RULE,
       SolrProjectRule.PROJECT_RULE,
-//      SolrSortRule.SORT_RULE,
+      SolrSortRule.SORT_RULE,
 //      SolrAggregateRule.AGGREGATE_RULE,
   };
 
@@ -117,45 +117,23 @@ class SolrRules {
     }
   }
 
-  abstract static class SolrRule extends RelOptRule {
-    final Convention out;
-
-    <R extends RelNode> SolrRule(RelOptRuleOperand rule, String description) {
-      super(rule, description);
-      this.out = SolrRel.CONVENTION;
-    }
-
-    abstract public RelNode convert(RelNode rel);
-
-    /**
-     * @see ConverterRule
-     */
-    @Override
-    public void onMatch(RelOptRuleCall call) {
-      RelNode rel = call.rel(0);
-      if (rel.getTraitSet().contains(Convention.NONE)) {
-        final RelNode converted = convert(rel);
-        if (converted != null) {
-          call.transformTo(converted);
-        }
-      }
-    }
-  }
-
   /**
    * Rule to convert a {@link LogicalFilter} to a {@link SolrFilter}.
    */
-  private static class SolrFilterRule extends SolrRule {
-
-    private static final SolrFilterRule FILTER_RULE =
-        new SolrFilterRule(operand(LogicalFilter.class, operand(SolrTableScan.class, none())), "SolrFilterRule");
+  private static class SolrFilterRule extends SolrConverterRule {
+    private static final Predicate<RelNode> FILTER_PREDICATE = relNode -> {
+      List<RexNode> filterOperands = ((RexCall) ((LogicalFilter) relNode).getCondition()).getOperands();
+      return filterOperands.size() == 2 &&
+          ((!filterOperands.get(0).getKind().equals(SqlKind.LITERAL)
+              && filterOperands.get(1).getKind().equals(SqlKind.LITERAL))
+            || (filterOperands.get(0).getKind().equals(SqlKind.LITERAL)
+              && !filterOperands.get(1).getKind().equals(SqlKind.LITERAL)));
+    };
 
-    private static final SolrFilterRule FILTER_PROJECT_RULE =
-        new SolrFilterRule(operand(LogicalFilter.class, operand(
-            LogicalProject.class, operand(SolrTableScan.class, none()))), "SolrFilterProjectRule");
+    private static final SolrFilterRule FILTER_RULE = new SolrFilterRule();
 
-    <R extends RelNode> SolrFilterRule(RelOptRuleOperand rule, String description) {
-      super(rule, description);
+    private SolrFilterRule() {
+      super(LogicalFilter.class, FILTER_PREDICATE, "SolrFilterRule");
     }
 
     public RelNode convert(RelNode rel) {
@@ -194,14 +172,12 @@ class SolrRules {
   /**
    * Rule to convert a {@link Sort} to a {@link SolrSort}.
    */
-  private static class SolrSortRule extends SolrRule {
-//    static final SolrSortRule SORT_RULE = new SolrSortRule(operand(Sort.class, any()), "SolrSortRule");
+  private static class SolrSortRule extends SolrConverterRule {
 
-    static final SolrSortRule SORT_RULE = new SolrSortRule(
-        operand(Sort.class, operand(SolrTableScan.class, none())), "SolrSortRule");
+    static final SolrSortRule SORT_RULE = new SolrSortRule();
 
-    <R extends RelNode> SolrSortRule(RelOptRuleOperand rule, String description) {
-      super(rule, description);
+    private SolrSortRule() {
+      super(LogicalSort.class, relNode -> true, "SolrSortRule");
     }
 
     public RelNode convert(RelNode rel) {


[34/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: 7a3dd46bbf4216d75dd57b51570d26f9e8929ded
Parents: 89b39e4 bef725a
Author: Kevin Risden <kr...@apache.org>
Authored: Wed Feb 1 12:00:22 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Wed Feb 1 12:00:22 2017 -0500

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  31 +
 .../miscellaneous/WordDelimiterGraphFilter.java |   2 -
 .../TestWordDelimiterGraphFilter.java           |  15 +-
 lucene/common-build.xml                         |   2 +
 .../org/apache/lucene/geo/GeoEncodingUtils.java | 145 ++++-
 .../java/org/apache/lucene/geo/GeoUtils.java    |  13 +-
 .../lucene60/TestLucene60PointsFormat.java      |   9 +-
 .../org/apache/lucene/geo/TestGeoUtils.java     |  12 +
 lucene/join/build.xml                           |  21 -
 .../join/ParentChildrenBlockJoinQuery.java      | 199 +++++++
 .../search/join/ToParentBlockJoinCollector.java | 507 ----------------
 .../join/ToParentBlockJoinIndexSearcher.java    |  73 ---
 .../search/join/ToParentBlockJoinQuery.java     | 428 ++++++--------
 .../apache/lucene/search/join/package-info.java |  31 +-
 .../lucene/search/join/TestBlockJoin.java       | 591 ++++---------------
 .../search/join/TestBlockJoinValidation.java    |  19 -
 .../apache/lucene/search/join/TestJoinUtil.java | 110 ++--
 .../join/TestParentChildrenBlockJoinQuery.java  | 104 ++++
 .../lucene/queryparser/xml/CoreParser.java      |  18 +-
 .../lucene/queryparser/xml/TestCoreParser.java  |  19 +-
 .../document/LatLonDocValuesDistanceQuery.java  |   2 +-
 .../document/LatLonPointDistanceQuery.java      |   2 +-
 .../document/LatLonPointInPolygonQuery.java     |   6 +-
 .../analyzing/AnalyzingInfixSuggester.java      |   4 +-
 .../analyzing/AnalyzingInfixSuggesterTest.java  |  13 +-
 .../lucene/analysis/CannedTokenStream.java      |  28 +-
 solr/CHANGES.txt                                |  25 +-
 solr/bin/solr                                   |  13 +-
 solr/bin/solr.cmd                               |   4 +-
 .../dataimport/TestMailEntityProcessor.java     |   1 +
 .../apache/solr/hadoop/MorphlineMapperTest.java |   3 +-
 .../solr/hadoop/MorphlineReducerTest.java       |   2 +-
 solr/core/src/java/org/apache/solr/api/Api.java |  67 +++
 .../src/java/org/apache/solr/api/ApiBag.java    | 354 +++++++++++
 .../java/org/apache/solr/api/ApiSupport.java    |  46 ++
 .../java/org/apache/solr/api/SpecProvider.java  |  25 +
 .../java/org/apache/solr/api/V2HttpCall.java    | 340 +++++++++++
 .../java/org/apache/solr/api/package-info.java  |  21 +
 .../src/java/org/apache/solr/cloud/Assign.java  |  10 +-
 .../org/apache/solr/cloud/CreateShardCmd.java   |   2 +-
 .../apache/solr/cloud/DeleteCollectionCmd.java  |   7 +
 .../org/apache/solr/core/CoreContainer.java     |  10 +-
 .../java/org/apache/solr/core/PluginBag.java    |  71 ++-
 .../java/org/apache/solr/core/SolrCores.java    |   4 +-
 .../solr/core/snapshots/SolrSnapshotsTool.java  |  15 +-
 .../org/apache/solr/handler/BlobHandler.java    |  14 +-
 .../apache/solr/handler/DumpRequestHandler.java |  11 +
 .../apache/solr/handler/PingRequestHandler.java |   5 +
 .../apache/solr/handler/RealTimeGetHandler.java |  14 +
 .../apache/solr/handler/ReplicationHandler.java |  25 +-
 .../apache/solr/handler/RequestHandlerBase.java |  12 +-
 .../org/apache/solr/handler/SchemaHandler.java  |  35 +-
 .../apache/solr/handler/SolrConfigHandler.java  |  16 +
 .../solr/handler/UpdateRequestHandler.java      |   2 +
 .../solr/handler/UpdateRequestHandlerApi.java   |  73 +++
 .../handler/admin/BaseHandlerApiSupport.java    | 236 ++++++++
 .../handler/admin/CollectionHandlerApi.java     | 319 ++++++++++
 .../solr/handler/admin/CollectionsHandler.java  |  69 ++-
 .../solr/handler/admin/ConfigSetsHandler.java   |  47 +-
 .../handler/admin/ConfigSetsHandlerApi.java     | 112 ++++
 .../solr/handler/admin/CoreAdminHandler.java    |  14 +
 .../solr/handler/admin/CoreAdminHandlerApi.java | 175 ++++++
 .../apache/solr/handler/admin/InfoHandler.java  |  78 +--
 .../solr/handler/admin/SecurityConfHandler.java |  70 +++
 .../solr/metrics/SolrCoreMetricManager.java     |   3 -
 .../apache/solr/metrics/SolrMetricManager.java  |  85 ++-
 .../org/apache/solr/query/SolrRangeQuery.java   |   4 +-
 .../apache/solr/request/SolrQueryRequest.java   |  24 +
 .../solr/request/SolrQueryRequestBase.java      |  35 ++
 .../org/apache/solr/schema/SchemaManager.java   |  13 +-
 .../java/org/apache/solr/search/BitDocSet.java  |   2 +-
 .../src/java/org/apache/solr/search/DocSet.java |   4 +-
 .../java/org/apache/solr/search/DocSetBase.java |  21 +-
 .../org/apache/solr/search/DocSetCollector.java |   7 +
 .../java/org/apache/solr/search/DocSetUtil.java |  62 +-
 .../java/org/apache/solr/search/DocSlice.java   |   8 +-
 .../java/org/apache/solr/search/HashDocSet.java |   2 +-
 .../org/apache/solr/search/SolrCoreParser.java  |  42 +-
 .../apache/solr/search/SolrIndexSearcher.java   |  55 +-
 .../solr/search/SolrSpanQueryBuilder.java       |  33 ++
 .../org/apache/solr/search/SortedIntDocSet.java |   2 +-
 .../solr/search/grouping/CommandHandler.java    |   3 +-
 .../search/join/BlockJoinFacetAccsHolder.java   |  14 -
 .../apache/solr/security/BasicAuthPlugin.java   |  10 +-
 .../security/RuleBasedAuthorizationPlugin.java  |  11 +-
 .../security/Sha256AuthenticationProvider.java  |   8 +
 .../org/apache/solr/servlet/HttpSolrCall.java   | 115 +++-
 .../org/apache/solr/servlet/ResponseUtils.java  |   6 +
 .../apache/solr/servlet/SolrDispatchFilter.java |  18 +-
 .../apache/solr/servlet/SolrRequestParsers.java |  27 +-
 .../org/apache/solr/util/CommandOperation.java  |   4 +
 .../apache/solr/util/JsonSchemaValidator.java   | 370 ++++++++++++
 .../src/java/org/apache/solr/util/PathTrie.java | 195 ++++++
 solr/core/src/resources/ImplicitPlugins.json    |   6 +-
 .../src/resources/apispec/cluster.Commands.json |  74 +++
 .../apispec/cluster.commandstatus.delete.json   |  10 +
 .../apispec/cluster.commandstatus.json          |  20 +
 .../apispec/cluster.configs.Commands.json       |  34 ++
 .../apispec/cluster.configs.delete.json         |  12 +
 .../src/resources/apispec/cluster.configs.json  |  12 +
 solr/core/src/resources/apispec/cluster.json    |  14 +
 .../src/resources/apispec/cluster.nodes.json    |  12 +
 .../cluster.security.BasicAuth.Commands.json    |  23 +
 ...cluster.security.RuleBasedAuthorization.json | 129 ++++
 ...luster.security.authentication.Commands.json |  12 +
 .../cluster.security.authentication.json        |  12 +
 ...cluster.security.authorization.Commands.json |  13 +
 .../apispec/cluster.security.authorization.json |  13 +
 .../resources/apispec/collections.Commands.json | 206 +++++++
 .../collections.collection.Commands.json        | 137 +++++
 .../collections.collection.Commands.modify.json |  36 ++
 .../collections.collection.Commands.reload.json |  11 +
 .../apispec/collections.collection.delete.json  |  13 +
 .../apispec/collections.collection.json         |  19 +
 .../collections.collection.shards.Commands.json | 109 ++++
 ...ctions.collection.shards.shard.Commands.json |  24 +
 ...lections.collection.shards.shard.delete.json |  27 +
 ....collection.shards.shard.replica.delete.json |  39 ++
 .../core/src/resources/apispec/collections.json |  13 +
 .../src/resources/apispec/core.RealtimeGet.json |  26 +
 .../apispec/core.SchemaEdit.addCopyField.json   |  27 +
 .../apispec/core.SchemaEdit.addField.json       |  98 +++
 .../core.SchemaEdit.addFieldType.analyzers.json |  51 ++
 .../apispec/core.SchemaEdit.addFieldType.json   |  53 ++
 .../core.SchemaEdit.deleteCopyField.json        |  19 +
 .../core.SchemaEdit.deleteDynamicField.json     |  12 +
 .../apispec/core.SchemaEdit.deleteField.json    |  12 +
 .../core.SchemaEdit.deleteFieldType.json        |  14 +
 .../src/resources/apispec/core.SchemaEdit.json  |  47 ++
 .../apispec/core.SchemaRead.copyFields.json     |  26 +
 ...ore.SchemaRead.dynamicFields_fieldTypes.json |  20 +
 .../apispec/core.SchemaRead.fields.json         |  34 ++
 .../src/resources/apispec/core.SchemaRead.json  |  18 +
 .../core/src/resources/apispec/core.Update.json |  17 +
 ...g.Commands.addRequestHandler.properties.json |  25 +
 .../apispec/core.config.Commands.generic.json   |  19 +
 .../resources/apispec/core.config.Commands.json | 215 +++++++
 .../core.config.Commands.runtimeLib.json        |  23 +
 .../apispec/core.config.Params.Commands.json    |  31 +
 .../resources/apispec/core.config.Params.json   |  13 +
 .../core/src/resources/apispec/core.config.json |  18 +
 .../src/resources/apispec/core.system.blob.json |  20 +
 .../apispec/core.system.blob.upload.json        |  12 +
 .../src/resources/apispec/cores.Commands.json   |  85 +++
 .../src/resources/apispec/cores.Status.json     |  20 +
 .../resources/apispec/cores.core.Commands.json  | 136 +++++
 .../apispec/cores.core.Commands.split.json      |  34 ++
 solr/core/src/resources/apispec/emptySpec.json  |  11 +
 .../src/resources/apispec/node.Commands.json    |  24 +
 solr/core/src/resources/apispec/node.Info.json  |  11 +
 .../core/src/resources/apispec/node.invoke.json |  16 +
 .../conf/solrconfig-managed-schema.xml          |   2 +-
 .../test/org/apache/solr/api/TestPathTrie.java  |  61 ++
 ...ConcurrentDeleteAndCreateCollectionTest.java |  33 +-
 .../cloud/hdfs/HdfsBasicDistributedZkTest.java  |   2 +
 .../apache/solr/cloud/hdfs/HdfsTestUtil.java    |   2 +-
 .../org/apache/solr/cloud/rule/RulesTest.java   |  18 +
 .../solr/core/BlobStoreTestRequestHandler.java  |   1 +
 .../test/org/apache/solr/core/SolrCoreTest.java |   1 +
 .../apache/solr/core/TestDynamicLoading.java    |   2 +-
 .../org/apache/solr/core/TestLazyCores.java     |  75 +++
 .../apache/solr/core/TestSolrConfigHandler.java |  97 ++-
 .../core/snapshots/TestSolrCloudSnapshots.java  |  18 +
 .../solr/handler/TestReplicationHandler.java    |  16 +
 .../solr/handler/V2ApiIntegrationTest.java      |  98 +++
 .../solr/handler/admin/TestApiFramework.java    | 219 +++++++
 .../solr/handler/admin/TestCollectionAPIs.java  | 231 ++++++++
 .../solr/handler/admin/TestConfigsApi.java      |  59 ++
 .../solr/handler/admin/TestCoreAdminApis.java   | 115 ++++
 .../solr/metrics/SolrMetricManagerTest.java     |  27 +-
 .../solr/rest/schema/TestBulkSchemaAPI.java     |  15 +
 .../ApacheLuceneSolrNearQueryBuilder.java       |  12 +-
 .../solr/search/ChooseOneWordQueryBuilder.java  |  62 ++
 .../apache/solr/search/HandyQueryBuilder.java   |  25 +-
 .../org/apache/solr/search/TestFiltering.java   |  58 +-
 .../apache/solr/search/TestSolrCoreParser.java  | 108 ++++
 .../solr/security/BasicAuthIntegrationTest.java |   4 +
 .../TestRuleBasedAuthorizationPlugin.java       |   8 +-
 .../solr/servlet/SolrRequestParserTest.java     |   4 +-
 .../solr/update/SolrIndexMetricsTest.java       |   2 +-
 .../org/apache/solr/util/JsonValidatorTest.java | 189 ++++++
 .../conf/solrconfig.xml                         |   8 +-
 .../apache/solr/client/solrj/SolrRequest.java   |  13 +-
 .../solr/client/solrj/impl/CloudSolrClient.java |  16 +-
 .../client/solrj/request/CoreAdminRequest.java  |  18 +
 .../org/apache/solr/common/cloud/Replica.java   |   3 +
 .../org/apache/solr/common/util/StrUtils.java   |  10 +-
 .../java/org/apache/solr/common/util/Utils.java |   5 +-
 .../solr/common/util/ValidatingJsonMap.java     | 349 +++++++++++
 .../AbstractEmbeddedSolrServerTestCase.java     |  22 +-
 .../solrj/embedded/SolrExampleJettyTest.java    |   9 +-
 .../client/solrj/request/TestCoreAdmin.java     |  95 +++
 .../solr/common/util/TestValidatingJsonMap.java |  52 ++
 .../org/apache/solr/util/ExternalPaths.java     |   2 +-
 .../org/apache/solr/util/RestTestHarness.java   |   8 +
 195 files changed, 8512 insertions(+), 1813 deletions(-)
----------------------------------------------------------------------



[46/50] lucene-solr:jira/solr-9858: SOLR-8593: Fix precommit

Posted by ab...@apache.org.
SOLR-8593: 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/dcf41b9a
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/dcf41b9a
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/dcf41b9a

Branch: refs/heads/jira/solr-9858
Commit: dcf41b9a8e3334fe0038f5b7a3be4549a03c72ce
Parents: 12229b2
Author: Joel Bernstein <jb...@apache.org>
Authored: Wed Feb 15 14:34:59 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 15 14:34:59 2017 -0500

----------------------------------------------------------------------
 solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/dcf41b9a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
index 983ab76..8c4d46d 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrAggregate.java
@@ -73,7 +73,7 @@ class SolrAggregate extends Aggregate implements SolrRel {
       AggregateCall aggCall = namedAggCall.getKey();
 
       Pair<String, String> metric = toSolrMetric(implementor, aggCall, inNames);
-      implementor.addReverseAggMapping(namedAggCall.getValue(), metric.getKey().toLowerCase()+"("+metric.getValue()+")");
+      implementor.addReverseAggMapping(namedAggCall.getValue(), metric.getKey().toLowerCase(Locale.ROOT)+"("+metric.getValue()+")");
       implementor.addMetricPair(namedAggCall.getValue(), metric.getKey(), metric.getValue());
       if(aggCall.getName() == null) {
         implementor.addFieldMapping(namedAggCall.getValue(),


[45/50] lucene-solr:jira/solr-9858: SOLR-8593: Switch to using the BooleanEvaluators

Posted by ab...@apache.org.
SOLR-8593: Switch to using the BooleanEvaluators


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

Branch: refs/heads/jira/solr-9858
Commit: 12229b2ca04726c5db4ab381190fb247d2ec1084
Parents: bfeb4e7
Author: Joel Bernstein <jb...@apache.org>
Authored: Wed Feb 15 14:21:24 2017 -0500
Committer: Joel Bernstein <jb...@apache.org>
Committed: Wed Feb 15 14:21:24 2017 -0500

----------------------------------------------------------------------
 .../org/apache/solr/handler/sql/SolrRel.java    |  1 -
 .../org/apache/solr/handler/sql/SolrTable.java  | 57 ++++++++++----------
 2 files changed, 30 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/12229b2c/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
index 557cfe0..d4de2c6 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrRel.java
@@ -20,7 +20,6 @@ import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptTable;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.util.Pair;
-import org.apache.solr.client.solrj.io.ops.BooleanOperation;
 
 import java.util.*;
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/12229b2c/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
index 6784323..9375bc0 100644
--- a/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
+++ b/solr/core/src/java/org/apache/solr/handler/sql/SolrTable.java
@@ -35,15 +35,16 @@ import org.apache.solr.client.solrj.io.comp.StreamComparator;
 import org.apache.solr.client.solrj.io.eq.FieldEqualitor;
 import org.apache.solr.client.solrj.io.eq.MultipleFieldEqualitor;
 import org.apache.solr.client.solrj.io.eq.StreamEqualitor;
-import org.apache.solr.client.solrj.io.ops.AndOperation;
-import org.apache.solr.client.solrj.io.ops.BooleanOperation;
-import org.apache.solr.client.solrj.io.ops.EqualsOperation;
-import org.apache.solr.client.solrj.io.ops.GreaterThanEqualToOperation;
-import org.apache.solr.client.solrj.io.ops.GreaterThanOperation;
-import org.apache.solr.client.solrj.io.ops.LessThanEqualToOperation;
-import org.apache.solr.client.solrj.io.ops.LessThanOperation;
-import org.apache.solr.client.solrj.io.ops.NotOperation;
-import org.apache.solr.client.solrj.io.ops.OrOperation;
+import org.apache.solr.client.solrj.io.eval.AndEvaluator;
+import org.apache.solr.client.solrj.io.eval.BooleanEvaluator;
+import org.apache.solr.client.solrj.io.eval.EqualsEvaluator;
+import org.apache.solr.client.solrj.io.eval.GreaterThanEqualToEvaluator;
+import org.apache.solr.client.solrj.io.eval.GreaterThanEvaluator;
+import org.apache.solr.client.solrj.io.eval.LessThanEqualToEvaluator;
+import org.apache.solr.client.solrj.io.eval.LessThanEvaluator;
+import org.apache.solr.client.solrj.io.eval.NotEvaluator;
+import org.apache.solr.client.solrj.io.eval.OrEvaluator;
+import org.apache.solr.client.solrj.io.eval.RawValueEvaluator;
 import org.apache.solr.client.solrj.io.stream.*;
 import org.apache.solr.client.solrj.io.stream.expr.StreamExpressionParser;
 import org.apache.solr.client.solrj.io.stream.expr.StreamFactory;
@@ -483,18 +484,19 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
         .withFunctionName("max", MaxMetric.class)
         .withFunctionName("avg", MeanMetric.class)
         .withFunctionName("count", CountMetric.class)
-        .withFunctionName("and", AndOperation.class)
-        .withFunctionName("or", OrOperation.class)
-        .withFunctionName("not", NotOperation.class)
-        .withFunctionName("eq", EqualsOperation.class)
-        .withFunctionName("gt", GreaterThanOperation.class)
-        .withFunctionName("lt", LessThanOperation.class)
-        .withFunctionName("lteq", LessThanEqualToOperation.class)
+        .withFunctionName("and", AndEvaluator.class)
+        .withFunctionName("or", OrEvaluator.class)
+        .withFunctionName("not", NotEvaluator.class)
+        .withFunctionName("eq", EqualsEvaluator.class)
+        .withFunctionName("gt", GreaterThanEvaluator.class)
+        .withFunctionName("lt", LessThanEvaluator.class)
+        .withFunctionName("val", RawValueEvaluator.class)
+        .withFunctionName("lteq", LessThanEqualToEvaluator.class)
         .withFunctionName("having", HavingStream.class)
-        .withFunctionName("gteq", GreaterThanEqualToOperation.class);
+        .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
 
     if(havingPredicate != null) {
-      BooleanOperation booleanOperation = (BooleanOperation)factory.constructOperation(StreamExpressionParser.parse(havingPredicate));
+      BooleanEvaluator booleanOperation = (BooleanEvaluator)factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
       tupleStream = new HavingStream(tupleStream, booleanOperation);
     }
 
@@ -605,17 +607,18 @@ class SolrTable extends AbstractQueryableTable implements TranslatableTable {
         .withFunctionName("max", MaxMetric.class)
         .withFunctionName("avg", MeanMetric.class)
         .withFunctionName("count", CountMetric.class)
-        .withFunctionName("and", AndOperation.class)
-        .withFunctionName("or", OrOperation.class)
-        .withFunctionName("not", NotOperation.class)
-        .withFunctionName("eq", EqualsOperation.class)
-        .withFunctionName("gt", GreaterThanOperation.class)
-        .withFunctionName("lt", LessThanOperation.class)
-        .withFunctionName("lteq", LessThanEqualToOperation.class)
-        .withFunctionName("gteq", GreaterThanEqualToOperation.class);
+        .withFunctionName("and", AndEvaluator.class)
+        .withFunctionName("or", OrEvaluator.class)
+        .withFunctionName("not", NotEvaluator.class)
+        .withFunctionName("eq", EqualsEvaluator.class)
+        .withFunctionName("val", RawValueEvaluator.class)
+        .withFunctionName("gt", GreaterThanEvaluator.class)
+        .withFunctionName("lt", LessThanEvaluator.class)
+        .withFunctionName("lteq", LessThanEqualToEvaluator.class)
+        .withFunctionName("gteq", GreaterThanEqualToEvaluator.class);
 
     if(havingPredicate != null) {
-      BooleanOperation booleanOperation = (BooleanOperation)factory.constructOperation(StreamExpressionParser.parse(havingPredicate));
+      BooleanEvaluator booleanOperation = (BooleanEvaluator)factory.constructEvaluator(StreamExpressionParser.parse(havingPredicate));
       tupleStream = new HavingStream(tupleStream, booleanOperation);
     }
 


[30/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: aaee7513e6df030370df70d7a9bf11045c523108
Parents: db6a339 ca50e5b
Author: Kevin Risden <kr...@apache.org>
Authored: Mon Jan 23 10:42:08 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Mon Jan 23 10:42:08 2017 -0500

----------------------------------------------------------------------
 dev-tools/doap/lucene.rdf                       |    7 +-
 dev-tools/doap/solr.rdf                         |    9 +-
 lucene/CHANGES.txt                              |   19 +
 .../analysis/charfilter/BaseCharFilter.java     |   26 +-
 .../lucene/analysis/core/TestRandomChains.java  |    3 +
 .../index/TestBackwardsCompatibility.java       |    4 +-
 .../org/apache/lucene/index/index.6.4.0-cfs.zip |  Bin 0 -> 15829 bytes
 .../apache/lucene/index/index.6.4.0-nocfs.zip   |  Bin 0 -> 15831 bytes
 lucene/common-build.xml                         |   26 +-
 .../lucene/document/NumericDocValuesField.java  |   48 +
 .../lucene/document/SortedDocValuesField.java   |   42 +
 .../document/SortedNumericDocValuesField.java   |   54 +
 .../SortedNumericDocValuesRangeQuery.java       |  144 ++
 .../document/SortedSetDocValuesField.java       |   43 +
 .../document/SortedSetDocValuesRangeQuery.java  |  188 +++
 .../lucene/search/DoubleValuesSource.java       |    2 +-
 .../lucene/search/FieldComparatorSource.java    |    8 +-
 .../lucene/search/FieldValueHitQueue.java       |   11 +-
 .../lucene/search/IndexOrDocValuesQuery.java    |  166 ++
 .../apache/lucene/search/LongValuesSource.java  |    2 +-
 .../org/apache/lucene/search/SortField.java     |    2 +-
 .../lucene/search/SortedNumericSortField.java   |    2 +-
 .../lucene/search/SortedSetSortField.java       |    2 +-
 .../java/org/apache/lucene/search/TopDocs.java  |   14 +-
 .../apache/lucene/search/TopFieldCollector.java |    4 +-
 .../lucene60/TestLucene60PointsFormat.java      |   47 +-
 .../lucene/search/TestDocValuesQueries.java     |  271 ++++
 .../lucene/search/TestElevationComparator.java  |   22 +-
 .../search/TestIndexOrDocValuesQuery.java       |   89 ++
 .../org/apache/lucene/util/bkd/TestBKD.java     |   37 +-
 .../search/grouping/BlockGroupingCollector.java |    2 +-
 .../grouping/FirstPassGroupingCollector.java    |    3 +-
 .../lucene/search/grouping/SearchGroup.java     |    8 +-
 .../lucene/search/grouping/TopGroups.java       |    5 +-
 lucene/ivy-versions.properties                  |    2 +-
 .../search/join/ToParentBlockJoinCollector.java |    2 +-
 .../search/join/ToParentBlockJoinSortField.java |    2 +-
 .../randomizedtesting-runner-2.4.0.jar.sha1     |    1 -
 .../randomizedtesting-runner-2.5.0.jar.sha1     |    1 +
 .../lucene/queries/function/ValueSource.java    |    2 +-
 .../lucene/document/LatLonPointSortField.java   |    6 +-
 .../lucene/search/DocValuesRangeQuery.java      |  276 ----
 .../lucene/search/IndexOrDocValuesQuery.java    |  116 --
 .../lucene/search/TestDocValuesRangeQuery.java  |  307 ----
 .../search/TestIndexOrDocValuesQuery.java       |   89 --
 lucene/site/changes/changes2html.pl             |    3 +-
 .../spatial3d/Geo3DPointOutsideSortField.java   |    5 +-
 .../lucene/spatial3d/Geo3DPointSortField.java   |    5 +-
 lucene/tools/prettify/inject-javadocs.js        |   27 +
 lucene/tools/prettify/lang-apollo.js            |   18 -
 lucene/tools/prettify/lang-css.js               |   18 -
 lucene/tools/prettify/lang-hs.js                |   18 -
 lucene/tools/prettify/lang-lisp.js              |   19 -
 lucene/tools/prettify/lang-lua.js               |   18 -
 lucene/tools/prettify/lang-ml.js                |   18 -
 lucene/tools/prettify/lang-proto.js             |   17 -
 lucene/tools/prettify/lang-sql.js               |   18 -
 lucene/tools/prettify/lang-vb.js                |   18 -
 lucene/tools/prettify/lang-wiki.js              |   18 -
 lucene/tools/prettify/prettify.css              |   30 +-
 lucene/tools/prettify/prettify.js               |   90 +-
 solr/CHANGES.txt                                |   45 +-
 solr/bin/solr                                   |   11 +-
 solr/bin/solr.cmd                               |   13 +-
 solr/bin/solr.in.cmd                            |    5 +
 solr/bin/solr.in.sh                             |    5 +
 .../apache/solr/schema/ICUCollationField.java   |   10 +-
 .../org/apache/solr/core/CoreContainer.java     |  109 +-
 .../org/apache/solr/core/DirectoryFactory.java  |   27 +
 .../src/java/org/apache/solr/core/SolrCore.java |  120 +-
 .../org/apache/solr/handler/IndexFetcher.java   |   60 +-
 .../org/apache/solr/handler/RestoreCore.java    |    2 +-
 .../solr/handler/admin/CoreAdminOperation.java  |    1 +
 .../solr/handler/admin/LukeRequestHandler.java  |    7 +-
 .../solr/handler/component/FacetComponent.java  |   12 +-
 .../component/MoreLikeThisComponent.java        |   12 +-
 .../solr/handler/component/QueryComponent.java  |   25 +-
 .../component/QueryElevationComponent.java      |   60 +-
 .../handler/component/RangeFacetProcessor.java  |    3 +-
 .../handler/component/RangeFacetRequest.java    |   31 +-
 .../component/ShardFieldSortedHitQueue.java     |    8 +-
 .../solr/handler/component/StatsComponent.java  |    6 +
 .../handler/component/StatsValuesFactory.java   |    2 +-
 .../handler/component/TermVectorComponent.java  |    9 +
 .../solr/index/SlowCompositeReaderWrapper.java  |    3 -
 .../org/apache/solr/request/IntervalFacets.java |    4 +
 .../org/apache/solr/request/SimpleFacets.java   |   37 +-
 .../apache/solr/request/json/RequestUtil.java   |   16 +-
 .../org/apache/solr/response/DocsStreamer.java  |    8 +
 .../org/apache/solr/schema/CollationField.java  |    3 +-
 .../apache/solr/schema/DoublePointField.java    |  186 +++
 .../java/org/apache/solr/schema/EnumField.java  |   20 +-
 .../java/org/apache/solr/schema/FieldType.java  |   25 +-
 .../org/apache/solr/schema/FloatPointField.java |  186 +++
 .../org/apache/solr/schema/IntPointField.java   |  186 +++
 .../org/apache/solr/schema/LongPointField.java  |  185 +++
 .../apache/solr/schema/NumericFieldType.java    |  151 ++
 .../java/org/apache/solr/schema/PointField.java |  233 +++
 .../org/apache/solr/schema/SchemaField.java     |   10 +
 .../org/apache/solr/schema/TrieDateField.java   |    2 +-
 .../org/apache/solr/schema/TrieDoubleField.java |    2 +-
 .../java/org/apache/solr/schema/TrieField.java  |  150 +-
 .../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    |    2 +-
 .../apache/solr/search/SolrIndexSearcher.java   |   45 +-
 .../apache/solr/search/TermQParserPlugin.java   |   10 +-
 .../apache/solr/search/TermsQParserPlugin.java  |   10 +
 .../apache/solr/search/facet/FacetRange.java    |   28 +-
 .../distributed/command/GroupConverter.java     |    2 +-
 .../SearchGroupShardResponseProcessor.java      |  160 +-
 .../TopGroupsShardResponseProcessor.java        |  114 +-
 .../solr/security/GenericHadoopAuthPlugin.java  |  266 ----
 .../apache/solr/security/HadoopAuthPlugin.java  |    2 +-
 .../DocumentExpressionDictionaryFactory.java    |   12 +-
 .../conf/schema-distrib-interval-faceting.xml   |   14 +-
 .../conf/schema-docValuesFaceting.xml           |   12 +
 .../solr/collection1/conf/schema-point.xml      |   92 ++
 .../solr/collection1/conf/schema-sorts.xml      |   44 +-
 .../test-files/solr/collection1/conf/schema.xml |   26 +-
 .../solr/collection1/conf/schema11.xml          |   19 +-
 .../solr/collection1/conf/schema12.xml          |   15 +-
 .../solr/collection1/conf/schema_latest.xml     |   21 +-
 .../configsets/cloud-hdfs/conf/solrconfig.xml   |    2 +
 .../apache/solr/TestDistributedGrouping.java    |   10 +-
 .../org/apache/solr/TestDistributedSearch.java  |   46 +-
 .../core/src/test/org/apache/solr/TestJoin.java |    6 +-
 .../org/apache/solr/TestRandomDVFaceting.java   |    8 +
 .../org/apache/solr/TestRandomFaceting.java     |   12 +-
 .../solr/cloud/CollectionsAPISolrJTest.java     |   34 -
 .../solr/cloud/MissingSegmentRecoveryTest.java  |  123 ++
 .../apache/solr/cloud/OverseerRolesTest.java    |  173 +-
 .../apache/solr/cloud/TestCloudPivotFacet.java  |    2 +
 .../HdfsCollectionsAPIDistributedZkTest.java    |    1 +
 .../handler/XsltUpdateRequestHandlerTest.java   |    2 +-
 .../handler/admin/LukeRequestHandlerTest.java   |    8 +-
 .../component/DistributedMLTComponentTest.java  |   23 +
 .../TermVectorComponentDistributedTest.java     |   18 +
 .../handler/component/TestExpandComponent.java  |    8 +-
 .../apache/solr/request/TestFacetMethods.java   |   12 +
 .../apache/solr/schema/SortableBinaryField.java |    3 +-
 .../org/apache/solr/schema/TestPointFields.java | 1495 ++++++++++++++++++
 .../solr/search/TestCollapseQParserPlugin.java  |    4 +-
 .../solr/search/TestMaxScoreQueryParser.java    |    2 +-
 .../search/TestRandomCollapseQParserPlugin.java |    2 +
 .../apache/solr/search/TestSolrQueryParser.java |    8 +
 .../solr/search/facet/TestJsonFacets.java       |    2 +
 solr/licenses/junit4-ant-2.4.0.jar.sha1         |    1 -
 solr/licenses/junit4-ant-2.5.0.jar.sha1         |    1 +
 .../randomizedtesting-runner-2.4.0.jar.sha1     |    1 -
 .../randomizedtesting-runner-2.5.0.jar.sha1     |    1 +
 solr/server/scripts/cloud-scripts/zkcli.bat     |    2 +-
 solr/server/scripts/cloud-scripts/zkcli.sh      |    2 +-
 .../java/org/apache/solr/SolrTestCaseJ4.java    |   44 +-
 155 files changed, 5266 insertions(+), 2134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/aaee7513/lucene/ivy-versions.properties
----------------------------------------------------------------------


[32/50] lucene-solr:jira/solr-9858: Merge branch 'apache-https-master' into jira/solr-8593

Posted by ab...@apache.org.
Merge branch 'apache-https-master' into jira/solr-8593


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

Branch: refs/heads/jira/solr-9858
Commit: a9bdfdec109abf410502b3804db4161abd33caf9
Parents: 934a92e bb5bf3f
Author: Kevin Risden <kr...@apache.org>
Authored: Sat Jan 28 12:20:51 2017 -0500
Committer: Kevin Risden <kr...@apache.org>
Committed: Sat Jan 28 12:20:51 2017 -0500

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  4 ++
 solr/bin/solr.cmd                               | 40 ++++++++++----------
 .../org/apache/solr/cloud/MockZkController.java | 36 ++++++++++++++++++
 .../schema/TestManagedSchemaThreadSafety.java   | 32 ++++++++++++++--
 4 files changed, 88 insertions(+), 24 deletions(-)
----------------------------------------------------------------------