diff --git a/product/ERP5/tests/testDomainTool.py b/product/ERP5/tests/testDomainTool.py
index 80df378d480e211c6152d7fa4de247740f0426bd..a80fddb4fbc7dd22567f158287d569e27c5a467e 100644
--- a/product/ERP5/tests/testDomainTool.py
+++ b/product/ERP5/tests/testDomainTool.py
@@ -56,6 +56,22 @@ class TestDomainTool(TestPredicateMixIn):
     """
     return ('erp5_base','erp5_pdm', 'erp5_trade', 'erp5_apparel')
 
+  def beforeTearDown(self):
+    transaction.abort()
+
+    for system_preference in self.portal.portal_preferences.objectValues(portal_type='System Preference'):
+      if system_preference.getPreferenceState() != 'disabled':
+        system_preference.disable()
+    def deleteAll(module):
+      module.manage_delObjects(ids=list(module.objectIds()))
+    deleteAll(self.portal.organisation_module)
+    deleteAll(self.portal.product_module)
+    deleteAll(self.portal.sale_supply_module)
+    deleteAll(self.portal.sale_order_module)
+
+    transaction.commit()
+    self.tic()
+
   def getPortalId(self):
     return self.getPortal().getId()
 
@@ -431,6 +447,249 @@ class TestDomainTool(TestPredicateMixIn):
     # Real test
     self.assertTrue(predicate_one_match not in portal_domains.searchPredicateList(document, test=0))
 
+  def test_07_NonLeftJoinModeOfSearchPredicateList(self, quiet=0, run=run_all_test):
+    if not run: return
+    if not quiet:
+      self.logMessage('Test non-left join mode of searchPredicateList method')
+
+    # Add system preference
+    system_preference = self.portal.portal_preferences.newContent(portal_type='System Preference')
+    system_preference.setPreferredPredicateCategoryList(
+      ['source_section', 'destination_section', 'price_currency'])
+
+    transaction.commit()
+    self.tic()
+
+    # Add sample data
+    jpy = self.portal.currency_module.newContent(portal_type='Currency',
+                                                 title='JPY',
+                                                 reference='JPY')
+    jpy.validate()
+
+    euro = self.portal.currency_module.newContent(portal_type='Currency',
+                                                 title='EURO',
+                                                 reference='EUR')
+    euro.validate()
+
+    organisation_module = self.portal.organisation_module
+    company= organisation_module.newContent(portal_type='Organisation',
+                                            title='Company')
+    shop = organisation_module.newContent(portal_type='Organisation',
+                                          title='Shop')
+    supplier = organisation_module.newContent(portal_type='Organisation',
+                                              title='Supplier')
+
+    product_module = self.portal.product_module
+    product1 = product_module.newContent(portal_type='Product',
+                                         title='Product1')
+    product2 = product_module.newContent(portal_type='Product',
+                                         title='Product2')
+
+    supply_module = self.portal.sale_supply_module
+    supply1 = supply_module.newContent(portal_type='Sale Supply',
+                                       title='Supply1',
+                                       source_section_value=supplier,
+                                       destination_section_value=shop,
+                                       price_currency_value=jpy)
+    supply1.newContent(portal_type='Sale Supply Line',
+                       resource_value=product1)
+    supply1.newContent(portal_type='Sale Supply Line',
+                       resource_value=product2)
+    supply2 = supply_module.newContent(portal_type='Sale Supply',
+                                       title='Supply2',
+                                       source_section_value=supplier,
+                                       destination_section_value=company,
+                                       price_currency_value=jpy)
+    supply2.newContent(portal_type='Sale Supply Line',
+                       resource_value=product2)
+    supply3 = supply_module.newContent(portal_type='Sale Supply',
+                                       title='Supply3',
+                                       source_section_value=supplier,
+                                       price_currency_value=euro)
+    supply3.newContent(portal_type='Sale Supply Line',
+                       resource_value=product1)
+
+    order = self.portal.sale_order_module.newContent(
+      portal_type='Sale Order',
+      source_section_value=supplier,
+      destination_section_value=shop,
+      price_currency_value=jpy)
+    order_line = order.newContent(portal_type='Sale Order Line',
+                                  resource_value=product1)
+
+    transaction.commit()
+    self.tic()
+
+    # Test
+    # Check traditional left join mode
+    domain_tool = self.portal.portal_domains
+    searchPredicateList = domain_tool.searchPredicateList
+    self.assertEqual(len(
+      searchPredicateList(order_line,
+                          portal_type='Sale Supply Line')),
+                     1)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section'])),
+                     4)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section'])),
+                     3)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'])),
+                     2)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency', 'resource'])),
+                     1)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency', 'resource'],
+      src__=1))
+    # if wrong base categories are passed, then nothing is matched
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'])),
+                     0)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'],
+      src__=1))
+
+    # Check non-left join mode
+    # Enable system preference and reindex all
+    system_preference.enable()
+    transaction.commit()
+    self.tic()
+    self.portal.ERP5Site_reindexAll()
+    transaction.commit()
+    self.tic()
+
+    # if tested_base_category_list is not passed, then left join mode is
+    # still used.
+    self.assertEqual(len(
+      searchPredicateList(order_line,
+                          portal_type='Sale Supply Line')),
+                     1)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      src__=1))
+
+    
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section'])),
+                     4)
+    self.assert_(not 'LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section'])),
+                     3)
+    self.assert_(not 'LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'])),
+                     2)
+    self.assert_(not 'LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency'],
+      src__=1))
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency', 'resource'])),
+                     1)
+    # resource is not in preferred predicate category list, so left join
+    # is used
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['source_section', 'destination_section',
+                                 'price_currency', 'resource'],
+      src__=1))
+    # if wrong base categories are passed, then nothing is matched
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'])),
+                     0)
+    self.assert_('LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'],
+      src__=1))
+    # add WAAA and BOOO to preference, this enables non-left join mode
+    system_preference.setPreferredPredicateCategoryList(
+      ['source_section', 'destination_section', 'price_currency',
+       'WAAA', 'BOOO'])
+    self.portal.portal_caches.clearAllCache()
+    transaction.commit()
+    self.tic()
+    self.portal.ERP5Site_reindexAll()
+    transaction.commit()
+    self.tic()
+    self.assertEqual(len(searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'])),
+                     0)
+    self.assert_(not 'LEFT JOIN' in searchPredicateList(
+      order_line,
+      portal_type='Sale Supply Line',
+      tested_base_category_list=['WAAA', 'BOOO'],
+      src__=1))
+
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestDomainTool))