Commit feaa3b7c authored by Jean-Paul Smets's avatar Jean-Paul Smets

Initial support for domains in predicate


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@5285 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 85072c82
...@@ -30,6 +30,8 @@ from Globals import InitializeClass ...@@ -30,6 +30,8 @@ from Globals import InitializeClass
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from Acquisition import aq_base, aq_inner from Acquisition import aq_base, aq_inner
from Products.CMFCore.utils import getToolByName
from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface from Products.ERP5Type import Permissions, PropertySheet, Constraint, Interface
from Products.ERP5Type.Document.Folder import Folder from Products.ERP5Type.Document.Folder import Folder
from Products.ERP5Type.Document import newTempBase from Products.ERP5Type.Document import newTempBase
...@@ -151,8 +153,9 @@ class Predicate(Folder): ...@@ -151,8 +153,9 @@ class Predicate(Folder):
# XXX Add here additional method calls # XXX Add here additional method calls
return result return result
security.declareProtected( Permissions.AccessContentsInformation, 'asSqlExpression' ) security.declareProtected( Permissions.AccessContentsInformation, 'buildSqlQuery' )
def asSqlExpression(): def buildSqlQuery(self, strict_membership=0, table='category',
join_table='catalog', join_column='uid'):
""" """
A Predicate can be rendered as an SQL expression. This A Predicate can be rendered as an SQL expression. This
can be used to generate SQL requests in reports or in can be used to generate SQL requests in reports or in
...@@ -160,8 +163,75 @@ class Predicate(Folder): ...@@ -160,8 +163,75 @@ class Predicate(Folder):
XXX - This method is not implemented yet XXX - This method is not implemented yet
""" """
pass portal_categories = getToolByName(self, 'portal_categories')
from_table_dict = {}
# First build SQL for membership criteria
# It would be much nicer if all this was handled by the catalog in a central place
membership_dict = {}
for base_category in self.getMembershipCriterionBaseCategoryList():
membership_dict[base_category] = [] # Init dict with valid base categories
for category in self.getMembershipCriterionCategoryList():
base_category = category.split('/')[0] # Retrieve base category
if membership_dict.has_key(base_category):
category_value = portal_categories.resolveCategory(category)
if category_value is not None:
table_alias = "single_%s_%s" % (table, base_category)
from_table_dict[table_alias] = 'category'
membership_dict[base_category].append(category_value.asSqlExpression(
strict_membership=strict_membership,
table=table_alias,
base_category=base_category))
membership_select_list = map(lambda l: '( %s )' % ' OR '.join(l),
membership_dict.values())
# First build SQL for membership criteria
# It would be much nicer if all this was handled by the catalog in a central place
multimembership_dict = {}
for base_category in self.getMultimembershipCriterionBaseCategoryList():
multimembership_dict[base_category] = [] # Init dict with valid base categories
join_count = 0
for category in self.getMembershipCriterionCategoryList():
base_category = category.split('/')[0] # Retrieve base category
if multimembership_dict.has_key(base_category):
category_value = portal_categories.resolveCategory(category)
if category_value is not None:
join_count += 1
table_alias = "multi_%s_%s" % (table, join_count)
from_table_dict[table_alias] = 'category'
multimembership_dict[base_category].append(category_value.asSqlExpression(
strict_membership=strict_membership,
table=table_alias,
base_category=base_category))
multimembership_select_list = map(lambda l: ' AND '.join(l), multimembership_dict.values())
# Build the join where expression
join_select_list = []
for k in from_table_dict.keys():
join_select_list.append('%s.%s = %s.uid' % (join_table, join_column, k))
sql_text = ' AND '.join(join_select_list + membership_select_list +
multimembership_select_list)
# And now build criteria
return { 'from_table_list' : from_table_dict.items(),
'where_expression' : sql_text }
security.declareProtected( Permissions.AccessContentsInformation, 'asSqlExpression' )
def asSqlExpression(self, strict_membership=0, table='category'):
"""
"""
return self.buildSqlQuery(strict_membership=strict_membership, table=table)['where_expression']
security.declareProtected( Permissions.AccessContentsInformation, 'asSqlJoinExpression' )
def asSqlJoinExpression(self, strict_membership=0, table='category', join_table='catalog', join_column='uid'):
"""
"""
table_list = self.buildSqlQuery(strict_membership=strict_membership, table=table)['from_table_list']
sql_text_list = map(lambda (a,b): '%s AS %s' % (b,a), table_list)
return ' , '.join(sql_text_list)
security.declareProtected( Permissions.AccessContentsInformation, 'getCriterionList' ) security.declareProtected( Permissions.AccessContentsInformation, 'getCriterionList' )
def getCriterionList(self, **kw): def getCriterionList(self, **kw):
""" """
...@@ -288,7 +358,7 @@ class Predicate(Folder): ...@@ -288,7 +358,7 @@ class Predicate(Folder):
self.reindexObject() self.reindexObject()
security.declareProtected(Permissions.AccessContentsInformation, 'generatePredicate') security.declareProtected(Permissions.AccessContentsInformation, 'generatePredicate')
def generatePredicate(self,multimembership_criterion_base_category_list=(), def generatePredicate(self, multimembership_criterion_base_category_list=(),
membership_criterion_base_category_list=(), membership_criterion_base_category_list=(),
criterion_property_list=()): criterion_property_list=()):
""" """
...@@ -357,3 +427,9 @@ class Predicate(Folder): ...@@ -357,3 +427,9 @@ class Predicate(Folder):
if script is not None: if script is not None:
return script() return script()
return self return self
def searchPredicate(self, **kw):
"""
Returns a list of documents matching the predicate
"""
pass
\ No newline at end of file
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