Criterion auf Beziehungen

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Antworten
Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Criterion auf Beziehungen

Beitrag von Megger » 02.05.2013, 13:50:18

Mhh also der Titel ist ein bisschen komisch, aber ist irgendwie schwierig zusammen zu fassen!

Ich überlege gerade, ob es möglich ist, in einem GenericCriterionObject etwas von einem Objekt abzufragen, welches in Beziehung zu meinem "Hauptobjekt" steht! Allerdings weiß das Criterion ja gar nichts über die Beziehung bzw. will ich nicht erst später die entsprechenden Objekte filtern!
Kleines Beispiel:

Code: Alles auswählen

[Artikel]
Name
Farbe
Preis

[Hersteller]
Name

[Größe]
Name
Ean

[ArtikelGröße]
Bestand

[Artikel2Hersteller]

[Artikel2ArtikelGröße]

[ArtikelGröße2Größe]
Nun habe ich ein Suchfeld, dadurch will ich dann z.b. alle Artikel, die das Suchwort im Namen haben, oder wo das Suchwort im Namen des Herstellers vorkommt usw.
Ich könnte natürlich mit

Code: Alles auswählen

$searchCrit = new GenericCriterionObject();
$searchCrit->addPropertyIndicator('Name', '%'.$suchwort.'%', 'LIKE');
 
arbeiten und damit schonmal alle Artikel holen, auf die das Suchwort zutrifft! Bedeutet allerdings, dass dies nicht alle Artikel sind, die ich will, weil es kann ja auch Artikel geben, bei denen das Suchwort nicht zutrifft, es aber durchaus beim Hersteller zutreffen könnte! Dadurch müsste man dann erst später filtern, d.h. PHP-seitig und nicht in der Datenbank (oder aber alle Hersteller laden, auf die das Suchwort zutrifft, dann alle verknüpften Artikel und danach die beiden Listen vergleichen, sodass doppelte Artikel entfernt werden)

Oder als Beispiel will ich alle Artikel haben, deren Bestand größer 0 ist! Da würde ich dann auch alle 'ArtikelGröße' Objekte laden mit Bestand größer 0 und dann die verknüpften Artikel! Will ich allerdings nur Artikel die einem Suchwort entsprechen, dann habe ich höchstwahrscheinlich auch wieder zuviel Objekte geladen!

Die Frage ist, ob man das irgendwie über ein GenericCriterionObject abfragen kann?
Beispielhaft:

Code: Alles auswählen

$searchCrit->add...Indicator('Artikel2Hersteller', 'Name', '%'.$suchwort.'%', 'LIKE');
 
Damit hätte das Criterion alles, was es braucht
Eine Beziehung - Diese ist nicht auf ein Objekt bezogen sondern allgemein nur auf die Beziehung an sich
Spaltenname - Der Spaltenname für die Tabelle des 'Target' Objektes
Suchwort - Was soll beachtet/gesucht werden
'Vergleichsoperator' - Wie soll verglichen werden

Was mir so spontan für Probleme einfallen:
- LogicalOperator: Dieser muss natürlich auch beachtet werden, ob der nun 'AND', 'OR' oder was auch immer ist
- Beziehung an sich: Die Verknüpfung muss meiner Meinung nach über ein LEFT JOIN erfolgen (zu mindestens bei LogicalOperator = 'OR', da das Suchwort ja optional ist)
- Konflikt mit addRelationIndicator: Die Beziehungstabelle sollte nicht zweimal eingebunden werden

Was haltet ihr davon? Habe ich irgendwo einen Denkfehler drin? Kann man das ganze vielleicht jetzt schon einfach lösen und ich sehe es nur nicht?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 02.05.2013, 21:29:06

Hi Tobi,

kurz meine Gedanken dazu:

Für den Anwendungsfall "Suche" sehe ich eher den Aufbau eines flachen Such-Index als sinnvolle Lösung an, für die Anzeige z.B. in einer Amin-GUI, in der du alle Autos eines Herstellers mit einem bestimmten Namen - oder zumindest Teil-Namen - suchst, kommst du mit einem Such-Index natürlich auch weiter, die Implementierung wird dadurch jedoch komplexer.

Für die Abfrage per GenericCriterionObject bräuchtest du - wie du schon schreibst - einen dedizierten Kenner um hinterher die Statements sauber bauen zu können. Insofern stimme ich dir zu, einfach lösen lässt sich das auf die Schnelle nicht. Evtl. könntest du das über die Verschachtelung lösen, die Lutz mal für das GCO gebaut hat. Dort könnte man doch dann für einen addRelationIndicator() noch optional ein GCO mitgeben, das mit einem addPropertyIndicator() initialisiert wäre mitgeben. Somit könntest du dir beispielsweise den doppelten JOIN sparen.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Criterion auf Beziehungen

Beitrag von Megger » 02.05.2013, 21:56:26

Ja den Anwendungsfall habe ich auch nur genommen um ein Beispiel zu haben, welches vielleicht irgendwie verständlich ist!
Artikel -> ArtikelGröße -> Größe entspricht eigentlich eher dem, was ich erreichen will!
- Zeige mir eine Liste mit allen Artikeln
- Zeige mir eine Liste mit allen Artikeln deren Bestand größer 0
- usw.

Mhh die Verschachtelung nutze ich bereits! Bei addRelationIndicator brauche ich ja aber ein sourceObject, welches ich nicht habe, bzw. nicht genau definieren kann!

Hersteller
APF
Framework
Adventure

Gib mir alle Hersteller, die mit A beginnen -> Dadurch habe ich schon 2 Hersteller! Oder ich verstehe irgendwie nicht so richtig, was du meinst!
Ach ja, wann funktioniert schon mal etwas einfach :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 04.05.2013, 08:17:01

Mhh die Verschachtelung nutze ich bereits! Bei addRelationIndicator brauche ich ja aber ein sourceObject, welches ich nicht habe, bzw. nicht genau definieren kann!
Da hast du Recht. In diesem Fall kannst du das nicht ohne Anpassung des GORM abfragen, denn den Hersteller als Beziehungs-Objekt kannst du im Moment nur dediziert spezifizieren. :(
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Criterion auf Beziehungen

Beitrag von Megger » 06.05.2013, 14:57:16

Mhhh, hatte kurz die Überlegung es über Statements zu machen! Aber das ist wieder recht unflexibel, wäre aber mit ein bisschen Trickserei sicherlich durchaus möglich!
Ich werde nochmal ein bisschen drüber nachdenken und ein paar Dinge ausprobieren ;D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Criterion auf Beziehungen

Beitrag von Megger » 15.05.2013, 15:07:48

Mit 2.0 habe ich es mir einfach vorgestellt, dass ganze von "außen" zu erweitern! Einfach gleichnamige Klassen unter einem anderen Namespace anlegen, ist aber dann doch nicht so einfach

Aber erstmal vorweg:
Also das mit den doppelten JOINs ist kein Problem, da beim "Zusammenbau" der Join Statements das targetObject nicht gebraucht wird! In der erbenden Klasse prüfe ich dann einfach, ob der relationName bereits vorhanden ist, wenn nicht, wird er einfach mit ins Array geschrieben mit 'DUMMY' als "Object" :D
Stellt also kein Problem dar!

Das Where Statement zu verändern ist auch kein Problem! Einfach an entsprechender Stelle die Attribute beziehen, die ich aus der Beziehungstabelle wissen will und entsprechend zusammen bauen -> fertig!

Nun wollte ich das ein bisschen testen, d.h. in der serviceobjects.ini den gorm auf meine Klasse umgestellt, sodass die "neue" Version überall verfügbar ist!
Und ab hier ist es dann nicht mehr so einfach :?
Declaration of APF\dev\modules\extgorm\data\GenericORRelationMapper::buildJoinStatementsByCriterion() should be compatible with APF\modules\genericormapper\data\GenericORRelationMapper::buildJoinStatementsByCriterion($objectName, APF\modules\genericormapper\data\GenericCriterionObject $criterion)

Declaration of APF\dev\modules\extgorm\data\GenericORRelationMapper::buildWhereStatementsByCriterion() should be compatible with APF\modules\genericormapper\data\GenericORRelationMapper::buildWhereStatementsByCriterion($objectName, APF\modules\genericormapper\data\GenericCriterionObject $criterion)

Argument 2 passed to APF\dev\modules\extgorm\data\GenericORRelationMapper::buildJoinStatementsByCriterion() must be an instance of APF\dev\modules\extgorm\data\GenericCriterionObject, instance of APF\modules\genericormapper\data\GenericCriterionObject given, called in

Call to undefined method APF\modules\genericormapper\data\GenericCriterionObject::getRelationPropertyDefinition()
Das habe ich mir anders vorgestellt :cry:
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 15.05.2013, 15:57:30

Hallo Tobi,

ich denke dass du bei einer Erweiterung ein Interface für die Signatur der Methode einführen musst. Andernfalls gebe ich dem PHP-Parser Recht, die übergebene Instanz passt nicht zur erwarteten Instanz.
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Criterion auf Beziehungen

Beitrag von Megger » 21.05.2013, 16:39:45

So inzwischen gibt mein extGORM mir die Objekte zurück die ich haben will! Problematisch war ein wenig die Verschachtelung von Objekten, was ich bisher mehr schlecht als Recht gelöst habe :D

Was noch fehlt ist das "umschalten" der JOINS, sodass man auch "LEFT JOIN" usw. nutzen kann!

Verwendung:
In der zip Datei gibt es einmal den "normalen" genericormapper, dieser ist in der Hinsicht angepasst, dass er ein Interface für GenericCriterionObjects nutzt!
Unter /dev/modules/genericormapper/data/ befindet sich dann meine Entwicklung! Einmal GenericORRelationMapper und GenericCriterionObject

Um nun einen Wert einer Beziehungstabelle abzufragen:

Code: Alles auswählen

$crit->addRelationPropertyIndicator('User2Group', 'Name', 'Admin');
 
1. Parameter: relationName - Welche Beziehung soll genutzt werden
2. Parameter: attributeName - Welches Feld soll in der Beziehungstabelle abgefragt werden
3. Parameter: attributeValue - Welchen Wert soll das Feld haben
4. Parameter (optional): comparisionOperator - Wie soll der Wert verglichen werden
5. Parameter (optional/noch nicht genutzt): relationOperator - Wie sollen die Tabellen verbunden werden (INNER, LEFT, RIGHT)-Join usw.

Wäre schön wenn das mal jemand unabhängiges testen könnte
Dateianhänge
extgorm.zip
Extended GORM
(58.09 KiB) 66-mal heruntergeladen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 21.05.2013, 23:40:35

Sorry komme grade nicht dazu. Ist es einfacher für dich für die Nachvollziehbarkeit der Entwicklung, wenn ich dir einen eigenen Feature-Branch für das Thema "GORM" anlege? Dann kannst du dort einchecken, nachvollziehen und den Code einfacher sharen...
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Criterion auf Beziehungen

Beitrag von Megger » 23.05.2013, 14:33:20

Das wäre sicherlich durchaus interessant :D
Dann kann man später doch theoretisch auch die Anpassungen wegen der Interface Nutzung mergen, auch wenn man den Rest nicht übernimmt, oder?
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 24.05.2013, 23:47:11

Jep, so können wir das machen. Magst du einfach einen Feature-Branch anlegen oder soll ich dir das erledigen?
Viele Grüße,
Christian

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: Criterion auf Beziehungen

Beitrag von dr.e. » 24.12.2013, 12:44:46

Hallo Tobi,

wie steht es mit diesem Thema? Hast du deine Änderungen bereits in den 2.0-Branch übernommen? Muss die Dokumentation noch angepasst werden?

BTW: magst du noch ein Item im Tracker dazu anlegen, damit wir das nicht vergessen? Danke! :)
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast