Autorenarchiv

PostgresSQL String Konstanten / Dateien namens “con.xyz”

Montag, 05. Juli 2010

Mein Ziel war es, korrupte javascript-RegEx Ausdrücke durch neue Ausdrücke zu ersetzen. Das Problem dabei waren die Zeichen, die ein Escaping benötigen, um den String(character varying) in eine Postgres DB einfügen zu können. Bei recht komplexen Ausdrücken eine umständliche Arbeit, die Zeichen einzeln zu “escapen”. Das ganze kann man sich aber folgendermaßen ersparen:

UPDATE testtabelle
SET textfeld = $stringconstant$Text mit vielen /^'\" $$stringconstant$
WHERE id = 4711;

Das ganze nennt sich “Dollar-Quoted String Constants”. Der String wird also zwischen zwei voranführenden und zwei endenden Dollarzeichen verpackt: $$ SomeCharacters/\^’#” $$ . Zwischen den Dollarzeichen kann, wie im obigen Beispiel, ein Tagname angegeben werden, um so z.B. auch verschachtelte Strukturen zu ermöglichen.

$outerTag$
someText $innerTag$ otherText $innerTag$
$outerTag$

Ein ganz anderes Thema…

Bei dem Versuch eine csv-Datei aus Java heraus anzulegen, flog eine Exception, nach ein bischen Verzweiflung und “googeln” kam heraus, dass der Name der Datei con.csv das Problem verursachte.
WindowsXP verbietet das Anlegen jeglicher Dateien mit Namen “con” gefolgt von einem Punkt oder einem Leerzeichen. Ärgerlich aber nicht umgehbar, angeblich ein Überbleibsel aus den alten MS-Dos Zeiten.


Sven Seiler


Erfahrungen mit Hibernate-Criteria und pgAdmin(postgres)

Montag, 15. Februar 2010

Wärend der Arbeit an einer Web Applikation, die Hibernate und eine PostgresDB verwendet, sind mir in letzter Zeit folgende Kleinigkeiten aufgefallen:

Hinzufügen von “Nicht NULL” Spalten im pgAdmin III

Möchte man mit dem pgAdmin III Tool nachträglich eine Spalte zu einer Tabelle hinzufügen, so öffnet man den entsprechenden Dialog z.B. über das Menü “Bearbeiten -> Neues Objekt -> neue Spalte”. Wir versuchen nun eine Spalte “darfAngeln” vom Typ “boolean” anzulegen. Diese soll keine “null”-Werte enthalten und als Standardwert “false” benutzen. Das ganze funktioniert solange, wie noch keine Einträge in der Tabelle existieren. Enthält die Tabelle allerdings Einträge, erhalten wir folgende Fehlermeldung:

Ein Fehler ist aufgetreten:
FEHLER: Spalte >darfAngeln< enthält NULL-Werte

Die Fehlermeldung läßt sich umgehen, indem man das Anlegen der Spalte per simplem SQL erledigt. Ins Query Fenster des pgAdmin wechseln und folgenden Code ausführen:

ALTER TABLE adm_raum_art
ADD COLUMN darfAngeln boolean NOT NULL DEFAULT false;

Punkt-Notation bei Criteria

Leider mußte ich durch eine Exception feststellen, dass die Verwendung der Punkt-Notation (implizite Erzeugung von Joins) zum Zugriff auf verknüpfte Objekte nicht möglich ist (im Gegensatz zu HQL). Um also Restrictions auf verschiedenen, assozierten Objekten “oder” verknüpfen zu können, bedarf es “createAlias” für die Erzeugung von expliziten Joins. Kleines Beispiel:

final Criteria criteria = getSession().createCriteria(Schule.class);
criteria.createAlias("schulAnsprechpartner", "schulAP", Criteria.LEFT_JOIN)
.createAlias("schulAP.person", "pers", Criteria.LEFT_JOIN)
.createAlias("pers.benutzer", "benutzer", Criteria.LEFT_JOIN)
.add(Restrictions.or(Restrictions.eq("darfAngeln", true),
Restrictions.eq("benutzer.id", 0815)));

Im Beispiel wurde nun doch die Punkt-Notation verwendet, allerdings immer nur mit der “Rekursionstiefe 1″.
Vielleicht kommt irgendwann auch für Criteria die Möglichkeit eine beliebige Tiefe zu verwenden.


Sven Seiler


Nested Sets – Teil II (Operationen)

Freitag, 29. Mai 2009

Hier im zweiten Teil der kleinen Serie über Nested Sets soll es um die Einfüge- und Löschoperation gehen. Vorher werden Operationen zur Ermittlung aller Kinder und aller Elternknoten vorgestellt.

Kindsknoten ermitteln
Die Kinder eines Knoten sind leicht erkennbar, denn ihre Grenzen müssen innerhalb der Grenzen ihres Elternknoten liegen.
Das heißt, die linke Grenze eines Knotens muß größer als die linke Grenze des Elternknotens sein, und gleichzeitig muß die linke Grenze kleiner als die rechte Grenze des Elternknotens sein. Eine Betrachtung der rechten Grenze ist nicht zwingend erforderlich, da ein Kindsknoten nicht “überlappend” sein kann (den Wertebereich des Elternknotens überschreitend).

Elternknoten ermitteln
Für die Ermittlung der Elternknoten gilt es, alle Knoten mit einer linken Grenze kleiner als die linke Grenze des Ausgangsknotens und einer rechten Grenze größer als die linke/rechte Grenze des Ausgangsknotens zu finden.

Löschoperation
Zum Löschen werden zuerst alle Kindsknoten des zu löschenden Knotens ermittelt und diese (mitsamt ihres Elternknotens) aus der DB entfernt. Anschließend muß die entstandene Lücke geschlossen werden, indem die rechte Grenze aller umschließenden Elternknoten angeapsst wird und alle “rechtsliegenden” Knoten nach links verschoben werden (Anpassung der linken und rechten Grenze). Das Offset (um das die Grenzen korregiert werden müssen) ist die Größe der Teilmenge, die der zu löschende Knoten repräsentiert (also rechte Grenze – linke Grenze + 1).

Ursprung – Katzen sollen entfernt werden:


simpletree3


Katzen und Kindsknoten wurden entfernt (Offset: 8-3+1 = 6):


simpletreekatzegeloescht


Anpassung aller Grenzen der Elternknoten des gelöschten Knotens und der rechtsliegenden Knoten:


simpletreekatzegeloeschtundgrenzenangepasst1

Einfügeoperation
Für das Einfügen eines Knotens muß zuerst der Raum für den Knoten geschaffen werden. Die Knoten die links vom einzufügenden Knoten liegen, bleiben unberührt. Alle Knoten die rechts vom einzufügenden Knoten liegen werden verschoben, ebenso der Knoten an dessen Position der Knoten eingefügt werden soll.

Es soll zwischen Katzen und Hunde, Kaninchen eingefügt werden.


simpletreesmall3

Es wurde für den neuen Knoten Raum geschaffen.


simpletreesmallmitlucke

Der neue “Kaninchen”-Knoten wurde eingefügt.


simpletreesmallmitkaninchen1

Zum Ende..
Es wird einen dritten Teil zu den Nested Sets geben, evtl. auch noch einen vierten.
In den kommenden Einträgen soll es dann um weitere Operationen, sowie Vor- und Nachteile von Nested Sets und die Persistierung in relationalen Datenbanken gehen.

Sven Seiller


Sven Seiler


Nested Sets – Teil I

Dienstag, 26. Mai 2009

In dieser kurzen Serie von Artikeln soll es um eine Einführung in Nested Sets gehen und deren Abbildung in einer relationalen Datenbank. In diesem ersten Teil soll erläutert werden, worum es sich bei Nested Sets handelt. Die verschiedene Operationen auf Nested Sets werden in den folgenden Artikeln behandelt werden.

Nested Sets stellen ein Modell dar, um Bäume mit Hilfe von (Teil-) Mengen abzubilden. Das Modell der Nested Sets wird meist in Datenbankanwendungen eingesetzt. Am einfachsten wird das Modell mit Hilfe eines Beispiels verständlich.



simpletree1

In der oben liegenden Zeichnung ist ein einfacher Baum dargestellt. Wie sieht dieser Baum jetzt als Nested Set aus?
Es gibt für jeden Knoten zwei Informationen, die linke und die rechte Grenze der Teilmenge. Folgend ein paar (redundante) Informationen/Regeln zu den Grenzen:

  • Die linke Grenze ist immer kleiner als die rechte Grenze (im folgenden wird oft nur noch von links und rechts gesprochen).
  • Die beiden Grenzen umfassen alle ihre Kindelemente.
  • Für Blätter gilt links plus eins ergibt rechts.
  • Beide Grenzen sind größer als die linke Grenze des Elternelements und kleiner als die rechte Grenze des Elternelements.

Die nächste Darstellung des Baums enthält jetzt zusätzlich die Nested Set Informationen (linke und rechte Grenze).


nestedset


Im kommenden Teil II werden dann, wie oben schon angekündigt, verschiedene Operationen erläutert werden. Motiviert wurde dieser Artikel durch die Verwendung von Nested Sets, zur Abbildung von Verzeichnis/Ordner Strukturen in einer Webanwendung.

Also bis demnächst..
Sven Seiller


Sven Seiler