In pratica stai scrivendo un compilatore, che si traduce da SQL in qualunque cosa capisca il tuo datastore. Alla fine, probabilmente avrai le seguenti parti:
- un parser che prende SQL e produce un Abstract Syntax Tree
- un gruppo di visitatori che eseguono analisi semantiche e / o riscrivono su AST
- un interprete che alla fine esegue la query (elaborata) contro il datastore
- un REPL che legge input e formatta l'output
Ma prima ancora di iniziare l'implementazione, dovresti considerare che SQL è definito sulle relazioni (tabelle), che sono fondamentalmente diverse dalle raccolte di documenti. Primo, ogni riga in una tabella ha le stesse colonne di tutte le altre righe in quella tabella e nient'altro. Secondo, ogni riga è una tupla piatta, mentre un documento è un albero.
Se fossi in te, per prima cosa risolverei questo problema di mappatura prendendo qualcosa come PostgreSQL, definendo le tabelle che ti aspetti di avere, e poi risolvendo come mappare i tuoi dati in dette tabelle (eseguendolo effettivamente). Puoi usare il risultato come prototipo per chiunque desideri avere SQL, ti darà alcune idee su come implementare il compilatore, perché la semantica sarà nota e avrai un solido riferimento per scopi di test / verifica.
Si può anche finire per decidere che copiare i dati su un RDBMS reale è abbastanza buono; Le query SQL sono una cosa abbastanza complessa da implementare in modo efficiente, con join, sottoquery, aggregazioni, proiezioni e quant'altro. È ancora più difficile se devi farlo "dall'esterno" dell'archivio dati.