SPQL: Unterschied zwischen den Versionen

Aus SiteparkWiki
Zur Navigation springen Zur Suche springen
 
(31 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
==Beschreibung==
+
=Beschreibung=
SQPL ist ein Sprache zur Beschreibung von Suchabfragen, sog. Queries, an den IES. Die Syntax ist ähnlich der Syntax von SQL und in einigen Teilen ein Untermenge hiervon.
+
SPQL ist eine Sprache zur Beschreibung von Suchabfragen, sog. Queries, an den IES. Die Syntax ist ähnlich der Syntax von SQL und in einigen Teilen eine Untermenge hiervon.
  
Suchabfragen stellen Teilmengen der Daten zur Verfügung, die sich in der Datenbank des InfoSite5-Systems befinden. Diese Teilmengen lassen sich durch das zur Suchabfrage gehörige Query spezifizieren: Ein Query kann etwa alle Informationen zu einem Schlagwort suchen. Die Suchabfrage stellt dann diese Informationen aus den gefundenen Artikeln als Trefferliste zur Verfügung.Eine Query kann z.Z.auf Artikel, Nutzer oder Templates abgesetzt werden.
+
Suchabfragen stellen Teilmengen der Daten zur Verfügung, die sich in der Datenbank des InfoSite5-Systems befinden. Diese Teilmengen lassen sich durch das zur Suchabfrage gehörige Query spezifizieren: Eine Query kann zum Beispiel alle Informationen zu einem Schlagwort suchen. Die Suchabfrage stellt dann diese Informationen aus den gefundenen Artikeln als Trefferliste zur Verfügung. Eine Query kann z.Z. auf Artikel, Nutzer oder Templates abgesetzt werden.
  
 
==Syntax==
 
==Syntax==
 
Der Query-String hat dabei die folgende Syntax:
 
Der Query-String hat dabei die folgende Syntax:
  
  '''from''' ElementType '''where''' query '''[order by''' FieldName '''[asc|desc] limit''' [Offset] Limit
+
  '''from''' ElementType '''where''' query '''[order by''' FieldName '''[asc|desc] limit''' [Offset] Limit ''']
  
  
<div class="note">Für Suchabfragen auf Artikel kann der Teil "from ElementType where" weggelassen werden. Er ist implizit. Für die Suche nach anderen Elementen müssen die entsprechenden Element-Typen verwendet werden.
+
<div class="note">Für Suchabfragen auf Artikel kann der Teil "<code>from ElementType where</code>" weggelassen werden. Er ist implizit. Für die Suche nach anderen Elementen müssen die entsprechenden Element-Typen verwendet werden.</div>
</div>
 
  
 +
=Element-Typen=
 +
Über den <code>ElementType</code> kann man steuern, ob eine Query auf Artikel, Nutzer oder Templates erfolgen soll. Folgende Schlüsselwörter müssen hierzu verwendet werden:
  
Der Query-String hat dabei die folgende Syntax:
+
*<code>information</code>
 +
*<code>user</code>
 +
*<code>template</code>
 +
*<code>informationpool</code> (''ab Version 2.1.0.46'')
 +
*<code>templatepool</code> (''ab Version 2.1.0.46'')
 +
*<code>userpool</code> (''ab Version 2.1.0.46'')
 +
 
 +
Obwohl für eine Query nach Artikeln auf die Anweisung "<code>from information where</code>" verzichtet werden kann, sollte die genau Syntax verwendet werden.
 +
 
 +
=Daten-Typen=
 +
Eine Query erlaubt in der Definition die Verwendung folgender Datentypen für die Abfragen entsprechender Felder:
 +
 
 +
;Texte
 +
:wird angegeben durch Anführungszeichen (") bzw. (')
 +
:<source lang="xml">z.B. sp_headline = 'welcome'</source>
 +
 
 +
;Zahlen
 +
:wird ohne Anführungszeichen angegeben
 +
:<source lang="xml">z.B. sp_number > 49</source>
 +
 
 +
;IDs
 +
:werden ebenfalls ohne Anführungszeichen, jedoch mit Typ angegeben
 +
:<source lang="xml">z.B. createdBy = 100010100000000001-3001</source>
 +
 
 +
;Anker
 +
:werden auch ohne Anführungszeichen, jedoch mit den Anker-Klammern <code>!{}</code> angegeben
 +
:<source lang="xml">z.B. parent = !{pool_x}</source>
 +
 
 +
=Operationen=
 +
Für die Definition einer Query stehen folgende Operationen und Vergleiche zur Verfügung. Diese können je nach Datentyp eingesetzt werden, um das Suchergebnis entsprechend einzuschränken.
 +
 
 +
;<code>=</code>
 +
:Findet alle Elemente, deren Feldinhalt gleich dem angegebenen Wert ist
 +
;<code>!=</code>
 +
:Findet alle Elemente, deren Feldinhalt ungleich dem angegebenen Wert oder gar nicht vorhanden ist
 +
;<code>></code>
 +
:Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) größer als der angegebene Wert ist
 +
;<code><</code>
 +
:Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) kleiner als der angegebene Wert ist
 +
;<code>>=</code>
 +
:Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) größer als bzw. gleich dem angegebenen Wert ist
 +
;<code><=</code>
 +
:Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) kleiner als bzw. gleich dem angegebenen Wert ist
 +
;<code>like</code>
 +
:Findet alle Elemente, deren Feldinhalt ähnlich dem angegebenen Suchwort sind (hier gilt die reguläre SQL-Syntax). Der Vergleich findet auf Text-Inhalte statt und das Vergleichswort erlaubt folgende "Wildcards":
 +
;<code>%</code>
 +
:Entspricht einem oder mehreren beliebigen Zeichen ('abcde' = 'ab%e')
 +
;<code>_</code>
 +
:Entspricht einem beliebigen Zeichen ('abcde' = 'a_c_e')
 +
;<code>not like</code>
 +
:Findet alle Elemente, auf die ein angegebenes Vergleichswort NICHT zutrifft
 +
;<code>range</code>
 +
:Findet bei nummerischen Vergleichen Elemente, deren Feldinhalt zwischen zwei angegebenen Zahlen liegt (z.B. findet "<code>sp_number range 0-9</code>" alle Elemente, deren Feldinhalt von "<code>sp_number</code>" zwischen 0 und 9 liegt). Logisch entspricht die Range-Operation folgender Anweisung, ist aber deutlich schneller: "<code>sp_number >= 0 AND sp_number < 9</code>"
 +
;<code>in</code>
 +
:Der IN-Operator erlaubt die Übergabe von Listen, mit denen ein Feldinhalt verglichen wird. Es sind sowohl Texte, als auch Zahlen oder Anker zulässig <code>('a','b','c')</code> oder <code>(1,2,3)</code> oder <code>(!{a},!{b})</code>. Leerzeichen zwischen den Elementen sind nicht erlaubt.
 +
;<code>not in</code>
 +
:Findet alle Elemente, deren Feldinhalte nicht mit den übergebenen Listen übereinstimmen
 +
;<code>exists</code>
 +
:Prüft ob content eines bestimmten Typs existiert. Aktuell werden nur Inhalte aus der TextContent-Tabelle mit den Content-Typen <code>long</code> oder <code>text</code> unterstützt.
 +
:Beispiel <code>FROM information WHERE sp_foo_number EXISTS number</code>, <code>FROM information WHERE sp_foo_number EXISTS text</code>
 +
;<code>not exists</code>
 +
:Prüft ob content eines bestimmten Typs nicht existiert. Aktuell werden nur Inhalte aus der TextContent-Tabelle mit den Content-Typen <code>long</code> oder <code>text</code> unterstützt.
 +
:Beispiel <code>FROM information WHERE sp_foo_number NOT EXISTS number</code>, <code>FROM information WHERE sp_foo_number EXISTS text</code>
 +
 
 +
=Logische Operationen=
 +
Eine Query lässt sich durch Verwendung logischer Operationen aus mehreren Teilen zusammenfügen. Dadurch lässt sich die Ergebnismenge i.d.R. auf die gewünschte Menge einschränken. Zur Steuerung der logischen Verknüpfung von mehreren Teilen einer Query können einfache, runde Klammern verwendet werden. Es stehen folgende Operanten zur Verfügung:
 +
 
 +
;<code>AND</code>
 +
:Verknüpft zwei Anweisungen logisch <code>UND</code>
 +
;<code>OR</code>
 +
:Verknüpft zwei Anweisungen logisch <code>ODER</code>
 +
;<code>NOT</code>
 +
:Negiert eine Anweisung
 +
;<code>( )</code>
 +
:Durch die Verwendung von Klammern können die einzelnen Anweisungen verschachtelt bzw. gesteuert werden
 +
 
 +
=Content-Typen=
 +
Eine Query wird i.d.R. über die Inhaltsfelder von Elementen abgesetzt. Da die Inhalte unterschiedlichen Typs sind, können bzw. müssen diese bei der Definition entsprechend angegeben werden. Die einzelnen Content-Typen sind in drei Gruppen unterteilt: <code>TextContent</code>, <code>SystemContent</code> und <code>LinkContent</code>. Der Zugriff erfolgt, analog zu den Bezeichungen in den Templates, in SPML. Ebenso gilt: Ist kein bestimmter Typ angegeben, so wird der Typ text angenommen.
 +
 
 +
Der Zugriff erfolgt duch Angabe des Feldnamens, ergänzt durch einen Punkt mit anschließender Angabe des Content-Typs.
 +
<source lang="xml">feldname.content-typ</source>
 +
 
 +
=TextContent=
 +
Folgende Content-Typen sind als <code>TextContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter
 +
 
 +
;<code>text</code>
 +
:Dieser Typ ist implizit, kann jedoch auch angegeben werden
 +
 
 +
=SystemContent=
 +
Folgende Content-Typen sind als <code>SystemContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter
 +
 
 +
;<code>width</code>
 +
:Zugriff auf die Breite von Bildern
 +
;<code>height</code>
 +
:Zugriff auf die Höhe von Bildern
 +
;<code>mime</code>
 +
:Zugriff auf den MIME-Typ
 +
;<code>format</code>
 +
:Zugriff auf das Format von Medien
 +
;<code>size</code>
 +
:Zugriff auf die Dateigröße
 +
 
 +
=LinkContent=
 +
Folgende Content-Typen sind als <code>LinkContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter
 +
 
 +
;<code>link</code>
 +
:Zugriff auf Links vom Typ link
 +
;<code>systemlink</code>
 +
:Zugriff auf Links vom Typ systemlink
 +
;<code>navlink</code>
 +
:Zugriff auf Links vom Typ navlink
 +
;<code>keywordlink</code>
 +
:Zugriff auf Links vom Typ keywordlink
 +
;<code>categorylink</code>
 +
:Zugriff auf Links vom Typ categorylink
 +
 
 +
=CalendarContent=
 +
Der Zugriff auf Termine bzw. <code>CalendarContent</code> erfolgt ebenfalls über die hier bereits beschriebenen Mechanismen. Da Termindaten als nummerische Werte gespeichert werden, erfolgt die Auswertung dieser Inhalte ebenfalls über nummerische Operationen. Der Zugriff erfolgt über das Schlüsselwort
 +
 
 +
;<code>calendar</code>
 +
:Zugriff auf Termin-Daten
 +
 
 +
Eine Query nach Terminen wird i.d.R. über einen Zeitpunkt bzw. Zeitraum definiert. Gefunden werden damit alle Elemente, deren Termine genau am, bzw. zwischen den angegebenen Zeiten liegen.
 +
 
 +
<div class="note">Die Terminsuche erfolgt über die Tage eines Calendar-Objektes. Eine Suche über Stunden oder Minuten ist nicht möglich</div>
 +
 
 +
Folgende Beispiele verdeutlichen typische Abfragen auf Termindaten:
 +
 
 +
Diese Query findet alle Elemente, deren Termine zwischen den angegebenen Werten liegen
 +
 
 +
<source lang="xml">feldname.calendar > 123345789 AND feldname.calendar < 1234567890</source>
 +
 
 +
Diese Query findet die gleichen Ergebnisse, ist jedoch performanter, da nur eine Abfrage ausgewertet werden muss (Entspricht: "<code>x <= calendar < y</code>")
 +
 
 +
<source lang="xml">feldname.calendar range 123345789-1234567890</source>
 +
 
 +
Diese Query findet alle Termine für Feldname "<code>dateItem</code>" ab x
 +
 
 +
<source lang="xml">dateItem.calendar > 123345789</source>
 +
 
 +
Diese Query findet alle Termine für Feldname "<code>dateItem</code>" vor x
 +
 
 +
<source lang="xml">dateItem.calendar < 123345789</source>
 +
 
 +
Diese Query findet alle Termine für Feldname "<code>dateItem</code>" bis x
 +
 
 +
<source lang="xml">dateItem.calendar <= 123345789</source>
 +
 
 +
=Wildcards=
 +
Wildcards sind sog. Joker und dienen als Platzhalter für unterschiedliche Zeichen oder Zeichenketten. Bei der Definition von Suchabfragen kann neben den SQL-Wildcards auch noch das <code>*</code> verwendet werden, um über alle Feldnamen zu suchen. Folgende Wildcards können in Suchabfragen verwendet werden:
 +
 
 +
;<code>*</code>
 +
:Kann verwendet werden, wenn der Feldname, über den gesucht werden soll, nicht genau angegeben werden kann. Die Wildcard steht lediglich für den Feldnamen. Content-Typen wie "<code>systemlink</code>" (s.u.) müssen explizit angegeben werden
 +
 
 +
<source lang="xml">z.B. (* = 'inhalt a') OR (*.systemlink != !{artikel_x})</source>
 +
 
 +
;<code>%</code>
 +
:Steht für beliebig viele Zeichen im Suchwort
  
 +
<source lang="xml">z.B. sp_headline = 'welcome %'</source>
  
 +
;<code>_</code>
 +
:Steht für genau ein Zeichen im Suchwort
  
Für Suchabfragen auf Artikel kann der Teil "'''from''' ''ElementType'' '''where'''" weggelassen werden. Er ist implizit. Für die Suche nach anderen Elementen müssen folgende Schlüsselwörter verwendet werden:
+
<source lang="xml">z.B. sp_rubric = 'section _a'</source>
  
# information
+
=Schlüsselwörter=
# user
+
Weiterhin werden folgende Schlüsselwörter für die Definition einer Query bereitsgestellt
# template
 
  
Mögliche Definitionen einer Suchabfrage wären beispielsweise:
+
;<code>parent</code>
 +
:Suche nach Elementen, deren Pool dem angegeben Wert entspricht
 +
;<code>root</code>
 +
:Suche nach Elementen, deren Pool unterhalb des angegebenen Root-Pools liegt
 +
;<code>anchor</code> (ab Version 2.0.3)
 +
:Suche nach Elementen mit den angegebenen Anchorn
 +
;<code>id</code> (ab Version 2.0.3)
 +
:Suche nach Elementen mit den angegebenen IDs.
 +
;<code>now</code> (ab Version 2.0.3)
 +
:liefert den aktuellen Zeitpunkt in Millisekunden ab dem 1.1.1970
  
;parent = !{Anchor}
+
Beispiele
:Listet alle Artikel eines Artikelpools mit entsprechendem Ankernamen
+
<source lang="xml">root = !{gui.informations}</source>
:;Anmerkung
+
<source lang="xml">anchor = 'gui.informations'</source>
::Der Zugriff auf Anker erfolgt über !{Ankername} und kann je nach Objekt hinter dem Anker mit Attributen erweitert werden !{Ankername}.attribute
+
<source lang="xml">id = 100010100000006434-1015</source>
 +
<source lang="xml">sp_mydate > now</source>
  
;root = !{Anchor}
+
=Definierte Felder von Elementen=
:Listet alle Artikel rekursiv unterhalb eines Artikelpools mit entsprechendem Ankernamen
+
Je nach Element-Typ kann über unterschiedliche Attribute bzw. Felder gesucht werden. Für die Definition innerhalb einer Query, werden entsprechende Schlüsselwörter verwendet, die i.d.R. analog zu den bekannten Bezeichnungen der SPML sind.
  
;systemlink = !{Anchor}
+
==Attribute des Typs <code>information</code>==
:Listet alle Systemlinks mit entsprechendem Ankernamen
+
Für die Suche nach Artikeln stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung
  
;link = !{Anchor}
+
;<code>changed</code>
:Listet alle Links mit entsprechendem Ankernamen
+
:Suche nach Änderungsdatum
 +
;<code>changedBy</code>
 +
:Suche nach Artikeln, die ein bestimmter Redakteur zuletzt geändert hat
 +
;<code>comment</code>
 +
:Suche über das Kommentarfeld
 +
;<code>created</code>
 +
:Suche nach Erstellungsdatum
 +
;<code>createdBy</code>
 +
:Suche nach Artikeln, die ein bestimmter Redakteur erstellt hat
 +
;<code>publicationFrom.calendar</code>
 +
:Suche nach Freigabedatum
 +
;<code>publicationTo.calendar</code>
 +
:Suche nach Sperrdatum
 +
;<code>directory</code>
 +
:Suche über das Arbeitsverzeichnis
 +
;<code>filename</code>
 +
:Suche über den Dateinamen
 +
;<code>name</code>
 +
:Suche über den Artikelnamen
 +
;<code>suffix</code>
 +
:Suche über die Dateiendung
 +
;<code>type</code>
 +
:Suche über den Artikeltyp (Resource, Medium, eigene Seite)
  
;navlink = !{Anchor}
+
==Attribute des Typs <code>template</code>==
:Listet alle Navlkinks mit entsprechendem Ankernamen
+
Für die Suche nach Templates stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung
  
;name = 'Artikelname'
+
;<code>comment</code>
:Listet alle Artikel mit entsprechendem Artikelnamen
+
:Suche über das Kommentarfeld
 +
;<code>name</code>
 +
:Suche über den Templatenamen
 +
;<code>source</code>
 +
:Suche über den Source-Code des Templates
 +
;<code>type</code>
 +
:Suche über den Typ des Templates
  
;filename = 'Dateiname'
+
==Attribute des Typs <code>user</code>==
;Listet alle Artikel mit entsprechendem Dateinamen
+
Für die Suche nach Nutzern stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung
  
;suffix = 'Endung'
+
;<code>comment</code>
:Listet alle Artikel mit entsprechender Dateiendung
+
:Suche über das Kommentarfeld
 +
;<code>email</code>
 +
:Suche über die Email
 +
;<code>firstname</code>
 +
:Suche über den Vornamen
 +
;<code>lastname</code>
 +
:Suche über den Nachnamen
 +
;<code>login</code>
 +
:Suche über das Login
 +
;<code>type</code>
 +
:Suche über den Typ des Templates
  
; * like 'String'
+
==Attribute des Typs <code>informationpool</code>, <code>templatepool</code> und <code>userpool</code>==
:Listet alle Artikel mit entsprechendem String
+
Für die Suche nach Artikel Pools stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung
  
;sp_variable like '%String%'
+
;<code>comment</code>
:Listet alle Artikel in der die Variable sp_variable den Inhalt String enthält
+
:Suche über das Kommentarfeld
:;Anmerkung
+
;<code>name</code>
::Ohne Prozentklammerung entspräche es genau dem Wort String
+
:Suche über den Pool-Namen
 +
;<code>type</code>
 +
:Suche über den Pool-Typ
  
Es ist natürlich möglich einzelne Suchbegriffe mit AND/ OR / NOT sinnvoll miteinander zu verknüpfen (Bspl.: Kaffee AND (Milch OR Kaffeeweisser) NOT Zucker).
+
=Order By=
 +
Für nummerische Werte (Daten und Zahlen) kann optional in der Query ein <code>order by</code> verwendet werden. Das kann in Verbindung mit der <code>limit</code>-Anweisung sinnvoll sein, um frühzeitig die Treffermenge einzuschränken. Insbesondere für Listen die zuletzt geänderte Artikel finden soll. Ohne diese Einschränkungen würden zunächst alle Artikel geladen und müssten anschließend sortiert und gefiltert werden.
  
Suchabfragen können über die Datenbank sortiert und die Trefferanzahl beschränkt werden. Als Syntax wird ORDER BY und LIMIT verwendet.
+
Optional kann auf die Sortierung noch über die Schlüsselwörter <code>asc</code> (=aufsteigend) und <code>desc</code> (=absteigend) Einfluss genommen werden.
  
===Beispiele===
+
Eine Sortierung von Zeichenketten kann zwar zum gewünschten Ergebnis führen, sollte aber nicht verwendet werden, da die alphanummerische Sortierung der Datenbank Anwendung finden würde. Und diese unterscheidet sich von der Sortierung im IES. Normale Suchabfragen sollten über Kriterien entsprechend eingeschränkt und anschließend über die Tags <code><sp:sort></code>, <code><sp:filter></code> und <code><sp:range></code> bearbeitet werden.
  
# myField = 'hallo' order by headline (aufsteigend sortieren)
+
Generell kann nach folgenden Feldern sortiert werden:
# myField = 'hallo' order by headline asc (aufsteigend sortieren)
 
# myField = 'hallo' order by headline desc (absteigend sortieren)
 
# myField = 'hallo' order by headline desc, intro asc (headline absteigend, intro aufsteigend sortieren)
 
# myField = 'hallo' order by headline limit 5 (aufsteigend sortieren und davon die ersten fünf)
 
# myField = 'hallo' order by headline limit 6,5 (aufsteigend sortieren und ab der sechsten Position die nächsten fünf)
 
  
Hierbei ist zu beachten, dass das Attribut "limit" nur im Zusammenhang mit "order by" ausgeführt werden kann.
+
;<code>created</code>
 +
:Sortierung nach dem Datum der Erstellung
 +
;<code>changed</code>
 +
:Sortierung nach dem Datum der letzten Änderung
 +
;<code>random</code> (ab Version 2.0.3)
 +
:Sortiert in eine zufälligen Reihenfolge. Wird diese Sortier-Reihenfolge in einem Artikelfeld vom Typ <code>query</code> verwendet, bewirkt dies eine kontinuierliche Neugenerierung des Artikels, da sich das Ergebnis der Query immer ändert (Bei Verwendung ORDER BY gilt auch eine andere Reihenfolge der Ergebnisse als Änderung).
 +
;alle Variablen vom Typ <code>TextContent</code> und <code>SystemContent</code>
 +
:Die Typen <code>CalendarContent</code> und <code>LinkContent</code> werden z.Z. noch nicht unterstützt
 +
;<code>name</code>
 +
:Sortierung nach dem Namen (Achtung: kein nummerischer Wert)
  
 +
=Limit=
 +
Über ein Limit kann die Treffermenge bereits auf SQL-Ebene frühzeitig eingeschränkt werden. Dies macht i.d.R. nur Sinn, wenn vorher ein <code>order by</code> angewandt wurde.
  
 
<noinclude>
 
<noinclude>
 
[[Category:SPML]]
 
[[Category:SPML]]
 
[[Category:Qualität_des_Inhalts_prüfen]]
 
[[Category:Qualität_des_Inhalts_prüfen]]
[[Category:Qualität_der_Sprache_prüfen]]
 
 
[[Category:Qualität_des_Codes_prüfen]]
 
[[Category:Qualität_des_Codes_prüfen]]
 
</noinclude>
 
</noinclude>

Aktuelle Version vom 14. August 2024, 15:54 Uhr

Beschreibung

SPQL ist eine Sprache zur Beschreibung von Suchabfragen, sog. Queries, an den IES. Die Syntax ist ähnlich der Syntax von SQL und in einigen Teilen eine Untermenge hiervon.

Suchabfragen stellen Teilmengen der Daten zur Verfügung, die sich in der Datenbank des InfoSite5-Systems befinden. Diese Teilmengen lassen sich durch das zur Suchabfrage gehörige Query spezifizieren: Eine Query kann zum Beispiel alle Informationen zu einem Schlagwort suchen. Die Suchabfrage stellt dann diese Informationen aus den gefundenen Artikeln als Trefferliste zur Verfügung. Eine Query kann z.Z. auf Artikel, Nutzer oder Templates abgesetzt werden.

Syntax

Der Query-String hat dabei die folgende Syntax:

from ElementType where query [order by FieldName [asc|desc] limit [Offset] Limit ]


Für Suchabfragen auf Artikel kann der Teil "from ElementType where" weggelassen werden. Er ist implizit. Für die Suche nach anderen Elementen müssen die entsprechenden Element-Typen verwendet werden.

Element-Typen

Über den ElementType kann man steuern, ob eine Query auf Artikel, Nutzer oder Templates erfolgen soll. Folgende Schlüsselwörter müssen hierzu verwendet werden:

  • information
  • user
  • template
  • informationpool (ab Version 2.1.0.46)
  • templatepool (ab Version 2.1.0.46)
  • userpool (ab Version 2.1.0.46)

Obwohl für eine Query nach Artikeln auf die Anweisung "from information where" verzichtet werden kann, sollte die genau Syntax verwendet werden.

Daten-Typen

Eine Query erlaubt in der Definition die Verwendung folgender Datentypen für die Abfragen entsprechender Felder:

Texte
wird angegeben durch Anführungszeichen (") bzw. (')
z.B. sp_headline = 'welcome'
Zahlen
wird ohne Anführungszeichen angegeben
z.B. sp_number > 49
IDs
werden ebenfalls ohne Anführungszeichen, jedoch mit Typ angegeben
z.B. createdBy = 100010100000000001-3001
Anker
werden auch ohne Anführungszeichen, jedoch mit den Anker-Klammern !{} angegeben
z.B. parent = !{pool_x}

Operationen

Für die Definition einer Query stehen folgende Operationen und Vergleiche zur Verfügung. Diese können je nach Datentyp eingesetzt werden, um das Suchergebnis entsprechend einzuschränken.

=
Findet alle Elemente, deren Feldinhalt gleich dem angegebenen Wert ist
!=
Findet alle Elemente, deren Feldinhalt ungleich dem angegebenen Wert oder gar nicht vorhanden ist
>
Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) größer als der angegebene Wert ist
<
Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) kleiner als der angegebene Wert ist
>=
Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) größer als bzw. gleich dem angegebenen Wert ist
<=
Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) kleiner als bzw. gleich dem angegebenen Wert ist
like
Findet alle Elemente, deren Feldinhalt ähnlich dem angegebenen Suchwort sind (hier gilt die reguläre SQL-Syntax). Der Vergleich findet auf Text-Inhalte statt und das Vergleichswort erlaubt folgende "Wildcards":
%
Entspricht einem oder mehreren beliebigen Zeichen ('abcde' = 'ab%e')
_
Entspricht einem beliebigen Zeichen ('abcde' = 'a_c_e')
not like
Findet alle Elemente, auf die ein angegebenes Vergleichswort NICHT zutrifft
range
Findet bei nummerischen Vergleichen Elemente, deren Feldinhalt zwischen zwei angegebenen Zahlen liegt (z.B. findet "sp_number range 0-9" alle Elemente, deren Feldinhalt von "sp_number" zwischen 0 und 9 liegt). Logisch entspricht die Range-Operation folgender Anweisung, ist aber deutlich schneller: "sp_number >= 0 AND sp_number < 9"
in
Der IN-Operator erlaubt die Übergabe von Listen, mit denen ein Feldinhalt verglichen wird. Es sind sowohl Texte, als auch Zahlen oder Anker zulässig ('a','b','c') oder (1,2,3) oder (!{a},!{b}). Leerzeichen zwischen den Elementen sind nicht erlaubt.
not in
Findet alle Elemente, deren Feldinhalte nicht mit den übergebenen Listen übereinstimmen
exists
Prüft ob content eines bestimmten Typs existiert. Aktuell werden nur Inhalte aus der TextContent-Tabelle mit den Content-Typen long oder text unterstützt.
Beispiel FROM information WHERE sp_foo_number EXISTS number, FROM information WHERE sp_foo_number EXISTS text
not exists
Prüft ob content eines bestimmten Typs nicht existiert. Aktuell werden nur Inhalte aus der TextContent-Tabelle mit den Content-Typen long oder text unterstützt.
Beispiel FROM information WHERE sp_foo_number NOT EXISTS number, FROM information WHERE sp_foo_number EXISTS text

Logische Operationen

Eine Query lässt sich durch Verwendung logischer Operationen aus mehreren Teilen zusammenfügen. Dadurch lässt sich die Ergebnismenge i.d.R. auf die gewünschte Menge einschränken. Zur Steuerung der logischen Verknüpfung von mehreren Teilen einer Query können einfache, runde Klammern verwendet werden. Es stehen folgende Operanten zur Verfügung:

AND
Verknüpft zwei Anweisungen logisch UND
OR
Verknüpft zwei Anweisungen logisch ODER
NOT
Negiert eine Anweisung
( )
Durch die Verwendung von Klammern können die einzelnen Anweisungen verschachtelt bzw. gesteuert werden

Content-Typen

Eine Query wird i.d.R. über die Inhaltsfelder von Elementen abgesetzt. Da die Inhalte unterschiedlichen Typs sind, können bzw. müssen diese bei der Definition entsprechend angegeben werden. Die einzelnen Content-Typen sind in drei Gruppen unterteilt: TextContent, SystemContent und LinkContent. Der Zugriff erfolgt, analog zu den Bezeichungen in den Templates, in SPML. Ebenso gilt: Ist kein bestimmter Typ angegeben, so wird der Typ text angenommen.

Der Zugriff erfolgt duch Angabe des Feldnamens, ergänzt durch einen Punkt mit anschließender Angabe des Content-Typs.

feldname.content-typ

TextContent

Folgende Content-Typen sind als TextContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter

text
Dieser Typ ist implizit, kann jedoch auch angegeben werden

SystemContent

Folgende Content-Typen sind als SystemContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter

width
Zugriff auf die Breite von Bildern
height
Zugriff auf die Höhe von Bildern
mime
Zugriff auf den MIME-Typ
format
Zugriff auf das Format von Medien
size
Zugriff auf die Dateigröße

LinkContent

Folgende Content-Typen sind als LinkContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter

link
Zugriff auf Links vom Typ link
systemlink
Zugriff auf Links vom Typ systemlink
navlink
Zugriff auf Links vom Typ navlink
keywordlink
Zugriff auf Links vom Typ keywordlink
categorylink
Zugriff auf Links vom Typ categorylink

CalendarContent

Der Zugriff auf Termine bzw. CalendarContent erfolgt ebenfalls über die hier bereits beschriebenen Mechanismen. Da Termindaten als nummerische Werte gespeichert werden, erfolgt die Auswertung dieser Inhalte ebenfalls über nummerische Operationen. Der Zugriff erfolgt über das Schlüsselwort

calendar
Zugriff auf Termin-Daten

Eine Query nach Terminen wird i.d.R. über einen Zeitpunkt bzw. Zeitraum definiert. Gefunden werden damit alle Elemente, deren Termine genau am, bzw. zwischen den angegebenen Zeiten liegen.

Die Terminsuche erfolgt über die Tage eines Calendar-Objektes. Eine Suche über Stunden oder Minuten ist nicht möglich

Folgende Beispiele verdeutlichen typische Abfragen auf Termindaten:

Diese Query findet alle Elemente, deren Termine zwischen den angegebenen Werten liegen

feldname.calendar > 123345789 AND feldname.calendar < 1234567890

Diese Query findet die gleichen Ergebnisse, ist jedoch performanter, da nur eine Abfrage ausgewertet werden muss (Entspricht: "x <= calendar < y")

feldname.calendar range 123345789-1234567890

Diese Query findet alle Termine für Feldname "dateItem" ab x

dateItem.calendar > 123345789

Diese Query findet alle Termine für Feldname "dateItem" vor x

dateItem.calendar < 123345789

Diese Query findet alle Termine für Feldname "dateItem" bis x

dateItem.calendar <= 123345789

Wildcards

Wildcards sind sog. Joker und dienen als Platzhalter für unterschiedliche Zeichen oder Zeichenketten. Bei der Definition von Suchabfragen kann neben den SQL-Wildcards auch noch das * verwendet werden, um über alle Feldnamen zu suchen. Folgende Wildcards können in Suchabfragen verwendet werden:

*
Kann verwendet werden, wenn der Feldname, über den gesucht werden soll, nicht genau angegeben werden kann. Die Wildcard steht lediglich für den Feldnamen. Content-Typen wie "systemlink" (s.u.) müssen explizit angegeben werden
z.B. (* = 'inhalt a') OR (*.systemlink != !{artikel_x})
%
Steht für beliebig viele Zeichen im Suchwort
z.B. sp_headline = 'welcome %'
_
Steht für genau ein Zeichen im Suchwort
z.B. sp_rubric = 'section _a'

Schlüsselwörter

Weiterhin werden folgende Schlüsselwörter für die Definition einer Query bereitsgestellt

parent
Suche nach Elementen, deren Pool dem angegeben Wert entspricht
root
Suche nach Elementen, deren Pool unterhalb des angegebenen Root-Pools liegt
anchor (ab Version 2.0.3)
Suche nach Elementen mit den angegebenen Anchorn
id (ab Version 2.0.3)
Suche nach Elementen mit den angegebenen IDs.
now (ab Version 2.0.3)
liefert den aktuellen Zeitpunkt in Millisekunden ab dem 1.1.1970

Beispiele

root = !{gui.informations}
anchor = 'gui.informations'
id = 100010100000006434-1015
sp_mydate > now

Definierte Felder von Elementen

Je nach Element-Typ kann über unterschiedliche Attribute bzw. Felder gesucht werden. Für die Definition innerhalb einer Query, werden entsprechende Schlüsselwörter verwendet, die i.d.R. analog zu den bekannten Bezeichnungen der SPML sind.

Attribute des Typs information

Für die Suche nach Artikeln stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung

changed
Suche nach Änderungsdatum
changedBy
Suche nach Artikeln, die ein bestimmter Redakteur zuletzt geändert hat
comment
Suche über das Kommentarfeld
created
Suche nach Erstellungsdatum
createdBy
Suche nach Artikeln, die ein bestimmter Redakteur erstellt hat
publicationFrom.calendar
Suche nach Freigabedatum
publicationTo.calendar
Suche nach Sperrdatum
directory
Suche über das Arbeitsverzeichnis
filename
Suche über den Dateinamen
name
Suche über den Artikelnamen
suffix
Suche über die Dateiendung
type
Suche über den Artikeltyp (Resource, Medium, eigene Seite)

Attribute des Typs template

Für die Suche nach Templates stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung

comment
Suche über das Kommentarfeld
name
Suche über den Templatenamen
source
Suche über den Source-Code des Templates
type
Suche über den Typ des Templates

Attribute des Typs user

Für die Suche nach Nutzern stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung

comment
Suche über das Kommentarfeld
email
Suche über die Email
firstname
Suche über den Vornamen
lastname
Suche über den Nachnamen
login
Suche über das Login
type
Suche über den Typ des Templates

Attribute des Typs informationpool, templatepool und userpool

Für die Suche nach Artikel Pools stehen für die Suche neben den Inhalts-Feldern noch folgende Schlüsselwörter für die Attribute zur Verfügung

comment
Suche über das Kommentarfeld
name
Suche über den Pool-Namen
type
Suche über den Pool-Typ

Order By

Für nummerische Werte (Daten und Zahlen) kann optional in der Query ein order by verwendet werden. Das kann in Verbindung mit der limit-Anweisung sinnvoll sein, um frühzeitig die Treffermenge einzuschränken. Insbesondere für Listen die zuletzt geänderte Artikel finden soll. Ohne diese Einschränkungen würden zunächst alle Artikel geladen und müssten anschließend sortiert und gefiltert werden.

Optional kann auf die Sortierung noch über die Schlüsselwörter asc (=aufsteigend) und desc (=absteigend) Einfluss genommen werden.

Eine Sortierung von Zeichenketten kann zwar zum gewünschten Ergebnis führen, sollte aber nicht verwendet werden, da die alphanummerische Sortierung der Datenbank Anwendung finden würde. Und diese unterscheidet sich von der Sortierung im IES. Normale Suchabfragen sollten über Kriterien entsprechend eingeschränkt und anschließend über die Tags <sp:sort>, <sp:filter> und <sp:range> bearbeitet werden.

Generell kann nach folgenden Feldern sortiert werden:

created
Sortierung nach dem Datum der Erstellung
changed
Sortierung nach dem Datum der letzten Änderung
random (ab Version 2.0.3)
Sortiert in eine zufälligen Reihenfolge. Wird diese Sortier-Reihenfolge in einem Artikelfeld vom Typ query verwendet, bewirkt dies eine kontinuierliche Neugenerierung des Artikels, da sich das Ergebnis der Query immer ändert (Bei Verwendung ORDER BY gilt auch eine andere Reihenfolge der Ergebnisse als Änderung).
alle Variablen vom Typ TextContent und SystemContent
Die Typen CalendarContent und LinkContent werden z.Z. noch nicht unterstützt
name
Sortierung nach dem Namen (Achtung: kein nummerischer Wert)

Limit

Über ein Limit kann die Treffermenge bereits auf SQL-Ebene frühzeitig eingeschränkt werden. Dies macht i.d.R. nur Sinn, wenn vorher ein order by angewandt wurde.