Read-only mirror of https://github.com/sogis/simi-sql2json — Kanton Solothurn. Issues & pull requests at the source.
  • Java 93%
  • Shell 7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2022-03-22 07:24:08 +01:00
.github/workflows reactivated github action 2021-05-10 10:48:36 +02:00
gradle/wrapper templating core 2021-01-15 08:17:37 +01:00
inttest groom inttest 2022-03-22 06:52:09 +01:00
src #991 Added line breaks to output 2022-03-22 07:24:08 +01:00
testdb Wrote devdok 2021-01-28 07:21:51 +01:00
.gitignore groom inttest 2022-03-22 06:52:09 +01:00
build.gradle groom inttest 2022-03-22 06:47:58 +01:00
DevDok.md updated devdoc for v1.1 2021-05-05 12:02:43 +02:00
gradlew app config 2021-01-13 08:04:02 +01:00
gradlew.bat app config 2021-01-13 08:04:02 +01:00
LICENSE Initial commit 2021-01-13 05:48:54 +01:00
README.md Harmonized reading from File and HTTP sources 2022-01-13 12:47:49 +01:00
settings.gradle app config 2021-01-13 08:04:02 +01:00

sql2json

badge

Der sql2json Transformator (Trafo) arbeitet pro Programmaufruf ein Json-Template mit n im Template enthaltenen Trafo-Tags ab. Für jedes Trafo-Tag setzt der Trafo ein Sql-Statement auf die Metadatenbank ab und ersetzt das Trafo-Tag mit dem Ergebnis des SQL-Queries.

Falls beim Aufruf ein Json-Schema angegeben wird, validiert der Trafo das erzeugte Json gegen das Schema.

Dokumentationen

In den folgenden Kapiteln ist die Konfiguration und Benutzung des Trafo beschrieben. Die Entwicklerdoku ist hier zuhause.

Downloaden und starten

Der Trafo ist ein executable fat jar, welches via Releases im Github-Repo bezogen werden kann.

Befehl zur Ausgabe der Hilfe:

java -jar sql2json.jar -h

Die Konfiguration des Trafo erfolgt mittels Kommandozeilenparameter und/oder Umgebungsvariable. Bei Variablen, welche sowohl auf Kommandozeile wie in Umgebungsvariable definiert sind, wird der Wert der Kommandozeile verwendet.

Bezeichnung Parameter Umgebungsvariable Bemerkung
Template-Pfad -t SqlTrafo_Templatepath Netzpfad zum zu verarbeitenden Template.
Pfad zu Output -o SqlTrafo_Outputpath Absoluter Dateipfad des output config.json. Bsp.: opt/user/trafo/wms/config.json
DB-Connection -c SqlTrafo_DbConnection DBC Connection-URL zur abzufragenden DB. Bsp.: jdbc:postgresql://host:port/database
DB-User -u SqlTrafo_DbUser Benutzername für die DB-Verbindung
DB-Password -p SqlTrafo_DbPassword Passwort für die DB-Verbindung
JSON-Schema -s SqlTrafo_JsonSchema Netzpfad zum JSON-Schema

Netzpfad:

  • Als absolute URL "http(s)://..." oder Dateipfad angeben
  • Bsp. Dateipfad: opt/user/trafo/wms/template.json

Siehe die Integrationstests als Beispiele:

Logging

Trafo nutzt die Bibliothek slf4j-simple. Loglevel und Ausgabeformat können mittels Java-Variablen gesetzt werden.

Setzen des Log-Levels:

java -Dorg.slf4j.simpleLogger.defaultLogLevel=warn -jar sql2json.jar

Log-Level: "trace", "debug", "info", "warn", "error" oder "off". Default: "info"

Siehe javadoc der Klasse SimpleLogger bezüglich der weiteren Konfigurationsmöglichkeiten des Loggings.

Beispiel mit Parametern und Logging:

java -Dorg.slf4j.simpleLogger.defaultLogLevel=warn -jar sql2json.jar \
  -c jdbc:postgresql://localhost/postgres \
  -u postgres \
  -p postgres \
  -t $(pwd)/template.json \
  -o $(pwd)/result.json

Konfiguration mittels Template, Trafo-Tags und Sql-Query Dateien

Programmablauf

Für jedes Trafo-Tag, welches der Trafo im Json-Template antrifft, werden die folgenden Schritte durchgeführt. Der Trafo:

  • setzt das im Trafo-Tag referenzierte SQL-Query auf die Datenbank ab. Der Pfad zur Query-Datei wird relativ zum Template-Pfad aufgelöst, damit die Sql-Dateien auch in Unterverzeichnissen geordnet werden können.
  • verarbeitet das SQL Resultset in ein Json-Element.
  • ersetzt im Output.json das Trafo-Tag mit dem Json-Element.

Trafo-Tag

Das Trafo-Tag ist ein Json-Objekt, dessen Name mit "$trafo:" beginnt: {"$trafo:elem": "object.sql"}

Typen:

  • "$trafo:elem": Rendert ein einzelnes Json-Element in das Output-Json. Typen von Json-Elementen:
    • "Primitive" Werte (String, Number, Boolean, Null)
    • Liste von Elementen: [...]
    • Objekt: {...}
  • "$trafo:list": Rendert eine Liste von Json-Elementen in das Output-Json.
    • Die Elemente der Liste können wiederum Primitivwerte, Objekte oder Listen sein.
  • "$trafo:set": Rendert ein Objekt mit Name-Wert-Paaren in das Output-Json.
    • Der Name in den Paaren ist ein String.
    • Die Werte in den Paaren können wiederum Primitivwerte, Objekte oder Listen sein.

Beispiel für Trafo-Tag {"$trafo:elem": "..."}

Template-Ausschnitt

{
	"fuu": "...",
	"layer": {"$trafo:elem": "element.sql"},
	"bar": "..."
}

Query-Rückgabe

buz
ch.so.agi.gemeindegrenzen

Der Trafo verwendet die erste zurückgegebene Spalte des Resultsets.

  • Spaltenname ist egal
  • Aus dem Db-Typ der Spalte leitet der Trafo das passende Json-Element ab
    • Json, Jsonb -> Objekt oder Liste
    • Varchar, Number, .... -> entsprechender Json "Primitivtyp"

Json-Ausgabe

{
	"fuu": "...",
	"layer": "ch.so.agi.gemeindegrenzen",
	"bar": "..."
}

Beispiel für Trafo-Tag {"$trafo:list": "..."}

Template-Ausschnitt

{
	"fuu": "...",
	"layers": {"$trafo:list": "objectlist.sql"},
	"bar": "..."
}

Query-Rückgabe

buz
{"id": "ch.so.agi.gemeindegrenzen", "title": "Gemeindegrenzen", "visible": true }
{"id": "ch.so.agi.bezirksgrenzen", "title": "Bezirksgrenzen", "visible": false }

Verhalten bezüglich der Spaltentypen identisch wie bei {"$trafo:elem": "..."}

Json-Ausgabe

{
	"fuu": "...",
	"layers": [{
			"id": "ch.so.agi.gemeindegrenzen",
			"title": "Gemeindegrenzen",
			"visible": true
		},
		{
			"id": "ch.so.agi.bezirksgrenzen",
			"title": "Bezirksgrenzen",
			"visible": false
		}
	],
	"bar": "..."
}

Beispiel für Trafo-Tag {"$trafo:set": "..."}

Template-Ausschnitt

{
	"fuu": "...",
	"layers": {"$trafo:set": "objectset.sql"},
	"bar": "..."
}

Query-Rückgabe

fuu bar
ch.so.agi.gemeindegrenzen {"title": "Gemeindegrenzen", "visible": true }
ch.so.agi.bezirksgrenzen {"title": "Bezirksgrenzen", "visible": false }

Der Trafo verwendet die ersten beiden zurückgegebenen Spalten des Resultsets.

  • Die Spaltennamen sind egal
  • Der Db-Typ der ersten Spalte muss ein String sein (varchar, ...)
  • Aus dem Db-Typ der zweiten Spalte leitet der Trafo das passende Json-Element ab
    • Json, Jsonb -> Objekt oder Liste
    • Varchar, Number, .... -> entsprechender Json "Primitivtyp"

Json-Ausgabe

{
	"fuu": "...",
	"layers": {
		"ch.so.agi.gemeindegrenzen": {
			"title": "Gemeindegrenzen",
			"visible": true
		},
		"ch.so.agi.bezirksgrenzen": {
			"title": "Bezirksgrenzen",
			"visible": false
		}
	},
	"bar": "..."
}

Korrekte Komplettkonfigurationen

Die Integrationstests sind gute erläuternde Komplettkonfigurationen (mit Template, Trafo-Tag, Sql-Datei). Siehe die auf _ok.sh endenden Integrationstests in Ordner [Repo-Root]/inttest.

Fehlerbehandlung

Beim Auftreten eines Fehlers wird das Json-Tag mit dem Fehlertext "erweitert" und in das output-json geschrieben. Zusätzlich wird ein umfangreicher Fehleroutput auf den Error-Stream geschrieben.

Bei einem Fehler bei der Verarbeitung eines Trafo-Tag wird die Verarbeitung der weiteren Tag's nicht abgebrochen. Die auftretenden Fehler werden sequentiell ausgegeben. Bei einem Fehler gibt der gestartete Java-Prozess <> 0 als exit value zurück.