From 6f7fb01fd90d204d9ce2fabb8a491cf876dbb513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com> Date: Wed, 12 Apr 2017 03:36:10 +0000 Subject: [PATCH] mysql_innodb_catalog: delete before inserting in predicate table since predicate is scriptable, a document that was once a predicate may no longer be a predicate next time it's indexed, so we should remove it from predicate table in that case. predicate_category was already doing this correctly --- .../z_catalog_predicate_list.sql | 7 ++++ product/ERP5/tests/testPredicate.py | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/product/ERP5/bootstrap/erp5_mysql_innodb_catalog/CatalogMethodTemplateItem/portal_catalog/erp5_mysql_innodb/z_catalog_predicate_list.sql b/product/ERP5/bootstrap/erp5_mysql_innodb_catalog/CatalogMethodTemplateItem/portal_catalog/erp5_mysql_innodb/z_catalog_predicate_list.sql index 90fa5ec2b8..ca4a30a4a9 100644 --- a/product/ERP5/bootstrap/erp5_mysql_innodb_catalog/CatalogMethodTemplateItem/portal_catalog/erp5_mysql_innodb/z_catalog_predicate_list.sql +++ b/product/ERP5/bootstrap/erp5_mysql_innodb_catalog/CatalogMethodTemplateItem/portal_catalog/erp5_mysql_innodb/z_catalog_predicate_list.sql @@ -1,3 +1,10 @@ +DELETE FROM + predicate +WHERE +<dtml-sqltest uid type="int" multiple> + +<dtml-var sql_delimiter> + <dtml-let predicate_list="[]"> <dtml-in prefix="loop" expr="_.range(_.len(uid))"> <dtml-if "isPredicate[loop_item]"> diff --git a/product/ERP5/tests/testPredicate.py b/product/ERP5/tests/testPredicate.py index 9d7721348d..81ccc76188 100644 --- a/product/ERP5/tests/testPredicate.py +++ b/product/ERP5/tests/testPredicate.py @@ -616,6 +616,44 @@ class TestPredicates(TestPredicateMixIn): self.assertFalse(getattr(predicate, '_identity_criterion', None) is None) self.assertFalse(getattr(predicate, '_range_criterion', None) is None) + + def test_predicateIndexation(self): + predicate = self.createPredicate( + membership_criterion_base_category_list = ['region'], + membership_criterion_category_list = [REGION_FRANCE_PATH] + ) + # Our test document will only be a predicate if title is different + # from 'never applies' + createZODBPythonScript( + self.portal.portal_skins.custom, + 'Predicate_asPredicate', + '', + """return None if context.getTitle() == 'never applies' else context""") + self.tic() + + self.assertEqual( + [predicate], + [brain.getObject() for brain in self.portal.portal_catalog( + **{'predicate.uid': predicate.getUid()})]) + self.assertEqual( + [predicate], + [brain.getObject() for brain in self.portal.portal_catalog( + **{'predicate_category.uid': predicate.getUid()})]) + + predicate.setTitle("never applies") + # this predicate is no longer a predicate, so it no longer exist in predicate tables + self.tic() + + self.assertEqual( + [], + [brain.getObject() for brain in self.portal.portal_catalog( + **{'predicate.uid': predicate.getUid()})]) + self.assertEqual( + [], + [brain.getObject() for brain in self.portal.portal_catalog( + **{'predicate_category.uid': predicate.getUid()})]) + + # TODO : # multi membership category # asPredicate scripts -- 2.30.9