summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2017-08-19 17:12:24 +0200
committerElena ``of Valhalla'' Grandi <valhalla@trueelena.org>2017-08-19 17:12:24 +0200
commit8e15a0763e3476e333b1e71b70015cf3bd757160 (patch)
tree953841bc576c5148681c29b50412a7a7a9f8f8a8
parentb368e0744d440cb2ba5fde8593325071b8389240 (diff)
Support indexing list fields
-rw-r--r--lesana/collection.py41
-rw-r--r--tests/data/complex/items/73097121f1874a6ea2f927db7dc4f11e.yaml10
-rw-r--r--tests/data/complex/settings.yaml7
-rw-r--r--tests/test_collection.py13
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