From 5c238e44f0919fef7a3cddb0e76568baacf8cf75 Mon Sep 17 00:00:00 2001 From: AlexanderSaydakov Date: Mon, 13 May 2024 19:20:47 -0700 Subject: [PATCH] removed intermediate hash map --- .../org/apache/datasketches/tuple/Filter.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/apache/datasketches/tuple/Filter.java b/src/main/java/org/apache/datasketches/tuple/Filter.java index 28b38295c..2ed156b84 100644 --- a/src/main/java/org/apache/datasketches/tuple/Filter.java +++ b/src/main/java/org/apache/datasketches/tuple/Filter.java @@ -19,10 +19,10 @@ package org.apache.datasketches.tuple; +import java.lang.reflect.Array; +import java.util.Arrays; import java.util.function.Predicate; -import org.apache.datasketches.common.ResizeFactor; - /** * Class for filtering entries from a {@link Sketch} given a {@link Summary} * @@ -52,23 +52,25 @@ public CompactSketch filter(final Sketch sketchIn) { if (sketchIn == null) { return new CompactSketch<>(null, null, Long.MAX_VALUE, true); } - - final QuickSelectSketch sketch = - new QuickSelectSketch<>(sketchIn.getRetainedEntries(), ResizeFactor.X1.lg(), null); + final long[] hashes = new long[sketchIn.getRetainedEntries()]; + T[] summaries = null; // lazy init to get class from the first entry + int i = 0; final TupleSketchIterator it = sketchIn.iterator(); while (it.next()) { final T summary = it.getSummary(); if (predicate.test(summary)) { - sketch.insert(it.getHash(), (T)summary.copy()); + hashes[i] = it.getHash(); + if (summaries == null) { + summaries = (T[]) Array.newInstance(summary.getClass(), sketchIn.getRetainedEntries()); + } + summaries[i++] = (T) summary.copy(); } } - - sketch.setThetaLong(sketchIn.getThetaLong()); - if (!sketchIn.isEmpty()) { - sketch.setEmpty(false); + final boolean isEmpty = i == 0 && !sketchIn.isEstimationMode(); + if (i == 0) { + return new CompactSketch<>(null, null, sketchIn.getThetaLong(), isEmpty); } - - return sketch.compact(); + return new CompactSketch<>(Arrays.copyOf(hashes, i), Arrays.copyOf(summaries, i), sketchIn.getThetaLong(), isEmpty); } }