Hash join: Difference between revisions
Content added Content deleted
mNo edit summary |
(Update emacs lisp) |
||
Line 965: | Line 965: | ||
<syntaxhighlight lang="lisp"> |
<syntaxhighlight lang="lisp"> |
||
(defun make-multi-map (rows) |
(defun make-multi-map (rows) |
||
(let (( |
(let ((multi-map nil)) |
||
(cl-loop for row in rows do |
|||
(let ((name (car row |
(let* ((name (car row)) |
||
(name-list (assoc name multi-map))) |
|||
(if name-list |
|||
(nconc name-list (list row)) |
|||
(progn |
|||
(add-to-list ' |
(add-to-list 'multi-map (list name row) 't) ) ) ) ) |
||
(mapcar 'place_line rows) |
|||
multi-map) ) |
|||
(defun join-tables (table1 table2) |
(defun join-tables (table1 table2) |
||
(let ((multi-map (make-multi-map table2)) |
(let ((multi-map (make-multi-map table2)) |
||
(result-table '())) |
(result-table '())) |
||
(cl-loop |
(cl-loop for row in table1 do |
||
(let ((multi-rc (assoc (cdr row) multi-map))) |
|||
for row in table1 do |
|||
( |
(when multi-rc |
||
(cl-loop for multi-line in (cdr multi-rc) do |
|||
(add-to-list 'result-table |
|||
(when multi-rc |
|||
( |
(list (car row) (cdr row) (car multi-line) (cdr multi-line)) |
||
't))))) |
|||
result-table)) |
result-table)) |
||
(let ((table1 '((27 . "Jonah") |
(let ((table1 '((27 . "Jonah") |
||
Line 998: | Line 997: | ||
("Alan" . "Zombies") |
("Alan" . "Zombies") |
||
("Glory" . "Buffy")))) |
("Glory" . "Buffy")))) |
||
(join-tables table1 table2)) |
(message "%s" (join-tables table1 table2)) ) |
||
</syntaxhighlight> |
</syntaxhighlight> |
||