mirror of https://github.com/apache/druid.git
fix timestamp ceil lower bound bug (#7823)
This commit is contained in:
parent
f2b00023f8
commit
d482da6e9b
|
@ -26,6 +26,7 @@ import org.apache.druid.java.util.common.granularity.PeriodGranularity;
|
|||
import org.apache.druid.math.expr.Expr;
|
||||
import org.apache.druid.math.expr.ExprEval;
|
||||
import org.apache.druid.math.expr.ExprMacroTable;
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.List;
|
||||
|
@ -72,7 +73,12 @@ public class TimestampCeilExprMacro implements ExprMacroTable.ExprMacro
|
|||
// Return null if the argument if null.
|
||||
return ExprEval.of(null);
|
||||
}
|
||||
return ExprEval.of(granularity.bucketEnd(DateTimes.utc(arg.eval(bindings).asLong())).getMillis());
|
||||
DateTime argTime = DateTimes.utc(arg.eval(bindings).asLong());
|
||||
DateTime bucketStartTime = granularity.bucketStart(argTime);
|
||||
if (argTime.equals(bucketStartTime)) {
|
||||
return ExprEval.of(bucketStartTime.getMillis());
|
||||
}
|
||||
return ExprEval.of(granularity.increment(bucketStartTime).getMillis());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -107,7 +113,12 @@ public class TimestampCeilExprMacro implements ExprMacroTable.ExprMacro
|
|||
public ExprEval eval(final ObjectBinding bindings)
|
||||
{
|
||||
final PeriodGranularity granularity = getGranularity(args, bindings);
|
||||
return ExprEval.of(granularity.bucketEnd(DateTimes.utc(args.get(0).eval(bindings).asLong())).getMillis());
|
||||
DateTime argTime = DateTimes.utc(args.get(0).eval(bindings).asLong());
|
||||
DateTime bucketStartTime = granularity.bucketStart(argTime);
|
||||
if (argTime.equals(bucketStartTime)) {
|
||||
return ExprEval.of(bucketStartTime.getMillis());
|
||||
}
|
||||
return ExprEval.of(granularity.increment(bucketStartTime).getMillis());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -34,6 +34,7 @@ public class ExprMacroTest
|
|||
private static final Expr.ObjectBinding BINDINGS = Parser.withMap(
|
||||
ImmutableMap.<String, Object>builder()
|
||||
.put("t", DateTimes.of("2000-02-03T04:05:06").getMillis())
|
||||
.put("t1", DateTimes.of("2000-02-03T00:00:00").getMillis())
|
||||
.put("tstr", "2000-02-03T04:05:06")
|
||||
.put("tstr_sql", "2000-02-03 04:05:06")
|
||||
.put("x", "foo")
|
||||
|
@ -88,6 +89,7 @@ public class ExprMacroTest
|
|||
assertExpr("timestamp_ceil(t, 'P1D',null,'America/Los_Angeles')", DateTimes.of("2000-02-03T08").getMillis());
|
||||
assertExpr("timestamp_ceil(t, 'P1D',null,CityOfAngels)", DateTimes.of("2000-02-03T08").getMillis());
|
||||
assertExpr("timestamp_ceil(t, 'P1D','1970-01-01T01','Etc/UTC')", DateTimes.of("2000-02-04T01").getMillis());
|
||||
assertExpr("timestamp_ceil(t1, 'P1D')", DateTimes.of("2000-02-03").getMillis());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -7906,4 +7906,43 @@ public class CalciteQueryTest extends BaseCalciteQueryTest
|
|||
)
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTimestampCeil() throws Exception
|
||||
{
|
||||
testQuery(
|
||||
"SELECT CEIL(TIMESTAMP '2000-01-01 00:00:00' TO DAY), \n"
|
||||
+ "CEIL(TIMESTAMP '2000-01-01 01:00:00' TO DAY) \n"
|
||||
+ "FROM druid.foo\n"
|
||||
+ "LIMIT 1",
|
||||
ImmutableList.of(
|
||||
newScanQueryBuilder()
|
||||
.dataSource(CalciteTests.DATASOURCE1)
|
||||
.intervals(querySegmentSpec(Filtration.eternity()))
|
||||
.virtualColumns(
|
||||
expressionVirtualColumn("v0", "946684800000", ValueType.LONG),
|
||||
expressionVirtualColumn("v1", "946771200000", ValueType.LONG)
|
||||
)
|
||||
.columns("v0", "v1")
|
||||
.limit(1)
|
||||
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
|
||||
.context(QUERY_CONTEXT_DEFAULT)
|
||||
.build()
|
||||
|
||||
),
|
||||
ImmutableList.of(
|
||||
new Object[]{
|
||||
Calcites.jodaToCalciteTimestamp(
|
||||
DateTimes.of("2000-01-01"),
|
||||
DateTimeZone.UTC
|
||||
),
|
||||
Calcites.jodaToCalciteTimestamp(
|
||||
DateTimes.of("2000-01-02"),
|
||||
DateTimeZone.UTC
|
||||
)
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue