Index: lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/DocMaker.java =================================================================== --- lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/DocMaker.java (revision 1371227) +++ lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/feeds/DocMaker.java (working copy) @@ -226,7 +226,7 @@ final DocState ds = getDocState(); final Document doc = reuseFields ? ds.doc : new Document(); - doc.getFields().clear(); + doc.clear(); // Set ID_FIELD FieldType ft = new FieldType(valType); Index: lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTokensTask.java =================================================================== --- lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTokensTask.java (revision 1371227) +++ lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTokensTask.java (working copy) @@ -26,6 +26,7 @@ import org.apache.lucene.benchmark.byTask.PerfRunData; import org.apache.lucene.benchmark.byTask.feeds.DocMaker; import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; import org.apache.lucene.document.IntField; import org.apache.lucene.document.LongField; import org.apache.lucene.document.FloatField; @@ -68,7 +69,7 @@ @Override public int doLogic() throws Exception { - List fields = doc.getFields(); + List fields = doc.getFields(); Analyzer analyzer = getRunData().getAnalyzer(); int tokenCount = 0; for(final IndexableField field : fields) { Index: lucene/core/src/java/org/apache/lucene/document/Document.java =================================================================== --- lucene/core/src/java/org/apache/lucene/document/Document.java (revision 1371227) +++ lucene/core/src/java/org/apache/lucene/document/Document.java (working copy) @@ -184,15 +184,15 @@ * @param name the name of the field * @return a Fieldable[] array */ - public IndexableField[] getFields(String name) { - List result = new ArrayList(); - for (IndexableField field : fields) { + public Field[] getFields(String name) { + List result = new ArrayList(); + for (Field field : fields) { if (field.name().equals(name)) { result.add(field); } } - return result.toArray(new IndexableField[result.size()]); + return result.toArray(new Field[result.size()]); } /** Returns a List of all the fields in a document. @@ -201,13 +201,8 @@ * index, e.g. {@link IndexSearcher#doc(int)} or {@link * IndexReader#document(int)}. */ - public final List getFields() { - List result = new ArrayList(); - for (IndexableField field : fields) { - result.add(field); - } - - return result; + public final List getFields() { + return Collections.unmodifiableList(fields); } private final static String[] NO_STRINGS = new String[0]; @@ -316,4 +311,8 @@ } }; } + + public void clear() { + fields.clear(); + } } Index: lucene/core/src/test/org/apache/lucene/document/TestDocument.java =================================================================== --- lucene/core/src/test/org/apache/lucene/document/TestDocument.java (revision 1371227) +++ lucene/core/src/test/org/apache/lucene/document/TestDocument.java (working copy) @@ -18,6 +18,7 @@ */ import java.io.StringReader; +import java.util.List; import org.apache.lucene.analysis.EmptyTokenizer; import org.apache.lucene.analysis.MockAnalyzer; @@ -124,7 +125,7 @@ // siltenlty ignored assertEquals(0, doc.getFields().size()); } - + public void testConstructorExceptions() { FieldType ft = new FieldType(); ft.setStored(true); @@ -147,6 +148,34 @@ // expected exception } } + + public void testClearDocument() { + Document doc = makeDocumentWithFields(); + assertEquals(8, doc.getFields().size()); + doc.clear(); + assertEquals(0, doc.getFields().size()); + } + + public void testGetFieldsImmutable() { + Document doc = makeDocumentWithFields(); + assertEquals(8, doc.getFields().size()); + List fields = doc.getFields(); + try { + fields.add( new StringField("name", "value", Field.Store.NO) ); + fail("Document.getFields() should return immutable List"); + } + catch (UnsupportedOperationException e) { + // OK + } + + try { + fields.clear(); + fail("Document.getFields() should return immutable List"); + } + catch (UnsupportedOperationException e) { + // OK + } + } /** * Tests {@link Document#getValues(String)} method for a brand new Document Index: lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java =================================================================== --- lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java (revision 1371227) +++ lucene/core/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java (working copy) @@ -1556,50 +1556,66 @@ try { doc = new Document(); // try to boost with norms omitted - List list = new ArrayList(); - list.add(new IndexableField() { - + IndexDocument docList = new IndexDocument() { + + List list = new ArrayList(); + List storedList = new ArrayList(); + @Override - public String name() { - return "foo"; - } + public Iterable indexableFields() { + if (list.size() == 0) { + list.add(new IndexableField() { + @Override + public String name() { + return "foo"; + } - @Override - public IndexableFieldType fieldType() { - return StringField.TYPE_NOT_STORED; - } + @Override + public IndexableFieldType fieldType() { + return StringField.TYPE_NOT_STORED; + } - @Override - public float boost() { - return 5f; - } + @Override + public float boost() { + return 5f; + } - @Override - public BytesRef binaryValue() { - return null; - } + @Override + public BytesRef binaryValue() { + return null; + } - @Override - public String stringValue() { - return "baz"; - } + @Override + public String stringValue() { + return "baz"; + } - @Override - public Reader readerValue() { - return null; - } + @Override + public Reader readerValue() { + return null; + } - @Override - public Number numericValue() { - return null; + @Override + public Number numericValue() { + return null; + } + + @Override + public TokenStream tokenStream(Analyzer analyzer) throws IOException { + return null; + } + }); + } + return list; } @Override - public TokenStream tokenStream(Analyzer analyzer) throws IOException { - return null; + public Iterable storableFields() { + return storedList; } - }); - iw.addDocument(list); + + }; + iw.addDocument(docList); fail("didn't get any exception, boost silently discarded"); } catch (UnsupportedOperationException expected) { // expected Index: lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java =================================================================== --- lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java (revision 1371227) +++ lucene/grouping/src/test/org/apache/lucene/search/grouping/TestGrouping.java (working copy) @@ -594,7 +594,7 @@ Document doc = new Document(); docs.add(doc); if (groupValue.group != null) { - doc.add(newStringField("group", groupValue.group.utf8ToString(), Field.Store.NO)); + doc.add(newStringField("group", groupValue.group.utf8ToString(), Field.Store.YES)); } doc.add(newStringField("sort1", groupValue.sort1.utf8ToString(), Field.Store.NO)); doc.add(newStringField("sort2", groupValue.sort2.utf8ToString(), Field.Store.NO)); Index: solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java =================================================================== --- solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java (revision 1371227) +++ solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java (working copy) @@ -298,7 +298,6 @@ private static SolrDocument toSolrDoc(SolrInputDocument sdoc, IndexSchema schema) { // TODO: do something more performant than this double conversion Document doc = DocumentBuilder.toDocument(sdoc, schema); - List fields = doc.getFields(); // copy the stored fields only StoredDocument out = new StoredDocument();