DataModels
- jrenbb
- Long Tran
DataModel is one kind of Model (the other kinds are ThingModels and AppModels). Therefore it has all the properties of Models (Lifecycle of models, Model Attributes, Unique and Constraints).
A DataModel is defined with a Name and any number of Model Attributes. DataModels do not have Actions.
Example of a DataModel:
A DataModel definition with three simple a\Attributes:
# DataModel(Name="VendorInfo"): Sid(name: "VendorSysId") String(name: "vendorName") String(name: "vendorTitle")
DataModel is often used in TQL applications to represent logical entities (versus physical things that have direct interactions with the application). For example, a user, a vendor, or a ladder.
The purpose of DataModel is to store just enough data that may be required to complete IoT Application logic. DataModels are not meant for general purpose large volume of transnational data.
DataModel can be created, read, update and deleted using TQL queries.
Create Query:
# Query: Create: VendorInfo: vendorName: "Phidget" vendorTitle: "Sensor Provider"
Create Query Result:
Note that VendorSysId of type Sid is automatically generated without specifying the value in Create Query Statement.
# Create(Status: "Success"): VendorInfo: VendorSysId: "KNTJ5MYXAAAAUAABA7EIY2FH": vendorName(Status: "Success+Created:1:1457715589911;", Value: "Phidget") vendorTitle(Status: "Success+Created:1:1457715589914;", Value: "Sensor Provider")
Find Query:
# Query: Find(format: "all"): VendorInfo: vendorName(eq: "Phidget")
Find Query Result:
# Find(Status: "Success", Format: "all"): Result: VendorInfo(QName: "SimpleModel.MyModels.VendorInfo"): VendorSysId: "KNRX3TBUAAAAUAABA4LIWHP2" vendorTitle(Value: "Sensor Company", Known: "Sensor Company", Version: "1", Timestamp: "1457663102018", DateTime: "2016-03-10 18:25:02.018", QName: "SimpleModel.MyModels.VendorInfo.vendorTitle", FName: "vendorTitle") vendorName(Value: "Phidget", Known: "Phidget", Version: "1", Timestamp: "1457663102004", DateTime: "2016-03-10 18:25:02.004", QName: "SimpleModel.MyModels.VendorInfo.vendorName", FName: "vendorName")
Example of Find Filter on Attributes of type Datetime
# DataModel(Name: "MyTasks"): Sid(Name: "TaskID") String(Name: "TaskName") String(Name: "TaskDesc") DateTime(Name: "TaskTime", Format: "$SimpleDateFormat(yyyy-MM-dd'T'HH:mm:ss'Z')") # TaskTime is a DateTime of SimpleDateFormat Integer(Name: "TaskStatus") Integer(Name: "RemindBeforeXMinutes")
Datetime with simple Greater Than filter
# Query: Find: MyTasks: TaskID(ne: "") TaskTime(gt: "[:$Now('%1$tY-%1$tm-%1$tdT%1$tTZ'):]") # Get the time in SimpleDateFormat
Datetime with Range-based filters
# Query: Find(format: "Version"): MyTasks: TaskID(ne: "") TaskTime(ge: "[:$Now('%1$tY-%1$tm-%1$tdT%1$tTZ', +PT15M):]") TaskTime(lt: "[:$Now('%1$tY-%1$tm-%1$tdT%1$tTZ', +PT6M):]") RemindBeforeXMinutes(le: "15") RemindBeforeXMinutes(gt: "0")
Update Query:
# Query: Find(format: "version"): VendorInfo: vendorName(eq: "Phidget") SetResponseData: Key: Message.Value.Find.Result.VendorInfo.vendorName Value: "Phidget Inc" Update: From: Result Include: $findResponse.Message.Value.Find
Update Query Result:
Note that the Version number is incremented automatically if the update is successful.
# Find(Status: "Success", Format: "version"): Result: VendorInfo: VendorSysId: "KNTMS6F7AAAAUAABA7SVACBP" vendorTitle(Value: "Sensor Provider", Version: "1") vendorName: "Phidget Inc" Update(Status: "Success", Format: "version"): VendorInfo: VendorSysId: "KNTMS6F7AAAAUAABA7SVACBP" vendorName(Status: "Success=Updated:2:1457718402256;", Value: "Phidget Inc", Version: "2") vendorTitle(Status: "Success_NoAction:1:1457718393024;", Value: "Sensor Provider", Version: "1")
Delete Query:
# Query: DeleteAll: VendorInfo: vendorName(eq: "Phidget")
DataModel with one Complex type.
# Def(Name: "PostalAddress"): String(Name: "Street") String(Name: "City") String(Name: "Zipcode") DataModel(Name: "VendorInfo"): Sid name: "VendorSysId") String(Name: "vendorName") String(Name: "vendorTitle") PostalAddress name: "VendorAddress")
DataModel with one Attribute that is of Array defined via Cardinality.
Save Query Results to a CSV
In some cases the user may want to save the query results to a CSV file. This can be achieved easily using 3 step process:
- Find Data
- Convert result to comma separated lines
- Save the content
- View the content
For example: Let's say you have a DataModel VendorInfo as defined below.
# Namespace(Name: "SimpleModel"): Domain(Name: "MyModels"): DataModel(Name: "VendorInfo"): Sid name: "VendorSysId") String(Name: "vName") String(Name: "vTitle") String(Name: "vLocation")
Generic Macro to Save File:
You can make is as part of your project.
Note the content has to be part of ProcessData.
# Macro(Name: "SaveFile"): Argument: FilePath: "" Result: JexlScript: var file = "[:$Macro.Argument.FilePath:]"; var data = sffContext.getProcessData(["toCSV","result"]); sffLog.info("Data", + data); sff:saveTxt("text", file, data); return null;
# Query: Find: VendorInfo: vName(ne: "") SetProcessData(key: "toCSV.result", value: "Name,Title,Location[:EOL:]") foreach(value: $vendor, in: $findResponse.Message.Value.Find.Result.VendorInfo): SetProcessData key: "toCSV.result", Value: "[:$ProcessData.toCSV.result:][:$TL.vendor.vName:],[:$TL.vendor.vTitle:],[:$TL.vendor.vLocation:][:EOL:]") SaveFile: FilePath: "./resources/querydata.csv"
# Query: Find: VendorInfo: vName(ne: "") SetProcessData key: "toCSV.result", value: "Name,Title,Location[:EOL:]") foreach(value: $vendor, in: $findResponse.Message.Value.Find.Result.VendorInfo): SetProcessData key: "toCSV.result", Value: "[:$ProcessData.toCSV.result:][:$TL.vendor.vName:],[:$TL.vendor.vTitle:],[:$TL.vendor.vLocation:][:EOL:]") SetLocalData key: "FILE", value: "#o'resources/querydata.csv'#") logInfo = [:[:$TL.FILE:][:$ProcessData.toCSV.result:]:]
Finally to View the file:
http://<ip>:<port>/fid-tqlengineres/<nameoffile>