| Index: lucene/src/test/org/apache/lucene/index/TestIndexWriter.java |
| =================================================================== |
| --- lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (revision 1188145) |
| +++ lucene/src/test/org/apache/lucene/index/TestIndexWriter.java (working copy) |
| @@ -1096,6 +1096,33 @@ |
| reader.close(); |
| dir.close(); |
| } |
| + |
| + public void testEmptyFieldNameEmptyTerm() throws IOException { |
| + Directory dir = newDirectory(); |
| + IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random))); |
| + Document doc = new Document(); |
| + // TODO: why do we throw IAE: name and value cannot both be empty in Field ctor?! |
| + doc.add(newField("", "", Field.Store.NO, Field.Index.NOT_ANALYZED)); |
| + doc.add(newField("", "a", Field.Store.NO, Field.Index.NOT_ANALYZED)); |
| + doc.add(newField("", "b", Field.Store.NO, Field.Index.NOT_ANALYZED)); |
| + doc.add(newField("", "c", Field.Store.NO, Field.Index.NOT_ANALYZED)); |
| + writer.addDocument(doc); |
| + writer.close(); |
| + IndexReader reader = IndexReader.open(dir, true); |
| + IndexReader subreader = SegmentReader.getOnlySegmentReader(reader); |
| + TermEnum te = subreader.terms(); |
| + assertTrue(te.next()); |
| + assertEquals(new Term("", ""), te.term()); |
| + assertTrue(te.next()); |
| + assertEquals(new Term("", "a"), te.term()); |
| + assertTrue(te.next()); |
| + assertEquals(new Term("", "b"), te.term()); |
| + assertTrue(te.next()); |
| + assertEquals(new Term("", "c"), te.term()); |
| + assertFalse(te.next()); |
| + reader.close(); |
| + dir.close(); |
| + } |
| |
| private static final class MockIndexWriter extends IndexWriter { |
| |
| Index: lucene/src/java/org/apache/lucene/index/TermInfosWriter.java |
| =================================================================== |
| --- lucene/src/java/org/apache/lucene/index/TermInfosWriter.java (revision 1188145) |
| +++ lucene/src/java/org/apache/lucene/index/TermInfosWriter.java (working copy) |
| @@ -167,6 +167,11 @@ |
| if (ch1 != ch2) |
| return ch1-ch2; |
| } |
| + if (utf16Result1.length == 0 && lastFieldNumber == -1) { |
| + // If there is a field named "" (empty string) with a term text of "" (empty string) then we |
| + // will get 0 on this comparison, yet, it's "OK". |
| + return -1; |
| + } |
| return utf16Result1.length - utf16Result2.length; |
| } |
| |
| Index: lucene/src/java/org/apache/lucene/document/Field.java |
| =================================================================== |
| --- lucene/src/java/org/apache/lucene/document/Field.java (revision 1188145) |
| +++ lucene/src/java/org/apache/lucene/document/Field.java (working copy) |
| @@ -396,8 +396,6 @@ |
| throw new NullPointerException("name cannot be null"); |
| if (value == null) |
| throw new NullPointerException("value cannot be null"); |
| - if (name.length() == 0 && value.length() == 0) |
| - throw new IllegalArgumentException("name and value cannot both be empty"); |
| if (index == Index.NO && store == Store.NO) |
| throw new IllegalArgumentException("it doesn't make sense to have a field that " |
| + "is neither indexed nor stored"); |