issue with normalize function

Bug #916380 reported by Cuong

This bug report was converted into a question: question #184864: Using OpenERP domain operators.

6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Odoo Server (MOVED TO GITHUB)
Invalid
Undecided
Unassigned

Bug Description

Hi,

I'm testing with openerp server trunk 6.1rc1, rev 3963.
My code is like this:
===
ids = self.search(cr, uid, ['|', ('from_pty_id', 'in', (1, 2)), '|', ('to_pty_id', 'in', (3, 4)), '|', ('pty_rel_tye_id', 'in', (5, 6))], limit=limit, context=context)
===

I face an assertion as below
===
File "/usr/local/lib/python2.7/dist-packages/openerp-6.1rc1-py2.7.egg/openerp/osv/expression.py", line 184, in normalize
    assert expected == 0
===

I checked this file, and found that the function logic may be cracked when encountering the above domain arguments. expected variable at the end of the loop equals 1. This makes the above assertion while the above search statement is right.

Thanks,

Revision history for this message
Olivier Dony (Odoo) (odo-openerp) wrote :

(This is a question on how to properly use OpenERP domains operators, so turning it into a question)

Changed in openobject-server:
status: New → Invalid
Revision history for this message
Olivier Dony (Odoo) (odo-openerp) wrote :

For the record, here is the answer I provided on the converted question:

The domain you are passing to search() is not valid, and the assert fails because of that. You need to remember that OpenERP domains uses prefix operators, so the operator must be *before* its operands.
As OR (|) is a binary operator (it takes 2 operands), it should always be used in this form: ['|', A, B]. Here you seem to be using it also as infix operator between the operands: ['|', A, '|', B, '|', C]. which will *not* work.

Here are 2 proper way to OR 3 operands:
   1. [ '|', '|', A, B, C ] <== ((A OR B) OR C)
   2. [ '|', A, '|', B, C ] <== (A OR (B OR C))

Taking the first way, you code should be:
  ids = self.search(cr, uid, ['|', '|', ('from_pty_id', 'in', (1, 2)), ('to_pty_id', 'in', (3, 4)), ('pty_rel_tye_id', 'in', (5, 6))],
                                limit=limit, context=context)

Hope this helps

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Related questions

Remote bug watches

Bug watches keep track of this bug in other bug trackers.