@Override protected ItemsSketch<String> _apply(final ItemsSketch<String> a, final ItemsSketch<String> b) { final ItemsUnion<String> union = ItemsUnion.getInstance(Ordering.<String>natural()); union.update(a); union.update(b); return union.getResult(); } }
@Override protected ItemsUnion<String> getExampleOutput() { final ItemsUnion<String> union = ItemsUnion.getInstance(32, Ordering.<String>natural()); union.update("1"); union.update("2"); union.update("3"); return union; }
@Test public void meEmptyOtherEstBiggerSmaller() { final ItemsUnion<Long> union = ItemsUnion.getInstance(16, Comparator.naturalOrder()); //me null final ItemsSketch<Long> skEmpty = ItemsSketch.getInstance(64, Comparator.naturalOrder()); union.update(skEmpty); //empty at k = 16 ItemsSketch<Long> skExact = buildIS(32, 64); //bigger, est union.update(skExact); Assert.assertEquals(union.getResult().getMinValue(), skExact.getMinValue(), 0.0); Assert.assertEquals(union.getResult().getMaxValue(), skExact.getMaxValue(), 0.0); union.reset(); union.update(skEmpty); //empty at k = 16 skExact = buildIS(8, 16); //smaller, est union.update(skExact); Assert.assertEquals(union.getResult().getMinValue(), skExact.getMinValue(), 0.0); Assert.assertEquals(union.getResult().getMaxValue(), skExact.getMaxValue(), 0.0); }
@Test public void nullAndEmpty() { ItemsUnion<Integer> union = ItemsUnion.getInstance(Comparator.naturalOrder()); Assert.assertTrue(union.isEmpty()); Assert.assertFalse(union.isDirect()); Assert.assertEquals(union.getMaxK(), DEFAULT_K); Assert.assertEquals(union.getEffectiveK(), DEFAULT_K); Assert.assertTrue(union.toString().length() > 0); union.update((Integer) null); ItemsSketch<Integer> result = union.getResult(); Assert.assertTrue(result.isEmpty()); Assert.assertEquals(result.getN(), 0); Assert.assertNull(result.getMinValue()); Assert.assertNull(result.getMaxValue()); Assert.assertNull(union.getResultAndReset()); union.update(validSk); union = ItemsUnion.getInstance(result); union.update((ItemsSketch<Integer>) null); union.update(emptySk); Assert.assertTrue(union.isEmpty()); Assert.assertFalse(union.isDirect()); Assert.assertEquals(union.getMaxK(), DEFAULT_K); Assert.assertEquals(union.getEffectiveK(), DEFAULT_K); result = union.getResult(); Assert.assertTrue(result.isEmpty());
@Test public void sameK() { final ItemsUnion<Long> union = ItemsUnion.getInstance(128, Comparator.naturalOrder()); ItemsSketch<Long> result = union.getResult(); Assert.assertEquals(result.getN(), 0); Assert.assertNull(result.getMinValue()); Assert.assertNull(result.getMaxValue()); for (int i = 1; i <= 1000; i++) { union.update((long) i); } result = union.getResult(); Assert.assertEquals(result.getN(), 1000); Assert.assertEquals(result.getMinValue(), Long.valueOf(1)); union.update(sketch1); result = union.getResult(); Assert.assertEquals(result.getN(), 2000); Assert.assertEquals(result.getMinValue(), Long.valueOf(1)); for (int i = 2001; i <= 3000; i++) { sketch2.update((long) i); } final ArrayOfItemsSerDe<Long> serDe = new ArrayOfLongsSerDe(); union.update(Memory.wrap(sketch2.toByteArray(serDe)), serDe); result = union.getResultAndReset(); Assert.assertNotNull(result); Assert.assertEquals(result.getN(), 3000); result = union.getResult(); Assert.assertEquals(result.getN(), 0); Assert.assertNull(result.getMinValue());
@Test public void toStringCrudeCheck() { final ItemsUnion<String> union = ItemsUnion.getInstance(128, Comparator.naturalOrder()); union.update("a"); final String brief = union.toString(); final String full = union.toString(true, true); Assert.assertTrue(brief.length() < full.length()); }
@Test public void checkToByteArray() { final int k = 32; final ArrayOfLongsSerDe serDe = new ArrayOfLongsSerDe(); ItemsUnion<Long> union = ItemsUnion.getInstance(k, Comparator.naturalOrder()); byte[] bytesOut = union.toByteArray(serDe); Assert.assertEquals(bytesOut.length, 8); Assert.assertTrue(union.isEmpty()); final byte[] byteArr = buildIS(k, 2 * k + 5).toByteArray(serDe); final Memory mem = Memory.wrap(byteArr); union = ItemsUnion.getInstance(mem, Comparator.naturalOrder(), serDe); bytesOut = union.toByteArray(serDe); Assert.assertEquals(bytesOut.length, byteArr.length); Assert.assertEquals(bytesOut, byteArr); // assumes consistent internal use of toByteArray() }
@Override public byte[] serialise(final ItemsUnion<String> union) throws SerialisationException { return union.getResult().toByteArray(SERIALISER); }
@Override public ItemsUnion<String> deserialise(final byte[] bytes) throws SerialisationException { return ItemsUnion.getInstance(WritableMemory.wrap(bytes), Comparator.naturalOrder(), SERIALISER); }
@Test public void basedOnSketch() { final Comparator<String> comp = Comparator.naturalOrder(); final ArrayOfStringsSerDe serDe = new ArrayOfStringsSerDe(); final ItemsSketch<String> sketch = ItemsSketch.getInstance(comp); ItemsUnion<String> union = ItemsUnion.getInstance(sketch); union.reset(); final byte[] byteArr = sketch.toByteArray(serDe); final Memory mem = Memory.wrap(byteArr); union = ItemsUnion.getInstance(mem, comp, serDe); Assert.assertEquals(byteArr.length, 8); union.reset(); }
/** * Create an instance of ItemsUnion with the default k * @param <T> type of item * @param comparator to compare items * @return an instance of ItemsUnion */ public static <T> ItemsUnion<T> getInstance(final Comparator<? super T> comparator) { return new ItemsUnion<T>(PreambleUtil.DEFAULT_K, comparator, null); }
/** * Returns summary information about the backing sketch. */ @Override public String toString() { return toString(true, false); }
/** * Returns summary information about the backing sketch. Used for debugging. * @param sketchSummary if true includes sketch summary * @param dataDetail if true includes data detail * @return summary information about the sketch. */ public String toString(final boolean sketchSummary, final boolean dataDetail) { final StringBuilder sb = new StringBuilder(); final String thisSimpleName = this.getClass().getSimpleName(); final int maxK = this.getMaxK(); final String kStr = String.format("%,d", maxK); sb.append(Util.LS).append("### Quantiles ").append(thisSimpleName).append(LS); sb.append(" maxK : ").append(kStr); if (gadget_ == null) { sb.append(ItemsSketch.getInstance(maxK_, comparator_).toString()); return sb.toString(); } sb.append(gadget_.toString(sketchSummary, dataDetail)); return sb.toString(); }
@Test public void meNullOtherEstBiggerSmaller() { final ItemsUnion<Long> union = ItemsUnion.getInstance(16, Comparator.naturalOrder()); //me null ItemsSketch<Long> skEst = buildIS(32, 64); //other is bigger, est union.update(skEst); Assert.assertEquals(union.getResult().getMinValue(), skEst.getMinValue(), 0.0); Assert.assertEquals(union.getResult().getMaxValue(), skEst.getMaxValue(), 0.0); union.reset(); skEst = buildIS(8, 64); //other is smaller est, union.update(skEst); Assert.assertEquals(union.getResult().getMinValue(), skEst.getMinValue(), 0.0); Assert.assertEquals(union.getResult().getMaxValue(), skEst.getMaxValue(), 0.0); }
@Test public void differentK() { final ItemsUnion<Long> union = ItemsUnion.getInstance(512, Comparator.naturalOrder()); ItemsSketch<Long> result = union.getResult(); Assert.assertEquals(result.getN(), 0); Assert.assertNull(result.getMinValue()); Assert.assertNull(result.getMaxValue()); for (int i = 1; i <= 10000; i++) { union.update((long) i); } result = union.getResult(); Assert.assertEquals(result.getK(), 512); Assert.assertEquals(result.getN(), 10000); union.update(sketch1); result = union.getResult(); Assert.assertEquals(result.getK(), 256); Assert.assertEquals(result.getN(), 20000); for (int i = 20001; i <= 30000; i++) { sketch2.update((long) i); } final ArrayOfItemsSerDe<Long> serDe = new ArrayOfLongsSerDe(); union.update(Memory.wrap(sketch2.toByteArray(serDe)), serDe); result = union.getResultAndReset(); Assert.assertNotNull(result); Assert.assertEquals(result.getK(), 128); result = union.getResult(); Assert.assertEquals(result.getN(), 0); Assert.assertNull(result.getMinValue());
@Before public void setup() { union1 = ItemsUnion.getInstance(Ordering.<String>natural()); union1.update("1"); union1.update("2"); union1.update("3"); union2 = ItemsUnion.getInstance(Ordering.<String>natural()); union2.update("4"); union2.update("5"); union2.update("6"); union2.update("7"); }
@Override protected String getTestValue(final ItemsUnion<String> object) { return object.getResult().getQuantile(0.5D); }
@Override protected ItemsUnion<String> getEmptyExampleOutput() { return ItemsUnion.getInstance(32, Ordering.<String>natural()); }