diff --git a/src/main/java/it/cavallium/dbengine/client/SearchResult.java b/src/main/java/it/cavallium/dbengine/client/SearchResult.java index 6436102..f33164a 100644 --- a/src/main/java/it/cavallium/dbengine/client/SearchResult.java +++ b/src/main/java/it/cavallium/dbengine/client/SearchResult.java @@ -1,21 +1,83 @@ package it.cavallium.dbengine.client; import it.cavallium.dbengine.client.query.current.data.TotalHitsCount; +import it.cavallium.dbengine.database.LLSearchResultShard; +import java.util.Objects; +import org.warp.commonutils.log.Logger; +import org.warp.commonutils.log.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -public record SearchResult(Flux> results, TotalHitsCount totalHitsCount, Mono release) { +public final class SearchResult { + + private static final Logger logger = LoggerFactory.getLogger(SearchResult.class); + + private volatile boolean releaseCalled; + + private final Flux> results; + private final TotalHitsCount totalHitsCount; + private final Mono release; + + public SearchResult(Flux> results, TotalHitsCount totalHitsCount, Mono release) { + this.results = results; + this.totalHitsCount = totalHitsCount; + this.release = Mono.fromRunnable(() -> { + if (releaseCalled) { + logger.warn("LuceneSearchResult::release has been called twice!"); + } + releaseCalled = true; + }).then(release); + } public static SearchResult empty() { return new SearchResult<>(Flux.empty(), TotalHitsCount.of(0, true), Mono.empty()); } public Flux> resultsThenRelease() { - return Flux - .usingWhen( - Mono.just(true), - _unused -> results, - _unused -> release - ); + return Flux.usingWhen(Mono.just(true), _unused -> results, _unused -> release); } + + public Flux> results() { + return results; + } + + public TotalHitsCount totalHitsCount() { + return totalHitsCount; + } + + public Mono release() { + return release; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj == null || obj.getClass() != this.getClass()) + return false; + var that = (SearchResult) obj; + return Objects.equals(this.results, that.results) && Objects.equals(this.totalHitsCount, that.totalHitsCount) + && Objects.equals(this.release, that.release); + } + + @Override + public int hashCode() { + return Objects.hash(results, totalHitsCount, release); + } + + @Override + public String toString() { + return "SearchResult[" + "results=" + results + ", " + "totalHitsCount=" + totalHitsCount + ", " + "release=" + + release + ']'; + } + + @SuppressWarnings("deprecation") + @Override + protected void finalize() throws Throwable { + if (!releaseCalled) { + logger.warn("LuceneSearchResult::release has not been called before class finalization!"); + } + super.finalize(); + } + } diff --git a/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java b/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java index 42b6649..2218217 100644 --- a/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java +++ b/src/main/java/it/cavallium/dbengine/client/SearchResultKeys.java @@ -1,13 +1,36 @@ package it.cavallium.dbengine.client; import it.cavallium.dbengine.client.query.current.data.TotalHitsCount; +import it.cavallium.dbengine.database.LLSearchResultShard; import it.cavallium.dbengine.database.collections.ValueGetter; +import java.util.Objects; import org.reactivestreams.Publisher; +import org.warp.commonutils.log.Logger; +import org.warp.commonutils.log.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @SuppressWarnings("unused") -public record SearchResultKeys(Flux> results, TotalHitsCount totalHitsCount, Mono release) { +public final class SearchResultKeys { + + private static final Logger logger = LoggerFactory.getLogger(SearchResultKeys.class); + + private volatile boolean releaseCalled; + + private final Flux> results; + private final TotalHitsCount totalHitsCount; + private final Mono release; + + public SearchResultKeys(Flux> results, TotalHitsCount totalHitsCount, Mono release) { + this.results = results; + this.totalHitsCount = totalHitsCount; + this.release = Mono.fromRunnable(() -> { + if (releaseCalled) { + logger.warn("LuceneSearchResult::release has been called twice!"); + } + releaseCalled = true; + }).then(release); + } public static SearchResultKeys empty() { return new SearchResultKeys<>(Flux.empty(), TotalHitsCount.of(0, true), Mono.empty()); @@ -21,11 +44,50 @@ public record SearchResultKeys(Flux> results, TotalHitsCou } public Flux> resultsThenRelease() { - return Flux - .usingWhen( - Mono.just(true), - _unused -> results, - _unused -> release - ); + return Flux.usingWhen(Mono.just(true), _unused -> results, _unused -> release); } + + public Flux> results() { + return results; + } + + public TotalHitsCount totalHitsCount() { + return totalHitsCount; + } + + public Mono release() { + return release; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj == null || obj.getClass() != this.getClass()) + return false; + var that = (SearchResultKeys) obj; + return Objects.equals(this.results, that.results) && Objects.equals(this.totalHitsCount, that.totalHitsCount) + && Objects.equals(this.release, that.release); + } + + @Override + public int hashCode() { + return Objects.hash(results, totalHitsCount, release); + } + + @Override + public String toString() { + return "SearchResultKeys[" + "results=" + results + ", " + "totalHitsCount=" + totalHitsCount + ", " + "release=" + + release + ']'; + } + + @SuppressWarnings("deprecation") + @Override + protected void finalize() throws Throwable { + if (!releaseCalled) { + logger.warn("LuceneSearchResult::release has not been called before class finalization!"); + } + super.finalize(); + } + } diff --git a/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java b/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java index c326fa4..b614424 100644 --- a/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java +++ b/src/main/java/it/cavallium/dbengine/database/LLSearchResultShard.java @@ -1,7 +1,75 @@ package it.cavallium.dbengine.database; import it.cavallium.dbengine.client.query.current.data.TotalHitsCount; +import it.cavallium.dbengine.lucene.searcher.LuceneSearchResult; +import java.util.Objects; +import org.warp.commonutils.log.Logger; +import org.warp.commonutils.log.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -public record LLSearchResultShard (Flux results, TotalHitsCount totalHitsCount, Mono release) {} +public final class LLSearchResultShard { + + private static final Logger logger = LoggerFactory.getLogger(LLSearchResultShard.class); + + private volatile boolean releaseCalled; + + private final Flux results; + private final TotalHitsCount totalHitsCount; + private final Mono release; + + public LLSearchResultShard(Flux results, TotalHitsCount totalHitsCount, Mono release) { + this.results = results; + this.totalHitsCount = totalHitsCount; + this.release = Mono.fromRunnable(() -> { + if (releaseCalled) { + logger.warn("LuceneSearchResult::release has been called twice!"); + } + releaseCalled = true; + }).then(release); + } + + public Flux results() { + return results; + } + + public TotalHitsCount totalHitsCount() { + return totalHitsCount; + } + + public Mono release() { + return release; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) + return true; + if (obj == null || obj.getClass() != this.getClass()) + return false; + var that = (LLSearchResultShard) obj; + return Objects.equals(this.results, that.results) && Objects.equals(this.totalHitsCount, that.totalHitsCount) + && Objects.equals(this.release, that.release); + } + + @Override + public int hashCode() { + return Objects.hash(results, totalHitsCount, release); + } + + @Override + public String toString() { + return "LLSearchResultShard[" + "results=" + results + ", " + "totalHitsCount=" + totalHitsCount + ", " + "release=" + + release + ']'; + } + + @SuppressWarnings("deprecation") + @Override + protected void finalize() throws Throwable { + if (!releaseCalled) { + logger.warn("LuceneSearchResult::release has not been called before class finalization!"); + } + super.finalize(); + } + +} diff --git a/src/main/java/it/cavallium/dbengine/lucene/searcher/LuceneSearchResult.java b/src/main/java/it/cavallium/dbengine/lucene/searcher/LuceneSearchResult.java index a926e9f..911edae 100644 --- a/src/main/java/it/cavallium/dbengine/lucene/searcher/LuceneSearchResult.java +++ b/src/main/java/it/cavallium/dbengine/lucene/searcher/LuceneSearchResult.java @@ -12,9 +12,10 @@ import reactor.core.publisher.Mono; public final class LuceneSearchResult { - protected static final Logger logger = LoggerFactory.getLogger(LuceneSearchResult.class); + private static final Logger logger = LoggerFactory.getLogger(LuceneSearchResult.class); private volatile boolean releaseCalled; + private final TotalHitsCount totalHitsCount; private final Flux results; private final Mono release; @@ -30,15 +31,6 @@ public final class LuceneSearchResult { }).then(release); } - @SuppressWarnings("deprecation") - @Override - protected void finalize() throws Throwable { - if (!releaseCalled) { - logger.warn("LuceneSearchResult::release has not been called before class finalization!"); - } - super.finalize(); - } - public TotalHitsCount totalHitsCount() { return totalHitsCount; } @@ -71,4 +63,13 @@ public final class LuceneSearchResult { return "LuceneSearchResult[" + "totalHitsCount=" + totalHitsCount + ", " + "results=" + results + ']'; } + @SuppressWarnings("deprecation") + @Override + protected void finalize() throws Throwable { + if (!releaseCalled) { + logger.warn("LuceneSearchResult::release has not been called before class finalization!"); + } + super.finalize(); + } + }