Quick Reference
- 1 HeliumDev Client Setup
- 2 HeliumDev Client Common Commands
- 3 Project Folder Structure
- 4 Hello World
- 5 DSL Basics
- 6 View Basics
- 7 Navigation
- 8 Objects
- 9 Collections
- 10 Built-in Data Types
- 11 Control Structures
- 12 Type Conversion
- 13 Built-in Functions (BIFs)
- 13.1 Date BIFs
- 13.2 String BIFs
- 13.3 Integer BIFs
- 13.4 Decimal BIFs
- 13.5 Uuid BIFs
- 13.6 Math BIFs
- 13.7 Mez BIFs
- 13.8 Persistent Entity BIFs
- 13.9 Selector BIFs
- 13.10 Collection BIFs
- 13.11 SQL BIFs
- 13.12 JSON Types BIFs
- 13.13 API BIFs
- 13.14 Assert BIFs
- 14 Object Annotations
- 15 Function Annotations
- 16 Object Attribute Annotations
- 17 Atomic Validators
- 18 View Widgets
- 18.1 button
- 18.2 action
- 18.3 textfield
- 18.4 textarea
- 18.5 datefield
- 18.6 invite (legacy; use invite BIF)
- 18.7 fileupload
- 18.8 filebrowser
- 18.9 map
- 18.10 code
- 18.11 gallery
- 18.12 submit
- 18.13 info
- 18.14 checkbox
- 18.15 select
- 18.16 table
- 18.17 menuitem
- 18.18 navigation (legacy; use navigation described earlier)
- 18.19 wall
- 19 Dynamic Content
- 20 Built-in Objects
HeliumDev Client Setup
java -jar HeliumDev-app-1.5.0-jar-with-dependencies.jar
he-dev> set server=dev
he-dev> server set uri=https://dev.mezzanineware.com
he-dev> server set user=usrname
he-dev> server password
he-dev> set mobileNumber=278212345678
he-dev> set project=Helium Tutorial
he-dev> project set roles=System Admin
he-dev> project set dir=/workspace/helium-tut
HeliumDev Client Common Commands
java -jar HeliumDev-app-1.5.0-jar-with-dependencies.jarhe-dev> helphe-dev> new-sandboxhe-dev> buildhe-dev> runhe-dev> release
Project Folder Structure
├── notification-templates
│ └── en.json
├── builtin-reports
│ └── foo-report
│ ├── foo_image.png
│ └── foo_report.jrxml
├── jasper-reports
│ └── bar-report
│ ├── master.jrxml
│ └── report.json
├── model
│ └── MyCustomObject.mez
├── sql-scripts
│ └── myStartupScript.sql
├── services
│ └── UserInvite.mez
├── utilities
│ └── dateStringFormatter.mez
└── web-app
├── email-templates
│ └── template1.html
├── images
│ ├── BarMenuIcon.png
│ └── FooMenuIcon.png
├── lang
│ └── en.lang
├── presenters
│ ├── PresenterFilesCon.mez
│ └── TainingDslUnits.mez
└── views
│ ├── BarView.vxml
│ └── FooView.vxml
└── static
├── dashboard.html
├── dashboard.css
└── dashboard.jsHello World
XML view snippet
<info label="some.lang_file.label">
<binding variable="helloWorld" />
</info>DSL presenter snippet
string helloWorld;
void init() {
helloWorld = "Hello, World";
}
DSL Basics
//this is a comment
/* this is a multi-
line comment */
unit UnitName;
MyCustomFoo globalScopedFoo;
void myFunction () {
globalScopedFoo = MyCustomFoo:new();
}
MyCustomFoo myReturnTypeFunction () {
MyCustomFoo localScopedFoo = MyCustomFoo:new();
return localScopedFoo;
}View Basics
<?xml version="1.0" encoding="UTF-8"?>
<ui xmlns="http://uiprogram.mezzanine.com/View"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://uiprogram.mezzanine.com/View ../View.xsd">
<view label="view_heading.for_this_view" unit="LinkedUnit"
init="onPageLoadFunction" destroy="onPageExitFunction">
<!-- this is a comment -->
<info label="at.least.one.widget">
<binding variable="variableInLinkedUnit" />
<binding variable="otherUnit:variableInOtherUnit" />
</info>
</view>
</ui>
Navigation
NurseManagement.vxml
<view label="view_heading.nurse_management" unit="NurseManagement">NurseDetails.vxml
<view label="view_heading.nurse_details" unit="NurseDetails">
<button label="action.back" action="back" />NurseDetails.mez
unit NurseDetails;
//returns member of auto-generated enum DSL_VIEWS
DSL_VIEWS back() {
return DSL_VIEWS.NurseManagement; //corresponds to vxml file name
}
Objects
object Person
{
string fname;
string sname;
int age;
}persistent object Person
{
string fname;
string sname;
int age;
}Collections
int[] integerCollection;
MyCustomObject[] objectCollection;
MyCustomObject fourthObject = objectCollection.get(3);
MyCustomObject objectAtIndex = objectCollection.get(i);
Built-in Data Types
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(Variables of all primitive types are null after declaration, until assigned a value)
Control Structures
if(name == "Tom") {
Mez:log("Hello Tom!");
} else if (name == "Frank") {
Mez:log("Hello Frank!");
} else {
Mez:log("Hi! Who are you?");
}for(int i = 1; i <= 10; i++) {
Mez:log(i);
}int i = 0;
for(; i < 10;) {
Mez:log("While style loop!");
}SomeObject[] objectCollection = SomeObject:all();
foreach(SomeObject currentObject: objectCollection) {
currentObject.description = "Foreach style loop!";
}try {
Mez:log("inside try statement");
// throws an exception now ...
} catch (ex){
Mez:log("inside catch statement");
} finally {
Mez:log("inside finally statement");
}void throwStatementExample(){
Mez:log("Throwing an exception now ...");
string error = "Oops, something went wrong!";
throw error;
}Type Conversion
date value = Date:fromString("2017-01-02");
datetime value = Date:fromTimeString("2017-1-20 08:45:12 GMT");int value = Integer:fromString("12");decimal value = Decimal:fromString("12.01");bigint value = 1631104351673l; //note the 'l' at the end of the literal
bigint value = "1631104351673";//no 'l' when converting from string
bigint value = 1234; //implicit converstion from int
bigint value = Date:now();//implicit conversion from datetimeuuid value = Uuid:fromString("c1bd11cb-4bb2-43e5-88b4-009ed40fc69f");string s = value; //value = any of above types
string s = String:concat("", value);json jsonPerson = /%
{
"name": "John",
"surname": "Smith",
"phoneNumber": "555-6162"
}
%/;jsonarray pets = /%
[
{
"name": "Jasmine",
"type": "Dog"
},
{
"name": "Markus",
"type": "Mole-rat"
}
]
%/;jsonarray primeNumbersJsonArray = /%[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]%/;
int[] primeNumbersPrimitiveArray = primeNumbersJsonArray;
Built-in Functions (BIFs)
Date BIFs
date d = Date:addSeconds(startDate, 10);
date d = Date:addDays(startDate, 10);
date d = Date:addMonths(startDate, 10);
int diff = Date:secondsBetween(dt1, dt2);
int diff = Date:daysBetween(d1, d2);
int diff = Date:monthsBetween(d1, d2);
int yr = Date:extract(dt, "year");
date d = Date:fromString("2017-01-02");
datetime dt = Date:fromUnixTimestamp(1631104351673l);
datetime dt = Date:fromTimeString("2017-1-20 08:45:12 GMT");
datetime dt = Date:now();
date d = Date:today();String BIFs
string s = String:concat("abc","def");
string[] result = String:split("abc def", " ");
string[] result = String:split("abc|def", "\\|");
int i = String:length("Hello world");
string s = String:substring("Hello World", 1, 4);
string s = String:lower("Hello World");
string s = String:upper("hello world");
bool b = String:startsWith("Hello World", "Hello");
bool b = String:endsWith("Hello World", "World");
bool b = String:regexMatch("27000111222", "^27[0-9]{9,}$");
int i = String:indexOf("Hello World", "ello");
string s = String:join(stringCollection, " ");
string s = String:translate("translation.key");
string s = /%
This is a
multi line string
declaration
%/;
string encodedTest = String:urlEncode("The string ü@foo-bar");
// encodedTest = The+string+%C3%BC%40foo-ba
string s = String:regexReplaceFirst("ab32c56desd111", "[0-9]", "X");
string s = String:regexReplaceAll("ab32c56desd111", "[0-9]", "X");
string s = String:replaceAll("Hello World", "l", "L");Integer BIFs
int value = Integer:fromString("12");Decimal BIFs
decimal value = Decimal:fromString("12.01");
Uuid BIFs
uuid value = Uuid:fromString("c1bd11cb-4bb2-43e5-88b4-009ed40fc69f");Math BIFs
int i = Math:pow(2, 8);
decimal d = Math:sqrt(3);
decimal r = Math:random();
decimal f = Math:floor(2.13);
decimal c = Math:ceil(2.13);
decimal r = Math:round(2.135, 2);
decimal r = Math:round(2.135, 2, DSL_MATH_ROUNDING_METHOD.Half_Down);Mez BIFs
datetime t = Mez:now();
date d = Mez:today();
Mez:log("Hello, World");
Mez:warn("Something could go wrong");
Mez:error("Something went wrong");
Mez:alert("translation.key");
Mez:alertWarn("translation.key");
Mez:alertError("translation.key");
Mez:userRole();
Mez:email(person, "email.descriptionKey", "email.subjectKey", "email.bodyKey");
Mez:email(person.emailAddress, "email.descriptionKey", "email.subjectKey", "email.bodyKey");
Mez:email(person.emailAddress, "email.descriptionKey", "email.subjectKey", "email.bodyKey", EMAIL_TEMPLATES.email_template);
Mez:email(person.emailAddress, "email.descriptionKey", "email.subjectKey", "email.bodyKey", "farmer_purchase_invoice_report/FarmerPurchaseInvoice.jrxml", "additional_farmer_report_1/AdditionalFarmerReport1.jrxml");
Mez:emailAttach(person.emailAddress, "email.descriptionKey", "email.subjectKey", "email.bodyKey", {"farmer_purchase_invoice_report/FarmerPurchaseInvoice.jrxml", getFarmerPurchaseInvoiceFileName()});
uuid smsId = Mez:sms(client, "mobileNumber", "exampleKey.smsText");
MezBatch stockUpdateBatch = Mez:createBatch(fileUpload._id, fileUpload.data);
Mez:requestPaymentStatus(paymentId);
Mez:createCryptoKey(name, key);
string result = Mez:encrypt("encrypt this value");
string result = Mez:encrypt("encrypt this value", "mykey");
string result = Mez:decrypt(encryptedValueVar);
string result = Mez:decrypt(encryptedValueVar, "mykey");Persistent Entity BIFs
Person p = Person:new();
p.save();
Person p = Person:read(getUserUUID());
Person:delete(p);
Person currentPerson = Person:user();
p.invite(p.mobileNumber);
p.invite(p.mobileNumber, p.emailAddress);
person.removeRole();
person.notify("description.key", "sms.content.key",
"email.subj.key", "email.content.key");
Person[] plist = Person:fromCsv(uploadedFile.blobData);
person.pay(shop, "ZAR", amount);
person.payWithRef(shop, "ZAR", amount, ourPayId, extraPayInfoString);
person.forcePasswordReset();
Person p = Person:fromCsvLine(personBatch.header, personBatchItem.value);
Selector BIFs
Person[] plist = Person:all();
Person[] plist = Person:equals(deleted, false);
Person[] plist = Person:empty(mobileNum);
Person[] plist = Person:between(dob, date1, date2);
Person[] plist = Person:lessThanOrEqual(age, num);
Person[] plist = Person:lessThan(age, num);
Person[] plist = Person:greaterThan(age, num);
Person[] plist = Person:attributeIn(state, state_list);
Person[] plist = Person:relationshipIn(reportsTo, person);
Person[] plist = Person:contains(name, "a");
Person[] plist = Person:beginsWith(name, "A");
Person[] plist = Person:endsWith(name, "a");
Person[] plist = Person:notEquals(deleted, true);
Person[] plist = Person:notEmpty(mobileNum);
Person[] plist = Person:notBetween(dob, date1, date2);
Person[] plist = Person:notContains(name, "a");
Person[] plist = Person:notBeginWith(name, "A");
Person[] plist = Person:notEndsWith(name, "a");
Person[] plist = Person:notAttributeIn(state, state_list);
Person[] plist = Person:notRelationshipIn(reportsTo, person);
Person[] plist = Person:union(equals(rating, "good"), equals(rating, "excellent"));
Person[] plist = Person:diff(equals(), equals());
Person[] plist = Person:intersect(equals(deleted, false, equals(active, true));
Person[] plist = Person:and(equals(deleted, false), equals(active, true));Collection BIFs
Person p = plist.pop();
Person p = plist.drop();
int len = plist.length();
Person firstPerson = plist.first();
Person lastPerson = plist.last();
plist.append(p);
plist.prepend(p);
plist.add(i, p);
Person p = plist.get(i);
plist.remove(i);
plist.sortAsc("dob"); //sort according to date attr. "dob"
plist.sortDesc("dob");
plist.clear();
plist.notify("description.key", "sms.content.key",
"email.subj.key", "email.content.key");
Person[] plistDoctorsSubset = plist.select(equals(title, "Dr."));SQL BIFs
QueryResult[] result = sql:query(selectQuery, param_1, ..., param_n);
int updates = sql:execute(updateQuery, param_1, ..., param_n);JSON Types BIFs
json personJsonObject = "{}";
personJsonObject.jsonPut("name", "John");
string personName = personJsonObject.jsonGet("name");API BIFs
// Outbound API specific
MezApiRequest request = ...
MezApiResponse response = api:get(request);
MezApiResponse response = api:post(request);
MezApiResponse response = api:delete(request);
MezApiResponse response = api:put(request);
// Inbound API specific
api:setStatusCode(404);Assert BIFs
//Assert:isEqual takes two values (objects or primitive types) and evaluates whether they are equal
Assert:isEqual(value1, value2, "value1 and value2 are not equal");
Assert:isEqual(1, 0, "1 and 0 are not equal");
//Assert:isNotEqual takes two values (objects or primitive types) and evaluates whether they are not equal
Assert:isNotEqual(value1, value1, "value1 and value1 are equal");
Assert:isNotEqual(1, 1, "1 and 1 are equal");
//Assert:isTrue takes one boolean value (variable/primitive/function that returns bool) and evaluates whether it is true
Assert:isTrue(false, "false is not true");
Assert:isTrue(someFunction(), "someFunction() does not return true");
//Assert:isFalse takes one boolean value (variable/primitive/function that returns bool) and evaluates whether it is true
Assert:isFalse(true, "true is not false");
Assert:isFalse(someFunction(), "someFunction() does not return false");
//Assert:isBoth takes two boolean value (variable/primitive/function that returns bool) and evaluates whether both are true
Assert:isBoth(true, false, "both true and false are not true");
Assert:isBoth(someFunction(), anotherFunction(), "someFunction() and anotherFunction() do not both return true");
//Assert:isEither takes two boolean value (variable/primitive/function that returns bool) and evaluates whether one is true
Assert:isEither(false, false, "neither false nor false is true");
Assert:isEither(someFunction(), anotherFunction(), "neither someFunction() nor anotherFunction() returns true");
//Assert:isNull takes one value (variable/primitive/function) and evaluates whether it is null or returns null
Assert:isNull(1, "1 is not null");
Assert:isNull(someFunction(), "someFunction() does not return null");
//Assert:isNotNull takes one value (variable/primitive/function) and evaluates whether it is not null or returns non-null
Assert:isNotNull(null, "null is null");
Assert:isNotNull(someFunction(), "someFunction() returns null");
//Assert:isGreater takes two values and evaluates whether the second is greater than the first
Assert:isGreater(2, 1, "1 is not greater than 2");
Assert:isGreater(value1, value2, "value2 is not greater than value1");
//Assert:isGreaterOrEqual takes two values and evaluates whether the second is greater than or equal to the first
Assert:isGreaterOrEqual(2, 1, "1 is not greater than or equal to 2");
Assert:isGreaterOrEqual(value1, value2, "value2 is not greater than or equal to value1");
//Assert:isLess takes two values and evaluates whether the second is less than the first
Assert:isLess(1, 2, "2 is not less than 1");
Assert:isLess(value1, value2, "value2 is not less than value1");
//Assert:isLessOrEqual takes two values and evaluates whether the second is less than or equal to the first
Assert:isLessOrEqual(1, 2, "2 is not less than or equal to 1");
Assert:isLessOrEqual(value1, value2, "value2 is not less than or equal to value1");
Object Annotations
@Role("Manager")
object Manager { ... }@Restrict("DevManager", equals(dept, "development"))
object Employee { ... }@RolesAllowed("Manager", "rw")
object EmployeeRecord { ... }@NotTracked
persistent object Person { ... }Function Annotations
@RoleName
string getGymEmployeeRoleName(GymEmployee employee) { ... }// Run at 2:15 AM every day
@Scheduled("15 2 * * *")
void foobar() { ... }
// Run at 06:00 every week-day (days 1 to 5)
@Scheduled("0 6 * * 1-5")
void foobar() { ... }
// Run every ten minutes
@Scheduled("*/10 * * * *")
void foobar() { ... }
//minute | hour | day-of-month | month | day-of-week@ReceiveSms("Test description")
void receiveSmsNumberText(string number, string text) { ... }
@ReceiveSms("Test description")
void receiveSmsNumberTextJson(string number, string text, json aggregatorFields) { ... }
@ReceiveSms("Test description")
void receiveSmsObjectText(Nurse nurse, string text) { ... }
@ReceiveSms("Test description")
void receiveSmsObjectNumberText(Nurse nurse, string number, string text) { ... }@OnSmsResultUpdate
void smsResultUpdateCallback(__sms_result__ smsResult) { ... }@OnScheduledFunctionResultUpdate
void scheduledFunctionResultUpdateCallback(
__scheduled_function_result__ scheduledFunctionResult) { ... }@OnPaymentUpdate
void paymentUpdate(uuid id, PAYMENT_STATUS status, string message){
Mez:log(Strings:concat("Updated Payment ", id, status, message);
}@POST("v1/farmer/profile/documentation")
void postFarmerDocumentation(FarmerDocumentation farmerDocumentation) {...}@ResponseExclude("middleName")
@ResponseExpand("crops")
@GET("v1/farmer/mobileNumber/{mobileNumber}")
Farmer getFarmer(string mobileNumber) {...}@PUT("v1/farmer")
void updateFarmer(Farmer farmer) {...}@DELETE("v1/farmer/mobileNumber/{mobileNumber}")
json deleteFarmer(string mobileNumber, bool purge) {...}@Test
void someUnitTest() {
string value1 = "John Doe";
string value2 = "Jane Smith";
Assert:isEqual(value1, value2, "value1 and value2 are not equal");
}
@Test
string someUnitTestWithReturn() {
string value1 = "John Doe";
string value2 = "Jane Smith";
Assert:isEqual(value1, value2, "value1 and value2 are not equal");
return value1;
}@USSD("description1")
MezUssdMenu processUssd(int menu, int selection) {
...
}
@USSD("description2")
MezUssdMenu processUssd(int menu, int selection, json gatewayArgs) {
...
}
Object Attribute Annotations
persistent object Person
{
@FirstnameValidator("validr.msg.fname")
string fname;
...persistent object Person
{
string name;
@OneToOne
IdentityDocument idDoc via person;
@OneToMany
Vehicle vehicles via owner;
@ManyToOne
House home via residents;
@ManyToMany
Person children via parents;
}Atomic Validators
validator PersonNameValidator {
notnull(); minlen(2); maxlen(50);
}validator BondRepaymentMonths {
notnull(); minval(0); maxval(72);
}validator CTMetroPhoneNumber {
notnull(); regex("021-[7..9]{7}");
}validator EmailValidator {
notnull(); regex("\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]{2,4}\b");
}
View Widgets
button
<button label="button.exec" action="exec" />action
<action label="action.exec" action="exec" />textfield
<textfield label="my.textfield.label" datatype="text">
<binding variable="MyUnit:string_value" />
</textfield>textarea
<textarea label="my.textfield.label">
<binding variable="MyUnit:string_value" />
</textarea>datefield
<datefield label="my.datefield.label">
<binding variable="MyUnit:date_value"/>
</datefield>invite (legacy; use invite BIF)
<invite label="my.invite.label">
<binding variable="MyUnit:user_object"/>
<role>MyUserRole</role>
</invite>fileupload
<fileupload label="my.fileupload.label">
<binding variable="MyUnit:object">
<attribute name="attributeName" />
</binding>
</fileupload>filebrowser
<filebrowser label="my.filebrowser.label">
<collectionSource function="MyUnit:values" />
</filebrowser>map
<map lat="item_lat" long="item_long">
<collectionSource variable="MyUnit:map_data">
<markerAction label="Mmy.map.action.open" action="MyUnit:open_item"/>
<markerTitle value="MyUnit:get_title"/>
<markerIcon value="MyUnit:get_icon"/>
<markerDesc value="MyUnit:get_desc"/>
</map>code
<code title="code_title.code_snippet">
<binding variable="QuestionManagement:question">
<attribute name="codeSnippet"/>
</binding>
</code>gallery
<gallery title="my.gallery.heading" imageAttribute="image" descriptionAttribute="description">
<collectionSource function="getObjectsWithImageBlobs"/>
<binding variable="selectedObject"/>
</gallery>submit
<submit label="submit.exec" action="exec" />info
<info label="info.shop_owner_firstname">
<binding variable="shop">
<attribute name="owner.firstName"/>
</binding>
</info>
<info label="info.welcome" value="info.system_admin_welcome"/>checkbox
<checkbox label="my.checkbox.label">
<binding variable="MyUnit:bool_value" />
</checkbox>select
<select label="my.select.label">
<binding variable="MyUnit:selected_value" />
<enum>SDS_SADSA</enum>
</select>
<select label="my.select.label">
<binding variable="MyUnit:selected_value" />
<collectionSource variable="MyUnit:values"/>
</select>table
<table title="my.table.title" defaultSortColumn="1" defaultSortDirection="descending" csvExport="disabled">
<collectionSource variable="MyUnit:plist"/>
<column heading="Firstname">
<attributeName>fname</attributeName>
</column>
<column heading="Surname">
<attributeName>sname</attributeName>
</column>
</table>menuitem
<menuitem icon="icon_name" label="my.menu.item">
<userRole>MyUserRole</userRole>
</menuitem> navigation (legacy; use navigation described earlier)
<navigation outcome="success" target ="myview_name"/>wall
<wall label="my.wall.label" defaultSort="timeStamp" commentHandler="MyUnit:commentFunction" buttonLabel="my.custom.label.for.comment.button">
<collectionSource function="MyUnit:collection" />
<itemTitle value="MyUnit:getTitle"/>
<itemText value="MyUnit:getText"/>
<itemOwner value="MyUnit:getOwner"/>
<itemTime value="MyUnit:getTime"/>
<itemIcon value="MyUnit:getIcon"/>
</wall>
Dynamic Content
Dynamic Widget Titles/Labels
view
<table title="translation.key">
...
</table>
<submit label="translation.key">en.lang
translation.key = {UnitFoo:globalVar}presenter
Unit UnitFoo;
string globalVar;
init() {
globalVar = getLabel();
...
}Dynamic Widget Visibility
view
<table title="table.label">
<visible variable="isTableVisible"/>
<collectionSource variable="items"/>
<column heading="col.name.label">
<attributeName>name</attributeName>
</column>
<column heading="col.desc.label">
<attributeName>description</attributeName>
<visible variable="isDescVisible"/>
</column>
</table>
<checkbox label="have.at.least.one.visible.widget">
<visible variable="isCheckboxVisible"/>
<binding variable="checkboxVar"/>
</checkbox>presenter
bool checkboxVar;
void init() {
checkboxVar = getCheckboxVar() {
...
}
Built-in Objects
| about |
|
|---|---|---|
object Identity {
string _firstNames;
string _nickName;
string _surname;
string _locale;
string _timeZone;
datetime _lastPasswordReset;
bool _mustResetPassword;
} | Implicit interface that is implemented by every @Role persistence object. | @Role("Person")
persistent object Person {
}
void test() {
Person p = getRandomPerson();
string name = p._firstNames;
Identity i = p;
string sameName = i._firstNames;
} |
@NotTracked
persistent object __sms_result__ {
datetime datetimestampStarted;
datetime datetimestampFinished;
string destination;
int attempt;
bool success;
string error;
bool doneProcessing;
uuid smsOutboundConfigurationVersionId;
string smsOutboundConfigurationName;
uuid smsId;
} | SMS results from Helium duplicated to the app schema. | void test() {
__sms_result__[] results = __sms_result__:all();
}
void test() {
__sms_result__[] results = __sms_result__:and(
equals(success, false),
equals(doneProcessing, true));
} |
@NotTracked
persistent object
__scheduled_function_result__ {
datetime datetimestampStarted;
datetime datetimestampFinished;
string qualifiedName;
string schedule;
string error;
string stackTrace;
bool success;
} | Scheduled function results from Helium duplicated to the app schema. | void test() {
__scheduled_function_result__[] results =
__scheduled_function_result__:equals(
qualifiedName,
"SomeUnit:SomeScheduledFunctionName");
} |
@NotTracked
persistent object MezBatch {
string name;
string header;
} | Used by Helium to create a CSV batch for later processing. | MezBatch stockUpdateBatch = Mez:createBatch(fileUpload._id, fileUpload.data);
|
@NotTracked
persistent object MezBatchItem {
// Line number from source CSV file
int lineNumber;
// Has this item been processed using fromCsvLine
bool processed;
string value;
@ManyToOne
MezBatch batch via batchItems;
} | Used by Helium to create CSV batch items for later processing. Each record represents a line from a CSV file and is related to a MezBatch. | MezBatchItem[] stockUpdateBatchItems = MezBatchItem:relationshipIn(batch, stockUpdateBatch);
StockUpdate[] stockUpdates;
for(MezBatchItem stockUpdateBatchItem: stockUpdateBatchItems) {
StockUpdate stockUpdate = StockUpdate:fromCsvLine(stockUpdateBatch.header, stockUpdateBatchItem.value);
stockUpdates.append(stockUpdate);
stockUpdateBatchItem.processed = true;
} |
object MezApiRequest {
string url;
json body;
string credentials;
json headers;
json queryParameters;
} | Used as an argument to the outbound API built-in functions in Helium. | MezApiRequest request = ...
MezApiResponse response = api:get(request); |
object MezApiResponse {
json body;
int code;
string message;
bool success;
string url;
} | Used as a result type for the outbound API built-in functions in Helium. | MezApiRequest request = ...
MezApiResponse response = api:get(request); |
object MezLegendKey {
string label;
blob icon;
}
| Used as a data source to build map legends. | MezLegendKey[] getLegend() {
MezLegendKey[] result;
ObjectWithIcon[] iconList = ObjectWithIcon:equals(type, "Gym");
foreach(ObjectWithIcon obj: iconList){
MezLegendKey newLegend = MezLegendKey:new();
newLegend.icon = obj.iconAttribute;
newLegend.label = obj.labelAttribute;
result.append(newLegend);
}
return result;
} |
object MezUssdMenu {
int menuId;
string headerText;
bool isFreeText;
}
| Used to represent menu content that is returned for USSD requests. | MezUssdMenu menu = MezUssdMenu:new();
menu.headerText = "What is your name?";
menu.menuId = 1;
menu.isFreeText = true; |
object MezUssdMenuOption {
string text;
int order;
@ManyToOne
MezUssdMenu menu via menuOptions;
} | Used to represent menu options for menus that are returned for USSD requests. | MezUssdMenu menu = MezUssdMenu:new();
menu.headerText = "Can you answer the second question?";
...
MezUssdMenuOption option1 = MezUssdMenuOption:new();
option1.text = "Yes I can";
option1.order = 1;
...
menu.menuOptions.append(option1); |
@NotTracked
persistent object __crypto_create_key_request__ {
string name;
string key;
} | Used to request to create a crypto key for this app. | __crypto_create_key_request__[] cryptoKeyCreateRequests = __crypto_create_key_request__:all();
for(int i = 0; i < cryptoKeyCreateRequests.length(); i++) {
__crypto_create_key_request__ cryptoKeyCreateRequest = cryptoKeyCreateRequests.get(i);
string keyName = cryptoKeyCreateRequest.name;
} |