Demande de conseils pour convertir une query filter string sur des tags en SQL, exemple "(tag1 and tag2) or tag3" en SQL
J’ai posté ce billet PostgreSQL subreddit, Javascript subreddit, AskProgramming Subreddit, Twitter et sur Fediverse :
Dans un projet closed source sur lequel je travaille actuellement, j’ai implémenté un système qui permet d’associer des
tags
sur des ressources.Mon implémentation ressemble au Proof of Concept suivant
postgres-tags-model-poc
lui-même inspiré de l’article Tags and Postgres Arrays, a Purrrfect Combination.Pour le moment l’implémentaiton fonctionne plutôt bien, je peux appliquer des filtres (voir les exemples dans le README) sur les ressources basées sur les
tags
, exemples :a.
SELECT * FROM main.contacts_with_tag_names WHERE ( tags && ( SELECT ARRAY_AGG(id) FROM main.contact_tags WHERE name = ANY(ARRAY['tag2']) ) );
ou
b.
SELECT * FROM main.contacts_with_tag_names WHERE ( ( tags <@ ( SELECT ARRAY_AGG(id) FROM main.contact_tags WHERE name = ANY(ARRAY['tag2', 'tag3']) ) ) OR ( tags && ( SELECT ARRAY_AGG(id) FROM main.contact_tags WHERE name = ANY(ARRAY['tag1']) ) );
Maintenant que cette implémentation est en place, je souhaite permettre aux utilisateurs de l’application de saisir des “query filter string” pour configurer des filtres basés sur des tags.
Voici à quoi ressemblerait les “query filter” string des exemples
a.
etb.
:
- a.
tag2
- b.
(tag2 and tag3) or tag1
Mon prochain objectif est l’implémentation de ce “query filter string”.
Une expérience passée m’a enseigné qu’utiliser de simples regex n’est pas la meilleure des idées pour implémenter un parser, j’ai constaté par la pratique que l’utilisation d’une librairie de lexer était bien plus simple et rigoureux.J’ai commencé par chercher des équivalents à Flex, GNU Bison… en Javascript
- Ce que j’ai trouvé sur npm : recherche “keywords:lexer”
- J’ai trouvé Jison sur Stackoverflow : Is there a flex - bison parser for javascript?
J’ai aussi passé un peu de temps à rechercher s’il existait une syntax “standard” de “query filter”, j’ai regardé les query search syntax de Google, Duckduckgo, Melisearch, Loki, GitHub, Jira et je n’ai rien trouvé de “standard” pour faire de la recherche uniquement basé sur des tags.
La syntax de “query filter” qui se rapproche le plus de mon objectif est celle de Google. Les autres syntaxes que j’ai étudiées sont souvent trop puissantes, elles gèrent beaucoup de fonctionnalités supplémentaires.Questions
Avant de me lancer dans l’implémentation de ce système de “query filter”, je vous adresse les questions suivantes :
- a. Connaissez-vous un “query filter syntax” standard, sur lequel je pourrais me baser ?
- b. Existe-t-il une librairie Open Source qui transforme ce type de query filter syntax en SQL ?
- c. Avez-vous une librairie de lexer Javascript à me conseiller qui serait adapté à ce besoin assez minimaliste ?
- d. Question accessoire : est-ce qu’un outil comme pgvector pourrait être pratique et mieux adapté que l’implémentation exposée dans l’article Tags and Postgres Arrays, a Purrrfect Combination ?
Merci d’avance pour vos suggestions.
Stéphane