nosqlbench-104 Add support for DateRange bindings

This commit is contained in:
Jonathan Shook 2020-03-27 12:15:02 -05:00
parent 0002d9f853
commit a484eb449e
6 changed files with 296 additions and 0 deletions

View File

@ -0,0 +1,46 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import com.datastax.driver.dse.search.DateRange;
import io.nosqlbench.virtdata.annotations.Example;
import io.nosqlbench.virtdata.annotations.ThreadSafeMapper;
import java.util.Date;
import java.util.function.Function;
import java.util.function.LongFunction;
/**
* Takes an input as a reference point in epoch time, and converts it to a DateRange,
* with the bounds set to the lower and upper timestamps which align to the
* specified precision. You can use any of these precisions to control the bounds
* around the provided timestamp:
* <ul>
* <LI>millisecond</LI>
* <LI>second</LI>
* <LI>minute</LI>
* <LI>hour</LI>
* <li>day</li>
* <li>month</li>
* <li>year</li>
* </ul>
*/
@ThreadSafeMapper
public class DateRangeDuring implements LongFunction<DateRange> {
private final com.datastax.driver.dse.search.DateRange.DateRangeBound.Precision precision;
@Example({"DateRangeDuring('millisecond')}","Convert the incoming millisecond to an equivalent DateRange"})
@Example({"DateRangeDuring('minute')}","Convert the incoming millisecond to a DateRange for the minute in which the " +
"millisecond falls"})
public DateRangeDuring(String precision) {
this.precision = com.datastax.driver.dse.search.DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
}
@Override
public DateRange apply(long value) {
Date date = new Date(value);
com.datastax.driver.dse.search.DateRange.DateRangeBound lower = com.datastax.driver.dse.search.DateRange.DateRangeBound.lowerBound(date, precision);
com.datastax.driver.dse.search.DateRange.DateRangeBound upper = com.datastax.driver.dse.search.DateRange.DateRangeBound.upperBound(date, precision);
com.datastax.driver.dse.search.DateRange dateRange = new com.datastax.driver.dse.search.DateRange(lower, upper);
return dateRange;
}
}

View File

@ -0,0 +1,60 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import com.datastax.driver.dse.search.DateRange;
import io.nosqlbench.virtdata.annotations.Example;
import io.nosqlbench.virtdata.annotations.ThreadSafeMapper;
import java.util.Date;
import java.util.function.Function;
import java.util.function.LongFunction;
import java.util.function.LongUnaryOperator;
/**
* Uses the precision and the two functions provided to create a DateRange.
* You can use any of these precisions to control the bounds
* around the provided timestamp:
* <ul>
* <LI>millisecond</LI>
* <LI>second</LI>
* <LI>minute</LI>
* <LI>hour</LI>
* <li>day</li>
* <li>month</li>
* <li>year</li>
* </ul>
*/
@ThreadSafeMapper
public class DateRangeFunc implements LongFunction<DateRange> {
private final DateRange.DateRangeBound.Precision precision;
private final LongUnaryOperator lower;
private final LongUnaryOperator upper;
public DateRangeFunc(String precision, LongUnaryOperator lower, LongUnaryOperator upper) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
this.lower = lower;
this.upper = upper;
}
public DateRangeFunc(String precision, LongFunction<Long> lower, LongFunction<Long> upper) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
this.lower = lower::apply;
this.upper = upper::apply;
}
public DateRangeFunc(String precision, Function<Long,Long> lower, Function<Long,Long> upper) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
this.lower = lower::apply;
this.upper = upper::apply;
}
@Override
public DateRange apply(long value) {
Date lowerDate = new Date(lower.applyAsLong(value));
DateRange.DateRangeBound lower = DateRange.DateRangeBound.lowerBound(lowerDate,precision);
Date upperDate = new Date(upper.applyAsLong(value));
DateRange.DateRangeBound upper = DateRange.DateRangeBound.upperBound(lowerDate,precision);
DateRange dateRange = new DateRange(lower, upper);
return dateRange;
}
}

View File

@ -0,0 +1,48 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import com.datastax.driver.dse.search.DateRange;
import io.nosqlbench.virtdata.annotations.Example;
import io.nosqlbench.virtdata.annotations.ThreadSafeMapper;
import java.util.Date;
import java.util.function.Function;
import java.util.function.LongFunction;
/**
* Takes an input as a reference point in epoch time, and converts it to a DateRange,
* with the lower bounds set to the lower bound of the precision and millisecond
* provided, and with no upper bound.
* You can use any of these precisions to control the bounds
* around the provided timestamp:
* <ul>
* <LI>millisecond</LI>
* <LI>second</LI>
* <LI>minute</LI>
* <LI>hour</LI>
* <li>day</li>
* <li>month</li>
* <li>year</li>
* </ul>
*/
@ThreadSafeMapper
public class DateRangeOnOrAfter implements LongFunction<DateRange> {
private final DateRange.DateRangeBound.Precision precision;
@Example({"DateRangeOnOrAfter('millisecond')}","Convert the incoming millisecond to an match any time on or after"})
@Example({"DateRangeOnOrAfter('minute')}","Convert the incoming millisecond to mach any time on or after the" +
" minute in which the " +
"millisecond falls"})
public DateRangeOnOrAfter(String precision) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
}
@Override
public DateRange apply(long value) {
Date date = new Date(value);
DateRange.DateRangeBound lower = DateRange.DateRangeBound.lowerBound(date, precision);
DateRange.DateRangeBound upper = DateRange.DateRangeBound.UNBOUNDED;
DateRange dateRange = new DateRange(lower, upper);
return dateRange;
}
}

View File

@ -0,0 +1,47 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import com.datastax.driver.dse.search.DateRange;
import io.nosqlbench.virtdata.annotations.Example;
import io.nosqlbench.virtdata.annotations.ThreadSafeMapper;
import java.util.Date;
import java.util.function.Function;
import java.util.function.LongFunction;
/**
* Takes an input as a reference point in epoch time, and converts it to a DateRange,
* with the upper bound set to the upper bound of the precision and millisecond
* provided, and with no lower bound.
* You can use any of these precisions to control the bounds
* around the provided timestamp:
* <ul>
* <LI>millisecond</LI>
* <LI>second</LI>
* <LI>minute</LI>
* <LI>hour</LI>
* <li>day</li>
* <li>month</li>
* <li>year</li>
* </ul>
*/
@ThreadSafeMapper
public class DateRangeOnOrBefore implements LongFunction<DateRange> {
private final DateRange.DateRangeBound.Precision precision;
@Example({"DateRangeOnOrBefore('millisecond')}","Convert the incoming millisecond to match anything on or before it."})
@Example({"DateRangeOnOrBefore('minute')}","Convert the incoming millisecond to match anything on or before the minute in" +
" which the millisecond falls"})
public DateRangeOnOrBefore(String precision) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
}
@Override
public DateRange apply(long value) {
Date date = new Date(value);
DateRange.DateRangeBound lower = DateRange.DateRangeBound.UNBOUNDED;
DateRange.DateRangeBound upper = DateRange.DateRangeBound.upperBound(date,precision);
DateRange dateRange = new DateRange(lower, upper);
return dateRange;
}
}

View File

@ -0,0 +1,36 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import com.datastax.driver.dse.search.DateRange;
import io.nosqlbench.virtdata.annotations.Example;
import io.nosqlbench.virtdata.annotations.ThreadSafeMapper;
import java.text.ParseException;
import java.util.Date;
import java.util.function.Function;
/**
* Parses the DateRange format according to <A HREF="https://lucene.apache.org/solr/guide/6_6/working-with-dates
* .html#WorkingwithDates-DateRangeFormatting">Date Range Formatting</A>.
* When possible it is more efficient to use the other DateRange methods since they do not require parsing.
*/
@ThreadSafeMapper
public class DateRangeParser implements Function<String, DateRange> {
private final DateRange.DateRangeBound.Precision precision;
@Example({"DateRangeParser()}","Convert inputs like '[1970-01-01T00:00:00 TO 1970-01-01T00:00:00]' into " +
"DateRanges" +
" "})
public DateRangeParser(String precision) {
this.precision = DateRange.DateRangeBound.Precision.valueOf(precision.toUpperCase());
}
@Override
public DateRange apply(String value) {
try {
return DateRange.parse(value);
} catch (ParseException e) {
throw new RuntimeException("unable to parse date rage input '" + value + "': error:" + e.getMessage());
}
}
}

View File

@ -0,0 +1,59 @@
package io.nosqlbench.activitytype.cql.datamappers.functions.to_daterange;
import org.junit.Test;
import java.util.function.Function;
import java.util.function.LongFunction;
import java.util.function.LongUnaryOperator;
import static org.assertj.core.api.Assertions.assertThat;
public class DateRangeFuncTest {
@Test
public void testDateRangeFuncs() {
LongFunction<Long> lf1 = value -> value;
DateRangeFunc function = new DateRangeFunc("second", lf1, lf1);
assertThat(function.apply(42L).toString())
.isEqualTo("[1970-01-01T00:00:00 TO 1970-01-01T00:00:00]");
assertThat(function.apply(42000L).toString())
.isEqualTo("[1970-01-01T00:00:42 TO 1970-01-01T00:00:42]");
assertThat(function.apply(42000000L).toString())
.isEqualTo("[1970-01-01T11:40:00 TO 1970-01-01T11:40:00]");
assertThat(function.apply(42000000000L).toString())
.isEqualTo("[1971-05-02T02:40:00 TO 1971-05-02T02:40:00]");
assertThat(function.apply(42000000000000L).toString())
.isEqualTo("[3300-12-05T02:40:00 TO 3300-12-05T02:40:00]");
LongUnaryOperator lf2 = value -> value;
function = new DateRangeFunc("second", lf2, lf2);
assertThat(function.apply(42L).toString())
.isEqualTo("[1970-01-01T00:00:00 TO 1970-01-01T00:00:00]");
assertThat(function.apply(42000L).toString())
.isEqualTo("[1970-01-01T00:00:42 TO 1970-01-01T00:00:42]");
assertThat(function.apply(42000000L).toString())
.isEqualTo("[1970-01-01T11:40:00 TO 1970-01-01T11:40:00]");
assertThat(function.apply(42000000000L).toString())
.isEqualTo("[1971-05-02T02:40:00 TO 1971-05-02T02:40:00]");
assertThat(function.apply(42000000000000L).toString())
.isEqualTo("[3300-12-05T02:40:00 TO 3300-12-05T02:40:00]");
Function<Long,Long> lf3 = value -> value;
function = new DateRangeFunc("second", lf3, lf3);
assertThat(function.apply(42L).toString())
.isEqualTo("[1970-01-01T00:00:00 TO 1970-01-01T00:00:00]");
assertThat(function.apply(42000L).toString())
.isEqualTo("[1970-01-01T00:00:42 TO 1970-01-01T00:00:42]");
assertThat(function.apply(42000000L).toString())
.isEqualTo("[1970-01-01T11:40:00 TO 1970-01-01T11:40:00]");
assertThat(function.apply(42000000000L).toString())
.isEqualTo("[1971-05-02T02:40:00 TO 1971-05-02T02:40:00]");
assertThat(function.apply(42000000000000L).toString())
.isEqualTo("[3300-12-05T02:40:00 TO 3300-12-05T02:40:00]");
}
}