SPQL: Unterschied zwischen den Versionen
Ole (Diskussion | Beiträge) |
Ole (Diskussion | Beiträge) |
||
Zeile 2: | Zeile 2: | ||
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. | 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. | ||
− | 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: 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. |
==Syntax== | ==Syntax== | ||
Zeile 10: | Zeile 10: | ||
− | <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> | + | <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> |
=Element-Typen= | =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: | + | Ü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: |
− | *information | + | *<code>information</code> |
− | *user | + | *<code>user</code> |
− | *template | + | *<code>template</code> |
− | Obwohl für eine Query nach Artikeln auf die Anweisung "from information where" verzichtet werden kann, sollte die genau Syntax verwendet werden. | + | 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= | =Daten-Typen= | ||
Zeile 38: | Zeile 38: | ||
;Anker | ;Anker | ||
− | :werden auch ohne Anführungszeichen, jedoch mit den Anker-Klammern !{} angegeben | + | :werden auch ohne Anführungszeichen, jedoch mit den Anker-Klammern <code>!{}</code> angegeben |
:<source lang="xml">z.B. parent = !{pool_x}</source> | :<source lang="xml">z.B. parent = !{pool_x}</source> | ||
=Operationen= | =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. | + | 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 | :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 | :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 | :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 | :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 | :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 | :Findet alle Elemente, deren Feldinhalt (i.d.R. numerisch) kleiner als bzw. gleich dem angegebenen Wert ist | ||
− | ;like | + | ;<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": | :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') | :Entspricht einem oder mehreren beliebigen Zeichen ('abcde' = 'ab%e') | ||
− | ;_ | + | ;<code>_</code> |
:Entspricht einem beliebigen Zeichen ('abcde' = 'a_c_de') | :Entspricht einem beliebigen Zeichen ('abcde' = 'a_c_de') | ||
− | ;not like | + | ;<code>not like</code> |
:Findet alle Elemente, auf die ein angegebenes Vergleichswort nicht zutrifft | :Findet alle Elemente, auf die ein angegebenes Vergleichswort nicht zutrifft | ||
− | ;range | + | ;<code>range</code> |
− | :Findet bei nummerischen Vergleichen Elemente, deren Feldinhalt zwischen zwei angegeben 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" | + | :Findet bei nummerischen Vergleichen Elemente, deren Feldinhalt zwischen zwei angegeben 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>" |
− | ;in | + | ;<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 ('a','b','c') oder (1,2,3) oder (!{a},!{b}). Leerzeichen zwischen den Elementen sind nicht erlaubt. | + | :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. |
− | ;not in | + | ;<code>not in</code> |
− | :Findet alle Elemente, deren Feldinhalte | + | :Findet alle Elemente, deren Feldinhalte nicht mit den übergebenen Listen übereinstimmen |
=Logische Operationen= | =Logische Operationen= | ||
Eine Query läßt sich durch Verwendung logischer Operationen aus mehreren Teilen zusammenfügen. Dadurch läßt 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: | Eine Query läßt sich durch Verwendung logischer Operationen aus mehreren Teilen zusammenfügen. Dadurch läßt 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 | + | ;<code>AND</code> |
− | :Verknüpft zwei Anweisungen logisch UND | + | :Verknüpft zwei Anweisungen logisch <code>UND</code> |
− | ;OR | + | ;<code>OR</code> |
− | :Verknüpft zwei Anweisungen logisch ODER | + | :Verknüpft zwei Anweisungen logisch <code>ODER</code> |
− | ;NOT | + | ;<code>NOT</code> |
:Negiert eine Anweisung | :Negiert eine Anweisung | ||
− | ;( ) | + | ;<code>( )</code> |
:Durch die Verwendung von Klammern können die einzelnen Anweisungen verschachtelt bzw. gesteuert werden | :Durch die Verwendung von Klammern können die einzelnen Anweisungen verschachtelt bzw. gesteuert werden | ||
=Content-Typen= | =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. | + | 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. | Der Zugriff erfolgt duch Angabe des Feldnamens ergänzt durch einen Punkt mit anschließender Angabe des Content-Typs. | ||
Zeile 90: | Zeile 90: | ||
=TextContent= | =TextContent= | ||
− | Folgende Content-Typen sind als TextContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter | + | Folgende Content-Typen sind als <code>TextContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter |
− | ;text | + | ;<code>text</code> |
:Dieser Typ ist implizit, kann jedoch auch angegeben werden | :Dieser Typ ist implizit, kann jedoch auch angegeben werden | ||
=SystemContent= | =SystemContent= | ||
− | Folgende Content-Typen sind als SystemContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter | + | Folgende Content-Typen sind als <code>SystemContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter |
− | ;width | + | ;<code>width</code> |
:Zugriff auf die Breite von Bildern | :Zugriff auf die Breite von Bildern | ||
− | ;height | + | ;<code>height</code> |
:Zugriff auf die Höhe von Bildern | :Zugriff auf die Höhe von Bildern | ||
− | ;mime | + | ;<code>mime</code> |
:Zugriff auf den MIME-Type | :Zugriff auf den MIME-Type | ||
− | ;format | + | ;<code>format</code> |
:Zugriff auf das Format von Medien | :Zugriff auf das Format von Medien | ||
− | ;size | + | ;<code>size</code> |
:Zugriff auf die Dateigröße | :Zugriff auf die Dateigröße | ||
=LinkContent= | =LinkContent= | ||
− | Folgende Content-Typen sind als LinkContent deklariert. Der Zugriff erfolgt über diese Schlüsselwörter | + | Folgende Content-Typen sind als <code>LinkContent</code> deklariert. Der Zugriff erfolgt über diese Schlüsselwörter |
− | ;link | + | ;<code>link</code> |
:Zugriff auf Links vom Typ link | :Zugriff auf Links vom Typ link | ||
− | ;systemlink | + | ;<code>systemlink</code> |
:Zugriff auf Links vom Typ systemlink | :Zugriff auf Links vom Typ systemlink | ||
− | ;navlink | + | ;<code>navlink</code> |
:Zugriff auf Links vom Typ navlink | :Zugriff auf Links vom Typ navlink | ||
− | ;keywordlink | + | ;<code>keywordlink</code> |
:Zugriff auf Links vom Typ keywordlink | :Zugriff auf Links vom Typ keywordlink | ||
− | ;categorylink | + | ;<code>categorylink</code> |
:Zugriff auf Links vom Typ categorylink | :Zugriff auf Links vom Typ categorylink | ||
=CalendarContent= | =CalendarContent= | ||
− | Der Zugriff auf Termine bzw. CalendarContent erfolgt ebenfalls über die hier | + | 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 |
− | ;calendar | + | ;<code>calendar</code> |
:Zugriff auf Termin-Daten | :Zugriff auf Termin-Daten | ||
− | Eine Query nach Terminen wird i.d.R. über einem Zeitpunkt bzw. einem Zeitraum definiert. Gefunden werden damit alle Elemente, deren Termine genau am bzw. zwischen den angegeben Zeiten liegen. Folgende Beispiele verdeutlichen typische Abfragen auf Termindaten | + | Eine Query nach Terminen wird i.d.R. über einem Zeitpunkt bzw. einem Zeitraum definiert. Gefunden werden damit alle Elemente, deren Termine genau am, bzw. zwischen den angegeben Zeiten liegen. Folgende Beispiele verdeutlichen typische Abfragen auf Termindaten |
Diese Query findet alle Elemente, deren Termine zwischen den angebenen Werten liegen | Diese Query findet alle Elemente, deren Termine zwischen den angebenen Werten liegen | ||
Zeile 139: | Zeile 139: | ||
<source lang="xml">feldname.calendar range 123345789-1234567890</source> | <source lang="xml">feldname.calendar range 123345789-1234567890</source> | ||
− | Diese Query findet alle Termine für Feldname "dateItem" ab x | + | Diese Query findet alle Termine für Feldname "<code>dateItem</code>" ab x |
<source lang="xml">dateItem.calendar > 123345789</source> | <source lang="xml">dateItem.calendar > 123345789</source> | ||
− | Diese Query findet alle Termine für Feldname "dateItem" vor x | + | Diese Query findet alle Termine für Feldname "<code>dateItem</code>" vor x |
<source lang="xml">dateItem.calendar < 123345789</source> | <source lang="xml">dateItem.calendar < 123345789</source> | ||
− | Diese Query findet alle Termine für Feldname "dateItem" bis x | + | Diese Query findet alle Termine für Feldname "<code>dateItem</code>" bis x |
<source lang="xml">dateItem.calendar <= 123345789</source> | <source lang="xml">dateItem.calendar <= 123345789</source> | ||
=Wildcards= | =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: | + | 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. Das Wildcard steht lediglich für den Feldnamen. Content-Typen wie "systemlink" (s.u.) müssen explizit angegeben werden | + | :Kann verwendet werden wenn der Feldname über den gesucht werden soll nicht genau angegeben werden kann. Das 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> | <source lang="xml">z.B. (* = 'inhalt a') OR (*.systemlink != !{artikel_x})</source> | ||
− | ;% | + | ;<code>%</code> |
:Steht für beliebig viele Zeichen im Suchwort | :Steht für beliebig viele Zeichen im Suchwort | ||
<source lang="xml">z.B. sp_headline = 'welcome %'</source> | <source lang="xml">z.B. sp_headline = 'welcome %'</source> | ||
− | ;_ | + | ;<code>_</code> |
:Steht für genau ein Zeichen im Suchwort | :Steht für genau ein Zeichen im Suchwort | ||
Zeile 172: | Zeile 172: | ||
Weiterhin werden folgende Schlüsselwörter für die Definition einer Query bereitsgestellt | Weiterhin werden folgende Schlüsselwörter für die Definition einer Query bereitsgestellt | ||
− | ;parent | + | ;<code>parent</code> |
:Suche nach Elementen, deren Pool dem angegeben Wert entspricht | :Suche nach Elementen, deren Pool dem angegeben Wert entspricht | ||
− | ;root | + | ;<code>root</code> |
:Suche nach Elementen, deren Pool unterhalb des angegebenen Root-Pools liegt | :Suche nach Elementen, deren Pool unterhalb des angegebenen Root-Pools liegt | ||
Zeile 182: | Zeile 182: | ||
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. | 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== | + | ==Attribute des Typs <code>information</code>== |
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 | 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 | + | ;<code>changed</code> |
:Suche nach Änderungsdatum | :Suche nach Änderungsdatum | ||
− | ;changedBy | + | ;<code>changedBy</code> |
:Suche nach Artikeln, die bestimmter Redakteur zuletzt geändert hat | :Suche nach Artikeln, die bestimmter Redakteur zuletzt geändert hat | ||
− | ;comment | + | ;<code>comment</code> |
:Suche über das Kommentarfeld | :Suche über das Kommentarfeld | ||
− | ;created | + | ;<code>created</code> |
:Suche nach Erstellungsdatum | :Suche nach Erstellungsdatum | ||
− | ;createdBy | + | ;<code>createdBy</code> |
:Suche nach Artikeln, die ein bestimmter Redakteur erstellt hat | :Suche nach Artikeln, die ein bestimmter Redakteur erstellt hat | ||
− | ;directory | + | ;<code>directory</code> |
:Suche über das Arbeitsverzeichnis | :Suche über das Arbeitsverzeichnis | ||
− | ;filename | + | ;<code>filename</code> |
:Suche über den Dateinamen | :Suche über den Dateinamen | ||
− | ;name | + | ;<code>name</code> |
:Suche über den Artikelnamen | :Suche über den Artikelnamen | ||
− | ;suffix | + | ;<code>suffix</code> |
:Suche über die Dateiendung | :Suche über die Dateiendung | ||
− | ;type | + | ;<code>type</code> |
:Suche über den Artikeltyp (Resource, Medium, eigene Seite) | :Suche über den Artikeltyp (Resource, Medium, eigene Seite) | ||
− | ==Attribute des Typs template== | + | ==Attribute des Typs <code>template</code>== |
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 | 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 | + | ;<code>comment</code> |
:Suche über das Kommentarfeld | :Suche über das Kommentarfeld | ||
− | ;name | + | ;<code>name</code> |
:Suche über den Templatenamen | :Suche über den Templatenamen | ||
− | ;source | + | ;<code>source</code> |
:Suche über den Source-Code des Templates | :Suche über den Source-Code des Templates | ||
− | ;type | + | ;<code>type</code> |
:Suche über den Typ des Templates | :Suche über den Typ des Templates | ||
− | ==Attribute des Typs user== | + | ==Attribute des Typs <code>user</code>== |
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 | 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 | + | ;<code>comment</code> |
:Suche über das Kommentarfeld | :Suche über das Kommentarfeld | ||
− | ;email | + | ;<code>email</code> |
:Suche über die Email | :Suche über die Email | ||
− | ;firstname | + | ;<code>firstname</code> |
:Suche über den Vornamen | :Suche über den Vornamen | ||
− | ;lastname | + | ;<code>lastname</code> |
:Suche über den Nachnamen | :Suche über den Nachnamen | ||
− | ;login | + | ;<code>login</code> |
:Suche über das Login | :Suche über das Login | ||
− | ;type | + | ;<code>type</code> |
:Suche über den Typ des Templates | :Suche über den Typ des Templates | ||
=Order By= | =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. | + | 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. |
− | Optional kann auf die Sortierung noch über die Schlüsselwörter asc (=aufsteigend) und desc (=absteigend) Einfluss genommen werden. | + | Optional kann auf die Sortierung noch über die Schlüsselwörter <code>asc</code> (=aufsteigend) und <code>desc</code> (=absteigend) Einfluss genommen werden. |
− | Eine Sortierung von Zeichenkette kann zwar zum gewünschten Ergebnis führen, sollte aber nicht verwendet werden, da die | + | Eine Sortierung von Zeichenkette 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. |
Generell kann nach folgenden Feldern sortiert werden: | Generell kann nach folgenden Feldern sortiert werden: | ||
− | ;created | + | ;<code>created</code> |
:Sortierung nach dem Datum der Erstellung | :Sortierung nach dem Datum der Erstellung | ||
− | ;changed | + | ;<code>changed</code> |
:Sortierung nach den Datum der letzten Änderung | :Sortierung nach den Datum der letzten Änderung | ||
− | ;alle Variablen vom Typ TextContent und SystemContent | + | ;alle Variablen vom Typ <code>TextContent</code> und <code>SystemContent</code> |
− | :Die Typen CalendarContent und LinkContent werden z.Z. noch nicht unterstützt | + | :Die Typen <code>CalendarContent</code> und <code>LinkContent</code> werden z.Z. noch nicht unterstützt |
− | ;name | + | ;<code>name</code> |
:Sortierung nach dem Namen (Achtung: kein nummerischer Wert) | :Sortierung nach dem Namen (Achtung: kein nummerischer Wert) | ||
=Limit= | =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. | + | Ü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> |
Version vom 4. Juli 2008, 14:35 Uhr
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.
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.
Syntax
Der Query-String hat dabei die folgende Syntax:
from ElementType where query [order by FieldName [asc|desc] limit [Offset] Limit
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
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
- ID's
- 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_de')
not like
- Findet alle Elemente, auf die ein angegebenes Vergleichswort nicht zutrifft
range
- Findet bei nummerischen Vergleichen Elemente, deren Feldinhalt zwischen zwei angegeben 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
Logische Operationen
Eine Query läßt sich durch Verwendung logischer Operationen aus mehreren Teilen zusammenfügen. Dadurch läßt 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-Type
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 einem Zeitpunkt bzw. einem Zeitraum definiert. Gefunden werden damit alle Elemente, deren Termine genau am, bzw. zwischen den angegeben Zeiten liegen. Folgende Beispiele verdeutlichen typische Abfragen auf Termindaten
Diese Query findet alle Elemente, deren Termine zwischen den angebenen 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. Das 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
z.B. root = !{gui.informations}
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 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
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
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 Zeichenkette 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 den Datum der letzten Änderung
- alle Variablen vom Typ
TextContent
undSystemContent
- Die Typen
CalendarContent
undLinkContent
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.