Automation Professionals is pleased to announce the immediately availability of a major upgrade to its free Simulation Aids Integration Toolkit module. The new feature justifying the "major upgrade" language is the implementation of eleven thirty-one new expression functions which use iteration to accomplish complex transforms of datasets and lists, to or from other datasets and lists, applying filtering, ordering, and computed new columns along the way. While there are certain operations that are still only available in the view() expression function, most of its functionality is now available without calling jython code.
Available for Ignition v8.1 only: v2.0.0.231640004
Visit my Module Sales page for the latest.
The list handling and generation code, including the handling of nested mappings, has no equivalent among the scripted functions, and is intended to accommodate the more complex data structures of Perspective. As with many of the technologies I implement, performance is the primary motivation for this work.
The online documentation has been updated in place, so both the module showcase and my Module Sales pages link to the latest content.
This functionality is also a stretch for the expression language foundation, as noted over here:
Paul's statement, only four days old, is no longer true.
There are debug loggers for the key iteration functions that report performance. Put "simaids" into the logger search box to get to them quickly.
If you would like a quick start to see these functions in action, I've been playing with this view:
View JSON
{
"custom": {},
"params": {},
"props": {},
"root": {
"children": [
{
"children": [
{
"custom": {
"filtered": [
"Folsom",
"Helsinki",
"San Francisco",
"Washington, DC",
"Wellington",
"Sydney",
"Wellington"
],
"filteredDS": {
"$": [
"ds",
192,
1686616771960
],
"$columns": [
{
"data": [
"Folsom",
"Helsinki",
"Jakarta",
"Madrid",
"Prague",
"San Diego",
"San Francisco",
"Shanghai",
"Tokyo",
"Washington, DC",
"Wellington",
"Delhi",
"Dhaka",
"Lagos",
"Karachi",
"Istanbul",
"Cairo",
"Mexico City",
"London",
"New York City",
"Tehran",
"Bogota",
"Rio de Janeiro",
"Riyadh",
"Singapore",
"Saint Petersburg",
"Sydney",
"Abidjan",
"Dar es Salaam",
"Wellington",
"Los Angeles",
"Berlin",
"Jeddah",
"Kabul",
"Mashhad",
"Milan",
"Kiev",
"Rome",
"Chicago",
"Osaka",
"Bandung",
"Managua",
"Paris",
"Shiraz",
"Manila",
"Montreal",
"Guadalajara",
"Dallas",
"Yerevan",
"Tunis"
],
"name": "city",
"type": "String"
},
{
"data": [
"United States",
"Finland",
"Indonesia",
"Spain",
"Czech Republic",
"United States",
"United States",
"China",
"Japan",
"United States",
"New Zealand",
"India",
"Bangladesh",
"Nigeria",
"Pakistan",
"Turkey",
"Egypt",
"Mexico",
"United Kingdom",
"United States",
"Iran",
"Colombia",
"Brazil",
"Saudi Arabia",
"Singapore",
"Russia",
"Australia",
"Ivory Coast",
"Tanzania",
"New Zealand",
"United States",
"Germany",
"Saudi Arabia",
"Afghanistan",
"Iran",
"Italy",
"Ukraine",
"Italy",
"United States",
"Japan",
"Indonesia",
"Nicaragua",
"France",
"Iran",
"Philippines",
"Canada",
"Mexico",
"United States",
"Armenia",
"Tunisia"
],
"name": "country",
"type": "String"
},
{
"data": [
77271,
635591,
10187595,
3233527,
1241664,
1406630,
884363,
24153000,
13617000,
658893,
405000,
11034555,
14399000,
16060303,
14910352,
14025000,
10230350,
8974724,
8825001,
8622698,
8154051,
7878783,
6429923,
5676621,
5535000,
5191690,
208374,
4765000,
4364541,
405000,
3884307,
3517424,
3456259,
3414100,
3001184,
1359905,
2908703,
2877215,
2695598,
2691742,
2575478,
2560789,
2229621,
1869001,
1780148,
1649519,
1495189,
1317929,
1060138,
1056247
],
"name": "population",
"type": "int"
}
]
},
"rawData": [
{
"city": {
"align": "center",
"editable": true,
"justify": "left",
"style": {
"backgroundColor": "#F7901D",
"classes": "some-class"
},
"value": "Folsom"
},
"country": "United States",
"population": 77271
},
{
"city": "Helsinki",
"country": "Finland",
"population": 635591
},
{
"city": "Jakarta",
"country": "Indonesia",
"population": 10187595
},
{
"city": "Madrid",
"country": "Spain",
"population": 3233527
},
{
"city": "Prague",
"country": "Czech Republic",
"population": 1241664
},
{
"city": "San Diego",
"country": "United States",
"population": 1406630
},
{
"city": "San Francisco",
"country": "United States",
"population": 884363
},
{
"city": "Shanghai",
"country": "China",
"population": 24153000
},
{
"city": "Tokyo",
"country": "Japan",
"population": 13617000
},
{
"city": "Washington, DC",
"country": "United States",
"population": 658893
},
{
"city": "Wellington",
"country": "New Zealand",
"population": 405000
},
{
"city": "Delhi",
"country": "India",
"population": 11034555
},
{
"city": "Dhaka",
"country": "Bangladesh",
"population": 14399000
},
{
"city": "Lagos",
"country": "Nigeria",
"population": 16060303
},
{
"city": "Karachi",
"country": "Pakistan",
"population": 14910352
},
{
"city": "Istanbul",
"country": "Turkey",
"population": 14025000
},
{
"city": "Cairo",
"country": "Egypt",
"population": 10230350
},
{
"city": "Mexico City",
"country": "Mexico",
"population": 8974724
},
{
"city": "London",
"country": "United Kingdom",
"population": 8825001
},
{
"city": "New York City",
"country": "United States",
"population": 8622698
},
{
"city": "Tehran",
"country": "Iran",
"population": 8154051
},
{
"city": "Bogota",
"country": "Colombia",
"population": 7878783
},
{
"city": "Rio de Janeiro",
"country": "Brazil",
"population": 6429923
},
{
"city": "Riyadh",
"country": "Saudi Arabia",
"population": 5676621
},
{
"city": "Singapore",
"country": "Singapore",
"population": 5535000
},
{
"city": "Saint Petersburg",
"country": "Russia",
"population": 5191690
},
{
"city": "Sydney",
"country": "Australia",
"population": 208374
},
{
"city": "Abidjan",
"country": "Ivory Coast",
"population": 4765000
},
{
"city": "Dar es Salaam",
"country": "Tanzania",
"population": 4364541
},
{
"city": "Wellington",
"country": "New Zealand",
"population": 405000
},
{
"city": "Los Angeles",
"country": "United States",
"population": 3884307
},
{
"city": "Berlin",
"country": "Germany",
"population": 3517424
},
{
"city": "Jeddah",
"country": "Saudi Arabia",
"population": 3456259
},
{
"city": "Kabul",
"country": "Afghanistan",
"population": 3414100
},
{
"city": "Mashhad",
"country": "Iran",
"population": 3001184
},
{
"city": "Milan",
"country": "Italy",
"population": 1359905
},
{
"city": "Kiev",
"country": "Ukraine",
"population": 2908703
},
{
"city": "Rome",
"country": "Italy",
"population": 2877215
},
{
"city": "Chicago",
"country": "United States",
"population": 2695598
},
{
"city": "Osaka",
"country": "Japan",
"population": 2691742
},
{
"city": "Bandung",
"country": "Indonesia",
"population": 2575478
},
{
"city": "Managua",
"country": "Nicaragua",
"population": 2560789
},
{
"city": "Paris",
"country": "France",
"population": 2229621
},
{
"city": "Shiraz",
"country": "Iran",
"population": 1869001
},
{
"city": "Manila",
"country": "Philippines",
"population": 1780148
},
{
"city": "Montreal",
"country": "Canada",
"population": 1649519
},
{
"city": "Guadalajara",
"country": "Mexico",
"population": 1495189
},
{
"city": "Dallas",
"country": "United States",
"population": 1317929
},
{
"city": "Yerevan",
"country": "Armenia",
"population": 1060138
},
{
"city": "Tunis",
"country": "Tunisia",
"population": 1056247
}
]
},
"meta": {
"name": "Table1"
},
"position": {
"basis": "400px",
"grow": 1
},
"propConfig": {
"custom.constList": {
"binding": {
"config": {
"expression": "asList(\u0027Hello\u0027, \"Cruel\", \"World\", 56, \"Today\")"
},
"type": "expr"
}
},
"custom.constMap": {
"binding": {
"config": {
"expression": "asMap(\u0027key1\u0027, \u0027Value1\u0027, \"key2\", \"Another\", \u0027key3\u0027, \u0027Cruel\u0027, \u0027key4\u0027, \u0027World\u0027)"
},
"type": "expr"
}
},
"custom.filtered": {
"access": "PRIVATE",
"binding": {
"config": {
"expression": "forEach({this.props.data}, if(it()[\u0027population\u0027] \u003c 1000000, unMap(it()[\u0027city\u0027], \u0027value\u0027), null))"
},
"previewEnabled": false,
"type": "expr"
},
"persistent": true
},
"custom.filteredDS": {
"access": "PRIVATE",
"binding": {
"config": {
"expression": "unionAll(\n\tasList(\u0027city\u0027, \u0027country\u0027, \u0027population\u0027),\n\tasList(\u0027str\u0027, \u0027str\u0027, \u0027i\u0027),\n\tforEach(\n\t\t{this.props.data},\n\t\tasList(unMap(it()[\u0027city\u0027], \u0027value\u0027), it()[\u0027country\u0027], it()[\u0027population\u0027])\n\t)\n)"
},
"type": "expr"
},
"persistent": true
},
"custom.rawData": {
"access": "PRIVATE"
},
"props.data": {
"binding": {
"config": {
"expression": "forEach(\n\t{this.custom.filteredDS},\n\tasMap(it())\n)"
},
"type": "expr"
}
}
},
"type": "ia.display.table"
}
],
"meta": {
"name": "FlexContainer"
},
"position": {
"basis": "34px",
"grow": 1
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
}
],
"meta": {
"name": "root"
},
"props": {
"direction": "column"
},
"type": "ia.container.flex"
}
}
Note: the new stuff is only lightly tested. The changes were sufficiently non-invasive that I consider the balance of the module to still be production-grade.
Edit: Name changed with v2.0.14 release.