changeset 1093:effef57f3f7e 2.3.0

Complement and correct data model and docs for queries.
author Tom Gottfried <tom@intevation.de>
date Fri, 14 Oct 2016 15:18:42 +0200 (2016-10-14)
parents b225875c68fe
children 1715ea7a6f75
files README.markdown db_schema/stammdaten_schema.sql
diffstat 2 files changed, 34 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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:
--- 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)
 );
 
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)