create_graph_with_properties.cljs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. (ns logseq.tasks.db-graph.create-graph-with-properties
  2. "Script that generates all the permutations of property types and cardinality.
  3. Also creates a page of queries that exercises most properties
  4. NOTE: This script is also used in CI to confirm graph creation works"
  5. (:require [logseq.tasks.db-graph.create-graph :as create-graph]
  6. [logseq.db.sqlite.util :as sqlite-util]
  7. [clojure.string :as string]
  8. [datascript.core :as d]
  9. ["path" :as node-path]
  10. ["os" :as os]
  11. [nbb.core :as nbb]))
  12. (defn- date-journal-title [date]
  13. (let [title (.toLocaleString date "en-US" #js {:month "short" :day "numeric" :year "numeric"})
  14. suffixes {1 "st" 21 "st" 31 "st" 2 "nd" 22 "nd" 3 "rd" 23 "rd" 33 "rd"}]
  15. (sqlite-util/sanitize-page-name
  16. (string/replace-first title #"(\d+)" (str "$1" (suffixes (.getDate date) "th"))))))
  17. (defn- date-journal-day [date]
  18. (js/parseInt (str (.toLocaleString date "en-US" #js {:year "numeric"})
  19. (.toLocaleString date "en-US" #js {:month "2-digit"})
  20. (.toLocaleString date "en-US" #js {:day "2-digit"}))))
  21. (defn- subtract-days
  22. [date days]
  23. (new js/Date (- (.getTime date) (* days 24 60 60 1000))))
  24. (defn- create-init-data
  25. []
  26. (let [today (new js/Date)
  27. yesterday (subtract-days today 1)]
  28. {:pages-and-blocks
  29. [{:page
  30. {:block/name (date-journal-title today) :block/journal? true :block/journal-day (date-journal-day today)}
  31. :blocks
  32. [{:block/content "[[Properties]]"}
  33. {:block/content "[[Queries]]"}]}
  34. {:page
  35. {:block/name (date-journal-title yesterday) :block/journal? true :block/journal-day (date-journal-day yesterday)}}
  36. {:page {:block/name "properties"}
  37. :blocks
  38. [{:block/content "default property block" :properties {:default "haha"}}
  39. {:block/content "url property block" :properties {:url "https://logseq.com"}}
  40. {:block/content "url-many property block" :properties {:url-many #{"https://logseq.com" "https://docs.logseq.com"}}}
  41. {:block/content "checkbox property block" :properties {:checkbox true}}
  42. {:block/content "number property block" :properties {:number 5}}
  43. {:block/content "number-many property block" :properties {:number-many #{5 10}}}
  44. {:block/content "page property block" :properties {:page [:page "page 1"]}}
  45. {:block/content "page-many property block" :properties {:page-many #{[:page "page 1"] [:page "page 2"]}}}
  46. {:block/content "date property block" :properties {:date [:page (date-journal-title today)]}}
  47. {:block/content "date-many property block" :properties {:date-many #{[:page (date-journal-title today)]
  48. [:page (date-journal-title yesterday)]}}}]}
  49. {:page {:block/name "queries"}
  50. :blocks
  51. [{:block/content "{{query (property :default \"haha\")}}"}
  52. {:block/content "{{query (property :url \"https://logseq.com\")}}"}
  53. {:block/content "{{query (property :url-many \"https://logseq.com\")}}"}
  54. {:block/content "{{query (property :checkbox true)}}"}
  55. {:block/content "{{query (property :number 5)}}"}
  56. {:block/content "{{query (property :number-many 10)}}"}
  57. {:block/content "{{query (property :page [[Page 1]])}}"}
  58. {:block/content "{{query (property :page-many [[Page 2]])}}"}
  59. {:block/content (str "{{query (property :date [[" (string/capitalize (date-journal-title today)) "]])}}")}
  60. {:block/content (str "{{query (property :date-many [[" (string/capitalize (date-journal-title yesterday)) "]])}}")}]}
  61. {:page {:block/name "page 1"}
  62. :blocks
  63. [{:block/content "yee"}
  64. {:block/content "haw"}]}
  65. {:page {:block/name "page 2"}}]
  66. :properties
  67. (->> [:default :url :checkbox :number :page :date]
  68. (mapcat #(cond-> [[% {:block/schema {:type %}}]]
  69. (not (#{:checkbox :default} %))
  70. (conj [(keyword (str (name %) "-many")) {:block/schema {:type % :cardinality :many}}])))
  71. (into {}))}))
  72. (defn -main [args]
  73. (when (not= 1 (count args))
  74. (println "Usage: $0 GRAPH-DIR")
  75. (js/process.exit 1))
  76. (let [graph-dir (first args)
  77. [dir db-name] (if (string/includes? graph-dir "/")
  78. ((juxt node-path/dirname node-path/basename) graph-dir)
  79. [(node-path/join (os/homedir) "logseq" "graphs") graph-dir])
  80. conn (create-graph/init-conn dir db-name)
  81. blocks-tx (create-graph/create-blocks-tx (create-init-data))]
  82. (println "Generating" (count (filter :block/name blocks-tx)) "pages and"
  83. (count (filter :block/content blocks-tx)) "blocks ...")
  84. (d/transact! conn blocks-tx)
  85. (println "Created graph" (str db-name " with " (count (d/datoms @conn :eavt)) " datoms!"))))
  86. (when (= nbb/*file* (:file (meta #'-main)))
  87. (-main *command-line-args*))