@Override public void init(ByteBuffer buf, int position) { final ByteBuffer mutationBuffer = buf.duplicate(); mutationBuffer.position(position); BloomKFilter filter = new BloomKFilter(maxNumEntries); BloomKFilter.serialize(mutationBuffer, filter); }
/** * Deserialize a bloom filter * Read a byte stream, which was written by {@linkplain #serialize(OutputStream, BloomKFilter)} * into a {@code BloomKFilter} * * @param in input bytestream * * @return deserialized BloomKFilter */ public static BloomKFilter deserialize(InputStream in) throws IOException { if (in == null) { throw new IOException("Input stream is null"); } try { DataInputStream dataInputStream = new DataInputStream(in); int numHashFunc = dataInputStream.readByte(); int bitsetArrayLen = dataInputStream.readInt(); long[] data = new long[bitsetArrayLen]; for (int i = 0; i < bitsetArrayLen; i++) { data[i] = dataInputStream.readLong(); } return new BloomKFilter(data, numHashFunc); } catch (RuntimeException e) { IOException io = new IOException("Unable to deserialize BloomKFilter"); io.initCause(e); throw io; } }
/** * Deserialize a bloom filter * Read a byte buffer, which was written by {@linkplain #serialize(OutputStream, BloomKFilter)} or * {@linkplain #serialize(ByteBuffer, int, BloomKFilter)} * into a {@code BloomKFilter}. Does not mutate buffer position. * * @param in input ByteBuffer * * @return deserialized BloomKFilter */ public static BloomKFilter deserialize(ByteBuffer in, int position) throws IOException { if (in == null) { throw new IOException("Input stream is null"); } try { ByteBuffer dataBuffer = in.duplicate().order(ByteOrder.BIG_ENDIAN); dataBuffer.position(position); int numHashFunc = dataBuffer.get(); int bitsetArrayLen = dataBuffer.getInt(); long[] data = new long[bitsetArrayLen]; for (int i = 0; i < bitsetArrayLen; i++) { data[i] = dataBuffer.getLong(); } return new BloomKFilter(data, numHashFunc); } catch (RuntimeException e) { throw new IOException("Unable to deserialize BloomKFilter", e); } }
@Override public void fold(ColumnValueSelector selector) { BloomKFilter other = (BloomKFilter) selector.getObject(); if (other == null) { return; } if (combined == null) { combined = new BloomKFilter(maxNumEntries); } combined.merge(other); }
@Override public Aggregator factorize(final ColumnSelectorFactory metricFactory) { final BaseNullableColumnValueSelector selector = metricFactory.makeColumnValueSelector(fieldName); // null columns should be empty bloom filters by this point, so encountering a nil column in merge agg is unexpected if (selector instanceof NilColumnValueSelector) { throw new ISE("WTF?! Unexpected NilColumnValueSelector"); } return new BloomFilterMergeAggregator((ColumnValueSelector<Object>) selector, new BloomKFilter(getMaxNumEntries())); }
@Override public Aggregator factorize(ColumnSelectorFactory columnFactory) { BloomKFilter filter = new BloomKFilter(maxNumEntries); ColumnCapabilities capabilities = columnFactory.getColumnCapabilities(field.getDimension()); if (capabilities == null) { BaseNullableColumnValueSelector selector = columnFactory.makeColumnValueSelector(field.getDimension()); if (selector instanceof NilColumnValueSelector) { // BloomKFilter must be the same size so we cannot use a constant for the empty agg return new EmptyBloomFilterAggregator(filter); } throw new IAE( "Cannot create bloom filter buffer aggregator for column selector type [%s]", selector.getClass().getName() ); } ValueType type = capabilities.getType(); switch (type) { case STRING: return new StringBloomFilterAggregator(columnFactory.makeDimensionSelector(field), filter); case LONG: return new LongBloomFilterAggregator(columnFactory.makeColumnValueSelector(field.getDimension()), filter); case FLOAT: return new FloatBloomFilterAggregator(columnFactory.makeColumnValueSelector(field.getDimension()), filter); case DOUBLE: return new DoubleBloomFilterAggregator(columnFactory.makeColumnValueSelector(field.getDimension()), filter); default: throw new IAE("Cannot create bloom filter aggregator for invalid column type [%s]", type); } }