Model instance data

There are three types of Models that can be defined at the time of creating models for your IoT applications. The three models are:

  • DataModel
  • ThingModel
  • AppModel

See Models for details.

In TQL Model development is a three step process -

  1. Definition
  2. Deploy (compilation)
  3. Queries (instantiation, update, delete, subscription)

See also lifecycle of models.

Model Instances

Once models are defined and deployed the meta structure of the model definition is stored in memory. (If A-Stack shuts down and restart, the model definitions will be reloaded. The but model instance data will persist.)

Before Find queries can find anything from the models, they must be instantiated, or populated with data. The result of model instantiation is called Model Instances. Multiple model instances can be created from the same model (definition). Model instance data is persisted in the storage (TQLCache), as defined at the time of the deployment.

Even though A-Stack uses SQL type of database technology to persist model instances, they are stored in a schema-less way, not in a relational format. This preserves the the performance at scale.

For example: Here is the definition of a ThingModel - PhidgetSensorModel that combines PhidgetSensorFacet. 

Definition

PhidgetSensor Thing Model
#
ThingFacet(Name: "PhidgetSensorFacet"):
  Integer(Name: "SensorValue", Update: "auto", KnownBy: "PhidgetSensorAction")
  String(Name: "SensorURL", Default: "phid://")
  String(Name: "SensorInterfaceIndex")
  String(Name: "SensorType")
  String(Name: "SensorInterfaceType")
  String(Name: "SensorValueFormat")
  String(Name: "Simulated")
ThingModel(Name: "PhidgetSensorModel", Combines: "PhidgetSensorFacet"):
  Sid(Name: "phidId")

Create model instances

The model instances of PhidgetSensorModel is created using a Create TQL Query. 

Create PhidgetSensor ThingModel Instance
#
Query: 
  Create: 
    PhidgetSensors: 
      SensorURL: phid:// 
      SensorType: Rotation 
      SensorInterfaceType: PhidgetInterfaceKit 
      SensorValueFormat: Raw 
      SensorInterfaceIndex: 0 
      SensorValue(value: "$Null()", version: "1");
      Simulated: true

The result of model instance creation is below.

Note that there is Status returned for every attribute that gets created.

Create PhidgetSensor ThingModel Instance Result
#
Create(Status: "Success"):
  PhidgetSensors: 
    phidId: KNUBPHLOAAAAUAABA6EJCI75
    SensorValue(Status: "Success+Created:1:1457740291438;", Value: "", Version: "1")
    SensorURL(Status: "Success+Created:1:1457740291442;", Value: "phid://", Version: "1")
    SensorInterfaceIndex(Status: "Success+Created:1:1457740291443;", Value: "0", Version: "1")
    SensorType(Status: "Success+Created:1:1457740291444;", Value: "Rotation", Version: "1")
    SensorInterfaceType(Status: "Success+Created:1:1457740291444;", Value: "PhidgetInterfaceKit", Version: "1")
    SensorValueFormat(Status: "Success+Created:1:1457740291445;", Value: "Raw", Version: "1")
    Simulated(Status: "Success+Created:1:1457740291445;", Value: "true", Version: "1")

Find Model Instances

After model instances are created, you can read them using Find Query with constraints.

Find PhidgetSensor ThingModel Instance
#
Query: 
  Find format: "all"):
    PhidgetSensors: 
      SensorURL(ne : "")

Find Query Result

Find PhidgetSensor ThingModel Instance
#Find(Status: "Success", Format: "all"):
	Result: 
		PhidgetSensors(QName: "SimpleModel.MyModels.PhidgetSensors"):
			phidId: KNUBPHLOAAAAUAABA6EJCI75 
			SensorValue(Value: "", Known: "60", Version: "1", Timestamp: "1457740291438", DateTime: "2016-03-11 15:51:31.438", QName: "SimpleModel.MyModels.PhidgetSensors.SensorValue", FName: "SensorValue")
			SensorURL(Value: "phid://", Known: "phid://", Version: "1", Timestamp: "1457740291442", DateTime: "2016-03-11 15:51:31.442", QName: "SimpleModel.MyModels.PhidgetSensors.SensorURL", FName: "SensorURL")
			SensorInterfaceType(Value: "PhidgetInterfaceKit", Known: "PhidgetInterfaceKit", Version: "1", Timestamp: "1457740291444", DateTime: "2016-03-11 15:51:31.444", QName: "SimpleModel.MyModels.PhidgetSensors.SensorInterfaceType", FName: "SensorInterfaceType")
			Simulated(Value: "true", Known: "true", Version: "1", Timestamp: "1457740291445", DateTime: "2016-03-11 15:51:31.445", QName: "SimpleModel.MyModels.PhidgetSensors.Simulated", FName: "Simulated")
			SensorInterfaceIndex(Value: "0", Known: "0", Version: "1", Timestamp: "1457740291443", DateTime: "2016-03-11 15:51:31.443", QName: "SimpleModel.MyModels.PhidgetSensors.SensorInterfaceIndex", FName: "SensorInterfaceIndex")
			SensorType(Value: "Rotation", Known: "Rotation", Version: "1", Timestamp: "1457740291444", DateTime: "2016-03-11 15:51:31.444", QName: "SimpleModel.MyModels.PhidgetSensors.SensorType", FName: "SensorType")
			SensorValueFormat(Value: "Raw", Known: "Raw", Version: "1", Timestamp: "1457740291445", DateTime: "2016-03-11 15:51:31.445", QName: "SimpleModel.MyModels.PhidgetSensors.SensorValueFormat", FName: "SensorValueFormat")

The following system generated tags are for each attribute: 

A-Stack automatically generates tags as part of every attribute that makes up the model definition. System tags can be read (using FIND) with 

Format="all" modifier with the <Find> Query.

System Tag NameDescriptionPersisted?Query Constraint?
ValueThe value of the attribute is stored in "Value". This is often specified by the user at the time of create query (instantiation)YesYes
Known

Applicable to ThingModel/AppModel - this is the value that is only set by the output of Actions. Known CANNOT be

set using CRUD operations (Create / Update) via TQL Queries. The system also maintains a "Known" for DataModel attributes, for consistency purposes, but it will always be the same as Value.

YesNo
VersionThe version number of the attribute. This number is automatically incremented each time the value changes.Yes

No. You can request the value

using Format on <Find>

TimestampUnix epoch time at the time (in millisecond) of the attribute creation. For example: Timestamp value
1457663102004 is same as Fri, 11 Mar 2016 02:25:02 GMT
YesNo
DatetimeFormatted data time value of the attribute creation. For example:
2016-03-10 18:25:02.004
YesNo
QName

Fully qualified name of the attribute. <NamSpace>.<Domain>.<ModelName>.<AttributeName>. For example

SimpleModel.MyModels.VendorInfo.vendorName given that VendorInfo is defined within

Namespace - SimpleModel, with Domain as MyModels and DataModel Name as VendorInfo

YesNo
FNameGiven name of the attribute name.YesNo

Go to page

Status: This is a transient attribute returned as part of the result of TQL Create/Save, Update and Delete operations. It is not persisted.