X-Git-Url: http://git.kpe.io/?p=clsql.git;a=blobdiff_plain;f=sql%2Fobjects.lisp;h=0285ca45e4cf00fa1d2b04991290eaac63e34297;hp=e0d2cef682f51d1738885d4351cfb6f3c5bf3303;hb=388e813f22e5443353299e4058b99747ccb42377;hpb=fcb0cac1b206dacdb3d1043b5393bbb510a00882 diff --git a/sql/objects.lisp b/sql/objects.lisp index e0d2cef..0285ca4 100644 --- a/sql/objects.lisp +++ b/sql/objects.lisp @@ -234,12 +234,18 @@ superclass of the newly-defined View Class." sels (error "No slots of type :base in view-class ~A" (class-name vclass))))) +(defun generate-immediate-joins-list (vclass) + "Returns list of pairs of join slots and their class for a class." + (let ((sels nil)) + (dolist (slotdef (ordered-class-slots vclass)) + (when (and (eq :join (view-class-slot-db-kind slotdef)) + (eq :immediate (gethash :retrieval (view-class-slot-db-info slotdef)))) + (push slotdef sels))) + (cons vclass (list sels)))) -;; ;; Called by 'get-slot-values-from-view' ;; - (defvar *update-context* nil) (defmethod update-slot-from-db ((instance standard-db-object) slotdef value) @@ -854,6 +860,10 @@ superclass of the newly-defined View Class." (apply #'sql-and jc) jc)))))) +;; FIXME: add retrieval immediate for efficiency +;; For example, for (select 'employee-address) in test suite => +;; select addr.*,ea_join.* FROM addr,ea_join WHERE ea_join.aaddressid=addr.addressid\g + (defun find-all (view-classes &rest args &key all set-operation distinct from where group-by having @@ -897,6 +907,7 @@ superclass of the newly-defined View Class." objects)))) (let* ((*db-deserializing* t) (sclasses (mapcar #'find-class view-classes)) + (immediate-joins (mapcar #'generate-immediate-joins-list sclasses)) (sels (mapcar #'generate-selection-list sclasses)) (fullsels (apply #'append sels)) (sel-tables (collect-table-refs where))