This is an automated email from the ASF dual-hosted git repository.
mdrob pushed a commit to branch branch_9_0
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9_0 by this push:
new ca92f33 SOLR-15333 Fix SpatialRecursivePrefixTreeFieldType schema
definition warnings (#645)
ca92f33 is described below
commit ca92f33e3685acf7050180e3827371bcc8b1115f
Author: Mike Drob <[email protected]>
AuthorDate: Fri Feb 18 12:22:56 2022 -0600
SOLR-15333 Fix SpatialRecursivePrefixTreeFieldType schema definition
warnings (#645)
Co-authored-by: Steffen Moldenhauer <[email protected]>
Co-authored-by: David Smiley <[email protected]>
(cherry picked from commit 7f620c7a10006f344ff660d28b17298372f102fd)
---
solr/CHANGES.txt | 2 +
.../schema/AbstractSpatialPrefixTreeFieldType.java | 30 +++++++-------
.../java/org/apache/solr/schema/IndexSchema.java | 2 +-
.../java/org/apache/solr/schema/SchemaManager.java | 19 +++++----
.../solr/util/plugin/AbstractPluginLoader.java | 6 +--
.../apache/solr/rest/schema/TestBulkSchemaAPI.java | 47 ++++++++++++++++++++++
6 files changed, 80 insertions(+), 26 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 61d797a..9a42505 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -611,6 +611,8 @@ Bug Fixes
* SOLR-16019: UTF-8 parsing errors for parameters should cause a HTTP 400
status code, not 500 (janhoy, Matthias Pigulla)
+* SOLR-15333: Reduced spurious warn logging by
AbstractSpatialPrefixTreeFieldType field properties (Steffen Moldenhauer, David
Smiley, Mike Drob)
+
================== 8.11.1 ==================
Bug Fixes
diff --git
a/solr/core/src/java/org/apache/solr/schema/AbstractSpatialPrefixTreeFieldType.java
b/solr/core/src/java/org/apache/solr/schema/AbstractSpatialPrefixTreeFieldType.java
index f7b9912..4f15e00 100644
---
a/solr/core/src/java/org/apache/solr/schema/AbstractSpatialPrefixTreeFieldType.java
+++
b/solr/core/src/java/org/apache/solr/schema/AbstractSpatialPrefixTreeFieldType.java
@@ -72,22 +72,19 @@ public abstract class AbstractSpatialPrefixTreeFieldType<T
extends PrefixTreeStr
for (Map.Entry<String, String> entry : FIELD_TYPE_INVARIANTS.entrySet()) {
final String key = entry.getKey();
final String hardcodedValue = entry.getValue();
- final String userConfiguredValue = args.get(entry.getKey());
-
- if (args.containsKey(key)) {
- if (userConfiguredValue.equals(hardcodedValue)) {
- log.warn("FieldType {} does not allow {} to be specified in schema,
hardcoded behavior is {}={}",
- getClass().getSimpleName(), key, key, hardcodedValue);
- } else {
- final String message = String.format(Locale.ROOT, "FieldType %s is
incompatible with %s=%s; hardcoded " +
- "behavior is %s=%s. Remove specification in schema",
- getClass().getSimpleName(), key, userConfiguredValue, key,
hardcodedValue);
- throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
message);
- }
+ final String userConfiguredValue = args.remove(key);
+
+ if (hardcodedValue.equals(userConfiguredValue)) {
+ // If this is coming from the schema API, can we pass it back to the
user without causing a failure?
+ log.warn("FieldType {} does not allow {} to be specified in schema,
hardcoded behavior is {}={}",
+ getClass().getSimpleName(), key, key, hardcodedValue);
+ } else if (userConfiguredValue != null) {
+ final String message = String.format(Locale.ROOT,
+ "FieldType %s is incompatible with %s=%s; hardcoded behavior is
%s=%s. Remove specification in schema",
+ getClass().getSimpleName(), key, userConfiguredValue, key,
hardcodedValue);
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, message);
}
}
- args.putAll(FIELD_TYPE_INVARIANTS);
-
super.setArgs(schema, args);
}
@@ -95,6 +92,11 @@ public abstract class AbstractSpatialPrefixTreeFieldType<T
extends PrefixTreeStr
protected void init(IndexSchema schema, Map<String, String> args) {
super.init(schema, args);
+ //set STORE_ property flags to be always false
+ properties &= ~(STORE_TERMPOSITIONS | STORE_TERMOFFSETS);
+ //set OMIT_ property flags to be always true
+ properties |= (OMIT_TF_POSITIONS | OMIT_NORMS | OMIT_POSITIONS);
+
args.putIfAbsent(SpatialPrefixTreeFactory.VERSION,
schema.getDefaultLuceneMatchVersion().toString());
// Convert the maxDistErr to degrees (based on distanceUnits) since Lucene
spatial layer depends on degrees
diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
index 1fb0de7..ba1a565 100644
--- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
@@ -765,7 +765,7 @@ public class IndexSchema {
for (Map.Entry<SchemaField, Integer> entry :
copyFieldTargetCounts.entrySet()) {
if (entry.getValue() > 1 && !entry.getKey().multiValued()) {
- log.warn("Field {} is not multivalued and destination for multiople {}
({})"
+ log.warn("Field {} is not multivalued and destination for multiple {}
({})"
, entry.getKey().name, COPY_FIELDS, entry.getValue());
}
}
diff --git a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
index 03bdde2..da909bc 100644
--- a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
+++ b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
@@ -186,7 +186,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.addFieldTypes(singletonList(fieldType), false);
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not add field type.", e);
op.addError(getErrorStr(e));
return false;
}
@@ -221,7 +221,7 @@ public class SchemaManager {
mgr.managedIndexSchema = mgr.managedIndexSchema.addCopyFields(src,
dests, maxChars);
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not add copy field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -239,7 +239,7 @@ public class SchemaManager {
= mgr.managedIndexSchema.addFields(singletonList(field),
Collections.emptyMap(), false);
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not add field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -257,7 +257,7 @@ public class SchemaManager {
= mgr.managedIndexSchema.addDynamicFields(singletonList(field),
Collections.emptyMap(), false);
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not add dynamic field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -276,7 +276,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.deleteFieldTypes(singleton(name));
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not delete field type", e);
op.addError(getErrorStr(e));
return false;
}
@@ -297,6 +297,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.deleteCopyFields(singletonMap(source, dests));
return true;
} catch (Exception e) {
+ log.error("Could not delete copy field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -315,6 +316,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.deleteFields(singleton(name));
return true;
} catch (Exception e) {
+ log.error("Could not delete field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -333,7 +335,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.deleteDynamicFields(singleton(name));
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not delete dynamic field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -349,7 +351,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.replaceFieldType(name, className, op.getDataMap());
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not replace field type", e);
op.addError(getErrorStr(e));
return false;
}
@@ -370,7 +372,7 @@ public class SchemaManager {
mgr.managedIndexSchema = mgr.managedIndexSchema.replaceField(name,
ft, op.getValuesExcluding(NAME, TYPE));
return true;
} catch (Exception e) {
- log.error("err", e);
+ log.error("Could not replace field", e);
op.addError(getErrorStr(e));
return false;
}
@@ -391,6 +393,7 @@ public class SchemaManager {
mgr.managedIndexSchema =
mgr.managedIndexSchema.replaceDynamicField(name, ft,
op.getValuesExcluding(NAME, TYPE));
return true;
} catch (Exception e) {
+ log.error("Could not replace dynamic field", e);
op.addError(getErrorStr(e));
return false;
}
diff --git
a/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
b/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
index 4dc386d..73fc5b9 100644
--- a/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
+++ b/solr/core/src/java/org/apache/solr/util/plugin/AbstractPluginLoader.java
@@ -257,10 +257,10 @@ public abstract class AbstractPluginLoader<T>
for (PluginInitInfo pinfo : info) {
try {
init(pinfo.plugin, pinfo.node);
+ } catch (SolrException e) {
+ throw new SolrException(ErrorCode.getErrorCode(e.code()), "Plugin init
failure for " + type, e);
} catch (Exception ex) {
- SolrException e = new SolrException
- (ErrorCode.SERVER_ERROR, "Plugin init failure for " + type, ex);
- throw e;
+ throw new SolrException(ErrorCode.SERVER_ERROR, "Plugin init failure
for " + type, ex);
}
}
return plugin;
diff --git
a/solr/core/src/test/org/apache/solr/rest/schema/TestBulkSchemaAPI.java
b/solr/core/src/test/org/apache/solr/rest/schema/TestBulkSchemaAPI.java
index aa0b868..960b83a 100644
--- a/solr/core/src/test/org/apache/solr/rest/schema/TestBulkSchemaAPI.java
+++ b/solr/core/src/test/org/apache/solr/rest/schema/TestBulkSchemaAPI.java
@@ -38,8 +38,10 @@ import
org.apache.solr.client.solrj.request.schema.SchemaRequest;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.SolrCore;
+import org.apache.solr.schema.AbstractSpatialPrefixTreeFieldType;
import org.apache.solr.schema.SimilarityFactory;
import org.apache.solr.search.similarities.SchemaSimilarityFactory;
+import org.apache.solr.util.LogListener;
import org.apache.solr.util.RESTfulServerProvider;
import org.apache.solr.util.RestTestBase;
import org.apache.solr.util.RestTestHarness;
@@ -50,6 +52,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.solr.common.util.Utils.fromJSONString;
+import static org.hamcrest.Matchers.containsString;
public class TestBulkSchemaAPI extends RestTestBase {
@@ -1179,6 +1182,50 @@ public class TestBulkSchemaAPI extends RestTestBase {
assertEquals(1, size);
}
+ @Test
+ public void testDateRangeFieldDefaults() throws Exception {
+ try (LogListener listener =
LogListener.warn(AbstractSpatialPrefixTreeFieldType.class)) {
+ // Add a default date range field and verify success
+ assertJPost("/schema", "{\n"
+ + " \"add-field-type\":{\n"
+ + " \"name\":\"dr-field1\",\n"
+ + " \"class\":\"solr.DateRangeField\"}\n"
+ + "}", "/responseHeader/status==0");
+ assertJQ(
+ "/schema/fieldtypes/dr-field1",
+ "fieldType=={\n"
+ + " \"name\":\"dr-field1\",\n"
+ + " \"class\":\"solr.DateRangeField\"\n"
+ + "}");
+
+ assertEquals(0, listener.getCount());
+
+ // Add a date range field with redundant invariants
+ assertJPost("/schema", "{\n"
+ + " \"add-field-type\":{\n"
+ + " \"name\":\"dr-redundant\",\n"
+ + " \"omitNorms\":\"true\",\n"
+ + " \"termOffsets\":\"false\",\n"
+ + " \"class\":\"solr.DateRangeField\"}\n"
+ + "}", "/responseHeader/status==0");
+
+ assertEquals(2, listener.getCount());
+ assertThat(listener.pollMessage(), containsString("hardcoded behavior is
omitNorms=true"));
+ assertThat(listener.pollMessage(), containsString("hardcoded behavior is
termOffsets=false"));
+
+ // Add a date range field with violated invariants
+ assertJPost("/schema", "{\n"
+ + " \"add-field-type\":{\n"
+ + " \"name\":\"dr-invalid\",\n"
+ + " \"omitNorms\":\"false\",\n"
+ + " \"termOffsets\":\"true\",\n"
+ + " \"class\":\"solr.DateRangeField\"}\n"
+ + "}", "/responseHeader/status==400");
+
+ // could assert no more listener events but listener's close() gives us
a better error message
+ }
+ }
+
public void testSimilarityParser() throws Exception {
RestTestHarness harness = restTestHarness;