[Lada-commits] [PATCH 2 of 2] Complement and correct data model and docs for queries
Wald Commits
scm-commit at wald.intevation.org
Fri Oct 14 15:20:59 CEST 2016
# HG changeset patch
# User Tom Gottfried <tom at intevation.de>
# Date 1476451122 -7200
# Node ID effef57f3f7e1587cae44b5907cf624105ced0db
# Parent b225875c68fedd7daa4c058776671d9f75488925
Complement and correct data model and docs for queries.
diff -r b225875c68fe -r effef57f3f7e README.markdown
--- a/README.markdown Thu Oct 13 22:25:46 2016 +0200
+++ b/README.markdown Fri Oct 14 15:18:42 2016 +0200
@@ -90,17 +90,20 @@
Der Ordner 'target' enthält dann die Dokumentation im HTML-Format in dem
Verzeichnis 'site/apidocs'.
-Erstellen von Filtern
+Erstellen von Queries
---------------------
-Um neue Filter für die Suche von Proben, Messungen und Messprogrammen zu
+Queries können als SQL-Statement in der Tabelle stammdaten.queries definiert
+werden. Eine Filterung kann über Variablen erfolgen, die in stammdaten.filter
+definiert werden müssen und mittels SQL-Interpolation im SQL-Statement
+verwendet werden können.
+Um neue Queries für die Suche von Proben, Messungen und Messprogrammen zu
erstellen sind die folgenden Schritte erforderlich:
1. In der Tabelle 'stammdaten.query' einen neuen Eintrag erzeugen.
* id: Primary-Key (wird generiert)
- * name: Der Name des Filters
+ * name: Der Name der Query
* type: Der Datentyp der gefiltert werden soll.
- (mögliche Werte: 'probe', 'messung', 'messprogramm', 'ort', 'probenehmer',
- 'datensatzerzeuger', 'messprogrammkategorie')
+ (mögliche Werte siehe Datenbank-Schema-Definition)
* sql: Das auszuführende SQL-Statement (siehe #Regeln für die Syntax)
* description: Ein beschreibender Text
@@ -114,13 +117,14 @@
* flex: Dynamische Spaltenbreite (true/false)
* index: Der Datenindex
-3. In der Tabelle 'stammdaten.filter' für jedes 'WHERE'-Statement in der Query
- einen Eintrag erzeugen:
+3. In der Tabelle 'stammdaten.filter' für jeden Parameter in der 'WHERE'-Clause
+ der Query einen Eintrag erzeugen:
* id: Primary-Key (wird generiert)
* query_id: ID der zugehörigen und in Schritt 1. erzeugten Query
* data_index: Der Name der Variablen, die in dem 'WHERE'-Statement ersetzt
werden soll
* type: Datenbasis, die im Client als Eingabe genutzt werden soll
+ (mögliche Werte siehe Datenbank-Schema-Definition)
* label: Der angezeigte Name des Filters
* multiselect: Mehrfachangabe von Werten für diesen Filter (true/false)
@@ -128,20 +132,24 @@
* Bei Queries vom Typ `probe` muss das erste selektierte Feld `probe.id` sein.
Dieses wird in der Oberfläche nicht angezeigt.
-* Bei Queries vom Typ `messung` muss das erste selektierte Feld `messung.id` und
- das Zweite `probe.id AS probeId` sein. Diese werden in der Oberfläche nicht
- angezeigt. Um im Client die Funktionalität zu erhalten, sollten Messungsfilter
- die beiden Felder `probe.hauptproben_nr AS hauptprobenNr` und
- `messung.nebenproben_nr AS nebenprobenNr` enthalten.
+* Bei Queries vom Typ `messung` muss das erste selektierte Feld `messung.id`
+ und das zweite `probe.id` sein. Diese werden in der Oberfläche nicht
+ angezeigt. Für `probe.id` muss in stammdaten.result ein Eintrag mit
+ `data_index = 'probeId'` angelegt werden (obwohl diese Spalte nicht angezeigt
+ wird). Um im Client die Funktionalität zu erhalten, sollten Messungsfilter
+ die beiden Felder `probe.hauptproben_nr` und `messung.nebenproben_nr`
+ enthalten.
* Bei Queries vom Typ `messprogramm` muss das erste selektierte Feld
`messprogramm.id` sein. Dieses wird in der Oberfläche nicht angezeigt.
+* Werden bei einem JOIN Spalten gleichen Namens aus verschiedenen Tabellen
+ in der SELECT-Clause verwendet, so müssen diese mit einem expliziten Alias
+ versehen werden, um eine
+ org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException zu
+ vermeiden.
* Im `WHERE`-Statement genutzte Variablen müssen in der Form `:variablenName`
angegeben werden und dem Feld `data_index` im zugehörigen Filter entsprechen.
-* Um auch leere Filterangaben zu erlauben, sollte im `WHERE`-Statement ein
- Element wie folgt aussehen:
- ... WHERE (tabelle.feld = :variablenName OR '' = :variablenName) ...
-* Wenn ein Filter mit `multiselect = true` angegeben wird, so wird in dem
- `WHERE`-Statement ein `SIMILAR TO` erwartet.
+* Wenn ein Filter mit `multiselect = true` angegeben wird, so wird in der
+ `WHERE`-Clause ein `SIMILAR TO` erwartet.
* Das Feld `index` in der Tabelle `stammdaten.result` dient zur Zuordnung des
selektierten Datenfeldes zu dem Entsprechenden Eintrag in der Tabelle
`stammdaten.result`. Beispiel:
diff -r b225875c68fe -r effef57f3f7e db_schema/stammdaten_schema.sql
--- a/db_schema/stammdaten_schema.sql Thu Oct 13 22:25:46 2016 +0200
+++ b/db_schema/stammdaten_schema.sql Fri Oct 14 15:18:42 2016 +0200
@@ -295,9 +295,12 @@
CREATE TABLE query (
id integer PRIMARY KEY DEFAULT nextval('query_id_seq'::regclass),
name character varying(80) NOT NULL,
- type character varying(30) NOT NULL,
+ type character varying(30) NOT NULL
+ CHECK(type IN('probe', 'messung', 'messprogramm', 'ort',
+ 'probenehmer', 'datensatzerzeuger', 'messprogrammkategorie')),
sql character varying(1500) NOT NULL,
- description character varying(100)
+ description character varying(100),
+ UNIQUE (name, type)
);
ALTER SEQUENCE query_id_seq OWNED BY query.id;
@@ -330,7 +333,8 @@
id integer PRIMARY KEY DEFAULT nextval('filter_id_seq'::regclass),
query_id integer NOT NULL REFERENCES query ON DELETE CASCADE,
data_index character varying(50) NOT NULL,
- type character varying(10) NOT NULL,
+ type character varying(10) NOT NULL
+ CHECK(type IN('liststatus', 'listmst', 'listnetz', 'listumw', 'text')),
label character varying(50) NOT NULL,
multiselect boolean
);
@@ -625,7 +629,8 @@
header character varying(50) NOT NULL,
width integer,
flex boolean,
- index integer,
+ index integer NOT NULL,
+ UNIQUE (query_id, index),
UNIQUE (query_id, data_index)
);
More information about the Lada-commits
mailing list