diff --git a/src/java/org/apache/lucene/index/FilterIndexReader.java b/src/java/org/apache/lucene/index/FilterIndexReader.java index a6f50a3ac70..5b968430aa9 100644 --- a/src/java/org/apache/lucene/index/FilterIndexReader.java +++ b/src/java/org/apache/lucene/index/FilterIndexReader.java @@ -141,4 +141,8 @@ public class FilterIndexReader extends IndexReader { public Collection getIndexedFieldNames (Field.TermVector tvSpec){ return in.getIndexedFieldNames(tvSpec); } + + public Collection getFieldNames(IndexReader.FieldOption fieldNames) { + return in.getFieldNames(fieldNames); + } } diff --git a/src/java/org/apache/lucene/index/IndexReader.java b/src/java/org/apache/lucene/index/IndexReader.java index 3aca75afd7e..eece42f0a90 100644 --- a/src/java/org/apache/lucene/index/IndexReader.java +++ b/src/java/org/apache/lucene/index/IndexReader.java @@ -47,6 +47,35 @@ import java.util.Set; */ public abstract class IndexReader { + public static final class FieldOption { + private String option; + private FieldOption() { } + private FieldOption(String option) { + this.option = option; + } + public String toString() { + return this.option; + } + // all fields + public static final FieldOption ALL = new FieldOption ("ALL"); + // all indexed fields + public static final FieldOption INDEXED = new FieldOption ("INDEXED"); + // all fields which are not indexed + public static final FieldOption UNINDEXED = new FieldOption ("UNINDEXED"); + // all fields which are indexed with termvectors enables + public static final FieldOption INDEXED_WITH_TERMVECTOR = new FieldOption ("INDEXED_WITH_TERMVECTOR"); + // all fields which are indexed but don't have termvectors enabled + public static final FieldOption INDEXED_NO_TERMVECTOR = new FieldOption ("INDEXED_NO_TERMVECTOR"); + // all fields where termvectors are enabled. Please note that only standard termvector fields are returned + public static final FieldOption TERMVECTOR = new FieldOption ("TERMVECTOR"); + // all field with termvectors wiht positions enabled + public static final FieldOption TERMVECTOR_WITH_POSITION = new FieldOption ("TERMVECTOR_WITH_POSITION"); + // all fields where termvectors with offset position are set + public static final FieldOption TERMVECTOR_WITH_OFFSET = new FieldOption ("TERMVECTOR_WITH_OFFSET"); + // all fields where termvectors with offset and position values set + public static final FieldOption TERMVECTOR_WITH_POSITION_OFFSET = new FieldOption ("TERMVECTOR_WITH_POSITION_OFFSET"); + } + /** * Constructor used if IndexReader is not owner of its directory. * This is used for IndexReaders that are used within other IndexReaders that take care or locking directories. @@ -113,12 +142,12 @@ public abstract class IndexReader { infos.read(directory); if (infos.size() == 1) { // index is optimized return SegmentReader.get(infos, infos.info(0), closeDirectory); - } else { - IndexReader[] readers = new IndexReader[infos.size()]; - for (int i = 0; i < infos.size(); i++) - readers[i] = SegmentReader.get(infos.info(i)); - return new MultiReader(directory, infos, closeDirectory, readers); } + IndexReader[] readers = new IndexReader[infos.size()]; + for (int i = 0; i < infos.size(); i++) + readers[i] = SegmentReader.get(infos.info(i)); + return new MultiReader(directory, infos, closeDirectory, readers); + } }.run(); } @@ -544,6 +573,8 @@ public abstract class IndexReader { * to by this IndexReader. * @return Collection of Strings indicating the names of the fields * @throws IOException if there is a problem with accessing the index + * + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public abstract Collection getFieldNames() throws IOException; @@ -555,6 +586,8 @@ public abstract class IndexReader { * false if only unindexed fields should be returned. * @return Collection of Strings indicating the names of the fields * @throws IOException if there is a problem with accessing the index + * + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public abstract Collection getFieldNames(boolean indexed) throws IOException; @@ -564,7 +597,7 @@ public abstract class IndexReader { * else only indexed fields without term vector info * @return Collection of Strings indicating the names of the fields * - * @deprecated Replaced by {@link #getIndexedFieldNames (Field.TermVector tvSpec)} + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public Collection getIndexedFieldNames(boolean storedTermVector){ if(storedTermVector){ @@ -585,8 +618,19 @@ public abstract class IndexReader { * * @param tvSpec specifies which term vector information should be available for the fields * @return Collection of Strings indicating the names of the fields + * + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public abstract Collection getIndexedFieldNames(Field.TermVector tvSpec); + + /** + * Get a list of unique field names that exist in this index and have the specified + * field option information. + * @param fldOption specifies which field option should be available for the returned fields + * @return Collection of Strings indicating the names of the fields. + * @see IndexReader.FieldOption + */ + public abstract Collection getFieldNames(FieldOption fldOption); /** * Returns true iff the index in the named directory is diff --git a/src/java/org/apache/lucene/index/MultiReader.java b/src/java/org/apache/lucene/index/MultiReader.java index 56a35ae87f4..1fd3abfdbec 100644 --- a/src/java/org/apache/lucene/index/MultiReader.java +++ b/src/java/org/apache/lucene/index/MultiReader.java @@ -246,6 +246,19 @@ public class MultiReader extends IndexReader { return fieldSet; } + /** + * @see IndexReader#getFieldNames(IndexReader.FieldNames fldOption) + */ + public Collection getFieldNames (IndexReader.FieldOption fieldNames) { + // maintain a unique set of field names + Set fieldSet = new HashSet(); + for (int i = 0; i < subReaders.length; i++) { + IndexReader reader = subReaders[i]; + Collection names = reader.getFieldNames(fieldNames); + fieldSet.addAll(names); + } + return fieldSet; + } } class MultiTermEnum extends TermEnum { diff --git a/src/java/org/apache/lucene/index/SegmentReader.java b/src/java/org/apache/lucene/index/SegmentReader.java index 73373f02194..e6e9ef55d8b 100644 --- a/src/java/org/apache/lucene/index/SegmentReader.java +++ b/src/java/org/apache/lucene/index/SegmentReader.java @@ -320,6 +320,7 @@ class SegmentReader extends IndexReader { /** * @see IndexReader#getFieldNames() + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public Collection getFieldNames() { // maintain a unique set of field names @@ -333,6 +334,7 @@ class SegmentReader extends IndexReader { /** * @see IndexReader#getFieldNames(boolean) + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} */ public Collection getFieldNames(boolean indexed) { // maintain a unique set of field names @@ -345,6 +347,10 @@ class SegmentReader extends IndexReader { return fieldSet; } + /** + * @see IndexReader#getIndexedFieldNames(Field.TermVector tvSpec) + * @deprecated Replaced by {@link #getFieldNames (IndexReader.FieldOption fldOption)} + */ public Collection getIndexedFieldNames (Field.TermVector tvSpec){ boolean storedTermVector; boolean storePositionWithTermVector; @@ -392,6 +398,49 @@ class SegmentReader extends IndexReader { return fieldSet; } + /** + * @see IndexReader#getFieldNames(IndexReader.FieldOption fldOption) + */ + public Collection getFieldNames(IndexReader.FieldOption fieldOption) { + + Set fieldSet = new HashSet(); + for (int i = 0; i < fieldInfos.size(); i++) { + FieldInfo fi = fieldInfos.fieldInfo(i); + if (fieldOption == IndexReader.FieldOption.ALL) { + fieldSet.add(fi.name); + } + else if (!fi.isIndexed && fieldOption == IndexReader.FieldOption.UNINDEXED) { + fieldSet.add(fi.name); + } + else if (fi.isIndexed && fieldOption == IndexReader.FieldOption.INDEXED) { + fieldSet.add(fi.name); + } + else if (fi.isIndexed && fi.storeTermVector == false && fieldOption == IndexReader.FieldOption.INDEXED_NO_TERMVECTOR) { + fieldSet.add(fi.name); + } + else if (fi.storeTermVector == true && + fi.storePositionWithTermVector == false && + fi.storeOffsetWithTermVector == false && + fieldOption == IndexReader.FieldOption.TERMVECTOR) { + fieldSet.add(fi.name); + } + else if (fi.isIndexed && fi.storeTermVector && fieldOption == IndexReader.FieldOption.INDEXED_WITH_TERMVECTOR) { + fieldSet.add(fi.name); + } + else if (fi.storePositionWithTermVector && fi.storeOffsetWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION) { + fieldSet.add(fi.name); + } + else if (fi.storeOffsetWithTermVector && fi.storePositionWithTermVector == false && fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_OFFSET) { + fieldSet.add(fi.name); + } + else if ((fi.storeOffsetWithTermVector && fi.storePositionWithTermVector) && + fieldOption == IndexReader.FieldOption.TERMVECTOR_WITH_POSITION_OFFSET) { + fieldSet.add(fi.name); + } + } + return fieldSet; + } + public synchronized byte[] norms(String field) throws IOException { Norm norm = (Norm) norms.get(field); if (norm == null) // not an indexed field