There are 3 important types of parameters for the Relational Adaptor.
Type of parameter | Parameters of this type | Explanation |
Connection Parameters |
|
Connection parameters are used to connect to a database. *Database is only required is the Connection Type is Microsoft SQL Server. For Oracle, you may need to set the server to the relevant TNS of your datasource. E.g. |
Query Parameters |
|
The query parameters are used to fetch tags and tag values. These parameters are SQL queries that are usually expressed with keywords specific to the Relational Adaptor, to make your queries more easily understood. |
Column Parameters | Required:
Optional:
|
These parameters specify the column names that will define your timeseries query results.
|
Keywords
When the Relational Adaptor identifies any of these keywords in a query, it replaces them with the corresponding request’s field.
Keyword | Description | Narrow or Wide | Read or Write |
CONFIDENCE() | Confidence of the value that is being inserted/updated. | Both | Write |
ENDTIME() | The request’s end time. | Both | Read |
STARTTIME() | The request’s start time. | Both | Read |
TAGNAME() | Name of the tag that is being inserted/updated in a narrow table. | Narrow | Write |
TAGLIST() | The request’s entity names. Used in Narrow query requests. | Narrow | Read |
TAGFIELD() | Name of the column/field that is being inserted/updated in a wide table. | Wide | Write |
TAGFIELDLIST() | The request’s entity names (translated to field names). Used in Wide query requests. | Wide | Read |
NAMELIST() | The request’s entity names. Used in Wide query requests. | Wide | Read |
NAME() | Name of the entity whose value is being inserted/updated in a wide table. | Wide | Write |
SAMPLEINTERVAL() | Sample interval of the get request as a number of seconds (it can have a fractional part, so a half second interval would be passed to the query as 0.5). | Both | Read |
SAMPLEMETHOD() | Sample method of the get request as a string. | Both | Read |
TIMESTAMP() | Timestamp of the value that is being inserted/updated. | Both | Write |
VALUE() | The value that is being inserted/updated. | Both | Write |
Example Query using Column Parameters
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, PRV_PRODUCTION_METRICS.PRODUCTION_DATE, PRV_PRODUCTION_METRICS.PROD_OIL_ALLOC_GROSS_VOL, PRV_PRODUCTION_METRICS.CONFIDENCE, PRV_PRODUCTION_METRICS.MIN, PRV_PRODUCTION_METRICS.MAX FROM PRV_PRODUCTION_METRICS, PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_METRICS.PRODUCTION_ENTITY_ID = PRV_PRODUCTION_HIERARCHIES.PRODUCTION_ENTITY_ID AND PRV_PRODUCTION_HIERARCHIES.AREA_NAME IN (NAMELIST()) AND PRV_PRODUCTION_METRICS.PRODUCTION_DATE BETWEEN TRUNC(STARTTIME()) AND TRUNC(ENDTIME()) ORDER BY PRV_PRODUCTION_METRICS.PRODUCTION_DATE ASC
Where:
Tag Name Column = AREA_NAME
Data Timestamp Column = PRODUCTION_DATE
Data Value Column = PROD_OIL_ALLOC_GROSS_VOL
Data Confidence Column = CONFIDENCE
Tag Minimum Value Column = MIN
Tag Maximum Value Column = MAX
It is important that you order the returned results in date order, oldest time first.
PUT Queries
There are 3 main rules for being able to write values back to a source database.
- ‘Allow Write’ must be set to True.
- The available tags query must contain the value column with the correct data type.
- Run Tag Discovery at least once with such an available tags query.
About the Available Tags Query
The Available Tags Query (also known as the Discovery Query) is used to return a list of tags. It must always contain the Value column, even for narrow queries. This is because the adaptor will store the Value column’s type in the native names of tags, so that the adaptor will know how to convert incoming values to what the database expects.
This has 2 important consequences:
- If the Value column is not part of the query, the type would be missing from the native name. When an adaptor receives a Put request for a tag which doesn’t have the data type stored in its native name, it throws an InvalidConfigurationException. Therefore, if you had an existing read-only datasource that you want to turn into a read-write datasource, you must update the query and run the available tags query again, so that the adaptor can store the required types in the native names.
- If the adaptor cannot determine the type of a column (e.g. sql_variant type) or it determines the type incorrectly (as can happen with ODBC), you can override the column type in the available tags query to provide the adaptor with instructions on how to handle the specific column. To do this, use the CONVERT() function (if using MSSQL) or the CAST() function (if using Oracle).
Examples:
SELECT …, CONVERT(int, SqlVariantValueColumn)…
SELECT …, CAST(VALUE_COLUMN AS date) …
If writing values is not required, then the Value column can be omitted from narrow queries.
Narrow Queries
A relational query can be in one of two forms: Narrow or Wide. Narrow queries return a single Value column. If you configure your datasource’s query type to Narrow, you need to provide the Value column in your query.
E.g. In the following query, PROD_OIL_ALLOC_GROSS_VOL is the Value column:
SELECT PRV_PRODUCTION_METRICS.NAME, PRV_PRODUCTION_METRICS.PROD_DATE, PRV_PRODUCTION_METRICS.PROD_OIL_ALLOC_GROSS_VOL FROM PRV_PRODUCTION_METRICS WHERE PRV_PRODUCTION_METRICS.NAME IN (NAMELIST()) ORDER BY PRV_PRODUCTION_METRICS.PROD_DATE ASC
Here are some more examples.
Available Tags Query
This query returns a list of tags.
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME FROM PRV_PRODUCTION_HIERARCHIES
Single Point Raw Query
This is an example of a single point raw query using TAGLIST() and STARTTIME() keywords.
SELECT PRVPH.AREA_NAME, PRVPM.PRODUCTION_DATE, SUM(PRVPM.PROD_OIL_ALLOC_GROSS_VOL) AS PROD_OIL_ALLOC_GROSS_VOL FROM PRV_PRODUCTION_METRICS PRVPM, PRV_PRODUCTION_HIERARCHIES PRVPH, (SELECT PRVPHMT.AREA_NAME AS NAME,MAX(PRVPMMT.PRODUCTION_DATE) AS MAX_TIMESTAMP FROM PRV_PRODUCTION_METRICS PRVPMMT, PRV_PRODUCTION_HIERARCHIES PRVPHMT WHERE PRVPMMT.PRODUCTION_ENTITY_ID = PRVPHMT.PRODUCTION_ENTITY_ID AND PRVPHMT.AREA_NAME IN (TAGLIST()) AND PRVPMMT.PRODUCTION_DATE <= STARTTIME() AND PRVPMMT.READING_TYPE = 'DAILY' GROUP BY PRVPHMT.AREA_NAME) PRVPMMAXTIME WHERE PRVPM.PRODUCTION_ENTITY_ID = PRVPH.PRODUCTION_ENTITY_ID AND PRVPM.PRODUCTION_DATE = PRVPMMAXTIME.MAX_TIMESTAMP AND PRVPH.AREA_NAME = PRVPMMAXTIME.NAME AND PRVPH.AREA_NAME IN (TAGLIST()) GROUP BY PRVPH.AREA_NAME, PRVPM.PRODUCTION_DATE
Historical Raw Query
This is an example of a historical raw query using TAGLIST(), STARTTIME(), and ENDTIME() keywords.
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, PRV_PRODUCTION_METRICS.PRODUCTION_DATE, PRV_PRODUCTION_METRICS.PROD_OIL_ALLOC_GROSS_VOL FROM PRV_PRODUCTION_METRICS, PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_METRICS.PRODUCTION_ENTITY_ID = PRV_PRODUCTION_HIERARCHIES.PRODUCTION_ENTITY_ID AND PRV_PRODUCTION_HIERARCHIES.AREA_NAME IN (TAGLIST()) AND PRV_PRODUCTION_METRICS.PRODUCTION_DATE BETWEEN TRUNC(STARTTIME()) AND TRUNC(ENDTIME()) ORDER BY PRV_PRODUCTION_METRICS.PRODUCTION_DATE ASC
Put Select Query
In this type of query, the adaptor does not care about the actual value in the database. It just has to know whether it exists or not. Whether you use “SELECT NULL” or “SELECT Value()” or “SELECT ‘Wednesday’” doesn’t matter. The adaptor never inspects the returned value. It just checks whether the query returned any row or not so that it can decide whether to execute an INSERT or an UPDATE statement.
SELECT NULL FROM NarrowTable WHERE Tag = TagName() AND Timestamp = Timestamp()
Put Insert Statement
INSERT INTO NarrowTable Tag, Timestamp, Confidence, Value() VALUES (TagName(), Timestamp(), Confidence(), Value())
Put Update Statement
UPDATE NarrowTable SET Confidence = Confidence(), Value = Value() WHERE Tag = TagName() AND Timestamp = Timestamp()
Wide Queries
Wide queries return more than one Value column.
E.g. In the following wide query, PROD_OIL_ALLOC_GROSS_VOL and PROD_OIL_TARGET_GROSS_VOL are the Value columns:
SELECT PRV_PRODUCTION_METRICS.NAME AS NAME, PRV_PRODUCTION_METRICS.PROD_DATE AS TIMESTAMP, PRV_PRODUCTION_METRICS.PROD_OIL_ALLOC_GROSS_VOL, PRV_PRODUCTION_METRICS.PROD_OIL_TARGET_GROSS_VOL FROM PRV_PRODUCTION_METRICS WHERE PRV_PRODUCTION_METRICS.NAME IN (NAMELIST()) ORDER BY PRV_PRODUCTION_METRICS.PROD_DATE ASC
Here are some more examples.
Available Tags Query
This query returns a list of tags.
SELECT DISTINCT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, 0 AS PROD_OIL_ALLOC_GROSS_VOL, 0 AS PROD_OIL_TARGET_GROSS_VOL FROM PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_HIERARCHIES.AREA_NAME IS NOT NULL
Single Point Query
This is an example of a single point query using NAMELIST() and STARTTIME() keywords.
SELECT PRVPH.AREA_NAME, PRVPM.PRODUCTION_DATE, SUM(PRVPM.PROD_OIL_ALLOC_GROSS_VOL) AS PROD_OIL_ALLOC_GROSS_VOL, SUM(PRVPM.PROD_OIL_TARGET_GROSS_VOL) AS PROD_OIL_TARGET_GROSS_VOL, SUM(PRVPM.PROD_GAS_ALLOC_GROSS_VOL) AS PROD_GAS_ALLOC_GROSS_VOL, SUM(PRVPM.PROD_GAS_TARGET_GROSS_VOL) AS PROD_GAS_TARGET_GROSS_VOL, FROM PRV_PRODUCTION_METRICS PRVPM, PRV_PRODUCTION_HIERARCHIES PRVPH, (SELECT PRVPHMT.AREA_NAME AS NAME, MAX(PRVPMMT.PRODUCTION_DATE) AS MAX_TIMESTAMP FROM PRV_PRODUCTION_METRICS PRVPMMT, PRV_PRODUCTION_HIERARCHIES PRVPHMT WHERE PRVPHMT.AREA_NAME IN (NAMELIST()) AND PRVPMMT.PRODUCTION_DATE <= TRUNC(STARTTIME()) GROUP BY PRVPHMT.AREA_NAME) PRVPMMAXTIME WHERE PRVPM.PRODUCTION_ENTITY_ID = PRVPH.PRODUCTION_ENTITY_ID AND PRVPM.PRODUCTION_DATE = PRVPMMAXTIME.MAX_TIMESTAMP AND STARTTIME() < PRVPMMAXTIME.MAX_TIMESTAMP AND PRVPH.AREA_NAME = PRVPMMAXTIME.NAME AND PRVPH.AREA_NAME IN (NAMELIST()) GROUP BY PRVPH.AREA_NAME, PRVPM.PRODUCTION_DATE
Single Point Query
This is an example of a single point query using TAGFIELDLIST(), NAMELIST(), and STARTTIME() keywords.
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, PRV_PRODUCTION_HIERARCHIES.START_DATE, TAGFIELDLIST() FROM PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_HIERARCHIES.START_DATE >= TRUNC(STARTTIME()) AND PRV_PRODUCTION_HIERARCHIES.AREA_NAME IN (NAMELIST())
Historical Raw Query
This is an example of a historical raw query using NAMELIST(), STARTTIME(), and ENDTIME() keywords.
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, PRV_PRODUCTION_METRICS.PRODUCTION_DATE, PRV_PRODUCTION_METRICS.PROD_OIL_ALLOC_GROSS_VOL, PRV_PRODUCTION_METRICS.PROD_OIL_TARGET_GROSS_VOL FROM PRV_PRODUCTION_METRICS, PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_METRICS.PRODUCTION_ENTITY_ID = PRV_PRODUCTION_HIERARCHIES.PRODUCTION_ENTITY_ID AND PRV_PRODUCTION_HIERARCHIES.AREA_NAME IN (NAMELIST()) AND PRV_PRODUCTION_METRICS.PRODUCTION_DATE BETWEEN STARTTIME() AND ENDTIME() ORDER BY PRV_PRODUCTION_METRICS.PRODUCTION_DATE ASC
Historical Raw Query
This is an example of a historical raw query using NAMELIST(), TAGFIELDLIST(), STARTTIME(), and ENDTIME() keywords.
SELECT PRV_PRODUCTION_HIERARCHIES.AREA_NAME, PRV_PRODUCTION_HIERARCHIES.START_DATE, TAGFIELDLIST() FROM PRV_PRODUCTION_HIERARCHIES WHERE PRV_PRODUCTION_HIERARCHIES.START_DATE BETWEEN STARTTIME() AND ENDTIME()) AND PRV_PRODUCTION_HIERARCHIES.AREA_NAME IN (NAMELIST()) ORDER BY PRV_PRODUCTION_METRICS.PRODUCTION_DATE ASC
Put Select Query
In this type of query, the adaptor does not care about the actual value in the database. It just has to know whether it exists or not. Whether you use “SELECT NULL” or “SELECT Value()” or “SELECT ‘Wednesday’” doesn’t matter. The adaptor never inspects the returned value. It just checks whether the query returned any row or not so that it can decide whether to execute an INSERT or an UPDATE statement.
SELECT NULL FROM WideTable WHERE EntityName = Name() AND Timestamp = Timestamp()
Put Insert Statement
INSERT INTO WideTable (EntityName, Timestamp, Confidence, TagField()) VALUES (Name(), Timestamp(), Confidence(), Value())
Put Update Statement
UPDATE WideTable SET Confidence = Confidence(), TagField() = Value() WHERE EntityName = Name() AND Timestamp = Timestamp()