Fix index rebuilding for multi value first levels. GitLab issue #391.

Thanks to @jacekkow for the report and diagnosis.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2017-06-20 03:28:25 -04:00
parent 5a82c93d47
commit a7d6ab15f8
3 changed files with 56 additions and 8 deletions

View File

@@ -9,7 +9,8 @@ XX (2017-XX-XX)
- Make tags, metadata types and cabinets searchable via the dynamic search API. GitLab issue #344.
- Add support for updating configuration options from environment variables.
- Add purgelocks management command. GitLab issue #221.
- Fix index rebuilding for multi value first levels. GitLab issue #391.
2.3 (2017-06-08)
================
- Allow for bigger indexing expression templates.

View File

@@ -179,8 +179,8 @@ class IndexTemplateNode(MPTTModel):
else:
return self.expression
def index_document(self, document, acquire_lock=True):
# Avoid another process to index this same document for the same
def index_document(self, document, acquire_lock=True, index_instance_node_parent=None):
# Avoid another process indexing this same document for the same
# template node. This prevents this template node's index instance
# nodes from being deleted while the template is evaluated and
# documents added to it.
@@ -211,16 +211,20 @@ class IndexTemplateNode(MPTTModel):
index_instance_node, created = self.index_instance_nodes.get_or_create()
for child in self.get_children():
child.index_document(document=document, acquire_lock=False)
child.index_document(
document=document, acquire_lock=False,
index_instance_node_parent=index_instance_node
)
if acquire_lock:
lock.release()
elif self.enabled:
logger.debug('IndexTemplateNode; non parent: evaluating')
logger.debug('My parent is: %s', self.parent)
logger.debug('My parent template is: %s', self.parent)
logger.debug(
'My parent nodes: %s', self.parent.index_instance_nodes.all()
'My parent instance node is: %s',
index_instance_node_parent
)
logger.debug(
'IndexTemplateNode; Evaluating template: %s', self.expression
@@ -245,14 +249,17 @@ class IndexTemplateNode(MPTTModel):
logger.debug('Evaluation result: %s', result)
if result:
index_instance_node, created = self.index_instance_nodes.get_or_create(
parent=self.parent.index_instance_nodes.get(),
parent=index_instance_node_parent,
value=result
)
if self.link_documents:
index_instance_node.documents.add(document)
for child in self.get_children():
child.index_document(document=document, acquire_lock=False)
child.index_document(
document=document, acquire_lock=False,
index_instance_node_parent=index_instance_node
)
finally:
if acquire_lock:
lock.release()

View File

@@ -1,6 +1,7 @@
from __future__ import unicode_literals
from django.test import override_settings
from django.utils.encoding import force_text
from common.tests import BaseTestCase
from documents.models import DocumentType
@@ -169,3 +170,42 @@ class IndexTestCase(BaseTestCase):
self.assertQuerysetEqual(
instance_node.documents.all(), [repr(self.document)]
)
def test_dual_level_dual_document_index(self):
"""
Test creation of an index instance with two first levels with different
values and two second levels with the same value but as separate
children of each of the first levels.
"""
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document_2 = self.document_type.new_document(
file_object=file_object
)
# Create empty index
index = Index.objects.create(label=TEST_INDEX_LABEL)
# Add our document type to the new index
index.document_types.add(self.document_type)
# Create simple index template
root = index.template_root
level_1 = index.node_templates.create(
parent=root, expression='{{ document.uuid }}',
link_documents=False
)
index.node_templates.create(
parent=level_1, expression='{{ document.label }}',
link_documents=True
)
Index.objects.rebuild()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all()],
[
'', force_text(self.document_2.uuid), self.document_2.label,
force_text(self.document.uuid), self.document.label
]
)