diff --git a/src/main/java/it/cavallium/dbengine/database/luceneutil/AdaptiveStreamSearcher.java b/src/main/java/it/cavallium/dbengine/database/luceneutil/AdaptiveStreamSearcher.java index d718fde..8bb5c3e 100644 --- a/src/main/java/it/cavallium/dbengine/database/luceneutil/AdaptiveStreamSearcher.java +++ b/src/main/java/it/cavallium/dbengine/database/luceneutil/AdaptiveStreamSearcher.java @@ -15,11 +15,13 @@ public class AdaptiveStreamSearcher implements LuceneStreamSearcher { private final SimpleStreamSearcher simpleStreamSearcher; private final ParallelCollectorStreamSearcher parallelCollectorStreamSearcher; private final PagedStreamSearcher pagedStreamSearcher; + private final CountStreamSearcher countStreamSearcher; public AdaptiveStreamSearcher() { this.simpleStreamSearcher = new SimpleStreamSearcher(); this.parallelCollectorStreamSearcher = new ParallelCollectorStreamSearcher(); this.pagedStreamSearcher = new PagedStreamSearcher(simpleStreamSearcher); + this.countStreamSearcher = new CountStreamSearcher(); } @Override @@ -29,7 +31,9 @@ public class AdaptiveStreamSearcher implements LuceneStreamSearcher { @Nullable Sort luceneSort, String keyFieldName, Consumer consumer) throws IOException { - if (luceneSort == null) { + if (limit == 0) { + return countStreamSearcher.count(indexSearcher, query); + } else if (luceneSort == null) { return parallelCollectorStreamSearcher.streamSearch(indexSearcher, query, limit, null, keyFieldName, consumer); } else { if (limit > PagedStreamSearcher.MAX_ITEMS_PER_PAGE) { diff --git a/src/main/java/it/cavallium/dbengine/database/luceneutil/CountStreamSearcher.java b/src/main/java/it/cavallium/dbengine/database/luceneutil/CountStreamSearcher.java new file mode 100644 index 0000000..473d7c7 --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/database/luceneutil/CountStreamSearcher.java @@ -0,0 +1,40 @@ +package it.cavallium.dbengine.database.luceneutil; + +import java.io.IOException; +import java.util.function.Consumer; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Sort; +import org.jetbrains.annotations.Nullable; + +/** + * Search that only count approximate results without returning any result + */ +public class CountStreamSearcher implements LuceneStreamSearcher { + + @Override + public Long streamSearch(IndexSearcher indexSearcher, + Query query, + int limit, + @Nullable Sort luceneSort, + String keyFieldName, + Consumer consumer) throws IOException { + if (limit != 0) { + throw new IllegalArgumentException("CountStream doesn't support a limit different than 0"); + } + if (luceneSort != null) { + throw new IllegalArgumentException("CountStream doesn't support sorting"); + } + if (consumer != null) { + throw new IllegalArgumentException("CountStream doesn't support a results consumer"); + } + if (keyFieldName != null) { + throw new IllegalArgumentException("CountStream doesn't support a key field"); + } + return count(indexSearcher, query); + } + + public long count(IndexSearcher indexSearcher, Query query) throws IOException { + return indexSearcher.count(query); + } +}