final long v0 = TermIdEncoder.combine(pid, ctr); assertEquals("pid", pid, TermIdEncoder.getPartitionId(v0)); assertEquals("ctr", ctr, TermIdEncoder.getLocalCounter(v0)); final long u = encoder.encode(v0); final long u1 = encoder.encode2(v0); assertTrue(u == u1); final long v1 = encoder.decode(u); final long v2 = encoder.decode2(u); assertTrue(v1 == v2);
final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode(v0); assertTrue(v0 == encoder.decode(ev)); final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode2(v0); assertTrue(v0 == encoder.decode2(ev));
/** * Stress test using an encoder with NO bits reversed and rotated into the * high bits of the long value and random values for the partition * identifier and the local counter. */ public void test_encode_decode_0bits_stress() { final Random r = new Random(); final TermIdEncoder encoder = new TermIdEncoder(0); for (int i = 0; i < 1000000; i++) { final long v0 = r.nextLong(); if (v0 == 0L) { // Do not attempt to encode a NULL. continue; } // Encode. final long v1 = encoder.encode(v0); final long v2 = encoder.encode2(v0); assertTrue(v1==v2); // verify same behavior. // Verify does not cause any transform of the value. if (v0 != v1) fail(encoder, v0, v1); } }
/** * Test of encode/decode when ZERO (0) of the low bits are reversed and * placed into the high bits. The encoding should be a NOP in this special * case. */ public void test_encode_decode_0bits_pid1_ctr1() { final TermIdEncoder encoder = new TermIdEncoder(0); final int pid = 1; final int ctr = 1; doEncodeDecodeTest(encoder, pid, ctr); }
final long pid = 0xFFFFFFFFL & getPartitionId(v); final long ctr = 0xFFFFFFFFL & getLocalCounter(v);
final TermIdEncoder encoder = new TermIdEncoder(1); encoder.encode(0L); fail("Expecting: " + IllegalArgumentException.class); } catch (IllegalArgumentException ex) {
/** * Reverses the effect of {@link #encode(long)}. * * @param u * An encoded long value. * * @return The decode long value. */ public long decode(final long u) { // reverse high word and mask to recover the low-N bits. final int fwd = Integer.reverse(((int) (u >>> 32))) & mask; /* * Left-shift to make room for the (un-)reversed bits and then combine * them back in. */ final int ctr = ((int) (u << N) | fwd); /* * Bring the partition identifier back to an int by shifting it the * same number of bits in the other direction. */ final int pid = ((int) (u >>> (32 - N))); // reconstruct the long counter value. return combine(pid, ctr); }
/** * Unit test with {@link Integer#MIN_VALUE} for pid and 0L for the local * counter (this combination should not occur in practice since we increment * the local counter before assigning the term identifier rather than after). */ public void test_encode_decode_1bits_pidMIN_ctr0() { doEncodeDecodeTest(new TermIdEncoder(1), Integer.MIN_VALUE/* pid */, 0/* ctr */); }
final long pid = 0xFFFFFFFFL & getPartitionId(v); final long ctr = 0xFFFFFFFFL & getLocalCounter(v);
/** * Stress test using an encoder with NO bits reversed and rotated into the * high bits of the long value and random values for the partition * identifier and the local counter. */ public void test_encode_decode_0bits_stress() { final Random r = new Random(); final TermIdEncoder encoder = new TermIdEncoder(0); for (int i = 0; i < 1000000; i++) { final long v0 = r.nextLong(); if (v0 == 0L) { // Do not attempt to encode a NULL. continue; } // Encode. final long v1 = encoder.encode(v0); final long v2 = encoder.encode2(v0); assertTrue(v1==v2); // verify same behavior. // Verify does not cause any transform of the value. if (v0 != v1) fail(encoder, v0, v1); } }
final TermIdEncoder encoder = new TermIdEncoder(1); encoder.encode(0L); fail("Expecting: " + IllegalArgumentException.class); } catch (IllegalArgumentException ex) {
/** * Reverses the effect of {@link #encode(long)}. * * @param u * An encoded long value. * * @return The decode long value. */ public long decode(final long u) { // reverse high word and mask to recover the low-N bits. final int fwd = Integer.reverse(((int) (u >>> 32))) & mask; /* * Left-shift to make room for the (un-)reversed bits and then combine * them back in. */ final int ctr = ((int) (u << N) | fwd); /* * Bring the partition identifier back to an int by shifting it the * same number of bits in the other direction. */ final int pid = ((int) (u >>> (32 - N))); // reconstruct the long counter value. return combine(pid, ctr); }
final long v0 = TermIdEncoder.combine(pid, ctr); assertEquals("pid", pid, TermIdEncoder.getPartitionId(v0)); assertEquals("ctr", ctr, TermIdEncoder.getLocalCounter(v0)); final long u = encoder.encode(v0); final long u1 = encoder.encode2(v0); assertTrue(u == u1); final long v1 = encoder.decode(u); final long v2 = encoder.decode2(u); assertTrue(v1 == v2);
final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode(v0); assertTrue(v0 == encoder.decode(ev)); final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode2(v0); assertTrue(v0 == encoder.decode2(ev));
/** * Unit test with ONE (1) for pid and local counter. */ public void test_encode_decode_1bits_pid1_ctr1() { doEncodeDecodeTest(new TermIdEncoder(1), 1/* pid */, 1/* ctr */); }
private static void assertSameCounter(final int pid, final int ctr, final long v0) { // sanity check extract of pid. assertEquals("pid", pid, TermIdEncoder.getPartitionId(v0)); // sanity check extract of ctr. assertEquals("ctr", ctr, TermIdEncoder.getLocalCounter(v0)); final long v2 = BTree.PartitionedCounter.combine(pid, ctr); assertEquals(v0, v2); }
/** * Stress test using an encoder with NO bits reversed and rotated into the * high bits of the long value and random values for the partition * identifier and the local counter. */ public void test_encode_decode_0bits_stress() { final Random r = new Random(); final TermIdEncoder encoder = new TermIdEncoder(0); for (int i = 0; i < 1000000; i++) { final long v0 = r.nextLong(); if (v0 == 0L) { // Do not attempt to encode a NULL. continue; } // Encode. final long v1 = encoder.encode(v0); final long v2 = encoder.encode2(v0); assertTrue(v1==v2); // verify same behavior. // Verify does not cause any transform of the value. if (v0 != v1) fail(encoder, v0, v1); } }
final TermIdEncoder encoder = new TermIdEncoder(1); encoder.encode(0L); fail("Expecting: " + IllegalArgumentException.class); } catch (IllegalArgumentException ex) {
final long v0 = TermIdEncoder.combine(pid, ctr); assertEquals("pid", pid, TermIdEncoder.getPartitionId(v0)); assertEquals("ctr", ctr, TermIdEncoder.getLocalCounter(v0)); final long u = encoder.encode(v0); final long u1 = encoder.encode2(v0); assertTrue(u == u1); final long v1 = encoder.decode(u); final long v2 = encoder.decode2(u); assertTrue(v1 == v2);
final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode(v0); assertTrue(v0 == encoder.decode(ev)); final TermIdEncoder encoder = new TermIdEncoder(nbits); final long v0 = TermIdEncoder.combine(pid, ctr); final long ev = encoder.encode2(v0); assertTrue(v0 == encoder.decode2(ev));