Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@

import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import org.apache.pinot.broker.broker.AccessControlFactory;
import org.apache.pinot.broker.broker.AllowAllAccessControlFactory;
import org.apache.pinot.common.failuredetector.FailureDetector;
Expand Down Expand Up @@ -48,7 +47,6 @@
public class LiteralOnlyBrokerRequestTest {
private static final AccessControlFactory ACCESS_CONTROL_FACTORY = new AllowAllAccessControlFactory();
private static final Random RANDOM = new Random(System.currentTimeMillis());
private static final long ONE_HOUR_IN_MS = TimeUnit.HOURS.toMillis(1);

@BeforeClass
public void setUp() {
Expand Down Expand Up @@ -82,18 +80,20 @@ public void testNumberLiteralBrokerRequestFromSQL() {

@Test
public void testLiteralOnlyTransformBrokerRequestFromSQL() {
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT now()")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT ago('PT1H')")));
assertTrue(isLiteralOnlyQuery(
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT now()")));
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT ago('PT1H')")));
assertFalse(isLiteralOnlyQuery(
CalciteSqlParser.compileToPinotQuery("SELECT now(), fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z')")));
assertTrue(isLiteralOnlyQuery(
assertFalse(isLiteralOnlyQuery(
CalciteSqlParser.compileToPinotQuery("SELECT ago('PT1H'), fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z')")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT now() FROM myTable")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT ago('PT1H') FROM myTable")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT now() FROM myTable")));
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT ago('PT1H') FROM myTable")));
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
"SELECT now(), fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') FROM myTable")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
"SELECT ago('PT1H'), fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') FROM myTable")));
assertTrue(isLiteralOnlyQuery(
CalciteSqlParser.compileToPinotQuery("SELECT fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z')")));
assertFalse(
isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery("SELECT count(*) from foo where bar > ago('PT1H')")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
Expand Down Expand Up @@ -152,9 +152,9 @@ public void testLiteralOnlyTransformBrokerRequestFromSQL() {

@Test
public void testLiteralOnlyWithAsBrokerRequestFromSQL() {
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
"SELECT now() AS currentTs, fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') AS firstDayOf2020")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
assertFalse(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
"SELECT ago('PT1H') AS currentTs, fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') AS firstDayOf2020")));
assertTrue(isLiteralOnlyQuery(CalciteSqlParser.compileToPinotQuery(
"SELECT encodeUrl('key1=value 1&key2=value@!$2&key3=value%3') AS encoded, "
Expand Down Expand Up @@ -201,34 +201,13 @@ public void testBrokerRequestHandlerWithAsFunction()
new BrokerRequestIdGenerator(), null, ACCESS_CONTROL_FACTORY, null, null, null, null,
mock(ServerRoutingStatsManager.class), mock(FailureDetector.class),
ThreadAccountantUtils.getNoOpAccountant(), null, null);
long currentTsMin = System.currentTimeMillis();
BrokerResponse brokerResponse = requestHandler.handleRequest(
"SELECT now() AS currentTs, fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') AS firstDayOf2020");
long currentTsMax = System.currentTimeMillis();
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(0), "currentTs");
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnDataType(0), DataSchema.ColumnDataType.LONG);
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(1), "firstDayOf2020");
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnDataType(1), DataSchema.ColumnDataType.LONG);
assertEquals(brokerResponse.getResultTable().getRows().size(), 1);
assertEquals(brokerResponse.getResultTable().getRows().get(0).length, 2);
assertTrue(Long.parseLong(brokerResponse.getResultTable().getRows().get(0)[0].toString()) > currentTsMin);
assertTrue(Long.parseLong(brokerResponse.getResultTable().getRows().get(0)[0].toString()) < currentTsMax);
assertEquals(brokerResponse.getResultTable().getRows().get(0)[1], 1577836800000L);
assertEquals(brokerResponse.getTotalDocs(), 0);

long oneHourAgoTsMin = System.currentTimeMillis() - ONE_HOUR_IN_MS;
brokerResponse = requestHandler.handleRequest(
"SELECT ago('PT1H') AS oneHourAgoTs, fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') AS firstDayOf2020");
long oneHourAgoTsMax = System.currentTimeMillis() - ONE_HOUR_IN_MS;
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(0), "oneHourAgoTs");
"SELECT fromDateTime('2020-01-01 UTC', 'yyyy-MM-dd z') AS firstDayOf2020");
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(0), "firstDayOf2020");
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnDataType(0), DataSchema.ColumnDataType.LONG);
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnName(1), "firstDayOf2020");
assertEquals(brokerResponse.getResultTable().getDataSchema().getColumnDataType(1), DataSchema.ColumnDataType.LONG);
assertEquals(brokerResponse.getResultTable().getRows().size(), 1);
assertEquals(brokerResponse.getResultTable().getRows().get(0).length, 2);
assertTrue(Long.parseLong(brokerResponse.getResultTable().getRows().get(0)[0].toString()) >= oneHourAgoTsMin);
assertTrue(Long.parseLong(brokerResponse.getResultTable().getRows().get(0)[0].toString()) <= oneHourAgoTsMax);
assertEquals(brokerResponse.getResultTable().getRows().get(0)[1], 1577836800000L);
assertEquals(brokerResponse.getResultTable().getRows().get(0).length, 1);
assertEquals(brokerResponse.getResultTable().getRows().get(0)[0], 1577836800000L);
assertEquals(brokerResponse.getTotalDocs(), 0);

brokerResponse = requestHandler.handleRequest(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -569,11 +569,10 @@ public static long[] roundMV(long[] timeValue, long roundToNearest) {
return results;
}

/**
* Return current time as epoch millis
* TODO: Consider changing the return type to Timestamp
*/
@ScalarFunction
/// Returns current time as epoch millis.
///
/// TODO: Consider changing the return type to Timestamp.
@ScalarFunction(isDeterministic = false)
public static long now() {
return System.currentTimeMillis();
}
Expand All @@ -591,25 +590,25 @@ public static long sleep(long millis) {
return millis;
}

/**
* Return time as epoch millis before the given period (in ISO-8601 duration format).
* Examples:
* "PT20.345S" -- parses as "20.345 seconds"
* "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
* "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
* "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
* "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
* "P-6H3M" -- parses as "-6 hours and +3 minutes"
* "-P6H3M" -- parses as "-6 hours and -3 minutes"
* "-P-6H+3M" -- parses as "+6 hours and -3 minutes"
*/
@ScalarFunction
/// Returns time as epoch millis before the given period (in ISO-8601 duration format).
///
/// Examples:
///
/// - `"PT20.345S"` parses as "20.345 seconds".
/// - `"PT15M"` parses as "15 minutes" (where a minute is 60 seconds).
/// - `"PT10H"` parses as "10 hours" (where an hour is 3600 seconds).
/// - `"P2D"` parses as "2 days" (where a day is 24 hours or 86400 seconds).
/// - `"P2DT3H4M"` parses as "2 days, 3 hours and 4 minutes".
/// - `"P-6H3M"` parses as "-6 hours and +3 minutes".
/// - `"-P6H3M"` parses as "-6 hours and -3 minutes".
/// - `"-P-6H+3M"` parses as "+6 hours and -3 minutes".
@ScalarFunction(isDeterministic = false)
public static long ago(String periodString) {
Duration period = Duration.parse(periodString);
return System.currentTimeMillis() - period.toMillis();
}

@ScalarFunction
@ScalarFunction(isDeterministic = false)
public static long[] agoMV(String[] periodString) {
long[] results = new long[periodString.length];
for (int i = 0; i < periodString.length; i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;


Expand All @@ -56,6 +57,13 @@ public void testGetArgumentType() {
assertEquals(FunctionUtils.getArgumentType((short) 1), PinotDataType.SHORT);
}

@Test
public void testRequestTimeFunctionsAreNonDeterministic() {
assertFalse(FunctionRegistry.lookupFunctionInfo("now", 0).isDeterministic());
assertFalse(FunctionRegistry.lookupFunctionInfo("ago", 1).isDeterministic());
assertFalse(FunctionRegistry.lookupFunctionInfo("agomv", 1).isDeterministic());
}

@Test
public void testGetArgumentTypeForVendorTimestampSubclass() {
// Vendor JDBC drivers commonly return Timestamp subclasses (e.g. BigQuery Simba's TimestampTz).
Expand Down
Loading
Loading