Add ByteBufferSizedHashed

Like HashedToByteBuffer, but param is a size function instead of a fixed length
This commit is contained in:
Pierre Sauvage 2021-01-27 13:23:08 +01:00
parent ee51f4cee3
commit 6f56c13441
2 changed files with 86 additions and 0 deletions

View File

@ -0,0 +1,63 @@
package io.nosqlbench.virtdata.library.basics.shared.from_long.to_bytebuffer;
import io.nosqlbench.virtdata.api.annotations.Categories;
import io.nosqlbench.virtdata.api.annotations.Category;
import io.nosqlbench.virtdata.api.annotations.Example;
import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper;
import io.nosqlbench.virtdata.api.bindings.VirtDataConversions;
import io.nosqlbench.virtdata.library.basics.shared.from_long.to_long.Hash;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.function.LongFunction;
import java.util.function.LongToIntFunction;
/**
* Create a ByteBuffer from a long input based on a provided size function.
*
* As a 'Sized' function, the first argument is a function which determines the size of the resulting ByteBuffer.
*
* As a 'Hashed' function, the input value is hashed again before being used as value.
*/
@Categories(Category.conversion)
@ThreadSafeMapper
public class ByteBufferSizedHashed implements LongFunction<ByteBuffer> {
private final LongToIntFunction sizeFunc;
private final Hash hash = new Hash();
@Example({
"ByteBufferSizedHashed(16)",
"Functionally identical to HashedtoByteBuffer(16) but using dynamic sizing implementation"
})
@Example({
"ByteBufferSizedHashed(HashRange(10, 14))",
"Create a ByteBuffer with variable limit (10 to 14)"
})
public ByteBufferSizedHashed(int size) {
this.sizeFunc = s -> size;
}
public ByteBufferSizedHashed(Object sizeFunc) {
this.sizeFunc = VirtDataConversions.adaptFunction(sizeFunc, LongToIntFunction.class);
}
@Override
public ByteBuffer apply(long input) {
int length = sizeFunc.applyAsInt(input);
int longs = (length / Long.BYTES) +1;
int bytes = longs * Long.BYTES;
ByteBuffer buffer = ByteBuffer.allocate(bytes);
for (int i = 0; i < longs; i++) {
long l = hash.applyAsLong(input + i);
buffer.putLong(l);
}
buffer.flip();
buffer.limit(length);
return buffer;
}
}

View File

@ -0,0 +1,23 @@
package io.nosqlbench.virtdata.library.basics.shared.from_long.to_bytebuffer;
import io.nosqlbench.virtdata.library.basics.shared.from_long.to_int.HashRange;
import org.junit.Test;
import java.nio.ByteBuffer;
import java.util.function.LongToIntFunction;
import static org.assertj.core.api.Assertions.assertThat;
public class ByteBufferSizedHashedTest {
@Test
public void testWithHashRange() {
LongToIntFunction sizeFunc = new HashRange(100, 1000);
long input = 233423L;
ByteBufferSizedHashed d1 = new ByteBufferSizedHashed(sizeFunc);
ByteBuffer buf = d1.apply(input);
assertThat(sizeFunc.applyAsInt(233423L)).isEqualTo(buf.remaining());
}
}