git.fiddlerwoaroof.com
list-query.lisp
4f2543e4
 
d2878c38
 (defpackage #:tempores.ql
4f2543e4
   (:use #:cl #:anaphora #:alexandria #:serapeum #:fwoar.lisputils
d2878c38
         #:tempores.macros #:generic-equals))
4f2543e4
 
d2878c38
 (in-package #:tempores.ql)
4f2543e4
 
 (defstruct (ql-clause (:type vector))
   clause-type clause-parts)
 
 (defun .name ()
   (.map 'string
         (.is (.or #'alpha-char-p
                   #'digit-char-p))))
 
 (defun .order-specifier ()
   (.or (.string= "desc")
        (.string= "asc")))
 
 (defun .order-list (&optional (separator #\,))
   (.map 'list (.let* ((name (.name))
                       (order (.optional
                                (.and (.is #'whitespacep)
                                      (.order-specifier))))
                       (_ (.optional (.char= separator))))
                 (.identity (cons name
                                  (or order "asc"))))))
 
 (defun .name-list (&optional (separator #\,))
   (.map 'list (.let* ((name (.map 'string
                                   (.is (.or #'alpha-char-p
                                             #'digit-char-p))))
                       (_ (.optional (.char= separator))))
                 (.identity name))))
 
 (defun .select-clause ()
   (.let* ((_ (.string= "select"))
           (_ (.is #'whitespacep))
           (names (.name-list)))
     (.identity (vector :order-clause names))))
 
 (defun .where-clause ()
   (.let* ((_ (.string= "where"))
           (_ (.is #'whitespacep))
           (names (.name-list)))
     (.identity (vector :order-clause names))))
 
 (defun .order-clause ()
   (.let* ((_ (.string= "order by"))
           (_ (.is #'whitespacep))
           (names (.order-list)))
     (.identity (vector :order-clause names))))
 
 (defun .select-statement ()
   (.let* ((_ (.string= "where"))
           (_ (.is #'whitespacep))
           (names (.name-list)))
     (.identity (vector :order-clause names))))