@Override public void logAccess(LookupKey key) { numInsertions++; filter.add(key); }
@Override public boolean hasSeen(LookupKey key) { return filter.mightContain(key); }
@Override @SuppressWarnings("unchecked") public Object apply(List<Object> args) { if (args.size() > 0) { Object firstArg = args.get(0); if (firstArg instanceof List) { BloomFilter ret = null; for (Object bf : (List)firstArg) { if (bf instanceof BloomFilter) { if (ret == null) { ret = (BloomFilter)bf; } else { ret.merge((BloomFilter)bf); } } } return ret; } else { return null; } } return null; } }
@Test public void testBloomFilter() { final BloomFilter<Object> expected = new BloomFilter<>(new BloomFilter.DefaultSerializer<>(), 10000, 0.01); expected.add("foo"); expected.add("bar"); byte[] raw = SerDeUtils.toBytes(expected); BloomFilter<Object> actual = (BloomFilter) SerDeUtils.fromBytes(raw, Object.class); Assert.assertTrue(actual.mightContain("foo")); Assert.assertFalse(actual.mightContain("timothy")); assertEquals(expected, actual); }
@Override public Object apply(List<Object> args) { int expectedInsertions = 100000; float falsePositiveRate = 0.01f; if (args.size() > 1) { expectedInsertions = ConversionUtils.convert(args.get(0), Integer.class); } if (args.size() > 2) { falsePositiveRate = ConversionUtils.convert(args.get(1), Float.class); } return new BloomFilter<>(SerDeUtils.SERIALIZER, expectedInsertions, falsePositiveRate); } }
@Test @SuppressWarnings("unchecked") public void testBloomFilter() { final BloomFilter<Object> expected = new BloomFilter<>(new BloomFilter.DefaultSerializer<>(), 10000, 0.01); expected.add("foo"); expected.add("bar"); byte[] raw = SerDeUtils.toBytes(expected); BloomFilter<Object> actual = (BloomFilter) SerDeUtils.fromBytes(raw, Object.class); Assert.assertTrue(actual.mightContain("foo")); Assert.assertFalse(actual.mightContain("timothy")); assertEquals(expected, actual); }
@Override public void configure(Map<String, Object> config) { expectedInsertions = toInt(config.get(EXPECTED_INSERTIONS_KEY)); falsePositiveRate = toDouble(config.get(FALSE_POSITIVE_RATE_KEY)); name = config.get(NAME_KEY).toString(); filter = new BloomFilter<LookupKey>(new LookupKeySerializer(), expectedInsertions, falsePositiveRate); }
public BloomAccessTracker(String name, int expectedInsertions, double falsePositiveRate) { this.name = name; this.expectedInsertions = expectedInsertions; this.falsePositiveRate = falsePositiveRate; filter = new BloomFilter<LookupKey>(new LookupKeySerializer(), expectedInsertions, falsePositiveRate); } public BloomAccessTracker() {}
@Override @SuppressWarnings("unchecked") public Object apply(List<Object> args) { if (args.size() == 0) { return false; } BloomFilter<Object> filter = (BloomFilter)args.get(0); if (args.size() > 1) { Object arg = args.get(1); if (arg == null) { return false; } return filter.mightContain(arg); } return false; } }
@Override @SuppressWarnings("unchecked") public Object apply(List<Object> args) { BloomFilter<Object> filter = (BloomFilter)args.get(0); for (int i = 1;i < args.size();++i) { Object arg = args.get(i); if (arg != null) { filter.add(args.get(i)); } } return filter; } }
@Override public AccessTracker union(AccessTracker tracker) { if(filter == null) { throw new IllegalStateException("Unable to union access tracker, because this tracker is not initialized."); } if(tracker instanceof BloomAccessTracker ) { filter.merge(((BloomAccessTracker)tracker).getFilter()); return this; } else { throw new IllegalStateException("Unable to union access tracker, because it's not of the right type (BloomAccessTracker)"); } }
@Override public void reset() { filter = new BloomFilter<LookupKey>(new LookupKeySerializer(), expectedInsertions, falsePositiveRate); }
@Test @SuppressWarnings("unchecked") public void testAdd() { BloomFilter result = (BloomFilter)run("BLOOM_ADD(BLOOM_INIT(), string, double, integer, map)", variables); for(Object val : variables.values()) { Assert.assertTrue(result.mightContain(val)); } Assert.assertTrue(result.mightContain(ImmutableMap.of("key1", "value1", "key2", "value2"))); }
@Test @SuppressWarnings("unchecked") public void testMerge() { BloomFilter bloomString = (BloomFilter)run("BLOOM_ADD(BLOOM_INIT(), string)", variables); BloomFilter bloomDouble = (BloomFilter)run("BLOOM_ADD(BLOOM_INIT(), double)", variables); BloomFilter bloomInteger= (BloomFilter)run("BLOOM_ADD(BLOOM_INIT(), integer)", variables); BloomFilter bloomMap= (BloomFilter)run("BLOOM_ADD(BLOOM_INIT(), map)", variables); BloomFilter merged = (BloomFilter)run("BLOOM_MERGE([stringFilter, doubleFilter, integerFilter, mapFilter])" , ImmutableMap.of("stringFilter", bloomString ,"doubleFilter", bloomDouble ,"integerFilter", bloomInteger ,"mapFilter", bloomMap ) ); Assert.assertNotNull(merged); for(Object val : variables.values()) { Assert.assertTrue(merged.mightContain(val)); } }