Open Dr-Thomas-Tensi opened 6 years ago
@xdoo @dragonfly28 @rowe42 @Baumfrosch @ejcsid
-- TOKENS --
lParToken ::= "(" .
rParToken ::= ")" .
stringToken ::= <<single or double quote surrounded char sequence
optionally ending with "*">> .
wordToken ::= letter { letter | digit } .
orToken ::= "|" | "oder" .
andToken ::= "," | "&" | "und" .
notToken ::= "!" | "nicht" .
starToken ::= "*" .
-- Problem bei den Junktoren: deutsche Namen können auch als
-- Bestandteile von Schlüsseln oder Werten vorkommen, dann gibt es
-- Namenskollisionen ==> ggf. diese Varianten der Token weglassen
-- PRODUCTIONS --
primaryExpression ::= stringToken | keyValuePair | notToken primaryExpression
| lParToken expression rParToken .
keyValuePair ::= wordList equalsSymbol value .
wordList ::= wordToken { wordToken } .
value ::= literal | wordList [ starToken ] .
literal ::= booleanToken | numberToken | dateToken | stringToken .
term ::= primaryExpression [ andToken term ] .
expression ::= term [ orToken expression ] .
AXIOM ::= expression .
Diese Syntax klappt bei GitHub gut, weil dort die Schlüssel immer Worte sind; bei uns ist aber die natürliche Syntax oft eine Nominalphrase mit Leerzeichen (z.B. "Name des Geheges").
Das verstehe ich nicht. Ist es nicht so, dass die Suche bei uns immer im Kontext einer Entität statt findet? D.h. wenn ich ein Gehege mit einem bestimmten Namen haben will, dann brauche ich doch nicht "des Geheges".
Bevor wir hier Aufwand rein stecken, fände ich es hilfreich zu verstehen, warum wir das brauchen. Die Behauptung, dass die natürlich Syntax oft eine Nominalphrase ist, hilft mir da nicht weiter.
Ist es nicht so, dass die Suche bei uns immer im Kontext einer Entität statt findet? D.h. wenn ich ein Gehege mit einem bestimmten Namen haben will, dann brauche ich doch nicht "des Geheges".
Du hast vollkommen recht, dass der Kontext eigentlich klar ist. Aber wie erkennt der Nutzer einer Tabelle, dass er als Schlüssel "Vorname" oder "firstName" eintippen muss?
Die Behauptung, dass die natürliche Syntax oft eine Nominalphrase ist, hilft mir da nicht weiter.
Lass mich das ausführen, weil ich in der obigen Beschreibung etwas zu knapp war. Damit für ihn erkennbar wird, was für Schlüssel er benutzen darf, hat er zwei gleichwertige Eingabemöglichkeiten:
Das erfordert etwas aufwändige Vorverarbeitung im Frontend, aber wäre - aus meiner Sicht - eine relativ gut bedienbare Lösung.
Aber wie erkennt der Nutzer einer Tabelle, dass er als Schlüssel "Vorname" oder "firstName" eintippen muss?
Im einfachsten Fall aus der Nutzerdoku. Menschen die solche Suchen (neben der freien Suche) nutzen sind ja in der Regel Poweruser. Die geben heute Schlüsselnummern ein, um Dinge zu tun. Um das zu vereinfachen haben wir #181.
Oder er nimmt einfach den Text, der im Spaltenkopf steht, als Schlüssel (also "Vorname des Tieres"). Und das ist, so leid es mir tut ;-), in der Regel eine Nominalphrase. Damit man sich die Finger beim Eintippen nicht abbricht, kann man einen Präfix dieser Phrase verwenden, solange er innerhalb der Spalten eindeutig ist, also z.B. "Vorname" oder sogar nur "V".
Das ist nicht so einfach wie es sich anhört, weil der Bezug Anzeigename und Attribut ausschließlich über eine Locales Datei (die jederzeit geändert werden kann) hergestellt wird. D.h. der Anzeigename ist vollkommen willkürlich durch die Fachdienststelle gewählt.
Sollte ein Verfahren eine spezielle Suche benötigen, dann bin ich der Meinung, dass dies durch das Projekt, genau auf die Bedürfnisse der Fachdienststelle zugeschnitten, implementiert werden sollte. Wir unterstützen mit unserer Arbeit, damit Projekte bei der INDIVIDUAL Programmierung schneller und hoffentlich auch besser werden. Zu einer Individual Programmierung gehört auch, dass bestimmte Dinge individuell für einen bestimmten Fall hergestellt werden.
[Woher kommen Namen der Schlüssel?]
[aus der Nutzerdoku, Suchdefinierer sind Poweruser]
Naja, unser Anspruch ist ja schon, dass die Oberfläche weitgehend selbsterklärend ist. Auch als Nicht-Poweruser möchte ich schnell mal eine einfache Suche hinrotzen können, ohne in einer Dokumentation nachlesen zu müssen.
[Schlüssel könnten über die Spaltenbeschriftungen gewonnen werden]
[nicht so einfach: der Bezug Anzeigename und Attribut wird ausschließlich über eine (flüchtige) Locales Datei hergestellt]
Wir haben, wenn ich das richtig verstanden habe, noch nicht letztgültig definiert, ob die Abbildung von "Attributname" bzw. "technischer Spaltenname" im Front- oder Backend stattfindet. So etwas hängt von der Komplexität der Oberfläche ab und ob man beispielsweise ohne Backendzugriff Sprachumschaltungen zulassen will und vieles mehr.
In den meisten unserer Fälle wird die Lokalisierung - und so verstehe ich Deinen Einwurf - aber mit Hilfe einer Locales-Datei im Frontend gemacht werden, d.h. dort findet die Abbildung von technischem Attributnamen auf die angezeigten Spaltenbeschriftungen statt.
Im obigen Vorschlag hatte ich geschrieben, dass es eine Abbildungsmethode "displayedToTechnicalHeadingMap" gibt; die würde genau die Information der Locales-Datei benutzen. D.h. wir haben hier kein Wartungsproblem. Es könnte höchstens sein, dass der Fachbereich mal für unterschiedliche Spalten dieselben Beschriftungen vorsieht; dann klappt die Heuristik des obigen Algorithmus natürlich nicht mehr...
Für AdHoc-Suchen trägt der Ansatz mit der Suche mit Spaltenbeschriftungen; bei vorgefertigten Suchen, die über längere Zeit funktionieren müssen, sollten eher die technischen Namen verwendet werden: dann ist man von der Lokalisierung unabhängig.
Ich gebe schon zu, dass in meinem Vorschlag viele Verarbeitungsschritte bereits im Frontend ausgeführt werden müssen. Aber wenn ich mir das zutraue, das selbst in Javascript zu implementieren, dann kann es sicher nicht megaschwierig sein ;-)
Sollte ein Verfahren eine spezielle Suche benötigen, dann bin ich der Meinung, dass dies durch das Projekt, genau auf die Bedürfnisse der Fachdienststelle zugeschnitten, implementiert werden sollte.
Hmm, wir beide vertreten die verschiedenen Enden des Spektrums: Du bist eher für ein Gerüst, das durch den Entwickler gefüllt wird; ich bin für die Maximalgenerierung. Bei der Suche denke ich, sollten wir schon eine Engine vorgeben, damit man etwas hat, was für viele Belange taugt.
Es spricht ja nichts dagegen, diese Suche durch individuelle Lösungen ersetzen zu können.
Klingt nach Diskussion in der Gruppe oder wir treffen uns mal auf einen Kaffee?
Also ich finde den Vorschlag von @Dr-Thomas-Tensi sehr gut und umfassend. Und es ist ja tatsächlich im aktuellen Beispiel so, dass es bei den Enclosures eine Spalte gibt, die "Name des Geheges" überschrieben ist. Und da wüsste ich als Nutzer jetzt nicht ohne weiteres, was der technische Schlüssel im Suchfeld dafür ist.
Ich kann auch nachvollziehen, dass wir das Mapping von Spaltenüberschriften auf technische Feldschlüssel über die Information in der locales-Datei machen können.
Aber: Ich schätze das als relativ komplex ein, das zu implementieren. Das wird nix für Meilenstein 1 und meiner Meinung nach ist das auch für Meilenstein 2 schwer zu bewältigen (@ejcsid weiß hier mehr, da sie sich schon mit der Suche im Backend beschäftigt hat). Wenn du dir das aber zutraust, fände ich das nicht schlecht.
Was meinen die anderen? @Baumfrosch @ejcsid @dragonfly28
Wenn ich es richtig verstanden habe, setzen wir im Backend Lucene ein. Ich hätte erwartet, dass wir die Lucene-Parser-Syntax mit möglichst wenigen Veränderungen an die Oberfläche bringen. Damit hätten wir wenig Aufwand, aber die Mächtigkeit von Lucene. Konkret vermisse ich
-- Problem bei den Junktoren: deutsche Namen können auch als
-- Bestandteile von Schlüsseln oder Werten vorkommen, dann gibt es
-- Namenskollisionen ==> ggf. diese Varianten der Token weglassen
Hier würde ich wie Lucene auf Großbuchstaben setzen, evtl. in Englisch. Erspart Internationalisierung und ist man vom Outlook-Client gewohnt ;-)
Die Schlüssel würde ich auch von den Headern trennen, um flexibler zu sein. So könnte man Kürzel z.B. einführen. Sie sollten aber zu 90% identisch sein.
Ich hoffe, das hilft erstmal.
Für die Suche in unseren Listen gibt es bereits eine Basisimplementierung, die im Wesentlichen die Suchsyntax aus GitHub nachbildet.
Es sind per Leerzeichenfolgen getrennte Folgen von jeweils durch Doppelpunkt getrennten Schlüssel-Wert-Paaren. Ein Wert darf auch in Doppelapostrophen eingeschlossen sein, damit man Sonderzeichen als Wertbestandteil angeben kann (insbesondere Leerzeichen).
Diese Syntax klappt bei GitHub gut, weil dort die Schlüssel immer Worte sind; bei uns ist aber die natürliche Syntax oft eine Nominalphrase mit Leerzeichen (z.B. "Name des Geheges").
Das ließe sich auch wieder mit Quoting auflösen, aber dann wird die Syntax unhandlich. Insbesondere gibt es auch weitere Anforderungen an die Suchsyntax wie z.B. liberale Leerzeichensetzung, ODER-Junktor, Wildcards, Klammerung usw., die die Komplexität der Eingabe (und Verarbeitung ;-) nach oben treiben.
Ich biete an, eine vollständige Syntax zu überlegen, mit Euch abzustimmen und die JavaScript-Frontend- und Java-Backend-Implementierung dazu zu machen.
Meinungen?