When we use the `|` (or) version of this rule the ORM generates two
sub-queries when checking the company. This causes sub-optimal and in
some cases really bad planning for the queries and thus PG takes hours
to complete them.
Example (formatted):
```sql
SELECT "mrp_routing_workcenter".id
FROM "mrp_routing_workcenter"
LEFT JOIN "mrp_bom" AS "mrp_routing_workcenter__bom_id"
ON "mrp_routing_workcenter"."bom_id" = "mrp_routing_workcenter__bom_id"."id"
WHERE "mrp_routing_workcenter"."workcenter_id" in (1)
AND ( ("mrp_routing_workcenter"."bom_id" in (
SELECT "mrp_bom".id
FROM "mrp_bom"
WHERE ("mrp_bom"."company_id" in (1))
)
)
OR ("mrp_routing_workcenter"."bom_id" in (
SELECT "mrp_bom".id
FROM "mrp_bom"
WHERE "mrp_bom"."company_id" IS NULL
)
)
)
ORDER BY "mrp_routing_workcenter__bom_id"."sequence",
"mrp_routing_workcenter__bom_id"."id",
"mrp_routing_workcenter"."sequence",
"mrp_routing_workcenter"."id"
```
If we use the single term version the generated query has only one
sub-query:
```sql
SELECT "mrp_routing_workcenter".id
FROM "mrp_routing_workcenter"
LEFT JOIN "mrp_bom" AS "mrp_routing_workcenter__bom_id"
ON "mrp_routing_workcenter"."bom_id" = "mrp_routing_workcenter__bom_id"."id"
WHERE "mrp_routing_workcenter"."workcenter_id" in (1)
AND ( ("mrp_routing_workcenter"."bom_id" in (
SELECT "mrp_bom".id
FROM "mrp_bom"
WHERE (("mrp_bom"."company_id" in (1))
OR ("mrp_bom"."company_id" IS NULL))
)
)
)
ORDER BY "mrp_routing_workcenter__bom_id"."sequence",
"mrp_routing_workcenter__bom_id"."id",
"mrp_routing_workcenter"."sequence",
"mrp_routing_workcenter"."id"
```
In this version PG is able to produce a better query plan resulting in
better execution times.
Also, the `company_id` field is required on some models, so the "= False" comparison is useless.
closes odoo/odoo#159123
X-original-commit: 1b5c41f36801fb886ec591f29dba42787d698526
Related: odoo/enterprise#59378
Signed-off-by: Christophe Simonis (chs) <chs@odoo.com>
Co-authored-by: Christophe Simonis <chs@odoo.com>
191 lines
8.6 KiB
XML
191 lines
8.6 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<data noupdate="0">
|
|
|
|
<record id="base.module_category_inventory_inventory" model="ir.module.category">
|
|
<field name="description">Helps you manage your inventory and main stock operations: delivery orders, receptions, etc.</field>
|
|
<field name="sequence">4</field>
|
|
</record>
|
|
|
|
<record id="group_stock_multi_locations" model="res.groups">
|
|
<field name="name">Manage Multiple Stock Locations</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_multi_warehouses" model="res.groups">
|
|
<field name="name">Manage Multiple Warehouses</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_user" model="res.groups">
|
|
<field name="name">User</field>
|
|
<field name="category_id" ref="base.module_category_inventory_inventory"/>
|
|
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
|
</record>
|
|
<record id="group_stock_manager" model="res.groups">
|
|
<field name="name">Administrator</field>
|
|
<field name="category_id" ref="base.module_category_inventory_inventory"/>
|
|
<field name="implied_ids" eval="[(4, ref('group_stock_user'))]"/>
|
|
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
|
|
</record>
|
|
|
|
<record id="group_production_lot" model="res.groups">
|
|
<field name="name">Manage Lots / Serial Numbers</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_lot_print_gs1" model="res.groups">
|
|
<field name="name">Print GS1 Barcodes for Lot & Serial Numbers</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_lot_on_delivery_slip" model="res.groups">
|
|
<field name="name">Display Serial & Lot Number in Delivery Slips</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_tracking_lot" model="res.groups">
|
|
<field name="name">Manage Packages</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_adv_location" model="res.groups">
|
|
<field name="name">Manage Push and Pull inventory flows</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_tracking_owner" model="res.groups">
|
|
<field name="name">Manage Different Stock Owners</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_warning_stock" model="res.groups">
|
|
<field name="name">A warning can be set on a partner (Stock)</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_sign_delivery" model="res.groups">
|
|
<field name="name">Require a signature on your delivery orders</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_storage_categories" model="res.groups">
|
|
<field name="name">Manage Storage Categories</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_reception_report" model="res.groups">
|
|
<field name="name">Use Reception Report</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
|
|
<record id="group_stock_picking_wave" model="res.groups">
|
|
<field name="name">Use wave pickings</field>
|
|
<field name="category_id" ref="base.module_category_hidden"/>
|
|
</record>
|
|
</data>
|
|
<data noupdate="1">
|
|
<record id="base.default_user" model="res.users">
|
|
<field name="groups_id" eval="[(4,ref('stock.group_stock_manager'))]"/>
|
|
</record>
|
|
|
|
<!-- multi -->
|
|
<record model="ir.rule" id="stock_picking_rule">
|
|
<field name="name">stock_picking multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.picking')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_picking_type_rule">
|
|
<field name="name">Stock Operation Type multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.picking.type')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id','in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_putaway_rule_rule">
|
|
<field name="name">Stock Operation Type multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.putaway.rule')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id','in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_production_lot_rule">
|
|
<field name="name">Stock Production Lot multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.lot')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id','in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_warehouse_comp_rule">
|
|
<field name="name">Warehouse multi-company</field>
|
|
<field name="model_id" ref="model_stock_warehouse"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_location_comp_rule">
|
|
<field name="name">Location multi-company</field>
|
|
<field name="model_id" ref="model_stock_location"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_move_rule">
|
|
<field name="name">stock_move multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.move')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_move_line_rule">
|
|
<field name="name">stock_move_line multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.move.line')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_quant_rule">
|
|
<field name="name">stock_quant multi-company</field>
|
|
<field name="model_id" ref="model_stock_quant"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_warehouse_orderpoint_rule">
|
|
<field name="name">stock_warehouse.orderpoint multi-company</field>
|
|
<field name="model_id" search="[('model','=','stock.warehouse.orderpoint')]" model="ir.model"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="product_pulled_flow_comp_rule">
|
|
<field name="name">product_pulled_flow multi-company</field>
|
|
<field name="model_id" ref="model_stock_rule"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_location_route_comp_rule">
|
|
<field name="name">stock_route multi-company</field>
|
|
<field name="model_id" ref="model_stock_route"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_quant_package_comp_rule">
|
|
<field name="name">stock_quant_package multi-company</field>
|
|
<field name="model_id" ref="model_stock_quant_package"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_scrap_company_rule">
|
|
<field name="name">stock_scrap_company multi-company</field>
|
|
<field name="model_id" ref="model_stock_scrap"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="report_stock_quantity_flow_comp_rule">
|
|
<field name="name">report_stock_quantity_flow multi-company</field>
|
|
<field name="model_id" ref="model_report_stock_quantity"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
|
|
</record>
|
|
|
|
<record model="ir.rule" id="stock_storage_category_rule">
|
|
<field name="name">stock_storage_category multi-company</field>
|
|
<field name="model_id" ref="model_stock_storage_category"/>
|
|
<field name="domain_force">[('company_id', 'in', company_ids + [False])]</field>
|
|
</record>
|
|
|
|
</data>
|
|
</odoo>
|