FreeMarker Variablen

Das datasqill Modul DsModTemplateSQL übergibt dem FreeMarker Interpreter (zusätzlich zum FreeMarker Skript) Variablen, damit das Skript den Code anhand der beteiligten Tabellen mit Spalten und eingestellten Parameter generieren kann.

Das Skript kann nun aufgrund der Variablen das effektive SQL generieren.

Möchte man z.B. das INSERT INTO mit dem korrekten Tabellen (und optional Schemanamen) generieren, dann sieht es in FreeMarker so aus:

INSERT INTO ${target}

Ist das Zielobject im datasqill Modell nun die Tabelle holiday im Schema SOFTQUADRAT, dann wird der Code

INSERT INTO SOFTQUADRAT.holiday

generiert.

Die Variable target wird vom DsModTemplateSQL zur Verfügung gestellt.

Folgende Variablen stellt das Modul immer zur Verfügung:

Name Datentyp Bedeutung
database_product_name String Datenbankname laut Antwort vom jdbc-Treiber
action String Die Transformationsanweisung (SQL)
action_id Number Id der Action (Transformation)
batch_instance_id Number Id der Batch Instance (Laufender Batch), bzw. -1 beim Validate
request_id Number Id des eindeutigen Requests (Siehe request-Tabelle)
schedule_date String Startdatum in UTC Zeit des Batches im Format yyyy-MM-ddTHH:mm:ss.SSSSSSSSSZ
module_start_timestamp String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss.SSS
module_start_datetime String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss
module_start_date String Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd
module_utc_start_timestamp String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss.SSS
module_utc_start_datetime String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss
module_utc_start_date String Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd
connection_id Number Database ID (Connection ID) der Datenbankverbindung
target_connection_id Number Database ID (Connection ID) der Datenbankverbindung
target_schema String Schemaname der Zieltabelle. Kann zukünftig leer sein
target_schema_quoted String Schemaname der Zieltabelle der Zieldatenbank in Identifier Quotes, falls notwendig
target_table String Tabellenname der Zieltabelle
target_table_quoted String Tabellenname der Zieltabelle der Zieldatenbank in Identifier Quotes, falls notwendig
target String Schemaname mit "." (falls gegeben) und Tabellenname der Zieltabelle jeweils in Quotes, falls notwendig
target_partition String Partitionsname der Zieltabelle
sources Object Eine Liste der Quellobjekte vom Datentyp ObjectDs
iteration Number Bei Loop Queries gibt es eine fortlaufende Nummer pro Loop Ergebnis. Sonst 1
all_tgt TemplateColumn Liste aller Spalten in der Zieltabelle
all_src TemplateColumn Liste aller Spalten in der Quellabfrage
other_tgt TemplateColumn Liste aller Spalten ohne die durch Parameter definierte Spalten in der Zieltabelle
other_src TemplateColumn Liste aller Spalten ohne die durch Parameter definierte Spalten in der Quelltabelle

Variablen, wenn die Transformation genau eine Quelltabelle hat:

Name Datentyp Bedeutung
source_schema String Schemaname der Quelltabelle
source_table String Tabellenname der Quelltabelle
source_partition String Partitionsname der Quelltabelle

Variablen aus den Attributen:

In datasqill kann man Modulattribute hinterlegen, die dann in der datasqill GUI angezeigt und editiert werden können.

Dazu kann man für die Zwecke des Templates die Attribute definieren. Diese können dann im Template verwendet werden. So kann man im Historize Modul z.B. angeben, ob beim Abgleich gelöschte Daten berücksichtigt werden sollen (Boolean), oder welche Schlüssel den Primary Key der Historisierung definiert (TemplateColumn). Auch Einzelspalten (TemplateColumn) sind dort (für den Anwender unsichtbar) hinterlegt. Diese definierten Attribute werden mit dem Attributsnamen als Variablen dem FreeMarker Interpreter zur Verfügung gestellt.

Attribute vom Typ BOOLEAN, werden als boolsche Variable übergeben. Wenn die Attribute vom Typ CHAR sind und sie mit "RC:", "RL:", "OC:" oder "OL:" beginnen, dann werden sie in eine Liste von TemplateColumn umgewandet. Ansonsten werden sie direkt als String übergeben.

Optionale und Erforderliche Spalten, bzw. Spaltenlisten

Attributswertanfang Datentyp Bedeutung
OC: Optionale Spalte (Optional Column) Der Anwender gibt eine oder keine Spalte an
OL: Optionale Spaltenliste (Optional List) Eine kommaseparierte Liste von Spalten. Sie darf leer sein
RC: Erfolderliche Spalte (Required Column) Der Anwender muss genau eine Spalte angeben
RL: Erfolderliche Spaltenliste (Required List) Eine kommaseparierte Liste von Spalten. Sie darf nicht leer sein

Beispiele aus dem Historize Modul:

Name Wert Kommentar
is_deleted OC:is_deleted Die Spalte ist optional. Ist sie nicht gegeben, dann ändert sich die Logik des Templates
key RL:${tgt_pk_list} Die Spaltenliste ist erforderlich. In diesem Beispiel werden die Primary keys der Zieldatenbank verwendet
key RL:spalte1,spalte2 Die Spaltenliste ist erforderlich. In diesem Beispiel werden sie manuell angegeben
ignore_columns OL: Die Spaltenliste ist nicht erforderlich. Alle angegebenen Spalten werden beim Historize ignoriert

Der Datentyp ObjectDs

Der Datentyp ObjectDs leitet sich direkt aus der Tabelle vv_sqts_object in der Repositorydatenbank ab:

Name Datentyp Kommentar
sqtsObjectId Number Eindeutige ID des Objekts (Tabelle)
sqtsObjectTypeId Number ID des ObjektTyps.
serverId Number ID des Connection (database_id)
objectName Number Names des Objekts (Tabellenname)
objectOwner Number Names des Owners (Schemaname)
objectPartition Number Partitionsname

Der Datentyp TemplateColumn

In der Regel sind die oben angegebenen Spalten-Variablen eine Liste vom Datentyp TemplateColumn Der Datentyp TemplateColumn sieht folgendermaßen aus:

Name Datentyp Kommentar
name Number Name der Spalte, gegebenfalls gequoted
unquotedName Number Name der Spalte
nullable Boolean Gibt an, ob die Spalte den Wert NULL annehmen kann

Einige Beispiele zur Verwendung von Variablen im FreeMaker

Verwenden einer boolschen Variable

[#if with_delete!false]Text1[#else]Text2[/#if]

Ist with_delete true, dann ergibt es:

Text1

Ist with_delete false (oder nicht gesetzt, angegeben mit !false), dann ergibt es:

Text2

Ein Modul ist nur auf Oracle oder Postgres lauffähig. Abbrechen bei einer nicht unterstützten Datenbank

[#if !["Oracle","PostgreSQL"]?seq_contains("${database_product_name}")]
[#stop 'This Module does not support ' + database_product_name + " databases"]
[/#if]

Eine Where-Bedingung aufbauen, bei der 2 Tabellen über den gleichen Primary key (der über das Attribut key angegeben wurde) gejoint werden:

WHERE [#list key as col]src.${col.name} = tgt.${col.name} [#sep]
  AND [/#list]

[#sep] führt dazu, dass der folgende Teil nach der letzten Spalte nicht mehr generiert wird.

Besteht der key aus spalte1 und spalte2 dann wird folgender Code generiert:

WHERE src.spalte1 = tgt.spalte1
  AND src.spalte2 = tgt.spalte2

Besteht der key aus spalte1 und spalte-2 dann wird für die Datenbank MySQL folgender Code generiert:

WHERE src.spalte1 = tgt.spalte1
  AND src.spalte2 = tgt.`spalte-2`

Bei den meisten anderen Datenbanken wird folgender Code generiert:

WHERE src.spalte1 = tgt.spalte1
  AND src.spalte2 = tgt."spalte-2"

Ausgeben aller Datenbankquellen

[#list sources as src][#if "${src.sqtsObjectTypeId}" == "1"]${src.objectOwner}.${src.objectName}
[/#if][/#list]

Wenn als Datenbankquellen (es kann auch noch weitere Quellen geben) die beiden Tabellen tab1 und tab2 im Schema SOFTQUADRAT angegeben wurden, dann wäre die Ausgabe:

SOFTQUADRAT.tab1
SOFTQUADRAT.tab2