The lifecycle of models consists of several the following stages:
Definition: a model is developed using Thing Definition Language.
Compilation: a model is deployed to TQLEngine A-Stack and the definition is compiled
Instantiation: model instance(s) are created when model attribute values are provided (by Create/Save queries). Model instance data is always persisted in the storage (but workflow instances remain in the memory).
Updated: changes to the model instance attributes will result in updates of the model instance data in the storage. Updates can happen in two ways:
...
Deleted: the model instance is removed. This is done by a DeleteAll query (need conformation).
In ThingModels and AppModels, model lifecycle is closely linked to the workflow lifecycle (DataModels do not have Actions or workflows).
Gliffy | ||||
---|---|---|---|---|
|
Models can be "partially" instantiated. That is, if some, but not all attribute values are given, then model instance(s) will still be created with the attributes which have value. The other attribute values can be provided later as model instance updates.
Models are defined by using ThingModel, AppModel or DataModel typesExample of a Create query to instantiate a TempSensor model.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<ThingModel# Name="TempSensor" combines="TempFacetSerial"> <Sid Name="sensorId" /> </ThingModel> |
Once Model definitions are deployed in the engine, engine creates the meta data for the models in the storage defined in the deployment script.
Create(format="version,current"):
# This will create
TempSensor:
peripheral: serial
baudrate: 115200
interfacePort: "/dev/cu.usbserial-AL01C0ME"
interface: serial
format: ascii
operation: receive
uniqueId: 76522
payload: $Null()
tempValue: $Null()
|
For update and delete, see common CRUD operations on models.
Model instance data
A-Stack maintains model instances data in the storage (TQLCache) based on the model definition (the model definition itself is not stored, but held in memory). The model instance data storage type is defined in the deployment script. For example, the the deployment script below, the <Process> points to the [:ModelFile:], which will be replaced by the model definition file name at the time of deployment. The Type="Sqlsff" defines that storage type is the SFF unstructured SQL database.
Note |
---|
Model instance data may also be stored in external databases (SQL or NoSQL) by providing the connecting string to the <Storage>. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<NewFacetInstance# NewFacetInstance(fid=: "[:FacetIDName:]" Name=, Name: "[:FacetInstanceName:]", Type=: "SffTqlFacet">): OnActivate: <OnActivate> <NewFacetInstance name=NewFacetInstance(name: "tqlwf", type=: "SffWdlFacet"): /> TopicFacet: TQLGenericTopic <TopicFacet>?TQLGenericTopic</TopicFacet> Process: <Process> <Storage Name= Storage(Name: "[:TQLCacheName:]" Type=, Type: "SqlSff" Comment=, Comment: "[:TQLCacheName:] Database SFF Unstructured SQL database"): /> Namespace: <Namespace> <Include> Include: [:ModelFile:]</Include> <!-- ModelFile #ModelFile contains the definition for the model --> </Namespace> </Process> </OnActivate> ... |
...
the |
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<Create format="version,current"> <!-- This will create --> <TempSensor> <peripheral>serial</peripheral> <baudrate>115200</baudrate> <interfacePort>/dev/cu.usbserial-AL01C0ME</interfacePort> <interface>serial</interface> <format>ascii</format> <operation>receive</operation> <uniqueId>76522</uniqueId> <payload>$Null()</payload> <tempValue>$Null()</tempValue> </TempSensor> </Save> |
...
model |
...
Clarify the relationship/dependencies between model lifecycle and workflow lifecycle (if a workflow is defined within a action in the model)
When model is deployed, its definition along with action workflows are staged in memory as per the modifier limit. As when instance gets created, workflows may get activated, if actionable attribute is updated. Modifier - live decides on number of active instances of the workflows. When workflow is done executing the tasks, it will get trashed. If any of the task is marked as 'while="true"', that will maintain the workflow in the active state for ever.
...