From 847139f91296163fefdc1fd0fc318bc4c75513fa Mon Sep 17 00:00:00 2001 From: Vincent Pelletier <vincent@nexedi.com> Date: Tue, 28 Aug 2007 12:08:09 +0000 Subject: [PATCH] Move simulation, omition, reserved simulation and reserved omition query generation from _generateKeywordDict to _generateSQLKeywordDictFromKeywordDict. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@15866 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5/Tool/SimulationTool.py | 63 ++++++++++++++++++----------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/product/ERP5/Tool/SimulationTool.py b/product/ERP5/Tool/SimulationTool.py index 876dc2db55..421cd67779 100644 --- a/product/ERP5/Tool/SimulationTool.py +++ b/product/ERP5/Tool/SimulationTool.py @@ -376,6 +376,34 @@ class SimulationTool(BaseTool): column_value_dict = new_kw.pop('column_value_dict', {}) for key, value in column_value_dict.iteritems(): new_kw['%s.%s' % (table, key)] = value + # Simulation states matched with input and output omission + def joinQueriesIfNeeded(query_a, query_b, operator): + if None not in (query_a, query_b): + return ComplexQuery(query_a, query_b, operator=operator) + elif query_a is not None: + return query_a + return query_b + def getSimulationQuery(simulation_dict, omit_dict): + simulation_query = self._buildSimulationStateQuery( + simulation_state_dict=simulation_dict) + omit_query = self._buildOmitQuery(query_table=table, + omit_dict=omit_dict) + return joinQueriesIfNeeded(query_a=simulation_query, + query_b=omit_query, operator='AND') + regular_query = getSimulationQuery(new_kw.pop('simulation_dict', {}), + new_kw.pop('omit_dict', {})) + reserved_kw = new_kw.pop('reserved_kw', None) + if reserved_kw is not None: + reserved_query = getSimulationQuery( + reserved_kw.pop('simulation_dict', {}), + reserved_kw.pop('omit_dict', {})) + simulation_query = joinQueriesIfNeeded(query_a=regular_query, + query_b=reserved_query, + operator='OR') + else: + simulation_query = regular_query + if simulation_query is not None: + new_kw['query'] = simulation_query sql_kw.update(self.portal_catalog.buildSQLQuery(**new_kw)) return sql_kw @@ -568,43 +596,30 @@ class SimulationTool(BaseTool): #if len(variation_category_uid_list) : # new_kw['variationCategory'] = variation_category_uid_list - simulation_query = self._getSimulationStateQuery( + simulation_dict = self._getSimulationStateDict( simulation_state=simulation_state, omit_transit=omit_transit, input_simulation_state=input_simulation_state, output_simulation_state=output_simulation_state, transit_simulation_state=transit_simulation_state, strict_simulation_state=strict_simulation_state) - if omit_input or omit_output: - omit_query = self._getOmitQuery(omit_input=omit_input, - omit_output=omit_output, - query_table=table) - if simulation_query is not None: - simulation_query = ComplexQuery(simulation_query, omit_query, operator='AND') - else: - simulation_query = omit_query + new_kw['simulation_dict'] = simulation_dict + omit_dict = self._getOmitDict(omit_input=omit_input, + omit_output=omit_output) + new_kw['omit_dict'] = omit_dict if reserved_kw is not None: if not isinstance(reserved_kw, dict): # Not a dict when taken from URL, so, cast is needed # to make pop method available reserved_kw = dict(reserved_kw) + new_reserved_kw = {} reserved_omit_input = reserved_kw.pop('omit_input',0) reserved_omit_output = reserved_kw.pop('omit_output',0) - reserved_omit_query = self._getOmitQuery(query_table=table, - omit_input=reserved_omit_input, - omit_output=reserved_omit_output) - reserved_query = self._getSimulationStateQuery(**reserved_kw) - if reserved_omit_query is not None: - reserved_query = ComplexQuery(reserved_omit_query,reserved_query, - operator='AND') - if simulation_query is not None: - simulation_query = ComplexQuery(simulation_query, reserved_query, - operator='OR') - else: - simulation_query = reserved_query - if simulation_query is not None: - new_kw['query'] = simulation_query - + new_reserved_kw['omit_dict'] = self._getOmitDict( + omit_input=reserved_omit_input, + omit_output=reserved_omit_output) + new_reserved_kw['simulation_dict'] = self._getSimulationStateDict(**reserved_kw) + new_kw['reserved_kw'] = new_reserved_kw # It is necessary to use here another SQL query (or at least a subquery) # to get _DISTINCT_ uid from predicate_category table. # Otherwise, by using a where_expression, cells which fit conditions -- 2.30.9