diff --git a/src/main/java/it/cavallium/dbengine/lucene/DocumentStoredSingleFieldVisitor.java b/src/main/java/it/cavallium/dbengine/lucene/DocumentStoredSingleFieldVisitor.java new file mode 100644 index 0000000..efecf86 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/lucene/DocumentStoredSingleFieldVisitor.java @@ -0,0 +1,62 @@ +package it.cavallium.dbengine.lucene; + +import java.io.IOException; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.FieldType; +import org.apache.lucene.document.StoredField; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.FieldInfo; +import org.apache.lucene.index.StoredFieldVisitor; +import org.apache.lucene.index.StoredFieldVisitor.Status; + +public class DocumentStoredSingleFieldVisitor extends StoredFieldVisitor { + private final Document doc = new Document(); + private final String fieldToAdd; + + public DocumentStoredSingleFieldVisitor(String fieldToAdd) { + this.fieldToAdd = fieldToAdd; + } + + public DocumentStoredSingleFieldVisitor() { + this.fieldToAdd = null; + } + + public void binaryField(FieldInfo fieldInfo, byte[] value) throws IOException { + this.doc.add(new StoredField(fieldInfo.name, value)); + } + + public void stringField(FieldInfo fieldInfo, String value) throws IOException { + FieldType ft = new FieldType(TextField.TYPE_STORED); + ft.setStoreTermVectors(fieldInfo.hasVectors()); + ft.setOmitNorms(fieldInfo.omitsNorms()); + ft.setIndexOptions(fieldInfo.getIndexOptions()); + this.doc.add(new StoredField(fieldInfo.name, (String)Objects.requireNonNull(value, "String value should not be null"), ft)); + } + + public void intField(FieldInfo fieldInfo, int value) { + this.doc.add(new StoredField(fieldInfo.name, value)); + } + + public void longField(FieldInfo fieldInfo, long value) { + this.doc.add(new StoredField(fieldInfo.name, value)); + } + + public void floatField(FieldInfo fieldInfo, float value) { + this.doc.add(new StoredField(fieldInfo.name, value)); + } + + public void doubleField(FieldInfo fieldInfo, double value) { + this.doc.add(new StoredField(fieldInfo.name, value)); + } + + public Status needsField(FieldInfo fieldInfo) { + return Objects.equals(this.fieldToAdd, fieldInfo.name) ? Status.YES : Status.NO; + } + + public Document getDocument() { + return this.doc; + } +} diff --git a/src/main/java/it/cavallium/dbengine/lucene/LuceneUtils.java b/src/main/java/it/cavallium/dbengine/lucene/LuceneUtils.java index 952129f..c722687 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/LuceneUtils.java +++ b/src/main/java/it/cavallium/dbengine/lucene/LuceneUtils.java @@ -188,7 +188,9 @@ public class LuceneUtils { if (docId > indexReader.maxDoc()) { throw new IOException("Document " + docId + " > maxDoc (" +indexReader.maxDoc() + ")"); } - Document d = indexReader.document(docId, Set.of(keyFieldName)); + DocumentStoredSingleFieldVisitor visitor = new DocumentStoredSingleFieldVisitor(keyFieldName); + indexReader.document(docId, visitor); + Document d = visitor.getDocument(); if (d.getFields().isEmpty()) { throw new NoSuchElementException( "Can't get key (field \"" + keyFieldName + "\") of document docId: " + docId + ". Available fields: []"); diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/ScoredSimpleLuceneShardSearcher.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/ScoredSimpleLuceneShardSearcher.java index 3818a00..665b67d 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/ScoredSimpleLuceneShardSearcher.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/ScoredSimpleLuceneShardSearcher.java @@ -135,7 +135,7 @@ class ScoredSimpleLuceneShardSearcher implements LuceneShardSearcher { s -> {} ) .subscribeOn(scheduler) - .concatMap(topFieldDoc -> LuceneUtils + .flatMapSequential(topFieldDoc -> LuceneUtils .convertHits(topFieldDoc.scoreDocs, indexSearchers, keyFieldName, scheduler) ); }); diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleLuceneLocalSearcher.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleLuceneLocalSearcher.java index 2b53520..becee15 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleLuceneLocalSearcher.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleLuceneLocalSearcher.java @@ -93,7 +93,7 @@ public class SimpleLuceneLocalSearcher implements LuceneLocalSearcher { s -> {} ) .subscribeOn(scheduler) - .concatMap(topFieldDoc -> LuceneUtils + .flatMapSequential(topFieldDoc -> LuceneUtils .convertHits(topFieldDoc.scoreDocs, IndexSearchers.unsharded(indexSearcher), keyFieldName, scheduler) ); }); diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredLuceneShardSearcher.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredLuceneShardSearcher.java index 2134733..7e4b3c1 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredLuceneShardSearcher.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/UnscoredLuceneShardSearcher.java @@ -126,7 +126,7 @@ class UnscoredLuceneShardSearcher implements LuceneShardSearcher { s -> {} ) .subscribeOn(scheduler) - .concatMap(topFieldDoc -> LuceneUtils + .flatMapSequential(topFieldDoc -> LuceneUtils .convertHits(topFieldDoc.scoreDocs, indexSearchers, keyFieldName, scheduler) ); });