def test_40_negating_long_expression(self): source = ['!','&',('user_id','=',4),('partner_id','in',[1,2])] expect = ['|',('user_id','!=',4),('partner_id','not in',[1,2])] self.assertEqual(expression.distribute_not(source), expect, "distribute_not on expression applied wrongly") pos_leaves = [[('a', 'in', [])], [('d', '!=', 3)]] neg_leaves = [[('a', 'not in', [])], [('d', '=', 3)]] source = expression.OR([expression.AND(pos_leaves)] * 1000) expect = source self.assertEqual(expression.distribute_not(source), expect, "distribute_not on long expression without negation operator should not alter it") source = ['!'] + source expect = expression.AND([expression.OR(neg_leaves)] * 1000) self.assertEqual(expression.distribute_not(source), expect, "distribute_not on long expression applied wrongly")
def extended_init(self, cr, uid, exp, table, context): self._unaccent = expression.get_unaccent_wrapper(cr) self.joins = [] self.root_model = table # normalize and prepare the expression for parsing self.expression = expression.distribute_not( expression.normalize_domain(exp)) # look for real lang from context before parse parse_ctx = context.copy() if parse_ctx.get('lang', False) and exists_short_code(cr): cr.execute("select code from res_lang where short_code = '%s'" % parse_ctx['lang']) res = cr.fetchall() if res and res[0]: parse_ctx.update({'lang': res[0][0]}) # parse the domain expression self.parse(cr, uid, context=parse_ctx)
def __init__(self, cr, uid, exp, table, context): """ Initialize expression object and automatically parse the expression right after initialization. :param exp: expression (using domain ('foo', '=', 'bar' format)) :param table: root model :attr list result: list that will hold the result of the parsing as a list of ExtendedLeaf :attr list joins: list of join conditions, such as (res_country_state."id" = res_partner."state_id") :attr root_model: base model for the query :attr list expression: the domain expression, that will be normalized and prepared """ self._unaccent = get_unaccent_wrapper(cr) self.joins = [] self.root_model = table # normalize and prepare the expression for parsing self.expression = distribute_not(normalize_domain(exp)) # Keep a dict of table aliases to ensure that no alias # of lenght > 64 char are created self.table_aliases = {} # aliases are of the following form # a1, a2, a3 ... a10 ... a999 ... self.next_alias_int = 1 self.cr = cr self.uid = uid self.context = context # parse the domain expression self.parse(cr, uid, context=context)