add support for left joins
This commit is contained in:
11
septeql.lisp
11
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)
|
||||
|
||||
@@ -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)) "
|
||||
"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)) "
|
||||
Reference in New Issue
Block a user