Abfrage für Datenbank erstellen
-
Hallo,
ich habe eine Klasse, die eine Datenbank darstellt. In dieser werden Datensätze (Eigenschaften) zu Objekten gespeichert (z.B. Position, Name, Farbe, etc.) Von dieser abgeleitet gibt es konkrete Datenbanken, die unterschiedlich realisiert werden können (SQL, XML, im Speicher):class Datenbank { public: std::vector<Object> getObjekte(Abfrage q) = 0; }; class SQLDatenbank : public Datenbank { public: std::vector<Object> getObjekte(Abfrage q) };Ich möchte dann eine Abfrage erstellen können um bestimme Objekte auszuwählen. Z.B.
- Alle Objekte mit der Eigenschaft Farbe
- Alle Objekte im Umkreis von 5m um den Punkt (1,1,1)
- Alle Objekte mit der Farbe blau
Die einzelnen Abfragen sollten mit Und, Oder und Nicht verbunden werden können. Ich hatte die Idee die Abfragen durch Klassen darzustellen:
class Abfrage {}; class ImUmkreis : public Abfrage { public: ImUmkreis(float radius, float x, float y, float z); }; class UndAbfrage : public Abfrage { public: add(Abfrage q); private std::vector<Abfrage> abfragen; }; template <class T> class HatEigenschaft : public Abfrage { typedef T eigenschaft_t; };um dann zu Laufzeit eine Abfrage aus einzelnen Teilen zusammenzubauen:
main() { UndAbfrage und; und.add(HatEigenschaft<Position>()); und.add(ImUmkreis(5, 1, 1, 1)); SQLDatenbank data; std::vector<Objekte> obj = data.getObjekte(und); }Um eine konkrete Datenbank diese Abfrage ausführen zu lassen wollte ich für jede konkrete Datenbank einen Visitor erstellen, der z.B. bei einer SQL-Datenbank einen Abfrage-String erstellt oder bei einer Datenbank im Speicher alle Objekte durchgeht und prüft ob die Abfrage wahr/falsch ist.
Nur müsste ich die Basis-Visitor-Klasse jedesmal erweitern, wenn ich einen neuen Abfrage-Typ erstelle. Am liebsten wäre es mir, wenn ich nur eine neue Abfrage-Klasse erstellen müsste und Code für die konkreten Datenbanken.Vielleicht wisst ihr auch eine besseren Ansatz.
-
was in Richtung Linq?
als Beispiel/Ansatz: http://code.google.com/p/boolinq/