[Erp5-report] r35952 kazuhiko - /erp5/trunk/products/ERP5/Document/Predicate.py

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Jun 3 15:35:00 CEST 2010


Author: kazuhiko
Date: Thu Jun  3 15:34:52 2010
New Revision: 35952

URL: http://svn.erp5.org?rev=35952&view=rev
Log:
return False immediately in Predicate.test() once any check fails to reduce further needless calculations.

Modified:
    erp5/trunk/products/ERP5/Document/Predicate.py

Modified: erp5/trunk/products/ERP5/Document/Predicate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Predicate.py?rev=35952&r1=35951&r2=35952&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Predicate.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/Predicate.py [utf8] Thu Jun  3 15:34:52 2010
@@ -107,24 +107,30 @@
 #        (self.getRelativeUrl(), context.getRelativeUrl()))
     for property, value in self._identity_criterion.iteritems():
       if isinstance(value, (list, tuple)):
-        result = result and (context.getProperty(property) in value)
+        result = context.getProperty(property) in value
       else:
-        result = result and (context.getProperty(property) == value)
+        result = context.getProperty(property) == value
 #      LOG('predicate test', 0,
 #          '%s after prop %s : %s == %s' % \
 #          (result, property, context.getProperty(property), value))
+      if not result:
+        return result
     for property, (min, max) in self._range_criterion.iteritems():
       value = context.getProperty(property)
       if min is not None:
-        result = result and (value >= min)
+        result = value >= min
 #        LOG('predicate test', 0,
 #            '%s after prop %s : %s >= %s' % \
 #            (result, property, value, min))
+        if not result:
+          return result
       if max is not None:
-        result = result and (value < max)
+        result = value < max
 #        LOG('predicate test', 0,
 #            '%s after prop %s : %s < %s' % \
 #            (result, property, value, max))
+        if not result:
+          return result
     multimembership_criterion_base_category_list = \
         self.getMultimembershipCriterionBaseCategoryList()
     membership_criterion_base_category_list = \
@@ -169,6 +175,8 @@
           tested_base_category[bc] = tested_base_category[bc] or \
                                      context.isMemberOf(c,
                                          strict_membership=strict_membership)
+        if tested_base_category.get(bc, 1) == 0:
+          break
     finally:
       if not enabled:
         disableReadOnlyTransactionCache(self)
@@ -176,17 +184,19 @@
 #        LOG('predicate test', 0,
 #            '%s after single membership to %s' % \
 #            (tested_base_category[bc], c))
-    result = result and (0 not in tested_base_category.values())
+    result = 0 not in tested_base_category.values()
 #    LOG('predicate test', 0,
 #        '%s after category %s ' % (result, tested_base_category.items()))
+    if not result:
+      return result
     # Test method calls
     test_method_id_list = self.getTestMethodIdList()
     if test_method_id_list is not None :
       for test_method_id in test_method_id_list :
-        if (test_method_id is not None) and result:
+        if test_method_id is not None:
           method = getattr(context,test_method_id)
           try:
-            result = result and method(self)
+            result = method(self)
           except TypeError:
             if method.func_code.co_argcount != isinstance(method, MethodType):
               raise
@@ -194,9 +204,11 @@
             warn('Predicate %s uses an old-style method (%s) that does not'
                  ' take the predicate as argument' % (
                self.getRelativeUrl(), method.__name__), DeprecationWarning)
-            result = result and method()
-#        LOG('predicate test', 0,
-#            '%s after method %s ' % (result, test_method_id))
+            result = method()
+#          LOG('predicate test', 0,
+#              '%s after method %s ' % (result, test_method_id))
+          if not result:
+            return result
     return result
 
   @UnrestrictedMethod




More information about the Erp5-report mailing list