public static BloomKFilter bloomKFilterFromBytes(byte[] bytes) throws IOException { return BloomKFilter.deserialize(new ByteArrayInputStream(bytes)); } }
public static BloomKFilter deserialize(ByteBuffer in) throws IOException { return deserialize(in, in.position()); }
@Override public Object finalizeComputation(Object object) { try { if (object instanceof ByteBuffer) { return BloomKFilter.deserialize((ByteBuffer) object); } else if (object instanceof byte[]) { return BloomKFilter.deserialize(ByteBuffer.wrap((byte[]) object)); } else { return object; } } catch (IOException ioe) { throw new RuntimeException("Failed to deserialize BloomKFilter", ioe); } }
@Override public void aggregate() { Object other = selector.getObject(); if (other != null) { if (other instanceof BloomKFilter) { collector.merge((BloomKFilter) other); } else if (other instanceof ByteBuffer) { // fun fact: because bloom filter agg factory deserialize returns a byte buffer to avoid unnecessary serde, // but GroupByQueryEngine (group by v1) ends up trying to merge ByteBuffers from buffer aggs with this agg // instead of the BloomFilterBufferMergeAggregator. fun! Also, it requires a 'ComplexMetricSerde' to be // registered even for query time only aggs, but then never uses it. also fun! try { BloomKFilter otherFilter = BloomKFilter.deserialize((ByteBuffer) other); collector.merge(otherFilter); } catch (IOException ioe) { throw new RuntimeException("Failed to deserialize BloomKFilter", ioe); } } } } }