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. et b. :

  • 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

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