This documentation is for an old version of Dataplane Reports.

View the latest documentation, or the list of documentation for all versions.

Reporting on Calculated Values

Dataplane supports reporting on (and charting of) calculated fields created with the free Script Runner add-on by Jamie Echlin.

Script Runner allows administrators to create customized and programmable Scripted Fields that can be used almost anywhere that a regular JIRA field can be used, and which can perform arbitrary calculations on issue-related data using the Groovy language.

Using Script Runner with Dataplane

Dataplane can use your existing Scripted Fields, or you can add new fields to be used in conjunction with Dataplane.

Dataplane supports scripted fields that contain numeric, date, and text data. Scripted Fields can be used in most reports in Dataplane.

Since Scripted Field values are calculated on the fly and changes to a Scripted Field are not stored in the JIRA changelog, only the current values of Scripted Fields (and not the historical previously-calculated values) can be used in Dataplane.

To add a Scripted Field for use with Dataplane, follow the steps below. Existing scripted fields can also be used, so long as the Search Template is configured for the appropriate data type (as described below).

Creating a Scripted Field

To create a new Scripted Field:

  • Install the Script Runner add-on
  • Navigate to Toolgear » Issues » Custom Fields
  • Click "Add Custom Field"
  • Click on the "Advanced" tab on the left-hand side of the dialog
  • Find the "Scripted Field" field type and click "Next"
  • Give the Scripted Field a name and then click "Create"
  • If you do not want the scripted field to be visible to end users, do not associate the field with any screens. (However, you may want to associate the field with the Default or View screens for initial testing purposes, since you will not otherwise be able to see the rendered results of your field.)
  • Scroll down the custom field list to find your newly-created field, click the toolgear on the right hand side, and select "Edit"
  • Configure the Search Template based on the type of data you wish to store in the field (see below), then save the field. 

The Search Template controls the data type of the field as seen by Dataplane,  and it influences the reports in which the custom field is available.

To use the field in Dataplane as......select for Search Template:
Numeric data"Number Search" or "Number Range Searcher"
Date"Date Time Range Picker"
Text"Free Text Searcher"

Writing a Script for the Scripted Field

To define the functionality of the newly added Scripted Field:

  • Navigate to Toolgear » Add-ons and select "Script Fields" on the left-hand navigation menu
  • Scroll down to find your field, click the "edit" link, and write the script for your field

 

You must reindex JIRA if you have either newly added or modified a custom field script. This is required to make the updated field values visible to JIRA and Dataplane.

You must also navigate to Dataplane Reports » Administration and click the "Sync Index" button to refresh the list of custom fields available in Dataplane reports. Performing this synchronization is required only after adding an entirely new field (or changing the Search Template of an existing field). If you have simply updated the script for a field, reindexing JIRA itself is sufficient – no additional Dataplane operations need be performed.

The following tips are helpful for script testing, and for speeding up a JIRA reindex:

  • For testing your script, before doing a full reindex of JIRA, you can perform an edit and save on a single JIRA issue, or perform a transition on a single issue, and Script Runner will update the value of the scripted field for that issue only. You can then see the results in the Issue Navigator columns list (by adding the Scripted Field column) or when viewing the issue (if you added the custom field to the appropriate screen)
  • If your version of JIRA supports it, you can perform a background reindex so that no downtime is required.
  • Performing a reindex of only a single project is also possible.

Script Examples

This section provides examples of a few scripts that access issue data.

The Script Runner documentation on Scripted Fields provides many more examples of how to use scripted fields. Most Groovy language concepts can be used within scripted fields, including the ability to access other custom field values, perform arithmetic, and call arbitrary Java or Groovy APIs.

Numeric Scripted Field 

The following is an example of a very simple script that obtains the value of an existing custom field named "Product Price", multiplies the value by 50%, and returns the result.

The field for this script must be configured with a Search Template of "Number Search" or "Numeric Range Searcher", as described above, in order to be usable in numeric reports.

def price = getCustomFieldValue("Product Price")

if (price) {
    return price * 0.5;
}
else {
    return null
}

Date Scripted Field

The following is a simple script that subtracts one week from the value of an existing Date custom field called "Payment Date".

The field for this script must be configured with a Search Template of "Date Time Range Picker", as described above, in order to be selectable as a Date Basis in reports that support dates.

def paymentDate = getCustomFieldValue("Payment Date") 
 
if (paymentDate) { 
	def cal = new java.util.GregorianCalendar();
 
	cal.setTimeInMillis(paymentDate.getTime()); 
	cal.add(java.util.Calendar.DAY_OF_MONTH, -7);
 
	return new java.sql.Timestamp(cal.getTimeInMillis()); 
} 
else { 
	return null 
}

String Scripted Field

In this example we take the current value of an existing, select list field named "Team" and map that value to a geographic location. 

The field for this script should be configured with a Search Template of "Free Text Searcher".

final Map<String,String> LOCATION_MAP = new HashMap<String,String>() {{
    put("Team A",    "San Francisco")
    put("Team B",    "San Francisco")
    put("Team C",    "Montreal")
    put("Team D",    "Montreal")
    put("Team E",    "Montreal")
}};

def cfValue = getCustomFieldValue("Team")
    
if (cfValue != null) {
    def location = LOCATION_MAP.get(cfValue.toString())
	if (location != null) {
        return location
    }
}
return ""   // no match found

Page Contents