[Erp5-report] r9708 - /erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Sep 6 17:25:05 CEST 2006
Author: vincent
Date: Wed Sep 6 17:25:03 2006
New Revision: 9708
URL: http://svn.erp5.org?rev=9708&view=rev
Log:
Cache result of functions getColumnIds and getColumnMap.
Replace += on lists by explicit appends.
Replace type checking by isinstance.
Breaks one-liner "if ... : ..." in 2 lines.
Modified:
erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
Modified: erp5/trunk/products/ZSQLCatalog/SQLCatalog.py
URL: http://svn.erp5.org/erp5/trunk/products/ZSQLCatalog/SQLCatalog.py?rev=9708&r1=9707&r2=9708&view=diff
==============================================================================
--- erp5/trunk/products/ZSQLCatalog/SQLCatalog.py (original)
+++ erp5/trunk/products/ZSQLCatalog/SQLCatalog.py Wed Sep 6 17:25:03 2006
@@ -60,10 +60,18 @@
psyco = None
try:
- from Products.ERP5Type.Cache import enableReadOnlyTransactionCache, disableReadOnlyTransactionCache
+ from Products.ERP5Type.Cache import enableReadOnlyTransactionCache, disableReadOnlyTransactionCache, CachingMethod
except ImportError:
def doNothing(context):
pass
+ class CachingMethod:
+ """
+ Dummy CachingMethod class.
+ """
+ def __init__(self, callable, **kw):
+ self.function = callable
+ def __call__(*opts, **kw):
+ return self.function(*opts, **kw)
enableReadOnlyTransactionCache = doNothing
disableReadOnlyTransactionCache = doNothing
@@ -476,14 +484,14 @@
for property in property_list:
property_id = property[0]
value = property[1]
- if type(value) in (type(''), type(u'')):
+ if isinstance(value, basestring):
f.write(' <property id=%s type="str">%s</property>\n' % (quoteattr(property_id), escape(value)))
- elif type(value) in (type(()), type([])):
+ elif isinstance(value, (tuple, list)):
f.write(' <property id=%s type="tuple">\n' % quoteattr(property_id))
# Sort for easy diff
item_list = []
for item in value:
- if type(item) in (type(""), type(u"")):
+ if isinstance(item, basestring):
item_list.append(item)
item_list.sort()
for item in item_list:
@@ -730,41 +738,41 @@
"""
Calls the show column method and returns dictionnary of
Field Ids
-
- XXX This should be cached
- """
- keys = {}
- for table in self.getCatalogSearchTableIds():
- field_list = self._getCatalogSchema(table=table)
- for field in field_list:
- keys[field] = 1
- keys['%s.%s' % (table, field)] = 1 # Is this inconsistent ?
- for related in self.getSqlCatalogRelatedKeyList():
- related_tuple = related.split('|')
- related_key = related_tuple[0].strip()
- keys[related_key] = 1
- keys = keys.keys()
- keys.sort()
- return keys
+ """
+ def _getColumnIds(self):
+ keys = {}
+ for table in self.getCatalogSearchTableIds():
+ field_list = self._getCatalogSchema(table=table)
+ for field in field_list:
+ keys[field] = 1
+ keys['%s.%s' % (table, field)] = 1 # Is this inconsistent ?
+ for related in self.getSqlCatalogRelatedKeyList():
+ related_tuple = related.split('|')
+ related_key = related_tuple[0].strip()
+ keys[related_key] = 1
+ keys = keys.keys()
+ keys.sort()
+ return keys
+ return CachingMethod(_getColumnIds, id='SQLCatalog.getColumnIds', cache_duration=None)(self)
def getColumnMap(self):
"""
Calls the show column method and returns dictionnary of
Field Ids
-
- XXX This should be cached
- """
- keys = {}
- for table in self.getCatalogSearchTableIds():
- field_list = self._getCatalogSchema(table=table)
- for field in field_list:
- key = field
- if not keys.has_key(key): keys[key] = []
- keys[key].append(table)
- key = '%s.%s' % (table, key)
- if not keys.has_key(key): keys[key] = []
- keys[key].append(table) # Is this inconsistent ?
- return keys
+ """
+ def _getColumnMap(self):
+ keys = {}
+ for table in self.getCatalogSearchTableIds():
+ field_list = self._getCatalogSchema(table=table)
+ for field in field_list:
+ key = field
+ if not keys.has_key(key): keys[key] = []
+ keys[key].append(table)
+ key = '%s.%s' % (table, key)
+ if not keys.has_key(key): keys[key] = []
+ keys[key].append(table) # Is this inconsistent ?
+ return keys
+ return CachingMethod(_getColumnMap, id='SQLCatalog.getColumnMap', cache_duration=None)(self)
def getResultColumnIds(self):
"""
@@ -1335,14 +1343,14 @@
"""
ids={}
have_id=ids.has_key
- StringType=type('')
while self is not None:
if hasattr(self, 'objectValues'):
for o in self.objectValues(valid_method_meta_type_list):
if hasattr(o,'id'):
id=o.id
- if type(id) is not StringType: id=id()
+ if not isinstance(id, str):
+ id=id()
if not have_id(id):
if hasattr(o,'title_and_id'): o=o.title_and_id()
else: o=id
@@ -1531,11 +1539,11 @@
# Add table to table dict
from_table_dict[acceptable_key_map[key][0]] = acceptable_key_map[key][0] # We use catalog by default
if as_type == 'int':
- key = 'CAST(' + key + ' AS SIGNED)'
+ key = 'CAST(%s AS SIGNED)' % key
if so in ('descending', 'reverse', 'DESC'):
- new_sort_index += ['%s DESC' % key]
+ new_sort_index.append('%s DESC' % key)
else:
- new_sort_index += ['%s' % key]
+ new_sort_index.append('%s' % key)
sort_index = join(new_sort_index,',')
sort_on = str(sort_index)
except ConflictError:
@@ -1550,8 +1558,10 @@
for k, v in kw.items():
if k.endswith('_usage'):
new_k = k[0:-usage_len]
- if not new_kw.has_key(new_k): new_kw[new_k] = {}
- if type(new_kw[new_k]) is not type({}): new_kw[new_k] = {'query': new_kw[new_k]}
+ if not new_kw.has_key(new_k):
+ new_kw[new_k] = {}
+ if not isinstance(new_kw[new_k], dict):
+ new_kw[new_k] = {'query': new_kw[new_k]}
split_v = v.split(':')
new_kw[new_k] = {split_v[0]: split_v[1]}
else:
@@ -1590,7 +1600,7 @@
# query_table specifies what table name should be used by default
elif query_table and \
'%s.%s' % (query_table, key) in acceptable_keys:
- key = query_table + '.' + key
+ key = '%s.%s' % (query_table, key)
elif key == 'uid':
# uid is always ambiguous so we can only change it here
key = 'catalog.uid'
@@ -1602,22 +1612,22 @@
value = self._quoteSQLString(value)
if value != '' or not ignore_empty_string:
if '%' in value:
- where_expression += ["%s LIKE '%s'" % (key, value)]
+ where_expression.append("%s LIKE '%s'" % (key, value))
elif value.startswith('='):
- where_expression += ["%s = '%s'" % (key, value[1:])]
+ where_expression.append("%s = '%s'" % (key, value[1:]))
elif value.startswith('>='):
- where_expression += ["%s >= '%s'" % (key, value[2:])]
+ where_expression.append("%s >= '%s'" % (key, value[2:]))
elif value.startswith('<='):
- where_expression += ["%s <= '%s'" % (key, value[2:])]
+ where_expression.append("%s <= '%s'" % (key, value[2:]))
elif value.startswith('>'):
- where_expression += ["%s > '%s'" % (key, value[1:])]
+ where_expression.append("%s > '%s'" % (key, value[1:]))
elif value.startswith('<'):
- where_expression += ["%s < '%s'" % (key, value[1:])]
+ where_expression.append("%s < '%s'" % (key, value[1:]))
elif value.startswith('!='):
- where_expression += ["%s != '%s'" % (key, value[2:])]
+ where_expression.append("%s != '%s'" % (key, value[2:]))
elif key in keyword_search_keys:
# We must add % in the request to simulate the catalog
- where_expression += ["%s LIKE '%%%s%%'" % (key, value)]
+ where_expression.append("%s LIKE '%%%s%%'" % (key, value))
elif key in full_text_search_keys:
# We must add % in the request to simulate the catalog
# we first check if there is a special search_mode for this key
@@ -1631,14 +1641,14 @@
if search_mode is not None:
search_mode=search_mode.lower()
mode = full_text_search_modes.get(search_mode,'')
- where_expression += ["MATCH %s AGAINST ('%s' %s)" % (key, value, mode)]
+ where_expression.append("MATCH %s AGAINST ('%s' %s)" % (key, value, mode))
# we return relevance as Table_Key_relevance
- select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_'))]
+ select_expression.append("MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_')))
# and for simplicity as Key_relevance
if '.' in key:
- select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1])]
+ select_expression.append("MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1]))
else:
- where_expression += ["%s = '%s'" % (key, value)]
+ where_expression.append("%s = '%s'" % (key, value))
elif isinstance(value, (list, tuple)):
# We have to create an OR from tuple or list
query_item = []
@@ -1646,17 +1656,16 @@
if value_item != '' or not ignore_empty_string:
# we consider empty string as Non Significant
# also for lists
- if type(value_item) in (type(1), type(1.0),
- type(1991643034L)):
- query_item += ["%s = %s" % (key, value_item)]
+ if isinstance(value_item, (int, float, long)):
+ query_item.append("%s = %s" % (key, value_item))
else:
# For security.
value_item = self._quoteSQLString(value_item)
if '%' in value_item:
- query_item += ["%s LIKE '%s'" % (key, value_item)]
+ query_item.append("%s LIKE '%s'" % (key, value_item))
elif key in keyword_search_keys:
# We must add % in the request to simulate the catalog
- query_item += ["%s LIKE '%%%s%%'" % (key, value_item)]
+ query_item.append("%s LIKE '%%%s%%'" % (key, value_item))
elif key in full_text_search_keys:
# We must add % in the request to simulate the catalog
# we first check if there is a special search_mode for this key
@@ -1670,16 +1679,16 @@
if search_mode is not None:
search_mode=search_mode.lower()
mode = full_text_search_modes.get(search_mode, '')
- query_item += ["MATCH %s AGAINST ('%s')" % (key, value, mode)]
+ query_item.append("MATCH %s AGAINST ('%s')" % (key, value, mode))
# we return relevance as Table_Key_relevance
- select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_'))]
+ select_expression.append("MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.replace('.','_')))
# and for simplicity as Key_relevance
if '.' in key:
- select_expression += ["MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1])]
+ select_expression.append("MATCH %s AGAINST ('%s' %s) AS %s_relevance" % (key, value, mode,key.split('.')[1]))
else:
- query_item += ["%s = '%s'" % (key, value_item)]
+ query_item.append("%s = '%s'" % (key, value_item))
if len(query_item) > 0:
- where_expression += ['(%s)' % join(query_item, ' OR ')]
+ where_expression.append('(%s)' % join(query_item, ' OR '))
elif isinstance(value, dict):
# We are in the case of a complex query
query_item = []
@@ -1693,22 +1702,22 @@
query_min = self._quoteSQLString(min(query_value))
query_max = self._quoteSQLString(max(query_value))
if range_value == 'min' :
- query_item += ["%s >= '%s'" % (key, query_min) ]
+ query_item.append("%s >= '%s'" % (key, query_min))
elif range_value == 'max' :
- query_item += ["%s < '%s'" % (key, query_max) ]
+ query_item.append("%s < '%s'" % (key, query_max))
elif range_value == 'minmax' :
- query_item += ["%s >= '%s' and %s < '%s'" % (key, query_min, key, query_max) ]
+ query_item.append("%s >= '%s' and %s < '%s'" % (key, query_min, key, query_max))
elif range_value == 'minngt' :
- query_item += ["%s >= '%s' and %s <= '%s'" % (key, query_min, key, query_max) ]
+ query_item.append("%s >= '%s' and %s <= '%s'" % (key, query_min, key, query_max))
elif range_value == 'ngt' :
- query_item += ["%s <= '%s'" % (key, query_max) ]
+ query_item.append("%s <= '%s'" % (key, query_max))
else :
for query_value_item in query_value :
- query_item += ["%s = '%s'" % (key, self._quoteSQLString(query_value_item))]
+ query_item.append("%s = '%s'" % (key, self._quoteSQLString(query_value_item)))
if len(query_item) > 0:
- where_expression += ['(%s)' % join(query_item, ' %s ' % operator_value)]
+ where_expression.append('(%s)' % join(query_item, ' %s ' % operator_value))
else:
- where_expression += ["%s = %s" % (key, self._quoteSQLString(value))]
+ where_expression.append("%s = %s" % (key, self._quoteSQLString(value)))
elif key in topic_search_keys:
# ERP5 CPS compatibility
topic_operator = 'or'
@@ -1731,10 +1740,10 @@
topic_key = '%s.%s' % (query_table, topic_key)
# Add table to table dict
from_table_dict[acceptable_key_map[topic_key][0]] = acceptable_key_map[topic_key][0] # We use catalog by default
- query_item += ["%s = 1" % topic_key]
+ query_item.append("%s = 1" % topic_key)
# Join
if len(query_item) > 0:
- where_expression += ['(%s)' % join(query_item, ' %s ' % topic_operator)]
+ where_expression.append('(%s)' % join(query_item, ' %s ' % topic_operator))
# Calculate extra where_expression based on required joins
for k, tid in from_table_dict.items():
if k != query_table:
@@ -1886,7 +1895,7 @@
if REQUEST.has_key('%s_type' % id):
list_type = REQUEST['%s_type' % id]
- if type(list_type) is type('a'):
+ if isinstance(list_type, str):
list_type = [list_type]
self.filter_dict[id]['type'] = list_type
else:
More information about the Erp5-report
mailing list