Learn to configure the <url_template>
element for Pull Reports™ Ad Hoc
report and data service software.
Catalog Configuration Java API analog:
ColumnConfigurationBuilder#setUrlTemplate
A <url_template>
configures a URL for a <column>
value in the
Export Report REST API. <url_template>
s are
useful for creating drill-through reports. The URL implementation depends on the report format.
For instance, the html
format outputs the URL as an HTML anchor (<a>) element while the
csv
format type outputs the URL as an additional
column. See the Export Report REST API chapter for more information.
<url_template>
A <url_template>
is a
Freemarker template
which may reference column values within the result row within template expressions.
Only references to columns which are guaranteed to be available at runtime are valid.
These are:
Base table columns:
Reference the report's base table columns
with @
prefixed column ids.
For example: reference a base table <column>
with id="name"
with ${@name}
.
Parent tables columns:
Reference the <url_template>
parent table columns
with @@
prefixed column ids.
For example: reference a parent table date <column>
with id="some_date"
with ${@@some_date?date}
.
Note ?date
is Freemarker date format.
@
or @@
within base table <url_template>
s
When creating <url_template>
s for <column>
s within the <report>
's base table,
it is permitted to refer to base table columns prefixed with either @
or @@
. The
former, @
, always refers to columns within the base table. The later, @@
,
always refers to columns within the parent
table - which is the base table in this case. The choice between the two prefixes is unimportant unless
the base table is a global table which is itself referenced by
base and non-base <table_ref>
s. In this case, prefix column references
in the global table's <url_template>
s with @@
to have them refer to
<column>
ids
s within the global table.
To only export a URL when a referenced column is non-null, use the Freemarker ??
operator with an <#if >
statement. For example, in
this <column>
definition, the @addressStreet
column is only exported as
a URL if the @addressId
column is non-null.
<column id="addressStreet" name="address_street" displayName="Street Address"> <url_template><![CDATA[<#if @addressId??>/addressLookup?id=${@addressId}</#if></url_template>]]> </column>
Use methods provided by RequestMethodModels to contextualize
urls to the HttpServletRequest
.
<url_template>
values
Since <url_template>
values are filled for each result row, any
java.lang.Exception
thrown when
processing the template will disrupt the HTTP response stream and cause an
invalid response. For this reason, Pull Reports™ catches all <url_template>
processing Exception
s, logs the Exception
,
and outputs "ERROR. Check log."
instead of the true column value.
In order to prevent repetitive log entries, Pull Reports™ logs only one
<url_template>
processing Exception
per export request.
<url_template>
usageThis example demonstrates two <url_template>
elements, one associated
with the <report>
's base table and
one associated with a child <relationship>
.
The former demonstrates a hyperlink into an external URL and the latter
demonstrates a hyperlink into another Pull Report within the same <catalog>
.
<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns="http://www.pullreports.com/catalog-1.7.0" id="class_info" name="Class Information" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.pullreports.com/catalog-1.7.0 https://www.pullreports.com/docs/xsd/pullreports-catalog-1.7.0.xsd"> <report id="student" name="Student Report" > <export_config defaultColumns='id,complete_name'/> <table id="student" name="class_info.student" displayName="Student"> <column id="id" name="id" displayName="Student ID" paramType="java.lang.Integer"/> <column id="complete_name" name="complete_name" displayName="Complete Name"> <!-- ${@id} references column class_info.student.id. ${@@id} would also be valid. --> <url_template>https://www.school-district.com/rest/api/student/${@id}.html</url_template> </column> <relationship> <join_column columnName="student_id" referencedColumnName="id" /> <table id="grade" displayName="Grade" name="class_info.grade"> <column id="id" name="id" displayName="Grade ID" paramType="java.lang.Integer" export="false"/> <column id="grade" name="grade" displayName="Grade"/> <column id="year" name="year" displayName="Year" paramType="java.lang.Integer"> <!-- ${@id} references column class_info.student.id. ${@@year} references column class_info.grade.year The <#if> check ensures both ${@id} and ${@@year} are non-null for Pull Reports to output the URL. Although it is not used in this <url_template> example, ${@@id} would reference class_info.grade.id --> <url_template><![CDATA[ <#if @id?? && @@year??> //${getServerName()}/${getContextPath()}/pullreports/catalog/class_info/report/evidence/export?format=htmltable&columns=%2Fevidence&filter=%40student_id%3D${@id}&filter=%2Fevidence%40year%3D${@@year} </#if> ]]></url_template> </column> </table> </relationship> </table> </report> <report id="evidence" name="Grade Evidence Report" > <table id="student" name="class_info.student" displayName="Student"> <column id="student_id" name="id" displayName="Student ID" paramType="java.lang.Integer"/> <column id="complete_name" name="complete_name" displayName="Complete Name"/> <relationship join="inner"> <join_column columnName="student_id" referencedColumnName="id" /> <table id="evidence" displayName="Evidence" name="class_info.grade_evidence"> <column id="year" name="year" displayName="Year" paramType="java.lang.Integer"/> <column id="evidence" name="evidence_text" displayName="Evidence"/> </table> </relationship> </table> </report> </catalog>
To demonstrate the actual URL output, start with the <report>
's base, student
table
with rows:
student
table rowsid | complete_name |
---|---|
1 | Sylvia Martinez |
2 | Roger Mullins |
3 | Jackie Besanceney |
Then the URL values for the rows will be:
student
table with URL valuesid | complete_name | complete_name's URL |
---|---|---|
1 | Sylvia Martinez | https://www.school-district.com/rest/api/student/1.html |
2 | Roger Mullins | https://www.school-district.com/rest/api/student/2.html |
3 | Jackie Besanceney | https://www.school-district.com/rest/api/student/3.html |
Then assume a grade
table with rows:
grade
table rowsid | student_id | grade | year |
---|---|---|---|
100 | 1 | A | 2014 |
101 | 1 | A- | 2015 |
102 | 2 | B | 2015 |
The two tables may be joined via the Export Report REST API URL:
/[context]/pullreports/catalog/class_info/report/student/export?columns=/grade
And the joined result rows will be:
student
to grade
table left join with <url_template>
s appliedid | complete_name | complete_name's URL | grade | year | year's URL |
---|---|---|---|---|---|
1 | Sylvia Martinez | https://www.school-district.com /rest/api/student/1.html | A | 2014 | //[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D1 &filter=%2Fevidence%40year%3D2014 |
1 | Sylvia Martinez | https://www.school-district.com /rest/api/student/1.html | A- | 2014 | //[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D1 &filter=%2Fevidence%40year%3D2015 |
2 | Roger Mullins | https://www.school-district.com /rest/api/student/2.html | B | 2015 | //[serverName]/[context]/pullreports/catalog/class_info/report/evidence/export? format=htmltable &columns=%2Fevidence &filter=%40student_id%3D2 &filter=%2Fevidence%40year%3D2015 |
3 | Jackie Besanceney | https://www.school-district.com /rest/api/student/3.html |
<url_template>
usage
<url_template>
s may use Freemarker
directives
to fulfill complex use cases.
The following Pull Reports™ XML Catalog file demonstrates directive usage.
<?xml version="1.0" encoding="UTF-8"?> <catalog xmlns="http://www.pullreports.com/catalog-1.7.0" id="catalog" name="Catalog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.pullreports.com/catalog-1.7.0 https://www.pullreports.com/docs/xsd/pullreports-catalog-1.7.0.xsd"> <report id="report" name="Report" > <export_config defaultColumns='id'/> <table id="some_table" name="schema.table1" displayName="Table1"> <column id="id" name="id" displayName="ID" paramType="java.lang.Integer"/> <column id="date1" name="date1_field" displayName="Date 1" paramType="java.sql.Date"/> <column id="string1" name="string1_field" displayName="String 1"> <!-- Demonstrates use of Freemarker '?string[...]' and '?url' methods --> <url_template><![CDATA[ /foo/bar?param1=${@date1?string['yyyy']}¶m2=${@string1?url('ISO-8859-1')} ]]></url_template> </column> <column id="string2" name="string2_field" displayName="String 2"> <!-- Demonstrates conditional logic --> <url_template>/foo2/bar2/${@id}${(@date1??)?then('/' + @date1?string['MM'],'')}</url_template> </column> <column id="integer1" name="integer1_field" displayName="Integer 1" paramType="java.lang.Integer"/> <relationship> <join_column columnName="ref_id" referencedColumnName="id" /> <table id="table2" displayName="Table2" name="schema.table2"> <column id="code" name="code" displayName="Code"/> <column id="name" name="name" displayName="name"> <!-- Demonstrates referencing columns on this relationship table and the <report>'s base table --> <url_template><![CDATA[ //www.acme.com/path1?code=${@@code}&date1=${@date1?date} ]]></url_template> </column> </table> </relationship> </table> </report> </catalog>
<column> |