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(-)
----------------------------------------------------------------------