Ce projet a été initialement commencé dans une issue le 2024-03-08.

Sur un modèle de données SQL qui implémente un système de tags comme celui décrit ici, je souhaite pouvoir appliquer des filtres qui ressemblent à ceci :

  • a. tag_a or tag_b
  • b. tag_a and tag_b
  • c. tag_a and (not tag_b)
  • d. (tag_a and tag_b) or (tag_c and tag_d)

Voici à quels filtres (where) SQL peuvent ressembler ces filtres :

  • a. WHERE contacts.tags && (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_a', 'tag_b'])
  • b. WHERE contacts.tags @> (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_a', 'tag_b'])
  • c.
WHERE
  (contacts.tags && (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_a'])) AND
  (NOT (contacts.tags && (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_a'])))
  • d.
WHERE
  (contacts.tags && (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_a', 'tag_b'])) OR
  (contacts.tags && (SELECT ARRAY_AGG(id) FROM contact_tags WHERE name = ANY(ARRAY['tag_c', 'tag_d']))

Questions que je me pose :

  • Existe-t-il un “langage” de query de tag sur lequel je pourrais me baser ?
  • Existe-t-il un parser qui me permettrait de transformer ma query de filtre en SQL ?

Todo :