From ea2065302aacb263d438762c44413fbcfeef1d56 Mon Sep 17 00:00:00 2001 From: Andrea Cavalli Date: Mon, 20 Jun 2022 23:31:42 +0200 Subject: [PATCH] Code cleanup --- .../java/it/cavallium/dbengine/client/Hits.java | 10 +++++++++- .../dbengine/client/LuceneIndexImpl.java | 6 ++---- .../cavallium/dbengine/utils/SimpleResource.java | 15 ++++++++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/it/cavallium/dbengine/client/Hits.java b/src/main/java/it/cavallium/dbengine/client/Hits.java index 532bd9f..3899094 100644 --- a/src/main/java/it/cavallium/dbengine/client/Hits.java +++ b/src/main/java/it/cavallium/dbengine/client/Hits.java @@ -16,18 +16,26 @@ import reactor.core.publisher.Mono; import reactor.util.function.Tuples; public final class Hits extends SimpleResource { + + private static final Hits EMPTY_HITS = new Hits<>(Flux.empty(), TotalHitsCount.of(0, true), null, false); private Flux results; private TotalHitsCount totalHitsCount; private Runnable onClose; public Hits(Flux results, TotalHitsCount totalHitsCount, Runnable onClose) { + this(results, totalHitsCount, onClose, true); + } + + private Hits(Flux results, TotalHitsCount totalHitsCount, Runnable onClose, boolean canClose) { + super(canClose); this.results = results; this.totalHitsCount = totalHitsCount; this.onClose = onClose; } + @SuppressWarnings("unchecked") public static Hits empty() { - return new Hits<>(Flux.empty(), TotalHitsCount.of(0, true), null); + return (Hits) EMPTY_HITS; } public static Hits> withValuesLazy(Hits> hits, diff --git a/src/main/java/it/cavallium/dbengine/client/LuceneIndexImpl.java b/src/main/java/it/cavallium/dbengine/client/LuceneIndexImpl.java index 1ae5ac4..33c4239 100644 --- a/src/main/java/it/cavallium/dbengine/client/LuceneIndexImpl.java +++ b/src/main/java/it/cavallium/dbengine/client/LuceneIndexImpl.java @@ -124,7 +124,7 @@ public class LuceneIndexImpl implements LuceneIndex { .collectList() .flatMap(shards -> mergeResults(queryParams, shards)) .map(this::mapResults) - .single() + .defaultIfEmpty(Hits.empty()) .doOnDiscard(LLSearchResultShard.class, SimpleResource::close) .doOnDiscard(Hits.class, SimpleResource::close); } @@ -153,9 +153,7 @@ public class LuceneIndexImpl implements LuceneIndex { .query(query) .timeout(Duration.ofSeconds(30)) .limit(0) - .build()), searchResultKeys -> { - return Mono.just(searchResultKeys.totalHitsCount()); - }, LLUtils::finalizeResource); + .build()), searchResultKeys -> Mono.just(searchResultKeys.totalHitsCount()), LLUtils::finalizeResource); } @Override diff --git a/src/main/java/it/cavallium/dbengine/utils/SimpleResource.java b/src/main/java/it/cavallium/dbengine/utils/SimpleResource.java index 249254e..1a39863 100644 --- a/src/main/java/it/cavallium/dbengine/utils/SimpleResource.java +++ b/src/main/java/it/cavallium/dbengine/utils/SimpleResource.java @@ -6,20 +6,29 @@ import java.util.concurrent.atomic.AtomicBoolean; public abstract class SimpleResource implements SafeCloseable { private final AtomicBoolean closed = new AtomicBoolean(); + private final boolean canClose; + + public SimpleResource() { + canClose = true; + } + + protected SimpleResource(boolean canClose) { + this.canClose = canClose; + } @Override public final void close() { - if (closed.compareAndSet(false, true)) { + if (canClose && closed.compareAndSet(false, true)) { onClose(); } } private boolean isClosed() { - return closed.get(); + return canClose && closed.get(); } protected void ensureOpen() { - if (closed.get()) { + if (canClose && closed.get()) { throw new IllegalStateException("Resource is closed"); } }