예제 #1
0
    def test_build_query_with_multiple_dimensions_and_visualizations(self):
        queries = (
            mock_dataset.query()
            .widget(f.ReactTable(mock_dataset.fields.votes, mock_dataset.fields.wins))
            .widget(
                f.HighCharts()
                .axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
                .axis(f.HighCharts.LineSeries(mock_dataset.fields.wins))
            )
            .dimension(f.day(mock_dataset.fields.timestamp))
            .dimension(mock_dataset.fields.political_party)
            .sql
        )

        self.assertEqual(len(queries), 1)

        self.assertEqual(
            "SELECT "
            'TRUNC("timestamp",\'DD\') "$timestamp",'
            '"political_party" "$political_party",'
            'SUM("votes") "$votes",'
            'SUM("is_winner") "$wins" '
            'FROM "politics"."politician" '
            'GROUP BY "$timestamp","$political_party" '
            'ORDER BY "$timestamp","$political_party"',
            str(queries[0]),
        )
예제 #2
0
    def test_dod(self):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(timestamp_daily)
            .reference(f.DayOverDay(mock_dataset.fields.timestamp))
            .sql
        )

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[0]),
            )

        with self.subTest(
            "reference query is same as base query with reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('day',1,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[1]),
            )
예제 #3
0
    def test_dimension_with_single_reference_wow(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp) \
            .reference(f.WeekOverWeek(slicer.dimensions.timestamp)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'week\',1,"timestamp"),\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes_wow" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #4
0
    def test_reference_with_dimension_using_display_definition_includes_it_in_all_queries(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp) \
            .dimension(slicer.dimensions.candidate) \
            .reference(f.YearOverYear(slicer.dimensions.timestamp)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'DD\') "$d$timestamp",'
                             '"candidate_id" "$d$candidate",'
                             '"candidate_name" "$d$candidate_display",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp","$d$candidate","$d$candidate_display" '
                             'ORDER BY "$d$timestamp","$d$candidate_display"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'year\',1,"timestamp"),\'DD\') "$d$timestamp",'
                             '"candidate_id" "$d$candidate",'
                             '"candidate_name" "$d$candidate_display",'
                             'SUM("votes") "$m$votes_yoy" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp","$d$candidate","$d$candidate_display" '
                             'ORDER BY "$d$timestamp","$d$candidate_display"', str(queries[1]))
예제 #5
0
    def test_filters_on_other_dimensions_are_not_adapted(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp) \
            .reference(f.DayOverDay(slicer.dimensions.timestamp)) \
            .filter(slicer.dimensions.timestamp
                    .between(date(2018, 1, 1), date(2018, 1, 31))) \
            .filter(slicer.dimensions.political_party
                    .isin(['d'])) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'WHERE "timestamp" BETWEEN \'2018-01-01\' AND \'2018-01-31\' '
                             'AND "political_party" IN (\'d\') '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'day\',1,"timestamp"),\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician" '
                             'WHERE TIMESTAMPADD(\'day\',1,"timestamp") BETWEEN \'2018-01-01\' AND \'2018-01-31\' '
                             'AND "political_party" IN (\'d\') '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #6
0
    def test_adding_duplicate_reference_does_not_join_more_queries(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp) \
            .reference(f.DayOverDay(slicer.dimensions.timestamp),
                       f.DayOverDay(slicer.dimensions.timestamp)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'day\',1,"timestamp"),\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #7
0
    def test_use_same_nested_query_for_joining_references_with_same_period_and_dimension(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp) \
            .reference(f.DayOverDay(slicer.dimensions.timestamp),
                       f.DayOverDay(slicer.dimensions.timestamp, delta=True),
                       f.DayOverDay(slicer.dimensions.timestamp, delta_percent=True)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'day\',1,"timestamp"),\'DD\') "$d$timestamp",'
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #8
0
    def test_reference_on_dimension_with_weekly_interval(self):
        weekly_timestamp = slicer.dimensions.timestamp(f.weekly)
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(weekly_timestamp) \
            .reference(f.DayOverDay(weekly_timestamp)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'IW\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TRUNC(TIMESTAMPADD(\'day\',1,"timestamp"),\'IW\') "$d$timestamp",'
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician" '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #9
0
    def test_single_reference_dod_with_dimension_but_not_reference_dimension_in_query_using_filter(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.political_party) \
            .reference(f.DayOverDay(slicer.dimensions.timestamp)) \
            .filter(slicer.dimensions.timestamp.between(date(2000, 1, 1), date(2000, 3, 1))) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             '"political_party" "$d$political_party",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'WHERE "timestamp" BETWEEN \'2000-01-01\' AND \'2000-03-01\' '
                             'GROUP BY "$d$political_party" '
                             'ORDER BY "$d$political_party"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             '"political_party" "$d$political_party",'
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician" '
                             'WHERE TIMESTAMPADD(\'day\',1,"timestamp") BETWEEN \'2000-01-01\' AND \'2000-03-01\' '
                             'GROUP BY "$d$political_party" '
                             'ORDER BY "$d$political_party"', str(queries[1]))
예제 #10
0
    def test_date_dim_with_weekly_interval(self):
        weekly_timestamp = f.week(mock_dataset.fields.timestamp)
        queries = (mock_dataset.query.widget(f.HighCharts().axis(
            f.HighCharts.LineSeries(mock_dataset.fields.votes))).dimension(
                weekly_timestamp).reference(
                    f.DayOverDay(weekly_timestamp)).sql)

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'IW\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[0]),
            )

        with self.subTest(
                "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('day',1,TRUNC(\"timestamp\",'IW')),'IW') \"$timestamp\","
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[1]),
            )
예제 #11
0
    def test_yoy_with_monthly_interval(self):
        queries = (mock_dataset.query.widget(f.HighCharts().axis(
            f.HighCharts.LineSeries(mock_dataset.fields.votes))).dimension(
                timestamp_monthly).reference(
                    f.YearOverYear(mock_dataset.fields.timestamp)).sql)

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'MM\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[0]),
            )

        with self.subTest(
                "reference query is same as base query with reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('year',1,TRUNC(\"timestamp\",'MM')),'MM') \"$timestamp\","
                'SUM("votes") "$votes_yoy" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[1]),
            )
예제 #12
0
    def test_adapt_dow_for_leap_year_for_yoy_reference_with_date_filter(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .dimension(slicer.dimensions.timestamp(f.weekly)) \
            .reference(f.YearOverYear(slicer.dimensions.timestamp)) \
            .filter(slicer.dimensions.timestamp.between(date(2018, 1, 1), date(2018, 1, 31))) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'TRUNC("timestamp",\'IW\') "$d$timestamp",'
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician" '
                             'WHERE "timestamp" BETWEEN \'2018-01-01\' AND \'2018-01-31\' '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[0]))

        with self.subTest('reference query is same as base query with filter on reference dimension shifted'):
            self.assertEqual('SELECT '
                             'TIMESTAMPADD(\'year\',-1,TRUNC(TIMESTAMPADD(\'year\',1,"timestamp"),\'IW\')) '
                             '"$d$timestamp",'
                             'SUM("votes") "$m$votes_yoy" '
                             'FROM "politics"."politician" '
                             'WHERE TIMESTAMPADD(\'year\',1,"timestamp") BETWEEN \'2018-01-01\' AND \'2018-01-31\' '
                             'GROUP BY "$d$timestamp" '
                             'ORDER BY "$d$timestamp"', str(queries[1]))
예제 #13
0
    def test_build_query_for_chart_visualization_with_single_axis(self):
        queries = mock_dataset.query \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))) \
            .sql

        self.assertEqual(len(queries), 1)

        self.assertEqual(
            'SELECT '
            'SUM("votes") "$votes" '
            'FROM "politics"."politician"', str(queries[0]))
예제 #14
0
    def test_build_query_for_chart_visualization_with_single_axis(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .queries

        self.assertEqual(len(queries), 1)

        self.assertEqual(
            'SELECT '
            'SUM("votes") "$m$votes" '
            'FROM "politics"."politician"', str(queries[0]))
예제 #15
0
    def test_use_same_nested_query_for_joining_references_with_same_period_and_dimension_with_different_periods(
        self,
    ):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(timestamp_daily)
            .reference(
                f.DayOverDay(mock_dataset.fields.timestamp),
                f.DayOverDay(mock_dataset.fields.timestamp, delta=True),
                # also work with modified dimensions
                f.YearOverYear(timestamp_daily),
                f.YearOverYear(timestamp_daily, delta=True),
            )
            .sql
        )

        self.assertEqual(3, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[0]),
            )

        with self.subTest("second query for all DoD references"):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('day',1,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[1]),
            )

        with self.subTest("third query for all YoY references"):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('week',52,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_yoy" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[2]),
            )
예제 #16
0
    def test_dimension_with_multiple_references(self):
        queries = (mock_dataset.query.widget(f.HighCharts().axis(
            f.HighCharts.LineSeries(mock_dataset.fields.votes))).dimension(
                timestamp_daily).reference(
                    f.DayOverDay(mock_dataset.fields.timestamp)).reference(
                        f.YearOverYear(mock_dataset.fields.timestamp,
                                       delta_percent=True)).sql)

        self.assertEqual(3, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[0]),
            )

        with self.subTest(
                "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('day',1,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[1]),
            )

        with self.subTest(
                "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('week',52,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_yoy" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp" '
                'LIMIT 200000',
                str(queries[2]),
            )
예제 #17
0
    def test_build_query_for_chart_visualization_with_multiple_axes(self):
        queries = mock_dataset.query.widget(f.HighCharts().axis(
            f.HighCharts.LineSeries(mock_dataset.fields.votes)).axis(
                f.HighCharts.LineSeries(mock_dataset.fields.wins))).sql

        self.assertEqual(len(queries), 1)

        self.assertEqual(
            'SELECT '
            'SUM("votes") "$votes",'
            'SUM("is_winner") "$wins" '
            'FROM "politics"."politician" '
            'ORDER BY 1 '
            'LIMIT 200000',
            str(queries[0]),
        )
예제 #18
0
    def test_filters_on_other_dimensions_are_not_adapted(self):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(timestamp_daily)
            .reference(f.DayOverDay(mock_dataset.fields.timestamp))
            .filter(
                mock_dataset.fields.timestamp.between(
                    date(2018, 1, 1), date(2018, 1, 31)
                )
            )
            .filter(mock_dataset.fields.political_party.isin(["d"]))
            .sql
        )

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN '2018-01-01' AND '2018-01-31' "
                "AND \"political_party\" IN ('d') "
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[0]),
            )

        with self.subTest(
            "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('day',1,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN TIMESTAMPADD('day',-1,'2018-01-01') AND TIMESTAMPADD('day',-1,'2018-01-31') "
                "AND \"political_party\" IN ('d') "
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(queries[1]),
            )
예제 #19
0
    def test_single_reference_dod_with_no_dimension_uses_multiple_from_clauses_instead_of_joins(self):
        queries = slicer.data \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))) \
            .reference(f.DayOverDay(slicer.dimensions.timestamp)) \
            .queries

        self.assertEqual(2, len(queries))

        with self.subTest('base query is same as without reference'):
            self.assertEqual('SELECT '
                             'SUM("votes") "$m$votes" '
                             'FROM "politics"."politician"', str(queries[0]))

        with self.subTest('reference query is same as base query'):
            self.assertEqual('SELECT '
                             'SUM("votes") "$m$votes_dod" '
                             'FROM "politics"."politician"', str(queries[1]))
예제 #20
0
    def test_reference_with_no_dimensions_or_filters_creates_same_query(self):
        # TODO reduce this to a single query
        queries = (mock_dataset.query.widget(f.HighCharts().axis(
            f.HighCharts.LineSeries(mock_dataset.fields.votes))).reference(
                f.DayOverDay(mock_dataset.fields.timestamp)).sql)

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                'SELECT SUM("votes") "$votes" FROM "politics"."politician" ORDER BY 1 LIMIT 200000',
                str(queries[0]),
            )

        with self.subTest("reference query is same as base query"):
            self.assertEqual(
                'SELECT SUM("votes") "$votes_dod" FROM "politics"."politician" ORDER BY 1 LIMIT 200000',
                str(queries[1]),
            )
예제 #21
0
    def test_reference_without_selecting_ref_dimension_using_date_range_filter(self):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(mock_dataset.fields.political_party)
            .reference(f.DayOverDay(mock_dataset.fields.timestamp))
            .filter(
                mock_dataset.fields.timestamp.between(
                    date(2000, 1, 1), date(2000, 3, 1)
                )
            )
            .sql
        )

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                '"political_party" "$political_party",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN '2000-01-01' AND '2000-03-01' "
                'GROUP BY "$political_party" '
                'ORDER BY "$political_party"',
                str(queries[0]),
            )

        with self.subTest(
            "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                '"political_party" "$political_party",'
                'SUM("votes") "$votes_dod" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN TIMESTAMPADD('day',-1,'2000-01-01') "
                "AND TIMESTAMPADD('day',-1,'2000-03-01') "
                'GROUP BY "$political_party" '
                'ORDER BY "$political_party"',
                str(queries[1]),
            )
예제 #22
0
    def test_build_query_with_multiple_dimensions_and_visualizations(self):
        queries = slicer.data \
            .widget(f.DataTablesJS(slicer.metrics.votes, slicer.metrics.wins)) \
            .widget(f.HighCharts()
                    .axis(f.HighCharts.LineSeries(slicer.metrics.votes))
                    .axis(f.HighCharts.LineSeries(slicer.metrics.wins))) \
            .dimension(slicer.dimensions.timestamp) \
            .dimension(slicer.dimensions.political_party) \
            .queries

        self.assertEqual(len(queries), 1)

        self.assertEqual(
            'SELECT '
            'TRUNC("timestamp",\'DD\') "$d$timestamp",'
            '"political_party" "$d$political_party",'
            'SUM("votes") "$m$votes",'
            'SUM("is_winner") "$m$wins" '
            'FROM "politics"."politician" '
            'GROUP BY "$d$timestamp","$d$political_party" '
            'ORDER BY "$d$timestamp","$d$political_party"', str(queries[0]))
예제 #23
0
    def test_reference_with_dimension_using_display_definition_includes_it_in_all_queries(
        self,
    ):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(timestamp_daily)
            .dimension(mock_dataset.fields["candidate-name"])
            .reference(f.YearOverYear(mock_dataset.fields.timestamp))
            .sql
        )

        self.assertEqual(2, len(queries))

        with self.subTest("base query is same as without reference"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                '"candidate_name" "$candidate-name",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp","$candidate-name" '
                'ORDER BY "$timestamp","$candidate-name"',
                str(queries[0]),
            )

        with self.subTest(
            "reference query is same as base query with filter on reference dimension shifted"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('week',52,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                '"candidate_name" "$candidate-name",'
                'SUM("votes") "$votes_yoy" '
                'FROM "politics"."politician" '
                'GROUP BY "$timestamp","$candidate-name" '
                'ORDER BY "$timestamp","$candidate-name"',
                str(queries[1]),
            )
예제 #24
0
 def test_highcharts_requires_at_least_one_axis(self):
     with self.assertRaises(MetricRequiredException):
         slicer.data \
             .widget(f.HighCharts()) \
             .dimension(slicer.dimensions.timestamp) \
             .queries
예제 #25
0
 def test_highcharts_requires_at_least_one_axis(self):
     with self.assertRaises(MetricRequiredException):
         mock_dataset.query.widget(f.HighCharts()).dimension(
             mock_dataset.fields.timestamp).sql
예제 #26
0
    def test_reference_with_rollup_dimension_and_date_range_filter(self):
        queries = (
            mock_dataset.query.widget(
                f.HighCharts().axis(f.HighCharts.LineSeries(mock_dataset.fields.votes))
            )
            .dimension(Rollup(timestamp_daily))
            .reference(f.WeekOverWeek(mock_dataset.fields.timestamp))
            .filter(
                mock_dataset.fields.timestamp.between(
                    date(2018, 1, 1), date(2018, 1, 31)
                )
            )
            .sql
        )

        self.assertEqual(4, len(queries))

        base, reference, base_rollup, reference_rollup = queries

        with self.subTest("base query applies dimensions and date range filter"):
            self.assertEqual(
                "SELECT "
                'TRUNC("timestamp",\'DD\') "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN '2018-01-01' AND '2018-01-31' "
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(base),
            )

        with self.subTest(
            "reference query shifts timestamp dimension and date range filter by a week"
        ):
            self.assertEqual(
                "SELECT "
                "TRUNC(TIMESTAMPADD('week',1,TRUNC(\"timestamp\",'DD')),'DD') \"$timestamp\","
                'SUM("votes") "$votes_wow" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN TIMESTAMPADD('week',-1,'2018-01-01') "
                "AND TIMESTAMPADD('week',-1,'2018-01-31') "
                'GROUP BY "$timestamp" '
                'ORDER BY "$timestamp"',
                str(reference),
            )

        with self.subTest("totals query selects NULL for timestamp dimension"):
            self.assertEqual(
                "SELECT "
                'NULL "$timestamp",'
                'SUM("votes") "$votes" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN '2018-01-01' AND '2018-01-31' "
                'ORDER BY "$timestamp"',
                str(base_rollup),
            )

        with self.subTest(
            "reference totals query selects NULL for timestamp dimension and shifts date range filter"
        ):
            self.assertEqual(
                "SELECT "
                'NULL "$timestamp",'
                'SUM("votes") "$votes_wow" '
                'FROM "politics"."politician" '
                "WHERE \"timestamp\" BETWEEN TIMESTAMPADD('week',-1,'2018-01-01') "
                "AND TIMESTAMPADD('week',-1,'2018-01-31') "
                'ORDER BY "$timestamp"',
                str(reference_rollup),
            )