mirror of https://github.com/apache/lucene.git
LUCENE-3146: IndexReader.setNorms is no op if one of the field instances omits norms
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1130039 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
41c0976f9e
commit
a890a8f5b0
|
@ -236,6 +236,9 @@ Changes in Runtime Behavior
|
|||
|
||||
(Mike McCandless, Michael Busch, Simon Willnauer)
|
||||
|
||||
* LUCENE-3146: IndexReader.setNorm throws IllegalStateException if the field
|
||||
does not store norms. (Shai Erera, Mike McCandless)
|
||||
|
||||
API Changes
|
||||
|
||||
* LUCENE-2302, LUCENE-1458, LUCENE-2111, LUCENE-2514: Terms are no longer
|
||||
|
|
|
@ -86,7 +86,11 @@ public class TestFieldNormModifier extends LuceneTestCase {
|
|||
|
||||
public void testMissingField() throws Exception {
|
||||
FieldNormModifier fnm = new FieldNormModifier(store, s);
|
||||
fnm.reSetNorms("nobodyherebutuschickens");
|
||||
try {
|
||||
fnm.reSetNorms("nobodyherebutuschickens");
|
||||
} catch (IllegalStateException e) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
public void testFieldWithNoNorm() throws Exception {
|
||||
|
@ -101,7 +105,11 @@ public class TestFieldNormModifier extends LuceneTestCase {
|
|||
r.close();
|
||||
|
||||
FieldNormModifier fnm = new FieldNormModifier(store, s);
|
||||
fnm.reSetNorms("nonorm");
|
||||
try {
|
||||
fnm.reSetNorms("nonorm");
|
||||
} catch (IllegalStateException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
// nothing should have changed
|
||||
r = IndexReader.open(store, false);
|
||||
|
|
|
@ -92,12 +92,12 @@ public class TestLengthNormModifier extends LuceneTestCase {
|
|||
super.tearDown();
|
||||
}
|
||||
|
||||
public void testMissingField() {
|
||||
public void testMissingField() throws Exception {
|
||||
FieldNormModifier fnm = new FieldNormModifier(store, s);
|
||||
try {
|
||||
fnm.reSetNorms("nobodyherebutuschickens");
|
||||
} catch (Exception e) {
|
||||
assertNull("caught something", e);
|
||||
} catch (IllegalStateException e) {
|
||||
// expected
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -115,8 +115,8 @@ public class TestLengthNormModifier extends LuceneTestCase {
|
|||
FieldNormModifier fnm = new FieldNormModifier(store, s);
|
||||
try {
|
||||
fnm.reSetNorms("nonorm");
|
||||
} catch (Exception e) {
|
||||
assertNull("caught something", e);
|
||||
} catch (IllegalStateException e) {
|
||||
// expected
|
||||
}
|
||||
|
||||
// nothing should have changed
|
||||
|
|
|
@ -96,7 +96,7 @@ public final class Field extends AbstractField implements Fieldable {
|
|||
},
|
||||
|
||||
/** Expert: Index the field's value without an Analyzer,
|
||||
* and also disable the storing of norms. Note that you
|
||||
* and also disable the indexing of norms. Note that you
|
||||
* can also separately enable/disable norms by calling
|
||||
* {@link Field#setOmitNorms}. No norms means that
|
||||
* index-time field and document boosting and field
|
||||
|
@ -104,11 +104,11 @@ public final class Field extends AbstractField implements Fieldable {
|
|||
* less memory usage as norms take up one byte of RAM
|
||||
* per indexed field for every document in the index,
|
||||
* during searching. Note that once you index a given
|
||||
* field <i>with</i> norms enabled, disabling norms will
|
||||
* field <i>with</i> norms disabled, enabling norms will
|
||||
* have no effect. In other words, for this to have the
|
||||
* above described effect on a field, all instances of
|
||||
* above described effect on a field, one instance of
|
||||
* that field must be indexed with NOT_ANALYZED_NO_NORMS
|
||||
* from the beginning. */
|
||||
* at some point. */
|
||||
NOT_ANALYZED_NO_NORMS {
|
||||
@Override
|
||||
public boolean isIndexed() { return true; }
|
||||
|
|
|
@ -1025,8 +1025,8 @@ public abstract class IndexReader implements Cloneable,Closeable {
|
|||
* length normalization}. Thus, to preserve the length normalization
|
||||
* values when resetting this, one should base the new value upon the old.
|
||||
*
|
||||
* <b>NOTE:</b> If this field does not store norms, then
|
||||
* this method call will silently do nothing.
|
||||
* <b>NOTE:</b> If this field does not index norms, then
|
||||
* this method throws {@link IllegalStateException}.
|
||||
*
|
||||
* @see #norms(String)
|
||||
* @see Similarity#decodeNormValue(byte)
|
||||
|
@ -1037,6 +1037,7 @@ public abstract class IndexReader implements Cloneable,Closeable {
|
|||
* has this index open (<code>write.lock</code> could not
|
||||
* be obtained)
|
||||
* @throws IOException if there is a low-level IO error
|
||||
* @throws IllegalStateException if the field does not index norms
|
||||
*/
|
||||
public synchronized void setNorm(int doc, String field, byte value)
|
||||
throws StaleReaderException, CorruptIndexException, LockObtainFailedException, IOException {
|
||||
|
|
|
@ -566,8 +566,10 @@ public class SegmentReader extends IndexReader implements Cloneable {
|
|||
protected void doSetNorm(int doc, String field, byte value)
|
||||
throws IOException {
|
||||
SegmentNorms norm = norms.get(field);
|
||||
if (norm == null) // not an indexed field
|
||||
return;
|
||||
if (norm == null) {
|
||||
// field does not store norms
|
||||
throw new IllegalStateException("Cannot setNorm for field " + field + ": norms were omitted");
|
||||
}
|
||||
|
||||
normsDirty = true;
|
||||
norm.copyOnWrite()[doc] = value; // set the value
|
||||
|
|
Loading…
Reference in New Issue