From 7efa59e2ec1da54a414bb77208b33663f1c564a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Wed, 26 Nov 2014 17:48:04 +0100 Subject: [PATCH] Add a blob field that is not being indexed. --- daybed/indexer.py | 11 +++++++---- daybed/schemas/__init__.py | 8 ++++++++ daybed/schemas/base.py | 7 +++++++ daybed/tests/test_indexer.py | 5 +++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/daybed/indexer.py b/daybed/indexer.py index 566abde..c6ed0eb 100644 --- a/daybed/indexer.py +++ b/daybed/indexer.py @@ -4,6 +4,7 @@ from elasticsearch.exceptions import RequestError, ElasticsearchException from daybed import logger +from daybed.schemas import registry class SearchError(Exception): @@ -178,9 +179,11 @@ def _record_as_mapping(self, definition, record): field_types[field_name] = field_type mapping = record.copy() - for key, value in mapping.items(): + for key, value in record.items(): field_type = field_types.get(key) - if field_type in ('line', 'polygon'): + if not registry.indexable(field_type): + del mapping[key] + elif field_type in ('line', 'polygon'): geojson = { 'line': 'Linestring', 'polygon': 'Polygon' @@ -189,8 +192,8 @@ def _record_as_mapping(self, definition, record): 'type': geojson[field_type], 'coordinates': value } - if field_type == 'point': + elif field_type == 'point': mapping[key] = {'lon': value[0], 'lat': value[1]} - if field_type == 'list': + elif field_type == 'list': mapping[key] = json.dumps(value) return mapping diff --git a/daybed/schemas/__init__.py b/daybed/schemas/__init__.py index afd4a50..106c029 100644 --- a/daybed/schemas/__init__.py +++ b/daybed/schemas/__init__.py @@ -55,6 +55,13 @@ def definition(self, typename, **options): raise UnknownFieldTypeError('Type "%s" is unknown' % typename) return nodetype.definition(**options) + def indexable(self, typename): + try: + nodetype = self._registry[typename] + except KeyError: + return True + return nodetype.indexable + @property def names(self): return self._registry.keys() @@ -78,6 +85,7 @@ class TypeField(object): required = True default_value = null hint = u'' + indexable = True @classmethod def definition(cls, **kwargs): diff --git a/daybed/schemas/base.py b/daybed/schemas/base.py index 1a833c2..483c6a2 100644 --- a/daybed/schemas/base.py +++ b/daybed/schemas/base.py @@ -51,6 +51,13 @@ class TextField(TypeField): hint = _('A text') +@registry.add('blob') +class BlobField(TypeField): + node = String + hint = _('A binary blob that will be stored as-is') + indexable = False + + @registry.add('annotation') class AnnotationField(TypeField): required = False diff --git a/daybed/tests/test_indexer.py b/daybed/tests/test_indexer.py index e2a63b6..c918e78 100644 --- a/daybed/tests/test_indexer.py +++ b/daybed/tests/test_indexer.py @@ -236,6 +236,7 @@ def test_existing_records_unindexed_on_model_put(self, delete_mock): {'name': 'u', 'type': 'polygon'}, {'name': 'v', 'type': 'anyof', 'model': 'simple'}, {'name': 'w', 'type': 'oneof', 'model': 'simple'}, + {'name': 'x', 'type': 'blob'}, ] } } @@ -342,6 +343,7 @@ def setUp(self): 'u': [[[0.0, 0.0], [1.0, 1.0], [0.0, 1.0], [0.0, 0.0]]], 'v': ["simple-rec"], 'w': 'simple-rec', + 'x': 'binary-blob', } self.mapping = None @@ -379,6 +381,9 @@ def test_line_and_polygon_are_converted_to_geojson(self): {"type": "Polygon", "coordinates": self.record['u']}) + def test_blob_is_not_indexed(self): + self.assertNotIn('x', self.mapping) + class SpatialSearchTest(BaseWebTest):