LP#1721807: fix webstaff report templates that have might_have and has_many joins
authorGalen Charlton <gmc@equinoxinitiative.org>
Tue, 6 Mar 2018 23:00:23 +0000 (18:00 -0500)
committerKathy Lussier <klussier@masslnc.org>
Tue, 20 Mar 2018 18:24:28 +0000 (14:24 -0400)
This patch fixes a bug where using a virtual field in the web staff
report template editor to join another table would result in a syntax
error in the generated SQL.

To test
-------
[1] Apply the patch and verify that the regression test in the previous
    commit passes.
[2] Create new report template in the web staff client that include
    virtual fields and joins and verify that they work. One example
    would be a report that uses ILS User as the base source and joins
    in the patron notes virtual field.
[3] If available, clone a report template originally created in the web
    staff client that had previously failed, then save it. The new
    report should work.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Chris Sharp <csharp@georgialibraries.org>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Open-ILS/web/js/ui/default/staff/reporter/template/app.js

index 9ea625e..b50dabc 100644 (file)
@@ -119,7 +119,14 @@ function($scope , $q , $routeParams , $location , $timeout , $window,  egCore ,
                 if (i) { // not at the top of the tree
                     if (i == 1) join_path = join_path.split('-')[0];
 
-                    var uplink = p.uplink.name;
+                    // SQLBuilder relies on the first dash-separated component
+                    // of the join key to specify the column of left-hand relation
+                    // to join on; for has_many and might_have link types, we have to grab the
+                    // primary key of the left-hand table; otherwise, we can
+                    // just use the field/column name found in p.uplink.name.
+                    var uplink = (p.uplink.reltype == 'has_many' || p.uplink.reltype == 'might_have') ?
+                        egCore.idl.classes[p.from.split('.').slice(-1)[0]].pkey + '-' + p.uplink.name :
+                        p.uplink.name;
                     join_path += '-' + uplink;
                     alias = hex_md5(join_path);