# HG changeset patch # User Tom Gottfried # 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) );