DataModels

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 with Primitive Types
#
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.


 CRUD operations on DataModels

Create Query:

Create DataModel 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 DataModel Query Results
#
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:

Find DataModel Query
#
Query:
  Find(format: "all"):
    VendorInfo:
      vendorName(eq: "Phidget")

Find Query Result:

Find DataModel 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 definiton
#
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

Datetime 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

Datetime filter
#
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:

Update DataModel 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.
Update DataModel Query
#
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:

Delete DataModel Query
#
Query:
  DeleteAll:
    VendorInfo:
      vendorName(eq: "Phidget")


DataModel with one Complex type

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.

Sample project
#
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.

Generic SaveFile Macro
#
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;
FindConvertAndSave
#
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"
Save Query Output to a File
#
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:

View OR Download File
http://<ip>:<port>/fid-tqlengineres/<nameoffile>

Go to page