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 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(this.getClass().getName() + "::release has been called twice!"); } releaseCalled = true; }).then(release); } public static SearchResultKeys empty() { var sr = new SearchResultKeys(Flux.empty(), TotalHitsCount.of(0, true), Mono.empty()); sr.releaseCalled = true; return sr; } public SearchResult withValues(ValueGetter valuesGetter) { return new SearchResult<>(results.map(item -> new SearchResultItem<>(item.key(), item.key().flatMap(valuesGetter::get), item.score() )), totalHitsCount, release); } public Flux> resultsThenRelease() { 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(this.getClass().getName() + "::release has not been called before class finalization!"); } super.finalize(); } }