|
42 | 42 | (format nil "~:@(~A-~A~)" name pk-name)))
|
43 | 43 |
|
44 | 44 | (defun add-referencing-slots (initargs)
|
45 |
| - (let ((parent-column-map (make-hash-table :test 'eq))) |
| 45 | + (let ((parent-column-map (make-hash-table :test 'eq)) |
| 46 | + (class-name (getf initargs :name))) |
46 | 47 | (setf (getf initargs :direct-slots)
|
47 | 48 | (loop for column in (getf initargs :direct-slots)
|
48 | 49 | for (col-type not-null) = (multiple-value-list (parse-col-type (getf column :col-type)))
|
49 | 50 |
|
50 | 51 | if (typep col-type '(and symbol (not null) (not keyword)))
|
51 | 52 | append
|
52 |
| - (let* ((name (getf column :name)) |
53 |
| - ;; FIXME: find-class raises an error if the class is this same class or not defined yet. |
54 |
| - (rel-class (find-class col-type)) |
55 |
| - (pk-names (table-primary-key rel-class))) |
| 53 | + (let* ((column-name (getf column :name)) |
| 54 | + ;; FIXME: find-class raises an error if the class is not defined yet. |
| 55 | + (pk-names (if (eq col-type class-name) |
| 56 | + (or (getf initargs :primary-key) |
| 57 | + (getf (find-if (lambda (column-def) |
| 58 | + (getf column-def :primary-key)) |
| 59 | + (getf initargs :direct-slots)) |
| 60 | + :name) |
| 61 | + (loop for superclass in (getf initargs :direct-superclasses) |
| 62 | + for pk-names = (table-primary-key superclass) |
| 63 | + until pk-names |
| 64 | + finally (return pk-names))) |
| 65 | + (table-primary-key (find-class col-type))))) |
56 | 66 | (unless pk-names
|
57 |
| - (error "Foreign class ~S has no primary keys." |
58 |
| - (class-name rel-class))) |
| 67 | + (error "Primary keys can not be determined for ~A." |
| 68 | + col-type)) |
59 | 69 | (rplacd (cdr column)
|
60 | 70 | `(:ghost t ,@(cddr column)))
|
61 | 71 |
|
62 | 72 | (cons column
|
63 | 73 | (mapcar (lambda (pk-name)
|
64 |
| - (let ((rel-column-name (rel-column-name name pk-name))) |
65 |
| - (setf (gethash rel-column-name parent-column-map) name) |
| 74 | + (let ((rel-column-name (rel-column-name column-name pk-name))) |
| 75 | + (setf (gethash rel-column-name parent-column-map) column-name) |
66 | 76 | `(:name ,rel-column-name
|
67 | 77 | :initargs (,(intern (symbol-name rel-column-name) :keyword))
|
68 | 78 | :col-type ,(if not-null
|
|
0 commit comments