From 7d70900c84c7aa5a111614012cd91a20576532e0 Mon Sep 17 00:00:00 2001 From: Lucas Lavandeira <19612265+lucaslavandeira@users.noreply.github.com> Date: Mon, 13 Aug 2018 11:28:07 -0300 Subject: [PATCH] =?UTF-8?q?Corrijo=20offsets=20inv=C3=A1lidos=20cuando=20s?= =?UTF-8?q?e=20aplica=20rep=5Fmode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- series_tiempo_ar_api/apps/api/helpers.py | 17 +++++++++++++++++ .../apps/api/query/es_query/es_query.py | 2 +- .../apps/api/query/es_query/series.py | 8 ++++++++ .../apps/api/tests/query_tests.py | 10 ++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/series_tiempo_ar_api/apps/api/helpers.py b/series_tiempo_ar_api/apps/api/helpers.py index 621a4e64..70e357c2 100644 --- a/series_tiempo_ar_api/apps/api/helpers.py +++ b/series_tiempo_ar_api/apps/api/helpers.py @@ -98,3 +98,20 @@ def get_periodicity_human_format_es(periodicity): } return periodicities[periodicity] + + +def extra_offset(periodicity): + """Cantidad de valores extra a pedir en el offset de ES cuando se aplica + la periodicidad pasada. Es necesario para que al aplicar transformaciones + de variación, se devuelva la cantidad exacta esperada por el usuario. + Ejemplo: limit=100, rep_mode=change_a_year_ago, devolvería 99 resultados + en una serie anual, necesitamos sumar el valor devuelto por esta función + """ + offsets = { + 'year': 1, + 'semester': 2, + 'quarter': 4, + 'month': 12, + 'day': 365, + } + return offsets.get(periodicity, 0) diff --git a/series_tiempo_ar_api/apps/api/query/es_query/es_query.py b/series_tiempo_ar_api/apps/api/query/es_query/es_query.py index b746d9a8..a112ad69 100644 --- a/series_tiempo_ar_api/apps/api/query/es_query/es_query.py +++ b/series_tiempo_ar_api/apps/api/query/es_query/es_query.py @@ -78,7 +78,7 @@ def add_pagination(self, start, limit): raise QueryError(strings.EMPTY_QUERY_ERROR) for serie in self.series: - serie.search = serie.search[start:limit] + serie.add_pagination(start, limit) # Guardo estos parámetros, necesarios en el evento de hacer un collapse self.args[constants.PARAM_START] = start diff --git a/series_tiempo_ar_api/apps/api/query/es_query/series.py b/series_tiempo_ar_api/apps/api/query/es_query/series.py index 86971e4e..99ac2051 100644 --- a/series_tiempo_ar_api/apps/api/query/es_query/series.py +++ b/series_tiempo_ar_api/apps/api/query/es_query/series.py @@ -2,6 +2,7 @@ from django.conf import settings from elasticsearch_dsl import Search, Q, A +from series_tiempo_ar_api.apps.api.helpers import extra_offset from series_tiempo_ar_api.apps.api.query import constants from series_tiempo_ar_api.libs.indexing.elastic import ElasticInstance @@ -53,3 +54,10 @@ def add_collapse(self, periodicity): else: # Ignoramos la in memory ag self.collapse_agg = constants.AGG_DEFAULT self.search = self.search.filter('bool', must=[Q('match', interval=periodicity)]) + + self.args[constants.PARAM_PERIODICITY] = periodicity + + def add_pagination(self, start, limit): + # ☢️☢️☢️ + es_offset = limit + extra_offset(self.args[constants.PARAM_PERIODICITY]) + self.search = self.search[start:es_offset] diff --git a/series_tiempo_ar_api/apps/api/tests/query_tests.py b/series_tiempo_ar_api/apps/api/tests/query_tests.py index 37f131ba..f5610760 100644 --- a/series_tiempo_ar_api/apps/api/tests/query_tests.py +++ b/series_tiempo_ar_api/apps/api/tests/query_tests.py @@ -228,3 +228,13 @@ def test_query_count(self): # 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)