Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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.

Model lifecycle consists of three steps

...

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 their schematic layout is persisted in Storage (TQL Cache) defined at the time of the deployment. Note that even though models are persisted in SQL type of storage that data is highly unstructured and stored in proprietary format.Before Models can be queried using Find - Models must be initialized 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 creation 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.

Note

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

Code Block
languageruby
themexmlEmacs
titlePhidgetSensor Thing Model
linenumberstrue
<ThingFacet#
ThingFacet(Name=: "PhidgetSensorFacet">):
  <Integer Name=Integer(Name: "SensorValue", Update=: "auto", KnownBy=: "PhidgetSensorAction"/>)
  <String Name=String(Name: "SensorURL", Default=: "phid://"/>)
  <String Name=String(Name: "SensorInterfaceIndex"/>)
  <String Name=String(Name: "SensorType"/>)
  <String Name=String(Name: "SensorInterfaceType"/>)
  <String Name=String(Name: "SensorValueFormat"/>)
  <String Name=String(Name: "Simulated"/>
</ThingFacet>
<ThingModel Name=)
ThingModel(Name: "PhidgetSensorModel", Combines=: "PhidgetSensorFacet">):
  <Sid Name=Sid(Name: "phidId"/>
</ThingModel>

...

)

Create model instances

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

Code Block
languageruby
themexmlEmacs
titleCreate PhidgetSensor ThingModel Instance
linenumberstrue
<Query>#
Query: 
  Create: 
 <Create>   PhidgetSensors: 
<PhidgetSensors>      SensorURL: <SensorURL>phidphid://</SensorURL>
  
      SensorType: Rotation 
   <SensorType>Rotation</SensorType>   SensorInterfaceType: PhidgetInterfaceKit 
  <SensorInterfaceType>PhidgetInterfaceKit</SensorInterfaceType>    SensorValueFormat: Raw 
<SensorValueFormat>Raw</SensorValueFormat>      SensorInterfaceIndex: <SensorInterfaceIndex>0</SensorInterfaceIndex>0 
     <SensorValue SensorValue(value=: "$Null()", version=: "1"/>);
      <Simulated>true</Simulated>
    </PhidgetSensors>
  </Create>
</Query>

...

Simulated: true

The result of model instance creation is below.

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

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

Find Model Instances

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

Code Block
languageruby
themexmlEmacs
titleFind PhidgetSensor ThingModel Instance
linenumberstrue
<Query>#
Query: 
  <FindFind format=: "all">):
    <PhidgetSensors>PhidgetSensors: 
     <SensorURL SensorURL(ne : =""/>
    </PhidgetSensors>
  </Find>
</Query>)

Find Query Result

Code Block
languageruby
themexmlEmacs
titleFind PhidgetSensor ThingModel Instance
linenumberstrue
<Find Status=#Find(Status: "Success", Format=: "all">):
  <Result>
    <PhidgetSensors QName=	Result: 
		PhidgetSensors(QName: "SimpleModel.MyModels.PhidgetSensors">
      <phidId>KNUBPHLOAAAAUAABA6EJCI75</phidId>
      <SensorValue Value="" Known="60" Version="1" Timestamp="1457740291438" DateTime=):
			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=)
			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=)
			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=)
			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=)
			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=)
			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=)
			SensorValueFormat(Value: "Raw", Known=: "Raw", Version=: "1", Timestamp=: "1457740291445", DateTime=: "2016-03-11 15:51:31.445", QName=: "SimpleModel.MyModels.PhidgetSensors.SensorValueFormat", FName=: "SensorValueFormat"/>
    </PhidgetSensors>
  </Result>
</Find>

Automatically generated System Attributes

...

System Attribute Name

...

Description

...

Query

Constraint?

...

Version number of the attribute. This number is automatically incremented each time the value changes.

No historical data is persisted. Only the last value is persisted.

...

No. You can request the value

using Format on <Find>

...

1457663102004 is same as Fri, 11 Mar 2016 02:25:02 GMT

Note that this is only the "Create" timestamp. If attributes are updated their timestamp do not change.

...

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

...

Applicable to ThingFacet/AppFacet. Known is the value that is set within the Action. Known can not be

set using Create / Update TQL Query by the user.

...

2016-03-10 18:25:02.004 Note that is is only the "Create" Datetime. If attributes are

updated their datetime value do not change.

...

)


Note
iconfalse

The following system generated tags are for each attribute: 

Include Page
System generated tags for attributes
System generated tags for attributes

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.