Skip to content

Commit 8d0cbcb

Browse files
authored
LUCENE-9680 - Re-add IndexWriter::getFieldNames
1 parent a53e8e7 commit 8d0cbcb

File tree

4 files changed

+67
-0
lines changed

4 files changed

+67
-0
lines changed

lucene/CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ http://s.apache.org/luceneversions
77

88
New Features
99

10+
* LUCENE-9680: IndexWriter#getFieldNames() method added to get fields present in index.
11+
This method was removed in LUCENE-8909. (Oren Ovadia)
12+
1013
* LUCENE-9322: Vector-valued fields, Lucene90 Codec (Mike Sokolov, Julie Tibshirani, Tomoko Uchida)
1114

1215
* LUCENE-9004: Approximate nearest vector search via NSW graphs

lucene/core/src/java/org/apache/lucene/index/FieldInfos.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.List;
2626
import java.util.Map;
2727
import java.util.Objects;
28+
import java.util.Set;
2829
import java.util.stream.Collectors;
2930
import java.util.stream.StreamSupport;
3031
import org.apache.lucene.util.ArrayUtil;
@@ -681,6 +682,10 @@ synchronized boolean contains(String fieldName, DocValuesType dvType) {
681682
}
682683
}
683684

685+
synchronized Set<String> getFieldNames() {
686+
return Set.copyOf(nameToNumber.keySet());
687+
}
688+
684689
synchronized void clear() {
685690
numberToName.clear();
686691
nameToNumber.clear();

lucene/core/src/java/org/apache/lucene/index/IndexWriter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,6 +1987,17 @@ private DocValuesUpdate[] buildDocValuesUpdate(Term term, Field[] updates) {
19871987
return dvUpdates;
19881988
}
19891989

1990+
/**
1991+
* Return an unmodifiable set of all field names as visible from this IndexWriter, across all
1992+
* segments of the index.
1993+
*
1994+
* @lucene.experimental
1995+
*/
1996+
public Set<String> getFieldNames() {
1997+
// FieldNumbers#getFieldNames() returns an unmodifiableSet
1998+
return globalFieldNumberMap.getFieldNames();
1999+
}
2000+
19902001
// for test purpose
19912002
final synchronized int getSegmentCount() {
19922003
return segmentInfos.size();

lucene/core/src/test/org/apache/lucene/index/TestIndexWriter.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4635,4 +4635,52 @@ public void testIndexWriterBlocksOnStall() throws IOException, InterruptedExcept
46354635
}
46364636
}
46374637
}
4638+
4639+
public void testGetFieldNames() throws IOException {
4640+
Directory dir = newDirectory();
4641+
4642+
IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
4643+
4644+
assertEquals(Set.of(), writer.getFieldNames());
4645+
4646+
addDocWithField(writer, "f1");
4647+
assertEquals(Set.of("f1"), writer.getFieldNames());
4648+
4649+
// should be unmodifiable:
4650+
final Set<String> fieldSet = writer.getFieldNames();
4651+
assertThrows(UnsupportedOperationException.class, () -> fieldSet.add("cannot modify"));
4652+
assertThrows(UnsupportedOperationException.class, () -> fieldSet.remove("f1"));
4653+
4654+
addDocWithField(writer, "f2");
4655+
assertEquals(Set.of("f1", "f2"), writer.getFieldNames());
4656+
4657+
// set from a previous call is an independent immutable copy, cannot be modified.
4658+
assertEquals(Set.of("f1"), fieldSet);
4659+
4660+
// flush should not have an effect on field names
4661+
writer.flush();
4662+
assertEquals(Set.of("f1", "f2"), writer.getFieldNames());
4663+
4664+
// commit should not have an effect on field names
4665+
writer.commit();
4666+
assertEquals(Set.of("f1", "f2"), writer.getFieldNames());
4667+
4668+
writer.close();
4669+
4670+
// new writer should identify committed fields
4671+
writer = new IndexWriter(dir, newIndexWriterConfig(new MockAnalyzer(random())));
4672+
assertEquals(Set.of("f1", "f2"), writer.getFieldNames());
4673+
4674+
writer.deleteAll();
4675+
assertEquals(Set.of(), writer.getFieldNames());
4676+
4677+
writer.close();
4678+
dir.close();
4679+
}
4680+
4681+
private static void addDocWithField(IndexWriter writer, String field) throws IOException {
4682+
Document doc = new Document();
4683+
doc.add(newField(field, "value", storedTextType));
4684+
writer.addDocument(doc);
4685+
}
46384686
}

0 commit comments

Comments
 (0)