Models
Models are declared by a plugin in a service metadata file, which specifies a service name. Multiple plugins then implement that service to build up the model.
Service metadata file
The plugin which ‘owns’ the model declares it in the file/__service-metadata__.json file:
{
"example:data:setup-model:example:project": {
"statements": [
"conforms-to haplo:data-import-framework:setup-model"
],
"metadata": {
"name": "example:project",
"title": "Project",
"description": "Information about projects things associated with those projects."
}
}
}
This file specifies the service name, "example:data:setup-model:example:project" in this case, and the name, title and description to describe the model.
Model definitions
One or more plugins then implements the named service:
P.implementService(
"example:data:setup-model:example:project",
function(model) {
// Model definition is set up here
}
);
To setup the model, model.addDestination(spec) is called repeatedly to add the Destinations.
The spec has common properties, and then kind specific properties. The common properties are:
name |
Name of the Destination |
title |
Human readable name of the Destination. The string will have NAME() interpolated |
displaySort |
A numeric sorting value to order the Destinations when displaying information about the model in the admin UI |
kind |
The kind of Destination |
optional |
If true, then this Destination does not have to be completed by the control file |
depends |
The name of another Destination that this Destination depends on |
“object” Destination kind
The "object" Destination kind specifies an object in the object store. As well as the common properties, it has:
objectType |
The type of object this represents |
objectDependsWithAttribute |
(optional) If the depends property is set, then the attribute in the dependency which links to the Target object |
without |
(optional) An array of API codes for attributes that shouldn’t be included in the Destination |
objectAttributesOverride |
(optional) A dictionary of attribute API code to Name specification to override the automatic definition of Names from the schema. |
For example:
model.addDestination({
name: "phd:project",
title: "NAME(Doctoral Research Project) record",
depends: "profile",
kind: "object",
optional: true,
objectType: T.DoctoralResearchProject,
objectDependsWithAttribute: A.Researcher,
without: [
"std:attribute:notes"
]
});
“dictionary” Destination kind
The "dictionary" Destination kind uses a plain JavaScript Object as the target, and the model definition needs to provide methods to read and populate the Target. In addition to the common properties, it has:
dictionaryNames |
An object with the names of the Names as keys, and descriptions of the Name as the value. (see below) |
tryLoadDestinationTarget |
A function which given the load information, returns a new Target. Return undefined if it’s not possible to load the target |
tryMakeTargetAvailableForDependency |
A function which given the dependency name and dependent Target, returns a new Target. Return undefined if it’s not possible to load the target |
commit |
A function which given a Target, the Destination name, and a Transformation object, commits the Target to whatever database it’s stored in |
The dictionaryNames values contain properties:
description |
Human readable description of this Name |
type |
Data type |
required |
(optional) If true, this Name must have a value for the Transformation to succeed |
multivalue |
(optional) If true, this Name is multivalue, and will be stored in the Target as an Array of values |
For example:
model.addDestination({
name: "phd:project:supervisors",
title: "NAME(Doctoral Research Project) supervisors",
depends: "phd:project",
displaySort: 1001,
optional: true,
kind: "dictionary",
tryLoadDestinationTarget: function(loadInfo) {
// TODO: Load target
return {};
},
tryMakeTargetAvailableForDependency: function(dependencyName, dependencyTarget) {
// TODO: Load target given the dependencyTarget
return {};
},
commit: function(target, destinationName, transformation) {
// TODO: Store target in database
},
dictionaryNames: {
supervisor: {
description: "Supervisor",
type: "string",
multivalue: true
}
}
});