diff --git a/src/main/java/it/cavallium/dbengine/client/SearchResult.java b/src/main/java/it/cavallium/dbengine/client/SearchResult.java index 40e6ba7..5026ac4 100644 --- a/src/main/java/it/cavallium/dbengine/client/SearchResult.java +++ b/src/main/java/it/cavallium/dbengine/client/SearchResult.java @@ -18,7 +18,7 @@ public final class SearchResult extends ResourceSupport public SearchResult(Flux> results, TotalHitsCount totalHitsCount, Drop> drop) { - super(new SearchResult.CloseOnDrop<>(drop)); + super(new CloseOnDrop<>(drop)); this.results = results; this.totalHitsCount = totalHitsCount; } @@ -68,7 +68,11 @@ public final class SearchResult extends ResourceSupport @Override public void drop(SearchResult obj) { - delegate.drop(obj); + try { + delegate.drop(obj); + } finally { + obj.makeInaccessible(); + } } } } diff --git a/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java b/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java index d784a14..c22cbdf 100644 --- a/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java +++ b/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java @@ -80,7 +80,11 @@ public final class SearchResultKeys extends ResourceSupport obj) { - delegate.drop(obj); + try { + delegate.drop(obj); + } finally { + obj.makeInaccessible(); + } } } diff --git a/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java b/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java index f3db927..82ac4f7 100644 --- a/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java +++ b/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java @@ -84,7 +84,11 @@ public final class LLSearchResultShard extends ResourceSupport onInvalidateCache, ResourceSupport::close) .map(searcher -> searcher.copy(this::dropCachedIndexSearcher).send()) diff --git a/src/main/java/it/cavallium/dbengine/database/disk/LLIndexSearcher.java b/src/main/java/it/cavallium/dbengine/database/disk/LLIndexSearcher.java index e534357..5ffeca6 100644 --- a/src/main/java/it/cavallium/dbengine/database/disk/LLIndexSearcher.java +++ b/src/main/java/it/cavallium/dbengine/database/disk/LLIndexSearcher.java @@ -14,16 +14,19 @@ import org.slf4j.LoggerFactory; public class LLIndexSearcher extends ResourceSupport { private static final Logger logger = LoggerFactory.getLogger(LLIndexSearcher.class); + private final boolean ownsIndexSearcher; private IndexSearcher indexSearcher; private SearcherManager associatedSearcherManager; public LLIndexSearcher(IndexSearcher indexSearcher, @Nullable SearcherManager associatedSearcherManager, + boolean ownsIndexSearcher, Drop drop) { super(new LLIndexSearcher.CloseOnDrop(drop)); this.indexSearcher = indexSearcher; this.associatedSearcherManager = associatedSearcherManager; + this.ownsIndexSearcher = ownsIndexSearcher; } public IndexReader getIndexReader() { @@ -45,10 +48,14 @@ public class LLIndexSearcher extends ResourceSupport new LLIndexSearcher(indexSearcher, associatedSearcherManager, drop); + return drop -> new LLIndexSearcher(indexSearcher, associatedSearcherManager, ownsIndexSearcher, drop); } private void makeInaccessible() { @@ -80,7 +87,7 @@ public class LLIndexSearcher extends ResourceSupport 0) { obj.associatedSearcherManager.release(obj.indexSearcher); } diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/ExponentialPageLimits.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/ExponentialPageLimits.java index 7b106d7..ba0d6ef 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/ExponentialPageLimits.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/ExponentialPageLimits.java @@ -2,33 +2,46 @@ package it.cavallium.dbengine.lucene.searcher; import it.cavallium.dbengine.lucene.LuceneUtils; +/** + *
y = 2 ^ (x + pageIndexOffset) + firstPageLimit
+ */ public class ExponentialPageLimits implements PageLimits { + private static final int DEFAULT_PAGE_INDEX_OFFSET = 0; + + private final int pageIndexOffset; private final int firstPageLimit; private final int maxItemsPerPage; public ExponentialPageLimits() { - this(DEFAULT_MIN_ITEMS_PER_PAGE); + this(DEFAULT_PAGE_INDEX_OFFSET); } - public ExponentialPageLimits(int firstPageLimit) { - this(firstPageLimit, DEFAULT_MAX_ITEMS_PER_PAGE); + public ExponentialPageLimits(int pageIndexOffset) { + this(pageIndexOffset, DEFAULT_MIN_ITEMS_PER_PAGE); } - public ExponentialPageLimits(int firstPageLimit, int maxItemsPerPage) { + public ExponentialPageLimits(int pageIndexOffset, int firstPageLimit) { + this(pageIndexOffset, firstPageLimit, DEFAULT_MAX_ITEMS_PER_PAGE); + } + + public ExponentialPageLimits(int pageIndexOffset, int firstPageLimit, int maxItemsPerPage) { + this.pageIndexOffset = pageIndexOffset; this.firstPageLimit = firstPageLimit; this.maxItemsPerPage = maxItemsPerPage; } @Override public int getPageLimit(int pageIndex) { - if (pageIndex >= 10) { // safety + var offsetedIndex = pageIndex + pageIndexOffset; + var power = 0b1L << offsetedIndex; + + if (offsetedIndex >= 30) { // safety return maxItemsPerPage; } - var limitedPageIndex = Math.max(1, pageIndex); - var min = Math.max(firstPageLimit, Math.min(maxItemsPerPage, - LuceneUtils.safeLongToInt(limitedPageIndex * (0b1L << limitedPageIndex)))); + + var min = Math.max(firstPageLimit, Math.min(maxItemsPerPage, firstPageLimit + power)); assert min > 0; - return min; + return LuceneUtils.safeLongToInt(min); } } diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/LinearPageLimits.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/LinearPageLimits.java new file mode 100644 index 0000000..28a2e2d --- /dev/null +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/LinearPageLimits.java @@ -0,0 +1,40 @@ +package it.cavallium.dbengine.lucene.searcher; + +import it.cavallium.dbengine.lucene.LuceneUtils; + +/** + *
y = (x * factor) + firstPageLimit
+ */ +public class LinearPageLimits implements PageLimits { + + private static final double DEFAULT_FACTOR = 0.5d; + + private final double factor; + private final double firstPageLimit; + private final double maxItemsPerPage; + + public LinearPageLimits() { + this(DEFAULT_FACTOR, DEFAULT_MIN_ITEMS_PER_PAGE); + } + + public LinearPageLimits(double factor) { + this(factor, DEFAULT_MIN_ITEMS_PER_PAGE); + } + + public LinearPageLimits(double factor, int firstPageLimit) { + this(factor, firstPageLimit, DEFAULT_MAX_ITEMS_PER_PAGE); + } + + public LinearPageLimits(double factor, int firstPageLimit, int maxItemsPerPage) { + this.factor = factor; + this.firstPageLimit = firstPageLimit; + this.maxItemsPerPage = maxItemsPerPage; + } + + @Override + public int getPageLimit(int pageIndex) { + double min = Math.min(maxItemsPerPage, firstPageLimit + (pageIndex * factor)); + assert min > 0d; + return (int) min; + } +} diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/PageLimits.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/PageLimits.java index c3cd6ff..2051d86 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/PageLimits.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/PageLimits.java @@ -5,7 +5,7 @@ import it.cavallium.dbengine.lucene.LuceneUtils; public interface PageLimits { int DEFAULT_MIN_ITEMS_PER_PAGE = 10; - int DEFAULT_MAX_ITEMS_PER_PAGE = 500; + int DEFAULT_MAX_ITEMS_PER_PAGE = 250; int getPageLimit(int pageIndex); } diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleUnsortedUnscoredLuceneMultiSearcher.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleUnsortedUnscoredLuceneMultiSearcher.java index 7904e11..6638c5a 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleUnsortedUnscoredLuceneMultiSearcher.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/SimpleUnsortedUnscoredLuceneMultiSearcher.java @@ -30,11 +30,11 @@ public class SimpleUnsortedUnscoredLuceneMultiSearcher implements LuceneMultiSea var indexSearchersResource = Mono .fromRunnable(() -> { LLUtils.ensureBlocking(); - if (!queryParams.isSorted()) { + if (queryParams.isSorted()) { throw new UnsupportedOperationException("Sorted queries are not supported" + " by SimpleUnsortedUnscoredLuceneMultiSearcher"); } - if (!queryParams.isScored()) { + if (queryParams.isScored()) { throw new UnsupportedOperationException("Scored queries are not supported" + " by SimpleUnsortedUnscoredLuceneMultiSearcher"); }