mirror of https://github.com/apache/lucene.git
SOLR-13968: Support postingsFormat and docValuesFormat in schema fields.
Closes #1039
This commit is contained in:
parent
8b2d8d0947
commit
1927e850c8
|
@ -82,6 +82,8 @@ Improvements
|
||||||
|
|
||||||
* SOLR-13969: Clean up and document AuditEvent API (janhoy)
|
* SOLR-13969: Clean up and document AuditEvent API (janhoy)
|
||||||
|
|
||||||
|
* SOLR-13968: Support postingsFormat and docValuesFormat in schema fields. (Bruno Roustant)
|
||||||
|
|
||||||
Optimizations
|
Optimizations
|
||||||
---------------------
|
---------------------
|
||||||
(No changes)
|
(No changes)
|
||||||
|
|
|
@ -73,6 +73,8 @@ public abstract class FieldProperties {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static final String POSTINGS_FORMAT = "postingsFormat";
|
||||||
|
static final String DOC_VALUES_FORMAT = "docValuesFormat";
|
||||||
|
|
||||||
/** Returns the symbolic name for the property. */
|
/** Returns the symbolic name for the property. */
|
||||||
static String getPropertyName(int property) {
|
static String getPropertyName(int property) {
|
||||||
|
@ -85,13 +87,16 @@ public abstract class FieldProperties {
|
||||||
return 1 << i;
|
return 1 << i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (failOnError && !"default".equals(name)) {
|
if (failOnError && !isPropertyIgnored(name)) {
|
||||||
throw new IllegalArgumentException("Invalid field property: " + name);
|
throw new IllegalArgumentException("Invalid field property: " + name);
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isPropertyIgnored(String name) {
|
||||||
|
return name.equals("default") || name.equals(POSTINGS_FORMAT) || name.equals(DOC_VALUES_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
static String propertiesToString(int properties) {
|
static String propertiesToString(int properties) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
|
@ -985,8 +985,6 @@ public abstract class FieldType extends FieldProperties {
|
||||||
public static final String FILTER = "filter";
|
public static final String FILTER = "filter";
|
||||||
public static final String FILTERS = "filters";
|
public static final String FILTERS = "filters";
|
||||||
|
|
||||||
private static final String POSTINGS_FORMAT = "postingsFormat";
|
|
||||||
private static final String DOC_VALUES_FORMAT = "docValuesFormat";
|
|
||||||
protected static final String AUTO_GENERATE_PHRASE_QUERIES = "autoGeneratePhraseQueries";
|
protected static final String AUTO_GENERATE_PHRASE_QUERIES = "autoGeneratePhraseQueries";
|
||||||
protected static final String ENABLE_GRAPH_QUERIES = "enableGraphQueries";
|
protected static final String ENABLE_GRAPH_QUERIES = "enableGraphQueries";
|
||||||
private static final String ARGS = "args";
|
private static final String ARGS = "args";
|
||||||
|
|
|
@ -48,7 +48,7 @@ public final class SchemaField extends FieldProperties implements IndexableField
|
||||||
boolean required = false; // this can't be final since it may be changed dynamically
|
boolean required = false; // this can't be final since it may be changed dynamically
|
||||||
|
|
||||||
/** Declared field property overrides */
|
/** Declared field property overrides */
|
||||||
Map<String,?> args = Collections.emptyMap();
|
Map<String,Object> args = Collections.emptyMap();
|
||||||
|
|
||||||
|
|
||||||
/** Create a new SchemaField with the given name and type,
|
/** Create a new SchemaField with the given name and type,
|
||||||
|
@ -154,6 +154,22 @@ public final class SchemaField extends FieldProperties implements IndexableField
|
||||||
return type.getSortField(this, top);
|
return type.getSortField(this, top);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expert/advanced method to get the field {@link org.apache.lucene.codecs.PostingsFormat}.
|
||||||
|
* @return The {@code postingsFormat} declared; or null if unspecified.
|
||||||
|
*/
|
||||||
|
public String getPostingsFormat() {
|
||||||
|
return (String) args.getOrDefault(POSTINGS_FORMAT, type.getPostingsFormat());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expert/advanced method to get the field {@link org.apache.lucene.codecs.DocValuesFormat}.
|
||||||
|
* @return The {@code docValuesFormat} declared; or null if unspecified.
|
||||||
|
*/
|
||||||
|
public String getDocValuesFormat() {
|
||||||
|
return (String) args.getOrDefault(DOC_VALUES_FORMAT, type.getDocValuesFormat());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanity checks that the properties of this field type are plausible
|
* Sanity checks that the properties of this field type are plausible
|
||||||
* for a field that may be used in sorting, throwing an appropriate
|
* for a field that may be used in sorting, throwing an appropriate
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<schema name="test">
|
||||||
|
|
||||||
|
<fieldType name="str_none" class="solr.StrField"/>
|
||||||
|
<fieldType name="str_direct_asserting" class="solr.StrField" postingsFormat="Direct" docValuesFormat="Asserting"/>
|
||||||
|
<fieldType name="str_standard_simple" class="solr.StrField" postingsFormat="Lucene84" docValuesFormat="SimpleTextDocValuesFormat"/>
|
||||||
|
|
||||||
|
<field name="str_none_f" type="str_none"/>
|
||||||
|
<field name="str_direct_asserting_f" type="str_direct_asserting"/>
|
||||||
|
<field name="str_standard_simple_f" type="str_standard_simple"/>
|
||||||
|
|
||||||
|
<field name="str_none_lucene80_f" type="str_none" postingsFormat="Lucene80"/>
|
||||||
|
<field name="str_standard_lucene80_f" type="str_standard_simple" postingsFormat="Lucene80"/>
|
||||||
|
|
||||||
|
<field name="str_none_asserting_f" type="str_none" docValuesFormat="Asserting"/>
|
||||||
|
<field name="str_standard_asserting_f" type="str_standard_simple" docValuesFormat="Asserting"/>
|
||||||
|
|
||||||
|
<dynamicField name="*_lucene80" type="str_direct_asserting" postingsFormat="Lucene80"/>
|
||||||
|
<dynamicField name="*_direct" type="str_direct_asserting"/>
|
||||||
|
<dynamicField name="*_lucene70" type="str_none" postingsFormat="Lucene70"/>
|
||||||
|
|
||||||
|
<dynamicField name="*_asserting" type="str_none" docValuesFormat="Asserting"/>
|
||||||
|
<dynamicField name="*_simple" type="str_direct_asserting" docValuesFormat="SimpleTextDocValuesFormat"/>
|
||||||
|
|
||||||
|
</schema>
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* 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.schema;
|
||||||
|
|
||||||
|
import org.apache.solr.SolrTestCaseJ4;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
|
public class TestSchemaField extends SolrTestCaseJ4 {
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void create() throws Exception {
|
||||||
|
initCore("solrconfig_codec.xml","schema_postingsformat.xml");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void cleanup() {
|
||||||
|
clearIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFieldTypes() {
|
||||||
|
assertFieldTypeFormats("str_none", null, null);
|
||||||
|
assertFieldTypeFormats("str_direct_asserting", "Direct", "Asserting");
|
||||||
|
assertFieldTypeFormats("str_standard_simple", "Lucene84", "SimpleTextDocValuesFormat");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertFieldTypeFormats(String fieldTypeName, String expectedPostingsFormat, String expectedDocValuesFormat) {
|
||||||
|
FieldType ft = h.getCore().getLatestSchema().getFieldTypeByName(fieldTypeName);
|
||||||
|
assertNotNull("Field type " + fieldTypeName + " not found - schema got changed?", ft);
|
||||||
|
assertEquals("Field type " + ft.getTypeName() + " wrong " + FieldProperties.POSTINGS_FORMAT
|
||||||
|
+ " - schema got changed?",
|
||||||
|
expectedPostingsFormat, ft.getNamedPropertyValues(true).get(FieldProperties.POSTINGS_FORMAT));
|
||||||
|
assertEquals("Field type " + ft.getTypeName() + " wrong " + FieldProperties.DOC_VALUES_FORMAT
|
||||||
|
+ " - schema got changed?",
|
||||||
|
expectedDocValuesFormat, ft.getNamedPropertyValues(true).get(FieldProperties.DOC_VALUES_FORMAT));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFields() {
|
||||||
|
assertFieldFormats("str_none_f", null, null);
|
||||||
|
assertFieldFormats("str_direct_asserting_f", "Direct", "Asserting");
|
||||||
|
assertFieldFormats("str_standard_simple_f", "Lucene84", "SimpleTextDocValuesFormat");
|
||||||
|
|
||||||
|
assertFieldFormats("str_none_lucene80_f", "Lucene80", null);
|
||||||
|
assertFieldFormats("str_standard_lucene80_f", "Lucene80", "SimpleTextDocValuesFormat");
|
||||||
|
|
||||||
|
assertFieldFormats("str_none_asserting_f", null, "Asserting");
|
||||||
|
assertFieldFormats("str_standard_asserting_f", "Lucene84", "Asserting");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDynamicFields() {
|
||||||
|
assertFieldFormats("any_lucene80", "Lucene80", "Asserting");
|
||||||
|
assertFieldFormats("any_direct", "Direct", "Asserting");
|
||||||
|
assertFieldFormats("any_lucene70", "Lucene70", null);
|
||||||
|
|
||||||
|
assertFieldFormats("any_asserting", null, "Asserting");
|
||||||
|
assertFieldFormats("any_simple", "Direct", "SimpleTextDocValuesFormat");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertFieldFormats(String fieldName, String expectedPostingsFormat, String expectedDocValuesFormat) {
|
||||||
|
SchemaField f = h.getCore().getLatestSchema().getField(fieldName);
|
||||||
|
assertNotNull("Field " + fieldName + " not found - schema got changed?", f);
|
||||||
|
assertEquals("Field " + f.getName() + " wrong " + FieldProperties.POSTINGS_FORMAT
|
||||||
|
+ " - schema got changed?",
|
||||||
|
expectedPostingsFormat, f.getPostingsFormat());
|
||||||
|
assertEquals("Field " + f.getName() + " wrong " + FieldProperties.DOC_VALUES_FORMAT
|
||||||
|
+ " - schema got changed?",
|
||||||
|
expectedDocValuesFormat, f.getDocValuesFormat());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue