コード例 #1
0
class QueryTests(TestCase):
    single_series = SERIES_NAME

    @classmethod
    def setUpClass(cls):
        cls.field = Field.objects.get(identifier=cls.single_series)
        super(cls, QueryTests).setUpClass()

    def setUp(self):
        self.query = Query(index=settings.TEST_INDEX)

    def test_index_metadata_frequency(self):
        self.query.add_series(self.single_series, self.field)
        self.query.run()

        index_frequency = self.query.get_metadata()[0]['frequency']
        self.assertEqual(index_frequency, 'month')

    def test_index_metadata_start_end_dates(self):
        self.query.add_series(self.single_series, self.field)
        data = self.query.run()['data']

        index_meta = self.query.get_metadata()[0]
        self.assertEqual(data[0][0], index_meta['start_date'])
        self.assertEqual(data[-1][0], index_meta['end_date'])

    def test_collapse_index_metadata_frequency(self):
        collapse_interval = 'quarter'
        self.query.add_series(self.single_series, self.field)
        self.query.add_collapse(collapse=collapse_interval)
        self.query.run()

        index_frequency = self.query.get_metadata()[0]['frequency']
        self.assertEqual(index_frequency, collapse_interval)

    def test_collapse_index_metadata_start_end_dates(self):
        collapse_interval = 'quarter'
        self.query.add_series(self.single_series, self.field)
        self.query.add_collapse(collapse=collapse_interval)
        data = self.query.run()['data']

        index_meta = self.query.get_metadata()[0]
        self.assertEqual(data[0][0], index_meta['start_date'])
        self.assertEqual(data[-1][0], index_meta['end_date'])

    @raises(CollapseError)
    def test_invalid_collapse(self):
        collapse_interval = 'day'  # Serie cargada es mensual
        self.query.add_series(self.single_series, self.field)
        self.query.add_collapse(collapse=collapse_interval)

    def test_identifiers(self):

        self.query.add_series(self.single_series, self.field)
        # Devuelve lista de ids, una por serie. Me quedo con la primera (única)
        ids = self.query.get_series_identifiers()[0]
        field = Field.objects.get(identifier=self.single_series)
        self.assertEqual(ids['id'], field.identifier)
        self.assertEqual(ids['distribution'], field.distribution.identifier)
        self.assertEqual(ids['dataset'], field.distribution.dataset.identifier)

    def test_weekly_collapse(self):
        day_series_name = settings.TEST_SERIES_NAME.format('day')
        field = Field.objects.get(identifier=day_series_name)

        self.query.add_series(day_series_name, field)

        self.query.add_collapse(collapse='week')
        self.query.sort(how='asc')
        data = self.query.run()['data']

        first_date = iso8601.parse_date(data[0][0])
        second_date = iso8601.parse_date(data[1][0])

        delta = second_date - first_date
        self.assertEqual(delta.days, 7)

    def add_series_with_aggregation(self):
        # Aggregation sin haber definido collapse NO HACE NADA!
        self.query.add_series(self.single_series,
                              self.field,
                              collapse_agg='sum')
        self.assertTrue(self.query.series_models)

    def test_simple_metadata_remove_catalog(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        self.query.add_series(self.single_series, self.field)
        self.query.run()
        index_meta = self.query.get_metadata()[1]['catalog']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_dataset(self):
        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        self.query.add_series(self.single_series, self.field)
        self.query.run()
        index_meta = self.query.get_metadata()[1]['dataset']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_distribution(self):
        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.query.add_series(self.single_series, self.field)
        self.query.run()
        index_meta = self.query.get_metadata()[1]['distribution']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_field(self):
        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'
        self.field.save()

        self.query.add_series(self.single_series, self.field)
        self.query.run()
        index_meta = self.query.get_metadata()[1]['field']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('id', index_meta)

    def test_flatten_metadata_response(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'
        self.field.save()

        self.query.add_series(self.single_series, self.field)
        self.query.flatten_metadata_response()
        self.query.run()

        flat_meta = self.query.get_metadata()[1]

        other_query = Query(index=settings.TEST_INDEX)
        other_query.add_series(self.single_series, self.field)
        other_query.run()
        meta = other_query.get_metadata()[1]

        for key in meta:
            for in_key in meta[key]:
                self.assertEqual(meta[key][in_key],
                                 flat_meta['{}_{}'.format(key, in_key)])

    def test_full_metadata_flat_response(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'
        self.field.save()

        self.query.add_series(self.single_series, self.field)
        self.query.set_metadata_config('full')
        self.query.flatten_metadata_response()
        self.query.run()

        flat_meta = self.query.get_metadata()[1]

        other_query = Query(index=settings.TEST_INDEX)
        other_query.add_series(self.single_series, self.field)
        other_query.set_metadata_config('full')
        other_query.run()
        meta = other_query.get_metadata()[1]

        for key in meta:
            for in_key in meta[key]:
                self.assertEqual(meta[key][in_key],
                                 flat_meta['{}_{}'.format(key, in_key)])

    def test_full_metadata_includes_enhanced_meta(self):
        self.query.add_series(self.single_series, self.field)
        self.query.set_metadata_config('full')
        meta = self.query.get_metadata()

        for enhanced_meta in self.field.enhanced_meta.all():
            self.assertEqual(meta[1]['field'][enhanced_meta.key],
                             enhanced_meta.value)

    def test_full_metadata_periodicty_with_collapse(self):
        self.query.add_series(self.single_series, self.field)
        self.query.add_collapse('year')
        self.query.set_metadata_config('full')

        resp = self.query.run()

        self.assertEqual(resp['meta'][0]['frequency'], 'year')
        self.assertEqual(resp['meta'][1]['field'][meta_keys.PERIODICITY],
                         meta_keys.get(self.field, meta_keys.PERIODICITY))

    def test_query_count(self):
        self.query.add_series(self.single_series, self.field)

        resp = self.query.run()

        # Longitud de la serie pedida. Ver support/generate_data.py
        self.assertEqual(resp['count'], 1000)

    def test_day_series_length_with_limit_and_rep_mode(self):
        day_series_name = settings.TEST_SERIES_NAME.format('day')
        field = Field.objects.get(identifier=day_series_name)

        self.query.add_series(day_series_name,
                              field,
                              rep_mode='percent_change_a_year_ago')
        self.query.add_pagination(start=0, limit=2)
        result = self.query.run()

        self.assertEqual(len(result['data']), 2)

    def test_response_rep_mode_units(self):
        self.query.add_series(self.single_series, self.field)

        meta = self.query.get_metadata()
        field_meta = meta[1]['field']
        self.assertEqual(field_meta['representation_mode'], 'value')
        self.assertEqual(field_meta['representation_mode_units'],
                         meta[1]['field'].get('units'))

    def test_response_rep_mode_units_pct_change(self):
        rep_mode = constants.PCT_CHANGE
        self.query.add_series(self.single_series,
                              self.field,
                              rep_mode=rep_mode)

        meta = self.query.get_metadata()
        field_meta = meta[1]['field']

        self.assertEqual(field_meta['representation_mode'], rep_mode)
        self.assertEqual(field_meta['representation_mode_units'],
                         constants.VERBOSE_REP_MODES[rep_mode])
コード例 #2
0
class QueryTests(TestCase):
    single_series = SERIES_NAME

    def setUp(self):
        self.field = Field.objects.get(identifier=self.single_series)
        self.query = Query()

    def test_index_metadata_frequency(self):
        self.query.add_series(self.field)
        meta = self.query.run()['meta']

        index_frequency = meta[0]['frequency']
        self.assertEqual(index_frequency, 'month')

    def test_index_metadata_start_end_dates(self):
        self.query.add_series(self.field)
        res = self.query.run()

        index_meta = res['meta'][0]
        self.assertEqual(res['data'][0][0], index_meta['start_date'])
        self.assertEqual(res['data'][-1][0], index_meta['end_date'])

    def test_collapse_index_metadata_frequency(self):
        collapse_interval = 'quarter'
        self.query.add_series(self.field)
        self.query.update_collapse(collapse=collapse_interval)
        meta = self.query.run()['meta']

        index_frequency = meta[0]['frequency']
        self.assertEqual(index_frequency, collapse_interval)

    def test_collapse_index_metadata_start_end_dates(self):
        collapse_interval = 'quarter'
        self.query.add_series(self.field)
        self.query.update_collapse(collapse=collapse_interval)
        res = self.query.run()
        data = res['data']

        index_meta = res['meta'][0]
        self.assertEqual(data[0][0], index_meta['start_date'])
        self.assertEqual(data[-1][0], index_meta['end_date'])

    @raises(CollapseError)
    def test_invalid_collapse(self):
        collapse_interval = 'day'  # Serie cargada es mensual
        self.query.add_series(self.field)
        self.query.update_collapse(collapse=collapse_interval)

    def test_identifiers(self):

        self.query.add_series(self.field)
        # Devuelve lista de ids, una por serie. Me quedo con la primera (única)
        ids = self.query.get_series_identifiers()[0]
        field = Field.objects.get(identifier=self.single_series)
        self.assertEqual(ids['id'], field.identifier)
        self.assertEqual(ids['distribution'], field.distribution.identifier)
        self.assertEqual(ids['dataset'], field.distribution.dataset.identifier)

    def test_weekly_collapse(self):
        day_series_name = settings.TEST_SERIES_NAME.format('day')
        field = Field.objects.get(identifier=day_series_name)

        self.query.add_series(field)

        self.query.update_collapse(collapse='week')
        self.query.sort(how='asc')
        data = self.query.run()['data']

        first_date = iso8601.parse_date(data[0][0])
        second_date = iso8601.parse_date(data[1][0])

        delta = second_date - first_date
        self.assertEqual(delta.days, 7)

    def test_simple_metadata_remove_catalog(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        self.query.add_series(self.field)
        meta = self.query.run()['meta']
        index_meta = meta[1]['catalog']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_dataset(self):
        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        self.query.add_series(self.field)
        meta = self.query.run()['meta']
        index_meta = meta[1]['dataset']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_distribution(self):
        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.query.add_series(self.field)
        meta = self.query.run()['meta']
        index_meta = meta[1]['distribution']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('title', index_meta)

    def test_simple_metadata_remove_field(self):
        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'

        self.query.add_series(self.field)
        meta = self.query.run()['meta']
        index_meta = meta[1]['field']
        self.assertNotIn('extra_field', index_meta)
        self.assertIn('id', index_meta)

    def test_flatten_metadata_response(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'

        self.query.add_series(self.field)
        self.query.flatten_metadata_response()
        flat_meta = self.query.run()['meta'][1]

        other_query = Query()
        other_query.add_series(self.field)
        meta = other_query.run()['meta'][1]

        for key in meta:
            for in_key in meta[key]:
                self.assertEqual(meta[key][in_key],
                                 flat_meta['{}_{}'.format(key, in_key)])

    def test_full_metadata_flat_response(self):
        catalog = self.field.distribution.dataset.catalog
        catalog.metadata = '{"title": "test_title", "extra_field": "extra"}'
        catalog.save()

        dataset = self.field.distribution.dataset
        dataset.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dataset.save()

        dist = self.field.distribution
        dist.metadata = '{"title": "test_title", "extra_field": "extra"}'
        dist.save()

        self.field.metadata = '{"id": "test_title", "extra_field": "extra"}'

        self.query.add_series(self.field)
        self.query.set_metadata_config('full')
        self.query.flatten_metadata_response()
        flat_meta = self.query.run()['meta'][1]

        other_query = Query()
        other_query.add_series(self.field)
        other_query.set_metadata_config('full')
        meta = other_query.run()['meta'][1]

        for key in meta:
            for in_key in meta[key]:
                self.assertEqual(meta[key][in_key],
                                 flat_meta['{}_{}'.format(key, in_key)])

    def test_full_metadata_includes_enhanced_meta(self):
        self.query.add_series(self.field)
        self.query.set_metadata_config('full')
        meta = self.query.run()['meta']

        for enhanced_meta in self.field.enhanced_meta.all():
            self.assertEqual(meta[1]['field'][enhanced_meta.key],
                             enhanced_meta.value)

    def test_full_metadata_periodicty_with_collapse(self):
        self.query.add_series(self.field)
        self.query.update_collapse('year')
        self.query.set_metadata_config('full')

        resp = self.query.run()

        self.assertEqual(resp['meta'][0]['frequency'], 'year')
        self.assertEqual(resp['meta'][1]['field'][meta_keys.PERIODICITY],
                         meta_keys.get(self.field, meta_keys.PERIODICITY))

    def test_query_count(self):
        self.query.add_series(self.field)

        resp = self.query.run()

        # Longitud de la serie pedida. Ver support/generate_data.py
        self.assertEqual(resp['count'], 12 * 10)

    def test_day_series_length_with_limit_and_rep_mode(self):
        day_series_name = settings.TEST_SERIES_NAME.format('day')
        field = Field.objects.get(identifier=day_series_name)

        self.query.add_series(field, rep_mode='percent_change_a_year_ago')
        self.query.add_pagination(start=0, limit=2)
        result = self.query.run()

        self.assertEqual(len(result['data']), 2)

    def test_response_rep_mode_units(self):
        self.query.add_series(self.field)

        meta = self.query.run()['meta']
        field_meta = meta[1]['field']
        self.assertEqual(field_meta['representation_mode'], 'value')
        self.assertEqual(field_meta['representation_mode_units'],
                         meta[1]['field'].get('units'))

    def test_response_rep_mode_units_pct_change(self):
        rep_mode = constants.PCT_CHANGE
        self.query.add_series(self.field, rep_mode=rep_mode)

        meta = self.query.run()['meta']
        field_meta = meta[1]['field']

        self.assertEqual(field_meta['representation_mode'], rep_mode)
        self.assertEqual(field_meta['representation_mode_units'],
                         constants.VERBOSE_REP_MODES[rep_mode])

    def test_aggregation_on_yearly_series(self):
        """Esperado: Valores de la serie con y sin agregación son iguales, no
        hay valores que colapsar"""
        year_series = get_series_id('year')
        field = Field.objects.get(identifier=year_series)
        self.query.add_series(field)
        self.query.add_series(field, collapse_agg='end_of_period')

        data = self.query.run()['data']

        for row in data:
            self.assertEqual(row[1], row[2])

    def test_aggregation_on_monthly_series(self):
        """Esperado: Valores de la serie con y sin agregación son iguales, no
        hay valores que colapsar"""
        self.query.add_series(self.field)
        self.query.add_series(self.field, collapse_agg='end_of_period')

        data = self.query.run()['data']

        for row in data:
            self.assertEqual(row[1], row[2])

    def test_same_series_multiple_times_different_rep_mode(self):
        self.query.add_series(self.field)
        self.query.add_series(self.field, rep_mode='percent_change')
        self.query.set_metadata_config(how=constants.METADATA_ONLY)
        meta = self.query.run()['meta']

        self.assertEqual(meta[1]['field']['representation_mode'], 'value')
        self.assertEqual(meta[2]['field']['representation_mode'],
                         'percent_change')

    def test_is_percentage(self):
        SeriesUnits.objects.create(name=json.loads(
            self.field.metadata)['units'],
                                   percentage=True)
        self.query.add_series(self.field)
        self.query.set_metadata_config(how=constants.METADATA_ONLY)
        meta = self.query.run()['meta']

        self.assertTrue(meta[1]['field']['is_percentage'])

    def test_is_percentage_units_false(self):
        SeriesUnits.objects.create(name=json.loads(
            self.field.metadata)['units'],
                                   percentage=False)
        self.query.add_series(self.field)
        self.query.set_metadata_config(how=constants.METADATA_ONLY)
        meta = self.query.run()['meta']

        self.assertFalse(meta[1]['field']['is_percentage'])

    def test_is_percentage_with_percentage_rep_mode(self):
        self.query.add_series(self.field, rep_mode=constants.PCT_CHANGE)
        self.query.set_metadata_config(how=constants.METADATA_ONLY)
        meta = self.query.run()['meta']

        self.assertTrue(meta[1]['field']['is_percentage'])

    def test_is_percentage_with_non_percentage_rep_mode(self):

        self.query.add_series(self.field, rep_mode=constants.CHANGE)
        self.query.set_metadata_config(how=constants.METADATA_ONLY)
        meta = self.query.run()['meta']

        self.assertFalse(meta[1]['field']['is_percentage'])

    def test_add_query_aggregation(self):
        self.query.add_series(self.field)
        self.query.add_series(self.field, collapse_agg='sum')

        self.query.update_collapse('year')

        data = self.query.run()['data']
        for _, avg_value, sum_value in data:
            # Suma debe ser siempre mayor que el promedio
            self.assertGreater(sum_value, avg_value)

    def test_collapse_aggregation_series_order_different_periodicity(self):
        year_series = get_series_id('day')
        year_field = Field.objects.get(identifier=year_series)

        self.query.add_series(self.field, collapse_agg='sum')
        self.query.add_series(year_field)
        data = self.query.run()['data']

        other_query = Query()
        other_query.add_series(year_field)
        other_query.add_series(self.field, collapse_agg='sum')
        other_data = other_query.run()['data']

        for row1, row2 in zip(data, other_data):
            self.assertEqual(row1[0], row2[0])
            self.assertEqual(row1[1], row2[2])
            self.assertEqual(row1[2], row2[1])

    def test_add_two_collapses(self):
        """Esperado: El segundo collapse overridea el primero"""
        self.query.add_series(self.field)
        self.query.update_collapse('quarter')
        self.query.update_collapse('year')
        self.query.sort(how='asc')
        data = self.query.run()['data']

        prev_timestamp = None
        for row in data:
            timestamp = row[0]
            parsed_timestamp = iso8601.parse_date(timestamp)
            if not prev_timestamp:
                prev_timestamp = parsed_timestamp
                continue
            delta = relativedelta(parsed_timestamp, prev_timestamp)
            self.assertTrue(delta.years == 1, timestamp)
            prev_timestamp = parsed_timestamp

    def test_end_of_period_with_rep_mode(self):
        self.query.add_series(self.field, 'percent_change', 'end_of_period')
        self.query.update_collapse('year')
        self.query.sort('asc')
        data = self.query.run()['data']

        orig_eop = Query(index=settings.TS_INDEX)
        orig_eop.add_series(self.field, collapse_agg='end_of_period')
        orig_eop.update_collapse('year')
        orig_eop.sort('asc')
        end_of_period = orig_eop.run()['data']

        for i, row in enumerate(data):  # El primero es nulo en pct change
            value = end_of_period[i + 1][1] / end_of_period[i][1] - 1

            self.assertAlmostEqual(value, row[1])