feat(bigquery): implement custom minute time grains (#12581)
* feat(bigquery): implement custom minute time grains * address review comment
This commit is contained in:
parent
e7a5d0d01a
commit
7e99d768af
|
|
@ -245,6 +245,10 @@ class BaseEngineSpec: # pylint: disable=too-many-public-methods
|
|||
date_trunc_function = cls._date_trunc_functions.get(type_)
|
||||
if date_trunc_function:
|
||||
time_expr = time_expr.replace("{func}", date_trunc_function)
|
||||
if type_ and "{type}" in time_expr:
|
||||
date_trunc_function = cls._date_trunc_functions.get(type_)
|
||||
if date_trunc_function:
|
||||
time_expr = time_expr.replace("{type}", type_)
|
||||
else:
|
||||
time_expr = "{col}"
|
||||
|
||||
|
|
|
|||
|
|
@ -66,6 +66,18 @@ class BigQueryEngineSpec(BaseEngineSpec):
|
|||
None: "{col}",
|
||||
"PT1S": "{func}({col}, SECOND)",
|
||||
"PT1M": "{func}({col}, MINUTE)",
|
||||
"PT5M": "CAST(TIMESTAMP_SECONDS("
|
||||
"5*60 * DIV(UNIX_SECONDS(CAST({col} AS TIMESTAMP)), 5*60)"
|
||||
") AS {type})",
|
||||
"PT10M": "CAST(TIMESTAMP_SECONDS("
|
||||
"10*60 * DIV(UNIX_SECONDS(CAST({col} AS TIMESTAMP)), 10*60)"
|
||||
") AS {type})",
|
||||
"PT15M": "CAST(TIMESTAMP_SECONDS("
|
||||
"15*60 * DIV(UNIX_SECONDS(CAST({col} AS TIMESTAMP)), 15*60)"
|
||||
") AS {type})",
|
||||
"PT0.5H": "CAST(TIMESTAMP_SECONDS("
|
||||
"30*60 * DIV(UNIX_SECONDS(CAST({col} AS TIMESTAMP)), 30*60)"
|
||||
") AS {type})",
|
||||
"PT1H": "{func}({col}, HOUR)",
|
||||
"P1D": "{func}({col}, DAY)",
|
||||
"P1W": "{func}({col}, WEEK)",
|
||||
|
|
|
|||
|
|
@ -74,6 +74,28 @@ class TestBigQueryDbEngineSpec(TestDbEngineSpec):
|
|||
)
|
||||
self.assertEqual(str(actual), expected)
|
||||
|
||||
def test_custom_minute_timegrain_expressions(self):
|
||||
"""
|
||||
DB Eng Specs (bigquery): Test time grain expressions
|
||||
"""
|
||||
col = column("temporal")
|
||||
test_cases = {
|
||||
"DATE": "CAST(TIMESTAMP_SECONDS("
|
||||
"5*60 * DIV(UNIX_SECONDS(CAST(temporal AS TIMESTAMP)), 5*60)"
|
||||
") AS DATE)",
|
||||
"DATETIME": "CAST(TIMESTAMP_SECONDS("
|
||||
"5*60 * DIV(UNIX_SECONDS(CAST(temporal AS TIMESTAMP)), 5*60)"
|
||||
") AS DATETIME)",
|
||||
"TIMESTAMP": "CAST(TIMESTAMP_SECONDS("
|
||||
"5*60 * DIV(UNIX_SECONDS(CAST(temporal AS TIMESTAMP)), 5*60)"
|
||||
") AS TIMESTAMP)",
|
||||
}
|
||||
for type_, expected in test_cases.items():
|
||||
actual = BigQueryEngineSpec.get_timestamp_expr(
|
||||
col=col, pdf=None, time_grain="PT5M", type_=type_
|
||||
)
|
||||
assert str(actual) == expected
|
||||
|
||||
def test_fetch_data(self):
|
||||
"""
|
||||
DB Eng Specs (bigquery): Test fetch data
|
||||
|
|
|
|||
Loading…
Reference in New Issue