Da ich mich in der letzten Woche mit Mehrfachabfragen beschäftigt habe, hier ein paar Eindrücke und Erkenntnisse zum Thema. :-)

Unter Mehrfachabfragen verstehe ich in diesem Zusammenhang ein Mitgeben von mehreren Parameter Tupeln, welche jeweils ein Datenobjekt eindeutig identifizieren. Diese werden dann an den Handler weitergegeben und dieser entscheidet dann ob er mit Mehrfachabfragen umgehen kann, oder nicht. Falls nicht, so wird die effektive Handler-Funktion durch den Wrapper pro Tupel einmal explizit aufgerufen, dies ist natürlich nicht performat, aber es simuliert ein identisches Verhalten für den Fall dass Mehrfachabfragen nicht supported werden.

Jetzt muss natürlich wieder auf den effektiven Wrapper der Handler geschaut werden. Denn sobald Mehrfachabfragen möglich sind muss man sich überlegen ob das Ganze “lazy” oder “greedy” ablaufen soll. ;-)

“Lazy” bedeutet in diesem Fall, dass eine Abfrage die mindestens ein Ergebnis findet einen Ausstieg aus der Kanaliteration gewirkt und nur die gefundenen Daten zurückgegebenen werden. Alle Daten die in diesem Kanal nicht vorhanden waren, werden nicht in tiefer liegenden Kanälen gesucht.

Wenn man jetzt “Greedy” Abfragen will, so muss man sich einigen Herausforderungen stellen:

  1. Identifizieren von Parameter Tupeln
  2. Zuordnen von Query Ergebnissen zu den Parameter Tupeln
  3. Zwischenspeichern von Ergebnissen bei der Kanaliteration damit das Modul weiß welche Datenobjekte in welchen Kanal gespeichert werden müssen

Lösungen:

  1. Eine Tupel ID wird per md5() und implode() erzeugt:
    $id = md5(implode($params));
  2. Das hier ist sozusagen gerade “Work in progress”. ;-)
    Am direktesten wäre es wohl diese Verknüpfung im Datenkanal zu handhaben, allerdings wäre dass dann ein Entwicklungs-Overhead beim Schreiben von neuen Datenkanälen. Ich werde wohl versuchen die Zuordnung tiefer im System einzubauen um die zusätzliche Logik aus den Datenkanälen heraus zu halten.
  3. Dies sollte sich nicht schwierig gestalten, man muss bei Writeback nur abfragen welche Datenobjekte relevant sind für den Kanal. Dies werde ich wohl über ein assoziatives Array abwickeln.