Index: solr/src/java/org/apache/solr/search/SolrIndexReader.java =================================================================== --- solr/src/java/org/apache/solr/search/SolrIndexReader.java (revision 1056829) +++ solr/src/java/org/apache/solr/search/SolrIndexReader.java (working copy) @@ -288,11 +288,6 @@ } @Override - public void norms(String f, byte[] bytes, int offset) throws IOException { - in.norms(f, bytes, offset); - } - - @Override protected void doSetNorm(int d, String f, byte b) throws CorruptIndexException, IOException { in.setNorm(d, f, b); } Index: lucene/src/test/org/apache/lucene/index/TestOmitNorms.java =================================================================== --- lucene/src/test/org/apache/lucene/index/TestOmitNorms.java (revision 0) +++ lucene/src/test/org/apache/lucene/index/TestOmitNorms.java (revision 0) @@ -0,0 +1,216 @@ +package org.apache.lucene.index; + +/** + * 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. + */ + +import org.apache.lucene.util.LuceneTestCase; +import org.apache.lucene.util._TestUtil; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.analysis.MockAnalyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.store.Directory; + +public class TestOmitNorms extends LuceneTestCase { + // Tests whether the DocumentWriter correctly enable the + // omitNorms bit in the FieldInfo + public void testOmitNorms() throws Exception { + Directory ram = newDirectory(); + Analyzer analyzer = new MockAnalyzer(); + IndexWriter writer = new IndexWriter(ram, newIndexWriterConfig( TEST_VERSION_CURRENT, analyzer)); + Document d = new Document(); + + // this field will have norms + Field f1 = newField("f1", "This field has norms", Field.Store.NO, Field.Index.ANALYZED); + d.add(f1); + + // this field will NOT have norms + Field f2 = newField("f2", "This field has NO norms in all docs", Field.Store.NO, Field.Index.ANALYZED); + f2.setOmitNorms(true); + d.add(f2); + + writer.addDocument(d); + writer.optimize(); + // now we add another document which has term freq for field f2 and not for f1 and verify if the SegmentMerger + // keep things constant + d = new Document(); + + // Reverse + f1.setOmitNorms(true); + d.add(f1); + + f2.setOmitNorms(false); + d.add(f2); + + writer.addDocument(d); + + // force merge + writer.optimize(); + // flush + writer.close(); + _TestUtil.checkIndex(ram); + + SegmentReader reader = getOnlySegmentReader(IndexReader.open(ram, false)); + FieldInfos fi = reader.fieldInfos(); + assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f1").omitNorms); + assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitNorms); + + reader.close(); + ram.close(); + } + + // Tests whether merging of docs that have different + // omitNorms for the same field works + public void testMixedMerge() throws Exception { + Directory ram = newDirectory(); + Analyzer analyzer = new MockAnalyzer(); + IndexWriter writer = new IndexWriter( + ram, + newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer). + setMaxBufferedDocs(3). + setMergePolicy(newLogMergePolicy(2)) + ); + Document d = new Document(); + + // this field will have norms + Field f1 = newField("f1", "This field has norms", Field.Store.NO, Field.Index.ANALYZED); + d.add(f1); + + // this field will NOT have norms + Field f2 = newField("f2", "This field has NO norms in all docs", Field.Store.NO, Field.Index.ANALYZED); + f2.setOmitNorms(true); + d.add(f2); + + for(int i=0;i<30;i++) + writer.addDocument(d); + + // now we add another document which has norms for field f2 and not for f1 and verify if the SegmentMerger + // keep things constant + d = new Document(); + + // Reverese + f1.setOmitNorms(true); + d.add(f1); + + f2.setOmitNorms(false); + d.add(f2); + + for(int i=0;i<30;i++) + writer.addDocument(d); + + // force merge + writer.optimize(); + // flush + writer.close(); + + _TestUtil.checkIndex(ram); + + SegmentReader reader = getOnlySegmentReader(IndexReader.open(ram, false)); + FieldInfos fi = reader.fieldInfos(); + assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f1").omitNorms); + assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitNorms); + + reader.close(); + ram.close(); + } + + // Make sure first adding docs that do not omitNorms for + // field X, then adding docs that do omitNorms for that same + // field, + public void testMixedRAM() throws Exception { + Directory ram = newDirectory(); + Analyzer analyzer = new MockAnalyzer(); + IndexWriter writer = new IndexWriter( + ram, + newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer). + setMaxBufferedDocs(10). + setMergePolicy(newLogMergePolicy(2)) + ); + Document d = new Document(); + + // this field will have norms + Field f1 = newField("f1", "This field has norms", Field.Store.NO, Field.Index.ANALYZED); + d.add(f1); + + // this field will NOT have norms + Field f2 = newField("f2", "This field has NO norms in all docs", Field.Store.NO, Field.Index.ANALYZED); + d.add(f2); + + for(int i=0;i<5;i++) + writer.addDocument(d); + + f2.setOmitNorms(true); + + for(int i=0;i<20;i++) + writer.addDocument(d); + + // force merge + writer.optimize(); + + // flush + writer.close(); + + _TestUtil.checkIndex(ram); + + SegmentReader reader = getOnlySegmentReader(IndexReader.open(ram, false)); + FieldInfos fi = reader.fieldInfos(); + assertTrue("OmitNorms field bit should not be set.", !fi.fieldInfo("f1").omitNorms); + assertTrue("OmitNorms field bit should be set.", fi.fieldInfo("f2").omitNorms); + + reader.close(); + ram.close(); + } + + private void assertNoNrm(Directory dir) throws Throwable { + final String[] files = dir.listAll(); + for(int i=0;i> byField = new HashMap>(); + if (!fieldInfos.hasNorms()) { + return; + } + // Typically, each thread will have encountered the same // field. So first we collate by field, ie, all // per-thread field instances that correspond to the Index: lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestEmptyIndex.java =================================================================== --- lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestEmptyIndex.java (revision 1056829) +++ lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestEmptyIndex.java (working copy) @@ -71,12 +71,6 @@ byte[] norms = MultiNorms.norms(r, "foo"); if (norms != null) { assertEquals(0, norms.length); - norms = new byte[10]; - Arrays.fill(norms, (byte)10); - r.norms("foo", norms, 10); - for (byte b : norms) { - assertEquals((byte)10, b); - } } } Index: lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestIndicesEquals.java =================================================================== --- lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestIndicesEquals.java (revision 1056829) +++ lucene/contrib/instantiated/src/test/org/apache/lucene/store/instantiated/TestIndicesEquals.java (working copy) @@ -351,35 +351,6 @@ for (int i = 0; i < aprioriNorms.length; i++) { assertEquals("norms does not equals for field " + field + " in document " + i, aprioriNorms[i], testNorms[i]); } - - // test norms as used by multireader - - aprioriNorms = new byte[aprioriReader.maxDoc()]; - MultiNorms.norms(aprioriReader, (String) field, aprioriNorms, 0); - - testNorms = new byte[testReader.maxDoc()]; - MultiNorms.norms(testReader, (String) field, testNorms, 0); - - assertEquals(aprioriNorms.length, testNorms.length); - - for (int i = 0; i < aprioriNorms.length; i++) { - assertEquals("norms does not equals for field " + field + " in document " + i, aprioriNorms[i], testNorms[i]); - } - - - // test norms as used by multireader - - aprioriNorms = new byte[aprioriReader.maxDoc() + 10]; - MultiNorms.norms(aprioriReader, (String) field, aprioriNorms, 10); - - testNorms = new byte[testReader.maxDoc() + 10]; - MultiNorms.norms(testReader, (String) field, testNorms, 10); - - assertEquals(aprioriNorms.length, testNorms.length); - - for (int i = 0; i < aprioriNorms.length; i++) { - assertEquals("norms does not equals for field " + field + " in document " + i, aprioriNorms[i], testNorms[i]); - } } } Index: lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexReader.java =================================================================== --- lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexReader.java (revision 1056829) +++ lucene/contrib/instantiated/src/java/org/apache/lucene/store/instantiated/InstantiatedIndexReader.java (working copy) @@ -334,15 +334,6 @@ } @Override - public void norms(String field, byte[] bytes, int offset) throws IOException { - byte[] norms = getIndex().getNormsByFieldNameAndDocumentNumber().get(field); - if (norms == null) { - return; - } - System.arraycopy(norms, 0, bytes, offset, norms.length); - } - - @Override protected void doSetNorm(int doc, String field, byte value) throws IOException { if (uncommittedNormsByFieldNameAndDocumentNumber == null) { uncommittedNormsByFieldNameAndDocumentNumber = new HashMap>(getIndex().getNormsByFieldNameAndDocumentNumber().size()); Index: lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java =================================================================== --- lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (revision 1056829) +++ lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java (working copy) @@ -1174,13 +1174,6 @@ } @Override - public void norms(String fieldName, byte[] bytes, int offset) { - if (DEBUG) System.err.println("MemoryIndexReader.norms*: " + fieldName); - byte[] norms = norms(fieldName); - System.arraycopy(norms, 0, bytes, offset, norms.length); - } - - @Override protected void doSetNorm(int doc, String fieldName, byte value) { throw new UnsupportedOperationException(); }