septeql

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 405455a226eabd2a7348128743d569f508d7fe38
parent f00c303fee225894a4bbf8520c0ca9f9a5e45617
Author: septeql <septeql@telent.net>
Date:   Sat,  1 Sep 2007 23:24:30 +0000

add support for left joins
Diffstat:
Msepteql.lisp | 11+++++++++++
Mtests.lisp | 8++++++--
2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/septeql.lisp b/septeql.lisp @@ -156,6 +156,12 @@ interpolated into a SQL statement as a string literal" (setf r (make-instance 'sql :from r))) (make-instance 'sql :from `(join ,(sv l 'from) ,(sv r 'from) ,expr)))) +(define-translator left-join (rel1 rel2 expr) + (let* ((j (parse-relation `(join ,rel1 ,rel2 ,expr))) + (from (sv j 'from))) + (setf (sv j 'from) `(left-join ,@(cdr from))) + j)) + (define-translator group (aggregates dividers relation) (let ((l (parse-relation relation))) (when (any-slot-bound-p l '(start end group-by attributes order-by)) @@ -223,6 +229,11 @@ interpolated into a SQL statement as a string literal" (from-clause-as-string (second from)) (from-clause-as-string (third from)) (translate-scalar (fourth from)))) + ((eql (car from) 'left-join) + (format nil "(~A LEFT JOIN ~A ON ~A)" + (from-clause-as-string (second from)) + (from-clause-as-string (third from)) + (translate-scalar (fourth from)))) (t (error "buggered if I know")))) (defun as-string (sql) diff --git a/tests.lisp b/tests.lisp @@ -135,4 +135,8 @@ SIMPLE-ERROR ;; sent (to-sql '(select relation (and (= value 1) (< another 10) (or true false)))) ;; received -"SELECT * FROM RELATION WHERE (((VALUE = 1) AND (ANOTHER < 10)) AND (TRUE OR FALSE)) " -\ No newline at end of file +"SELECT * FROM RELATION WHERE (((VALUE = 1) AND (ANOTHER < 10)) AND (TRUE OR FALSE)) " +;; sent +(7ql:to-sql '(left-join a b (= a.id b.id))) +;; received +"SELECT * FROM (A LEFT JOIN B ON (A.ID = B.ID)) " +\ No newline at end of file