Eval - AppDaddy-Software-Solutions-Inc/framework-markup-language GitHub Wiki
<EVAL/> : Transform
The <EVAL/> transform is used to perform row level evaluations in a data source.
The operation is applied to each row in the data set and the resulting value stored in the specified target field.
<CALC/>'s are often used to calculate row totals, min or max values etc. It is also useful when used in combination with other data transforms like <FILTER/>.
Be careful to specify a target field that is unique since calculations will overwrite fields by the same name.
Name | Type | Default | Description | Req |
---|---|---|---|---|
operation | string | Calculation to perform, see operations | ✔ | |
source | string | Data key to perform the operation on* | ✔ | |
target | string | New data key in each row to assign the calculation to | ✔ | |
precision | int | Round the calculation precision value from the decimal, see fig. 4 |
For in-depth examples and full applications, visit fml.dev!
Like with all operational children of
Datasource
, they execute in order so you need to be aware that if you execute an operation on a data field created by aCALC
, that it is in fact already created above. See fig. 7 for a working example of this.
None
Name | Type | Default | Description | Req |
---|---|---|---|---|
operation | string | null | Calculation to perform, see operations | ✔ |
target | string | null | New data key in each row to assign the calculation to | ✔ |
source | string | null | Data key to perform the operation on* | ✔ |
precision | int | null | Round the calculation precision value from the decimal, see fig. 4 |
- sum: The average value of all occurrences of a specified source in the data, outputs the value to the target on each row, see fig. 1
- avg: The average value of all occurrences of a specified source in the data, outputs the value to the target on each row, see fig. 2
- min: The minimum value of all occurrences of a specified source in the data, outputs the value to the target on each row, see fig. 3
- max: The maximum value of all occurrences of a specified source in the data, outputs the value to the target on each row, see fig. 4
- count: The count of the number of existing source fields, outputs the value to the target on each row the source exists, see fig. 5
- eval: An eval statement acting as the source for each datarow, outputting the evaluated value to the target, see fig. 6
- total: An operation that returns the total occurrences of a fields value in the dataset, and outputs the value to the target, see fig. 7
The eval operation uses an evaluation statement as the source instead of a data key.
All examples will use this example data from this endpoint: api.web/cities/nearby
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
</ROW>
</DATA>
sum
<DATA id="DB1" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="TOTAL" source="POPULATION" operation="sum"/>
</DATA>
Show fig. 1 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<TOTAL>5700000</TOTAL>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<TOTAL>5700000</TOTAL>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<TOTAL>5700000</TOTAL>
</ROW>
</DATA>
avg
<DATA id="DB1" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="AVERAGEPOP" source="POPULATION" operation="avg"/>
</DATA>
Show fig. 2 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<AVERAGEPOP>1900000</AVERAGEPOP>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<AVERAGEPOP>1900000</AVERAGEPOP>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<AVERAGEPOP>1900000</AVERAGEPOP>
</ROW>
</DATA>
min
<DATA id="DB1" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="LOWESTPOP" source="POPULATION" operation="min"/>
</DATA>
Show fig. 3 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<LOWESTPOP>990000</LOWESTPOP>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<LOWESTPOP>990000</LOWESTPOP>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<LOWESTPOP>990000</LOWESTPOP>
</ROW>
</DATA>
max
<DATA id="DB1" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="HIGHESTPOP" source="POPULATION" operation="max" precision="-6"/>
</DATA>
*note the -6 precision rounds like so 2930000 -> 2.930000 -> 3 -> 3000000
Show fig. 4 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<HIGHESTPOP>3000000</HIGHESTPOP>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<HIGHESTPOP>3000000</HIGHESTPOP>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<HIGHESTPOP>3000000</HIGHESTPOP>
</ROW>
</DATA>
Everyone datarow that contains a field will be counted
count
<DATAid="DB1" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="ROWCOUNT" source="POPULATION" operation="count"/>
</DATA>
Show fig. 5 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<ROWCOUNT>3</ROWCOUNT>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<ROWCOUNT>3</ROWCOUNT>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<ROWCOUNT>3</ROWCOUNT>
</ROW>
</DATA>
eval
<DATA id="fig6" autoexecute="false">
<URL><![CDATA[api.web/cities/nearby]]></URL>
<CALC target="GROWTH_20PERCENT" source="{POPULATION} * 1.2" operation="EVAL" />
</DATA>
Show fig. 6 `Datasource`
<DATA>
<ROW>
<POPULATION>17800000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<GROWTH_20PERCENT>2136000</GROWTH_20PERCENT>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<GROWTH_20PERCENT>1188000</GROWTH_20PERCENT>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<GROWTH_20PERCENT>3516000</GROWTH_20PERCENT>
</ROW>
</DATA>
total
Using the total, we get an added field to each row to count the unique occurrences of each. In this case we will use COUNTRY
and add a target field COUNTRYCOUNT
:
<DATA id="fig7" autoexecute="false">
<CALC target="COUNTRYCOUNT" source="{data.COUNTRY}" operation="total"/>
</DATA>
Show fig. 7 `Datasource`
<DATA>
<ROW>
<POPULATION>1780000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<COUNTRYCOUNT>2</COUNTRYCOUNT>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<COUNTRYCOUNT>2</COUNTRYCOUNT>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Italy</COUNTRY>
<COUNTRYCOUNT>1</COUNTRYCOUNT>
</ROW>
</DATA>
Using Datasource id="fig6"
fig. 6 as the starting point for Datasource id="fig7"
, we will expand upon those datarows using sequenced operations.
Combining sequences of operations allows you to use previous CALC
s within a later operation as shown below.
<DATA id="fig8" value="{fig6.data}" autoexecute="false">
<CALC target="GROWTH_20PERCENT_W_INFLUX" source="{GROWTH_20PERCENT} + 135500" operation="EVAL" />
<CALC target="GROWTH_PERCENTAGE_INC_INFLUX" source="(({GROWTH_20PERCENT_W_INFLUX} / {data.POPULATION}) - 1) * 100" operation="EVAL" precision="2" />
<CALC target="AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX" source="GROWTH_PERCENTAGE_INC_INFLUX" operation="avg" precision="0"/>
</DATA>
Show fig. 8 `Datasource`
<DATA>
<ROW>
<POPULATION>1780000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Montreal</CITY>
<GROWTH_20PERCENT>2136000</GROWTH_20PERCENT>
<GROWTH_20PERCENT_W_INFLUX>2271500</GROWTH_20PERCENT_W_INFLUX>
<GROWTH_PERCENTAGE_INC_INFLUX>27.61</GROWTH_PERCENTAGE_INC_INFLUX>
<AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>28</AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>
</ROW>
<ROW>
<POPULATION>990000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Ottawa</CITY>
<GROWTH_20PERCENT>1188000</GROWTH_20PERCENT>
<GROWTH_20PERCENT_W_INFLUX>1323500</GROWTH_20PERCENT_W_INFLUX>
<GROWTH_PERCENTAGE_INC_INFLUX>33.67</GROWTH_PERCENTAGE_INC_INFLUX>
<AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>28</AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>
</ROW>
<ROW>
<POPULATION>2930000</POPULATION>
<COUNTRY>Canada</COUNTRY>
<CITY>Toronto</CITY>
<GROWTH_20PERCENT>3516000</GROWTH_20PERCENT>
<GROWTH_20PERCENT_W_INFLUX>3651500</GROWTH_20PERCENT_W_INFLUX>
<GROWTH_PERCENTAGE_INC_INFLUX>24.62</GROWTH_PERCENTAGE_INC_INFLUX>
<AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>28</AVERAGE_PERCENTAGE_GROWTH_INC_INFLUX>
</ROW>
</DATA>