Commit 2e3afafb authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

ERP5Type.Core.Predicate: optimise test().

parent 7c8082a2
...@@ -139,34 +139,36 @@ class Predicate(XMLObject): ...@@ -139,34 +139,36 @@ class Predicate(XMLObject):
# (result, property, value, max)) # (result, property, value, max))
if not result: if not result:
return result return result
multimembership_criterion_base_category_list = \
self.getMultimembershipCriterionBaseCategoryList()
membership_criterion_base_category_list = \
self.getMembershipCriterionBaseCategoryList()
tested_base_category = {}
# LOG('predicate test', 0,
# 'categories will be tested in multi %s single %s as %s' % \
# (multimembership_criterion_base_category_list,
# membership_criterion_base_category_list,
# self.getMembershipCriterionCategoryList()))
# Test category memberships. Enable the read-only transaction cache # Test category memberships. Enable the read-only transaction cache
# because this part is strictly read-only, and context.isMemberOf # because this part is strictly read-only, and context.isMemberOf
# is very expensive when the category list has many items. # is very expensive when the category list has many items.
if isMemberOf is None: membership_criterion_category_list = self.getMembershipCriterionCategoryList()
isMemberOf = context._getCategoryTool().isMemberOf if membership_criterion_category_list:
with readOnlyTransactionCache(): multimembership_criterion_base_category_list = \
for c in self.getMembershipCriterionCategoryList(): self.getMultimembershipCriterionBaseCategoryList()
bc = c.split('/', 1)[0] membership_criterion_base_category_list = \
if tested_base_category_list is None or bc in tested_base_category_list: self.getMembershipCriterionBaseCategoryList()
if bc in multimembership_criterion_base_category_list: tested_base_category = {}
if not isMemberOf(context, c, strict_membership=strict_membership): # LOG('predicate test', 0,
return 0 # 'categories will be tested in multi %s single %s as %s' % \
elif bc in membership_criterion_base_category_list and \ # (multimembership_criterion_base_category_list,
not tested_base_category.get(bc): # membership_criterion_base_category_list,
tested_base_category[bc] = \ # self.getMembershipCriterionCategoryList()))
isMemberOf(context, c, strict_membership=strict_membership) if isMemberOf is None:
if 0 in tested_base_category.itervalues(): isMemberOf = context._getCategoryTool().isMemberOf
return 0 with readOnlyTransactionCache():
for c in membership_criterion_category_list:
bc = c.split('/', 1)[0]
if tested_base_category_list is None or bc in tested_base_category_list:
if bc in multimembership_criterion_base_category_list:
if not isMemberOf(context, c, strict_membership=strict_membership):
return 0
elif bc in membership_criterion_base_category_list and \
not tested_base_category.get(bc):
tested_base_category[bc] = \
isMemberOf(context, c, strict_membership=strict_membership)
if 0 in tested_base_category.itervalues():
return 0
# Test method calls # Test method calls
test_method_id_list = self.getTestMethodIdList() test_method_id_list = self.getTestMethodIdList()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment