Stocker un filtre de mes données... dans ma base de données

Nekuro - 8 oct. 2012 à 17:07
 Nekuro - 8 oct. 2012 à 17:17
Bonjour,

pour un projet sur lequel je travaille à l'heure actuelle, je dois mettre en place un système permettant aux utilisateurs de mon logiciel (une appli web en PHP, basée sur Symfony) de sélectionner un ensemble de conditions qui leur permettra de restreindre les résultats renvoyés (rien de bien méchant, en somme).
Les conditions sont de la forme Entité:attribut Opérateur Argument, avec mes opérateurs dépendants du type de l'attribut. Encore une fois, rien de bien méchant, je vois comment le faire.
Mon problème est qu'une petite catégorie d'utilisateurs de l'application doit pouvoir non seulement choisir plusieurs conditions pour créer un filtre, mais aussi de les stocker dans la base de données, et ce en maintenant le parenthésage.
Celà complique donc le stockage de ces conditions, que j'aimerais bien effectuer de façon optimale (pas de stockage de requêtes à l'arrache dans la base par exemple).
Quelqu'un aurait-il une idée de structure? A l'heure actuelle, j'ai une sorte de structure en arbre, la méthode la plus sûre serait de stocker dans une table mes conditions (de la forme Entité Attribut Opérateur Argument) et dans une autre une sorte de groupement de noeuds, pouvant référencer ces conditions (Filtre Père Fils1 Fils2 ET/OU Condition Parenthèses? ).
Toutefois, celà pourrait générer beaucoup d'éléments pour un seul filtre...

Pour tenter d'éclaircir un peu, voilà la grammaire de mes conditions d'après mon raisonnement :

condition	:=	( condition )
condition	:=	condition AND condition
condition	:=	condition OR condition
condition	:=	selection Argument
selection	:=	Entite : attribut EQUALS
selection	:=	Entite : attribut NOT-EQUALS
selection	:=	Entite : String CONTAINS
selection	:=	Entite : String NOT-CONTAINS
selection	:=	Entite : Date LESS-THAN
selection	:=	Entite : Date LESS-EQUAL
selection	:=	Entite : Date MORE-THAN
selection	:=	Entite : Date MORE-EQUAL
attribut	:=	String
attribut	:=	Date
attribut	:=	ListItem


Merci d'avance à tous ceux qui se pencheraient sur mon problème.

1 réponse

Oh, et pour préciser :
dans la structure que j'envisage pour l'heure, il y a des contrôles sur les champs de type (Filtre, Père, Fils1, Fils2, ET/OU, Condition, Parenthèses?).
Filtre définit l'objet filtre auquel appartient le champ
Père définit le "noeud" parent du champ
Fils1 et Fils2 sont soient des champs "noeud", soit des conditions.
Le champ ET/OU indique le type de relation entre les deux fils du noeud (Fils1 ET Fils2, Fils1 OU Fils2).
Condition réfère à la condition à laquelle est associée le noeud. Si ce champ est rempli, les champs Fils1, Fils2 et ET/OU ne sont pas renseignés, et vice versa (ce qui fait du noeud une feuille).
Finalement, Parenthèses? est un booléen indiquant si les éléments de ce noeud sont entourés par des parenthèses (ce qui permet de les remonter à l'affichage, au cas où l'un de mes utilisateurs veut modifier le filtre).
0
Rejoignez-nous