From 0b90b550d157b5e8ef6f3115372798994940eff5 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Fri, 9 Jun 2017 17:51:45 +0200 Subject: [PATCH 1/2] Limit the number of results returned by default (fixes #45) --- CHANGELOG.rst | 3 ++- kinto_elasticsearch/indexer.py | 4 ++-- kinto_elasticsearch/views.py | 7 +++++++ tests/test_elasticsearch.py | 38 ++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index d258b2c..4ee0f89 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,8 +5,9 @@ Changelog 0.2.0 (unreleased) ------------------ -- Nothing changed yet. +**Bug fixes** +- Limit the number of results returned by default (fixes #45) 0.1.0 (2017-05-26) ------------------ diff --git a/kinto_elasticsearch/indexer.py b/kinto_elasticsearch/indexer.py index 1291579..d17e0b9 100644 --- a/kinto_elasticsearch/indexer.py +++ b/kinto_elasticsearch/indexer.py @@ -26,9 +26,9 @@ def create_index(self, bucket_id, collection_id, schema=None): body = {"mappings": {indexname: schema}} else: body = None - self.client.indices.create(index=indexname, body=body) + return self.client.indices.create(index=indexname, body=body) else: - self.update_index(bucket_id, collection_id, schema) + return self.update_index(bucket_id, collection_id, schema) def update_index(self, bucket_id, collection_id, schema=None): indexname = self.indexname(bucket_id, collection_id) diff --git a/kinto_elasticsearch/views.py b/kinto_elasticsearch/views.py index f16f298..ae8381b 100644 --- a/kinto_elasticsearch/views.py +++ b/kinto_elasticsearch/views.py @@ -29,6 +29,13 @@ def search_view(request, **kwargs): bucket_id = request.matchdict['bucket_id'] collection_id = request.matchdict['collection_id'] + # # Limit the number of results to return, based on existing Kinto settings. + paginate_by = request.registry.settings.get("paginate_by") + max_fetch_size = request.registry.settings["storage_max_fetch_size"] + if paginate_by is None or paginate_by <= 0: + paginate_by = max_fetch_size + kwargs.setdefault("size", min(paginate_by, max_fetch_size)) + # Access indexer from views using registry. indexer = request.registry.indexer try: diff --git a/tests/test_elasticsearch.py b/tests/test_elasticsearch.py index 245faa4..66df390 100644 --- a/tests/test_elasticsearch.py +++ b/tests/test_elasticsearch.py @@ -196,6 +196,44 @@ def test_empty_querystring_returns_all_results(self): assert len(result["hits"]["hits"]) == 2 +class LimitedResults(BaseWebTest, unittest.TestCase): + def get_app(self, settings): + app = self.make_app(settings=settings) + app.put("/buckets/bid", headers=self.headers) + app.put("/buckets/bid/collections/cid", headers=self.headers) + requests = [{ + "method": "POST", + "path": "/buckets/bid/collections/cid/records", + "body": {"data": {"age": i}} + } for i in range(5)] + app.post_json("/batch", {"requests": requests}, headers=self.headers) + return app + + def test_the_number_of_responses_is_limited_by_paginate_by_setting(self): + app = self.get_app({"paginate_by": 2}) + resp = app.get("/buckets/bid/collections/cid/search", headers=self.headers) + result = resp.json + assert len(result["hits"]["hits"]) == 2 + + def test_the_number_of_responses_is_limited_by_max_fetch_size_setting(self): + app = self.get_app({"storage_max_fetch_size": 2}) + resp = app.get("/buckets/bid/collections/cid/search", headers=self.headers) + result = resp.json + assert len(result["hits"]["hits"]) == 2 + + def test_the_number_of_responses_is_limited_by_smaller_limit(self): + app = self.get_app({"paginate_by": 4, "storage_max_fetch_size": 2}) + resp = app.get("/buckets/bid/collections/cid/search", headers=self.headers) + result = resp.json + assert len(result["hits"]["hits"]) == 2 + + def test_the_number_of_responses_is_limited_by_only_defined_limit(self): + app = self.get_app({"paginate_by": 0, "storage_max_fetch_size": 2}) + resp = app.get("/buckets/bid/collections/cid/search", headers=self.headers) + result = resp.json + assert len(result["hits"]["hits"]) == 2 + + class PermissionsCheck(BaseWebTest, unittest.TestCase): def test_search_is_allowed_if_write_on_bucket(self): body = {"permissions": {"write": ["system.Everyone"]}} From 22db03c20e086eaf484bbc37b97fc20eb5eafec1 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Tue, 13 Jun 2017 15:08:34 +0200 Subject: [PATCH 2/2] @Natim review --- kinto_elasticsearch/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kinto_elasticsearch/views.py b/kinto_elasticsearch/views.py index ae8381b..46b1a45 100644 --- a/kinto_elasticsearch/views.py +++ b/kinto_elasticsearch/views.py @@ -29,7 +29,7 @@ def search_view(request, **kwargs): bucket_id = request.matchdict['bucket_id'] collection_id = request.matchdict['collection_id'] - # # Limit the number of results to return, based on existing Kinto settings. + # Limit the number of results to return, based on existing Kinto settings. paginate_by = request.registry.settings.get("paginate_by") max_fetch_size = request.registry.settings["storage_max_fetch_size"] if paginate_by is None or paginate_by <= 0: