diff options
author | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2017-08-19 17:12:24 +0200 |
---|---|---|
committer | Elena ``of Valhalla'' Grandi <valhalla@trueelena.org> | 2017-08-19 17:12:24 +0200 |
commit | 8e15a0763e3476e333b1e71b70015cf3bd757160 (patch) | |
tree | 953841bc576c5148681c29b50412a7a7a9f8f8a8 | |
parent | b368e0744d440cb2ba5fde8593325071b8389240 (diff) |
Support indexing list fields
-rw-r--r-- | lesana/collection.py | 41 | ||||
-rw-r--r-- | tests/data/complex/items/73097121f1874a6ea2f927db7dc4f11e.yaml | 10 | ||||
-rw-r--r-- | tests/data/complex/settings.yaml | 7 | ||||
-rw-r--r-- | tests/test_collection.py | 13 |
4 files changed, 53 insertions, 18 deletions
diff --git a/lesana/collection.py b/lesana/collection.py index 8f76ea7..cbdd3a7 100644 --- a/lesana/collection.py +++ b/lesana/collection.py @@ -151,24 +151,34 @@ class Collection(object): # Fields with prefix, for field search for field in self.indexed_fields: - try: - self.indexer.index_text( - entry.data.get(field['name']), - 1, - field['prefix']) - except ValueError as e: - logging.info("Not indexing empty? value {}: {}".format( - entry.data.get(field['name']), - str(e))) + if field['multi']: + values = entry.data.get(field['name']) + else: + values = [entry.data.get(field['name'])] + for v in values: + try: + self.indexer.index_text( + v, + 1, + field['prefix']) + except ValueError as e: + logging.info("Not indexing empty? value {}: {}".format( + entry.data.get(field['name']), + str(e))) # unprefixed fields, for full text search for field in self.indexed_fields: if field.get('free_search', False): - try: - self.indexer.index_text(entry.data.get(field['name'])) - self.indexer.increase_termpos() - except ValueError as e: - # probably already logged earlier - pass + if field['multi']: + values = entry.data.get(field['name']) + else: + values = [entry.data.get(field['name'])] + for v in values: + try: + self.indexer.index_text(v) + self.indexer.increase_termpos() + except ValueError as e: + # probably already logged earlier + pass doc.set_data(entry.yaml_data) doc.add_boolean_term(entry.idterm) doc.add_value(0, entry.fname.encode('utf-8')) @@ -186,6 +196,7 @@ class Collection(object): 'prefix': prefix, 'name': field['name'], 'free_search': field['index'] == 'free', + 'multi': field['type'] in ['list'] }) return fields diff --git a/tests/data/complex/items/73097121f1874a6ea2f927db7dc4f11e.yaml b/tests/data/complex/items/73097121f1874a6ea2f927db7dc4f11e.yaml new file mode 100644 index 0000000..1c7070c --- /dev/null +++ b/tests/data/complex/items/73097121f1874a6ea2f927db7dc4f11e.yaml @@ -0,0 +1,10 @@ +name: 'An item' +description: | + multi + line + description +position: 'over there' +something: '' +tags: + - this + - that diff --git a/tests/data/complex/settings.yaml b/tests/data/complex/settings.yaml index 57a1773..bd2179c 100644 --- a/tests/data/complex/settings.yaml +++ b/tests/data/complex/settings.yaml @@ -1,5 +1,6 @@ name: "Fully featured lesana collection" lang: 'english' +entry_label: '{{ uid}}: {{ name }} ({{ tags }})' fields: - name: name type: string @@ -11,6 +12,10 @@ fields: index: free - name: position type: string - index: facet + index: field - name: something type: yaml + - name: tags + type: list + list: string + index: field diff --git a/tests/test_collection.py b/tests/test_collection.py index 9de681a..875a35a 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -232,13 +232,22 @@ class testComplexCollection(unittest.TestCase): self.collection.settings['name'], "Fully featured lesana collection" ) - self.assertEqual(len(self.collection.settings['fields']), 4) + self.assertEqual(len(self.collection.settings['fields']), 5) self.assertIsNotNone(self.collection.stemmer) - self.assertEqual(len(self.collection.indexed_fields), 2) + self.assertEqual(len(self.collection.indexed_fields), 4) def test_index(self): self.collection.update_cache() + def test_indexing_list(self): + self.collection.update_cache(['73097121f1874a6ea2f927db7dc4f11e.yaml']) + self.collection.start_search('tags:this') + res = self.collection.get_search_results() + matches = list(res) + self.assertEqual(len(matches), 1) + for m in matches: + self.assertIsInstance(m, lesana.Entry) + class testCollectionWithErrors(unittest.TestCase): @classmethod |