diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashInterval.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashInterval.java new file mode 100644 index 000000000..56369a200 --- /dev/null +++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashInterval.java @@ -0,0 +1,45 @@ +package io.nosqlbench.virtdata.library.basics.shared.from_long.to_int; + +import io.nosqlbench.nb.api.errors.BasicError; +import io.nosqlbench.virtdata.api.annotations.Example; +import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper; +import io.nosqlbench.virtdata.library.basics.shared.from_long.to_long.Hash; + +import java.util.function.LongToIntFunction; + +@ThreadSafeMapper +public class HashInterval implements LongToIntFunction { + + private final long minValue; + private final long width; + private final Hash hash = new Hash(); + + /** + * Create a hash interval based on a minimum value of 0 and a specified width. + * @param width The maximum value, which is excluded. + */ + @Example({"HashInterval(4)","return values which could include 0, 1, 2, 3, but not 4"}) + public HashInterval(int width) { + this.width=width; + this.minValue=0L; + } + + /** + * Create a hash interval + * @param minIncl The minimum value, which is included + * @param maxExcl The maximum value, which is excluded + */ + @Example({"HashInterval(2,5)","return values which could include 2, 3, 4, but not 5"}) + public HashInterval(int minIncl, int maxExcl) { + if (maxExcl<=minIncl) { + throw new BasicError("HashInterval must have min and max value in that order, where the min is less than the max."); + } + this.minValue = minIncl; + this.width = (maxExcl - minIncl); + } + + @Override + public int applyAsInt(long operand) { + return (int) ((minValue + (hash.applyAsLong(operand) % width)) & Integer.MAX_VALUE); + } +} diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashRange.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashRange.java index dcc3fd8df..740b6be37 100644 --- a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashRange.java +++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_int/HashRange.java @@ -1,5 +1,6 @@ package io.nosqlbench.virtdata.library.basics.shared.from_long.to_int; +import io.nosqlbench.nb.api.errors.BasicError; import io.nosqlbench.virtdata.api.annotations.Example; import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper; import io.nosqlbench.virtdata.library.basics.shared.from_long.to_long.Hash; @@ -22,7 +23,7 @@ public class HashRange implements LongToIntFunction { @Example({"HashRange(35L,39L)","map the input to a number in the range 35-38, inclusive, of type int"}) public HashRange(int minValue, int maxValue) { if (maxValue { private final static Logger logger = LogManager.getLogger(HashedLineToString.class); - private final HashRange indexRange; + private final HashInterval indexRange; private List lines = new ArrayList<>(); @@ -44,7 +45,10 @@ public class HashedLineToString implements LongFunction { public HashedLineToString(String filename) { this.filename = filename; this.lines = NBIO.readLines(filename); - this.indexRange = new HashRange(0, lines.size() - 2); + if (lines.size()<1) { + throw new BasicError("Read " + lines.size() + " lines from " + filename + ", empty files are not supported"); + } + this.indexRange = new HashInterval(0, lines.size()); } public String toString() { diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashInterval.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashInterval.java new file mode 100644 index 000000000..047668410 --- /dev/null +++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashInterval.java @@ -0,0 +1,45 @@ +package io.nosqlbench.virtdata.library.basics.shared.unary_int; + +import io.nosqlbench.nb.api.errors.BasicError; +import io.nosqlbench.virtdata.api.annotations.Example; +import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper; + +import java.util.function.IntUnaryOperator; + +@ThreadSafeMapper +public class HashInterval implements IntUnaryOperator { + + private final int minValue; + private final int width; + private final Hash hash = new Hash(); + + + /** + * Create a hash interval based on a minimum value of 0 and a specified width. + * @param width The maximum value, which is excluded. + */ + @Example({"HashInterval(4)","return values which could include 0, 1, 2, 3, but not 4"}) + public HashInterval(int width) { + this.minValue=0; + this.width=width; + } + + /** + * Create a hash interval + * @param minIncl The minimum value, which is included + * @param maxExcl The maximum value, which is excluded + */ + @Example({"HashInterval(2,5)","return values which could include 2, 3, 4, but not 5"}) + public HashInterval(int minIncl, int maxExcl) { + if (maxExcl<=minIncl) { + throw new BasicError("HashInterval must have min and max value in that order, where the min is less than the max."); + } + this.minValue = minIncl; + this.width = (maxExcl - minIncl); + } + + @Override + public int applyAsInt(int operand) { + return minValue + (hash.applyAsInt(operand) & width); + } +} diff --git a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashRange.java b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashRange.java index 78daf37a8..f21b732b6 100644 --- a/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashRange.java +++ b/virtdata-lib-basics/src/main/java/io/nosqlbench/virtdata/library/basics/shared/unary_int/HashRange.java @@ -1,5 +1,6 @@ package io.nosqlbench.virtdata.library.basics.shared.unary_int; +import io.nosqlbench.nb.api.errors.BasicError; import io.nosqlbench.virtdata.api.annotations.ThreadSafeMapper; import java.util.function.IntUnaryOperator; @@ -18,7 +19,7 @@ public class HashRange implements IntUnaryOperator { public HashRange(int minValue, int maxValue) { if (maxValue "_" + l); + io.nosqlbench.virtdata.library.basics.shared.from_long.to_collection.List lf = new io.nosqlbench.virtdata.library.basics.shared.from_long.to_collection.List(new HashRange(2, 3), (l) -> "_" + l); java.util.List l1 = lf.apply(2L); - assertThat(l1).containsExactly("_2","_3"); + assertThat(l1).containsExactly("_2","_3","_4"); } @Test diff --git a/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_long/HashIntervalTest.java b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_long/HashIntervalTest.java new file mode 100644 index 000000000..07be70e5d --- /dev/null +++ b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/shared/from_long/to_long/HashIntervalTest.java @@ -0,0 +1,22 @@ +package io.nosqlbench.virtdata.library.basics.shared.from_long.to_long; + +import io.nosqlbench.nb.api.errors.BasicError; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class HashIntervalTest { + + @Test + public void testBasicRange() { + HashInterval hi = new HashInterval(3L, 5L); + long r1 = hi.applyAsLong(43L); + assertThat(r1).isEqualTo(4L); + + } + + @Test(expected = BasicError.class) + public void testRangeError() { + HashInterval hi = new HashInterval(3L, 3L); + } +} \ No newline at end of file diff --git a/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_collections/HashedRangeToLongListTest.java b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_collections/HashedRangeToLongListTest.java index 87bf7c45d..0bae4b120 100644 --- a/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_collections/HashedRangeToLongListTest.java +++ b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_collections/HashedRangeToLongListTest.java @@ -13,6 +13,7 @@ public class HashedRangeToLongListTest { public void longListRangeTest() { HashedRangeToLongList gener = new HashedRangeToLongList(3, 6, 9, 12); for (int i = 0; i < 100; i++) { + System.out.println("long list range test size: " + i); List list= gener.apply(i); assertThat(list.size()).isBetween(9,12); for (Long longVal : list) { diff --git a/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_long/RangeTests.java b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_long/RangeTests.java index e70514a70..e41e0a538 100644 --- a/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_long/RangeTests.java +++ b/virtdata-lib-basics/src/test/java/io/nosqlbench/virtdata/library/basics/tests/long_long/RangeTests.java @@ -13,11 +13,11 @@ public class RangeTests { @Test public void testHashRange() { HashRange hr = new HashRange(10,13); - assertThat(hr.applyAsLong(0)).isEqualTo(11); - assertThat(hr.applyAsLong(10)).isEqualTo(12); - assertThat(hr.applyAsLong(100)).isEqualTo(12); - assertThat(hr.applyAsLong(1000)).isEqualTo(11); - assertThat(hr.applyAsLong(10000)).isEqualTo(10); + assertThat(hr.applyAsLong(0)).isEqualTo(13); + assertThat(hr.applyAsLong(10)).isEqualTo(11); + assertThat(hr.applyAsLong(100)).isEqualTo(13); + assertThat(hr.applyAsLong(1000)).isEqualTo(13); + assertThat(hr.applyAsLong(10000)).isEqualTo(11); } @Test @@ -32,10 +32,10 @@ public class RangeTests { @Test public void testAddHashRange() { AddHashRange ahr = new AddHashRange(14,17); - assertThat(ahr.applyAsLong(1)).isEqualTo(16); - assertThat(ahr.applyAsLong(2)).isEqualTo(16); - assertThat(ahr.applyAsLong(3)).isEqualTo(18); - assertThat(ahr.applyAsLong(4)).isEqualTo(20); + assertThat(ahr.applyAsLong(1)).isEqualTo(17); + assertThat(ahr.applyAsLong(2)).isEqualTo(17); + assertThat(ahr.applyAsLong(3)).isEqualTo(20); + assertThat(ahr.applyAsLong(4)).isEqualTo(19); assertThat(ahr.applyAsLong(5)).isEqualTo(19); }