[Dbix-class] possible optimization bug in 0.08250

Alexander Hartmaier alexander.hartmaier at t-systems.at
Sun Jun 2 13:55:10 GMT 2013


One of my result classes has a rel ordered by a related column:

__PACKAGE__->has_many(
    "entries",
    "NAC::Model::DBIC::Table::Patch_Interface",
    'fk_patch_request',
    { order_by =3D> 'row_index' },
);

The following code used to sort by entries.row_index but doesn't any more:

my $request =3D $rs->find( $id, { prefetch =3D> [
            'rel_accept',       'rel_req_status',
            'rel_req_customer', 'view_version',
            'entries',
        ],
    });

This is the resulting SQL. It does an order by but on the primary key of th=
e result class:

SELECT me.id_patch_request, me.req_id, me.req_desc, me.req_dn, me.req_name,=
 me.req_email, me.dst_kst_ktr, me.req_datetime, me.accept, me.accept_dateti=
me, me.accept_agent, me.req_status, me.req_status_datetime, me.req_agent, m=
e.agent_comment, me.req_customer, me.req_comment, rel_accept.id_bool_vals, =
rel_accept.bool_val_name, rel_req_status.id_fw_status, rel_req_status.statu=
s_name, rel_req_customer.id_customer, rel_req_customer.customername, rel_re=
q_customer.create_datetime, rel_req_customer.create_user, rel_req_customer.=
update_datetime, rel_req_customer.update_user, view_version.id_patch_reques=
t, view_version.version, entries.fk_patch_request, entries.row_index, entri=
es.hostid, entries.fk_location, entries.rack, entries.fk_patch_conn_type, e=
ntries.fk_ip_net, entries.want_ipv4, entries.ipaddr, entries.want_ipv6, ent=
ries.ipv6, entries.fqdn, entries.cable_id
  FROM patch_request me
  LEFT JOIN bool_vals rel_accept
    ON rel_accept.id_bool_vals =3D me.accept
  JOIN fw_status rel_req_status
    ON rel_req_status.id_fw_status =3D me.req_status
  JOIN customer rel_req_customer
    ON rel_req_customer.id_customer =3D me.req_customer
  JOIN view_patch_request_version view_version
    ON view_version.id_patch_request =3D me.id_patch_request
  LEFT JOIN patch_interface entries
    ON entries.fk_patch_request =3D me.id_patch_request
WHERE me.id_patch_request =3D '9569'
ORDER BY me.id_patch_request

I worked around it by adding the order_by to the calling find:

my $request =3D $rs->find( $id, { prefetch =3D> [
            'rel_accept',       'rel_req_status',
            'rel_req_customer', 'view_version',
            'entries',
        ],
        order_by =3D> 'entries.row_index',
    });

which produces this SQL as expected:

SELECT me.id_patch_request, me.req_id, me.req_desc, me.req_dn, me.req_name,=
 me.req_email, me.dst_kst_ktr, me.req_datetime, me.accept, me.accept_dateti=
me, me.accept_agent, me.req_status, me.req_status_datetime, me.req_agent, m=
e.agent_comment, me.req_customer, me.req_comment, rel_accept.id_bool_vals, =
rel_accept.bool_val_name, rel_req_status.id_fw_status, rel_req_status.statu=
s_name, rel_req_customer.id_customer, rel_req_customer.customername, rel_re=
q_customer.create_
datetime, rel_req_customer.create_user, rel_req_customer.update_datetime, r=
el_req_customer.update_user, view_version.id_patch_request, view_version.ve=
rsion, entries.fk_patch_request, entries.row_index, entries.hostid, entries=
.fk_location, entries.rack, entries.fk_patch_conn_type, entries.fk_ip_net, =
entries.want_ipv4, entries.ipaddr, entries.want_ipv6, entries.ipv6, entries=
.fqdn, entries.cable_id
  FROM patch_request me
  LEFT JOIN bool_vals rel_accept
    ON rel_accept.id_bool_vals =3D me.accept
  JOIN fw_status rel_req_status
    ON rel_req_status.id_fw_status =3D me.req_status
  JOIN customer rel_req_customer
    ON rel_req_customer.id_customer =3D me.req_customer
  JOIN view_patch_request_version view_version
    ON view_version.id_patch_request =3D me.id_patch_request
  LEFT JOIN patch_interface entries
    ON entries.fk_patch_request =3D me.id_patch_request
WHERE me.id_patch_request =3D '9569'
ORDER BY entries.row_index

--
Cheers, Alex


*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*=
"*
T-Systems Austria GesmbH Rennweg 97-99, 1030 Wien
Handelsgericht Wien, FN 79340b
*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*=
"*
Notice: This e-mail contains information that is confidential and may be pr=
ivileged.
If you are not the intended recipient, please notify the sender and then
delete this e-mail immediately.
*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*=
"*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20130602/a6a=
6ca59/attachment.htm


More information about the DBIx-Class mailing list