@Override public synchronized void relocate(int oldPosition, int newPosition, ByteBuffer oldBuffer, ByteBuffer newBuffer) { DoublesUnion union = unions.get(oldBuffer).get(oldPosition); final WritableMemory oldMem = getMemory(oldBuffer).writableRegion(oldPosition, maxIntermediateSize); if (union.isSameResource(oldMem)) { // union was not relocated on heap final WritableMemory newMem = getMemory(newBuffer).writableRegion(newPosition, maxIntermediateSize); union = DoublesUnion.wrap(newMem); } putUnion(newBuffer, newPosition, union); Int2ObjectMap<DoublesUnion> map = unions.get(oldBuffer); map.remove(oldPosition); if (map.isEmpty()) { unions.remove(oldBuffer); memCache.remove(oldBuffer); } }
@Test(expectedExceptions = SketchesArgumentException.class) public void wrapUnionFromCompact() { UpdateDoublesSketch s1 = DoublesSketch.builder().build(); s1.update(1); s1.update(2); Memory mem = Memory.wrap(s1.toByteArray(true)); DoublesUnion.wrap(mem); fail(); }
@Test public void checkWrapInstance() { final int k = 128; final int n = 1000; final UpdateDoublesSketch sketch = DoublesSketch.builder().setK(k).build(); for (int i = 1; i <= n; i++) { sketch.update(i); } final double skMedian = sketch.getQuantile(.5); Assert.assertEquals(skMedian, 500, 10); final byte[] byteArr = sketch.toByteArray(false); final WritableMemory mem = WritableMemory.wrap(byteArr); final DoublesUnion union = DoublesUnion.wrap(mem); Assert.assertFalse(union.isEmpty()); assertTrue(union.isDirect()); final DoublesSketch sketch2 = union.getResult(); final double uMedian = sketch2.getQuantile(0.5); Assert.assertEquals(skMedian, uMedian, 0.0); // check serializing again final byte[] bytesOut = union.toByteArray(); assertEquals(bytesOut.length, byteArr.length); assertEquals(bytesOut, byteArr); // wrapped, so should be exact }
s1.update(2); Memory mem = Memory.wrap(s1.toByteArray(false)); DoublesUnion u = DoublesUnion.wrap(mem); DoublesSketch s2 = u.getResult(); Assert.assertEquals(s2.getMinValue(), 1.0);