SOLR-2669: Fix backwards validation logic in SchemaField.calcProps

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1150478 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Chris M. Hostetter 2011-07-24 20:09:43 +00:00
parent 49075985fb
commit 7c1a58f72d
9 changed files with 215 additions and 6 deletions

View File

@ -288,6 +288,19 @@ Upgrading from Solr 3.3
before the master. If the master were to be updated first, the older
searchers would not be able to read the new index format.
* Previous versions of Solr silently allow and ignore some contradictory
properties specified in schema.xml. For example:
- indexed="false" omitNorms="false"
- indexed="false" omitTermFreqAndPositions="false"
Field property validation has now been fixed, to ensure that
contradictions like these now generate error messages. If users
have existing schemas that generate one of these new "conflicting
'false' field options for non-indexed field" error messages the
conflicting "omit*" properties can safely be removed, or changed to
"true" for consistent behavior with previous Solr versions. This
situation has now been fixed to cause an error on startup when these
contradictory options. See SOLR-2669.
New Features
----------------------
@ -378,6 +391,8 @@ Bug Fixes
"start" parameter was not honored and the documents returned were
0 through start+offset. (Markus Jelsma, yonik)
* SOLR-2669: Fix backwards validation of field properties in
SchemaField.calcProps (hossman)
Other Changes

View File

@ -577,7 +577,7 @@ public final class IndexSchema {
} catch(Exception e) {
// unexpected exception...
SolrConfig.severeErrors.add( e );
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Schema Parsing Failed",e,false);
throw new SolrException( SolrException.ErrorCode.SERVER_ERROR,"Schema Parsing Failed: " + e.getMessage(), e,false);
}
// create the field analyzers

View File

@ -226,20 +226,27 @@ public final class SchemaField extends FieldProperties {
}
if (on(falseProps,INDEXED)) {
int pp = (INDEXED | OMIT_NORMS | OMIT_TF_POSITIONS | OMIT_POSITIONS
int pp = (INDEXED
| STORE_TERMVECTORS | STORE_TERMPOSITIONS | STORE_TERMOFFSETS
| SORT_MISSING_FIRST | SORT_MISSING_LAST);
if (on(pp,trueProps)) {
throw new RuntimeException("SchemaField: " + name + " conflicting indexed field options:" + props);
throw new RuntimeException("SchemaField: " + name + " conflicting 'true' field options for non-indexed field:" + props);
}
p &= ~pp;
}
if (on(falseProps,INDEXED)) {
int pp = (OMIT_NORMS | OMIT_TF_POSITIONS | OMIT_POSITIONS);
if (on(pp,falseProps)) {
throw new RuntimeException("SchemaField: " + name + " conflicting 'false' field options for non-indexed field:" + props);
}
p &= ~pp;
}
if (on(falseProps,OMIT_TF_POSITIONS)) {
if (on(trueProps,OMIT_TF_POSITIONS)) {
int pp = (OMIT_POSITIONS | OMIT_TF_POSITIONS);
if (on(pp, trueProps)) {
throw new RuntimeException("SchemaField: " + name + " conflicting indexed field options:" + props);
if (on(pp, falseProps)) {
throw new RuntimeException("SchemaField: " + name + " conflicting tf and position field options:" + props);
}
p &= ~pp;
}

View File

@ -0,0 +1,40 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="bad-schema-not-indexed-but-norms" version="1.0">
<types>
<fieldType name="string" class="solr.StrField"/>
</types>
<fields>
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
<field name="signatureField" type="string" indexed="true" stored="false"/>
<!-- BEGIN BAD STUFF -->
<field name="bad_field" type="string" indexed="false" omitNorms="false" />
<!-- END BAD STUFF -->
<dynamicField name="*_sS" type="string" indexed="false" stored="true"/>
</fields>
<defaultSearchField>id</defaultSearchField>
<uniqueKey>id</uniqueKey>
</schema>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="bad-schema-not-indexed-but-pos" version="1.0">
<types>
<fieldType name="string" class="solr.StrField"/>
</types>
<fields>
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
<field name="signatureField" type="string" indexed="true" stored="false"/>
<!-- BEGIN BAD STUFF -->
<field name="bad_field" type="string" indexed="false" omitPositions="false" />
<!-- END BAD STUFF -->
<dynamicField name="*_sS" type="string" indexed="false" stored="true"/>
</fields>
<defaultSearchField>id</defaultSearchField>
<uniqueKey>id</uniqueKey>
</schema>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="bad-schema-not-indexed-but-tf" version="1.0">
<types>
<fieldType name="string" class="solr.StrField"/>
</types>
<fields>
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
<field name="signatureField" type="string" indexed="true" stored="false"/>
<!-- BEGIN BAD STUFF -->
<field name="bad_field" type="string" indexed="false" omitTermFreqAndPositions="false" />
<!-- END BAD STUFF -->
<dynamicField name="*_sS" type="string" indexed="false" stored="true"/>
</fields>
<defaultSearchField>id</defaultSearchField>
<uniqueKey>id</uniqueKey>
</schema>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<schema name="bad-schema-omit-tf-but-not-pos" version="1.0">
<types>
<fieldType name="string" class="solr.StrField"/>
</types>
<fields>
<field name="id" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
<field name="signatureField" type="string" indexed="true" stored="false"/>
<!-- BEGIN BAD STUFF -->
<field name="bad_field" type="string" indexed="true"
omitTermFreqAndPositions="true" omitPositions="false" />
<!-- END BAD STUFF -->
<dynamicField name="*_sS" type="string" indexed="false" stored="true"/>
</fields>
<defaultSearchField>id</defaultSearchField>
<uniqueKey>id</uniqueKey>
</schema>

View File

@ -481,6 +481,24 @@
<field name="test_posofftv" type="text" termVectors="true"
termPositions="true" termOffsets="true"/>
<!-- test valid combinations of indexed settings,
see also BadIndexSchemaTest -->
<!-- indexed=false should not prevent omit___=true -->
<field name="pint_i_norm" type="pint" omitNorms="true"
indexed="false" />
<field name="pint_i_tf" type="pint" omitOmitTermFreqAndPositions="true"
indexed="false" />
<field name="pint_i_pos" type="pint" omitPositions="true"
indexed="false" />
<field name="pint_i_all" type="pint"
indexed="false"
omitNorms="true"
omitOmitTermFreqAndPositions="true"
omitPositions="true" />
<!-- omitOmitTermFreqAndPositions=false and omitPositions=true are ok -->
<field name="pint_tf_pos" type="pint" indexed="true"
omitOmitTermFreqAndPositions="false" omitPositions="true" />
<!-- test highlit field settings -->
<field name="test_hlt" type="highlittext" indexed="true" compressed="true"/>
<field name="test_hlt_off" type="highlittext" indexed="true" compressed="false"/>

View File

@ -48,6 +48,14 @@ public class BadIndexSchemaTest extends SolrTestCaseJ4 {
fail("Did not encounter any exception from: " + schema);
}
@Test
public void testSevereErrorsForInvalidFieldOptions() throws Exception {
doTest("bad-schema-not-indexed-but-norms.xml", "bad_field");
doTest("bad-schema-not-indexed-but-tf.xml", "bad_field");
doTest("bad-schema-not-indexed-but-pos.xml", "bad_field");
doTest("bad-schema-omit-tf-but-not-pos.xml", "bad_field");
}
@Test
public void testSevereErrorsForDuplicateFields() throws Exception {
doTest("bad-schema-dup-field.xml", "fAgain");