feat: run extra query on QueryObject and add compare operator for post_processing (#15279)

* rebase master and resolve conflicts

* pylint to makefile

* fix crash when pivot operator

* fix comments

* add precision argument

* query test

* wip

* fix ut

* rename

* set time_offsets to cache key

wip

* refactor get_df_payload

wip

* extra query cache

* cache ut

* normalize df

* fix timeoffset

* fix ut

* make cache key logging sense

* resolve conflicts

* backend follow up iteration 1

wip

* rolling window type

* rebase master

* py lint and minor follow ups

* pylintrc
This commit is contained in:
Yongjie Zhao
2021-07-28 15:34:39 +01:00
committed by GitHub
parent bdfc2dc9d5
commit 32d2aa0c40
17 changed files with 744 additions and 149 deletions

View File

@@ -14,16 +14,19 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from datetime import datetime, timedelta
from datetime import date, datetime, timedelta
from unittest.mock import patch
from dateutil.relativedelta import relativedelta
from superset.charts.commands.exceptions import (
TimeRangeAmbiguousError,
TimeRangeParseFailError,
TimeRangeUnclearError,
)
from superset.utils.date_parser import (
DateRangeMigration,
datetime_eval,
get_past_or_future,
get_since_until,
parse_human_datetime,
parse_human_timedelta,
@@ -288,16 +291,48 @@ class TestDateParser(SupersetTestCase):
self.assertEqual(parse_past_timedelta("52 weeks"), timedelta(364))
self.assertEqual(parse_past_timedelta("1 month"), timedelta(31))
def test_get_past_or_future(self):
# 2020 is a leap year
dttm = datetime(2020, 2, 29)
self.assertEqual(get_past_or_future("1 year", dttm), datetime(2021, 2, 28))
self.assertEqual(get_past_or_future("-1 year", dttm), datetime(2019, 2, 28))
self.assertEqual(get_past_or_future("1 month", dttm), datetime(2020, 3, 29))
self.assertEqual(get_past_or_future("3 month", dttm), datetime(2020, 5, 29))
def test_parse_human_datetime(self):
with self.assertRaises(TimeRangeUnclearError):
with self.assertRaises(TimeRangeAmbiguousError):
parse_human_datetime(" 2 days ")
with self.assertRaises(TimeRangeUnclearError):
with self.assertRaises(TimeRangeAmbiguousError):
parse_human_datetime("2 day")
with self.assertRaises(TimeRangeParseFailError):
parse_human_datetime("xxxxxxx")
self.assertEqual(parse_human_datetime("2015-04-03"), datetime(2015, 4, 3, 0, 0))
self.assertEqual(
parse_human_datetime("2/3/1969"), datetime(1969, 2, 3, 0, 0),
)
self.assertLessEqual(parse_human_datetime("now"), datetime.now())
self.assertLess(parse_human_datetime("yesterday"), datetime.now())
self.assertEqual(
date.today() - timedelta(1), parse_human_datetime("yesterday").date()
)
self.assertEqual(
parse_human_datetime("one year ago").date(),
(datetime.now() - relativedelta(years=1)).date(),
)
self.assertEqual(
parse_human_datetime("2 years after").date(),
(datetime.now() + relativedelta(years=2)).date(),
)
def test_DateRangeMigration(self):
params = '{"time_range": " 8 days : 2020-03-10T00:00:00"}'
self.assertRegex(params, DateRangeMigration.x_dateunit_in_since)