Я не понимаю нормальную польскую нотацию (NPN или PN). Как построить сложный домен в Odoo?

Может ли кто-нибудь перевести следующую польскую нотацию на свой SQL-аналог:

['|', '&', ('is_company','=', True),('parent_id', '=', False),('company_name', '!=', False),('company_name', '!=', '')]

Мое предположение:

is_company = True OR parent_id = False AND company_name <> False AND company_name <> ''

Я не мог понять концепцию этой записи, как бы я ни пытался ее понять. Пожалуйста помоги.

ОБНОВИТЬ

Я пытался расширить обозначение выше, чтобы быть:

((is_company = True AND parent_id = False) OR company_name <> False) AND company_name <> '' AND customer_type_id <> False

1 ответ

Решение

Я полностью согласен с вами, каждый раз, когда мне приходится создавать сложную область, используя такую ​​польскую нотацию, мне приходится ломать голову, чтобы управлять ею.

Я думаю, что домен, который вы ищете, это:

['&amp;', '|', '&amp;', ('is_company', '=', True), ('parent_id', '=', False), ('company_name', '!=', False), '&amp;', ('company_name', '!=', ''), ('customer_type_id', '!=', False)]

Я создал метод для получения этих сложных доменов, и он работает:

Сначала я пишу письмо вместо каждого условия:

A => is_company = True => ('is_company', '=', True)
B => parent_id = False => ('parent_id', '=', False)
C => company_name <> False => ('company_name', '!=', False)
D => company_name <> '' => ('company_name', '!=', '')
E => customer_type_id <> False => ('customer_type_id', '!=', False)

Затем создайте нужное вам выражение, используя только буквы и стандартные операторы, забудьте о польской нотации и условиях:

Step 0. => ((A and B) or C) and D and E

Затем сгруппируйте операции, которые вы должны выполнить первыми (не обращайте внимания на отсутствующие операторы на данный момент):

Step 1. => ((A and B) or C) and D and E
Step 2. => (AB or C) and D and E
Step 3. => ABC and D and E
Step 4. => ABC and DE

Теперь у нас есть только оператор, давайте начнем его декомпозицию (и переместим оператор влево от каждой пары условий), следуя в обратном порядке, в котором вы сгруппировали операции (например, с шага 3 до 4 вы сгруппировали DE, так что теперь, с шага 4 до 3, разложим DE и переместим его оператор влево):

Step 4. => and ABC DE
Step 3. => and ABC and D E
Step 2. => and or AB C and D E
Step 1. => and or and A B C and D E

Теперь измените операторы и добавьте запятые, кавычки и скобки:

['&amp;', '|', '&amp;', A, B, C, '&amp;', D, E]

Наконец, замените буквы условиями, и там у вас есть свой домен. Было бы лучше объяснить это лицом к лицу, но, возможно, вы смогли понять все.

Примечание: я не удаляю &amp; операторы (несмотря на то, что вы их не пишете, Odoo должен принимать их по умолчанию), потому что мой опыт таков, что с самыми большими доменами, если бы я не писал &amp;домен не работал. Я предполагаю, что это произошло, когда было много вложенных условий, но я советую всегда писать их.

Другие вопросы по тегам