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