diff options
-rw-r--r-- | org-roam-ui.el | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/org-roam-ui.el b/org-roam-ui.el index aca7e40..aae4446 100644 --- a/org-roam-ui.el +++ b/org-roam-ui.el @@ -153,9 +153,23 @@ This serves the web-build and API over HTTP." (defun org-roam-ui--send-graphdata () "Get roam data, make JSON, send through websocket to org-roam-ui." (let* ((nodes-columns [id file title level]) - (links-columns [source dest type]) + (links-columns [links:source links:dest links:type refs:node-id]) (nodes-db-rows (org-roam-db-query `[:select ,nodes-columns :from nodes])) - (links-db-rows (org-roam-db-query `[:select ,links-columns :from links :where (or (= type "id") (= type "cite"))])) + ;; Left outer join on refs means any id link (or cite link without a + ;; corresponding node) will have 'nil for the `refs:node-id' value. Any + ;; cite link where a node has that `:ROAM_REFS:' will have a value. + (links-db-rows (org-roam-db-query `[:select ,links-columns + :from links + :left :outer :join refs :on (= links:dest refs:ref) + :where (or (= links:type "id") (= links:type "cite"))])) + ;; Convert any cite links that have nodes with associated refs to a + ;; standard id link while removing the 'nil `refs:node-id' from all + ;; other links + (links-db-rows (seq-map (lambda (l) + (pcase-let ((`(,source ,dest ,type ,node-id) l)) + (if node-id + (list source node-id "id") + (list source dest type)))) links-db-rows)) (response `((nodes . ,(mapcar (apply-partially #'org-roam-ui-sql-to-alist (append nodes-columns nil)) nodes-db-rows)) (links . ,(mapcar (apply-partially #'org-roam-ui-sql-to-alist '(source target type)) links-db-rows))))) (websocket-send-text oru-ws (json-encode `((type . "graphdata") (data . ,response)))))) |