Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/query performance #9016

Merged
merged 5 commits into from
Apr 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
81 changes: 47 additions & 34 deletions src/main/frontend/components/block.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -3065,8 +3065,9 @@
(when (seq queries)
(boolean (some #(= % title) (map :title queries))))))

;; TODO: move query related fns/components to components.query
(defn- trigger-custom-query!
[state *query-error]
[state *query-error *query-triggered?]
(let [[config query _query-result] (:rum/args state)
repo (state/get-current-repo)
result-atom (or (:query-atom state) (atom nil))
Expand Down Expand Up @@ -3098,6 +3099,8 @@
(catch :default e
(reset! *query-error e)
(atom nil)))]
(when *query-triggered?
(reset! *query-triggered? true))
(if (instance? Atom query-atom)
query-atom
result-atom)))
Expand All @@ -3121,38 +3124,45 @@
{:on-mouse-down on-mouse-down}
(ui/icon "refresh" {:style {:font-size 20}})]))

(defn- get-query-result
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

[state config *query-error *query-triggered? current-block-uuid q not-grouped-by-page? query-result-atom]
(or (when-let [*result (:query-result config)] @*result)
(let [query-atom (trigger-custom-query! state *query-error *query-triggered?)
query-result (and query-atom (rum/react query-atom))
;; exclude the current one, otherwise it'll loop forever
remove-blocks (if current-block-uuid [current-block-uuid] nil)
transformed-query-result (when query-result
(db/custom-query-result-transform query-result remove-blocks q))
result (if (and (:block/uuid (first transformed-query-result)) (not not-grouped-by-page?))
(let [result (db-utils/group-by-page transformed-query-result)]
(if (map? result)
(dissoc result nil)
result))
transformed-query-result)]
(when query-result-atom
(reset! query-result-atom (util/safe-with-meta result (meta @query-atom))))
(when-let [query-result (:query-result config)]
(let [result (remove (fn [b] (some? (get-in b [:block/properties :template]))) result)]
(reset! query-result result)))
result)))

(rum/defcs custom-query-inner < rum/reactive db-mixins/query
[state config {:keys [query children? breadcrumb-show?] :as q}
{:keys [query-result-atom
query-error-atom
query-triggered-atom
current-block
current-block-uuid
table?
dsl-query?
page-list?
built-in-query?
view-f]}]
(let [*query-error query-error-atom
query-atom (if built-in-query? query-result-atom (trigger-custom-query! state *query-error))
query-result (and query-atom (rum/react query-atom))
;; exclude the current one, otherwise it'll loop forever
remove-blocks (if current-block-uuid [current-block-uuid] nil)
transformed-query-result (when query-result
(db/custom-query-result-transform query-result remove-blocks q))
*query-triggered? query-triggered-atom
not-grouped-by-page? (or table?
(boolean (:result-transform q))
(and (string? query) (string/includes? query "(by-page false)")))
result (if (and (:block/uuid (first transformed-query-result)) (not not-grouped-by-page?))
(let [result (db-utils/group-by-page transformed-query-result)]
(if (map? result)
(dissoc result nil)
result))
transformed-query-result)
_ (when (and query-result-atom (not built-in-query?))
(reset! query-result-atom (util/safe-with-meta result (meta @query-atom))))
_ (when-let [query-result (:query-result config)]
(let [result (remove (fn [b] (some? (get-in b [:block/properties :template]))) result)]
(reset! query-result result)))
result (get-query-result state config *query-error *query-triggered? current-block-uuid q not-grouped-by-page? query-result-atom)
only-blocks? (:block/uuid (first result))
blocks-grouped-by-page? (and (seq result)
(not not-grouped-by-page?)
Expand Down Expand Up @@ -3232,13 +3242,13 @@

(rum/defcs ^:large-vars/cleanup-todo custom-query* < rum/reactive
(rum/local nil ::query-result)
(rum/local false ::query-triggered?)
{:init (fn [state] (assoc state :query-error (atom nil)))}
[state config {:keys [title query view collapsed? table-view?] :as q}]
(let [*query-error (:query-error state)
*query-triggered? (::query-triggered? state)
built-in? (built-in-custom-query? title)
*query-result (if built-in?
(trigger-custom-query! state *query-error)
(::query-result state))
*query-result (::query-result state)
result (rum/react *query-result)
dsl-query? (:dsl-query? config)
current-block-uuid (or (:block/uuid (:block config))
Expand All @@ -3262,21 +3272,24 @@
(false? (:blocks? (query-dsl/parse-query query))))
full-text-search? (and dsl-query?
(util/electron?)
(symbol? (safe-read-string query false)))]
(symbol? (safe-read-string query false)))
opts {:query-result-atom *query-result
:query-error-atom *query-error
:query-triggered-atom *query-triggered?
:current-block current-block
:dsl-query? dsl-query?
:current-block-uuid current-block-uuid
:table? table?
:view-f view-f
:page-list? page-list?}]
(if (:custom-query? config)
[:code (if dsl-query?
(util/format "{{query %s}}" query)
"{{query hidden}}")]
(when-not (and built-in? (empty? result))
(let [opts {:query-result-atom *query-result
:query-error-atom *query-error
:current-block current-block
:dsl-query? dsl-query?
:current-block-uuid current-block-uuid
:table? table?
:view-f view-f
:page-list? page-list?
:built-in-query? built-in?}]
(if-not @*query-triggered?
;; trigger custom query
(custom-query-inner config q opts)
(when-not (and built-in? (empty? @*query-result))
[:div.custom-query (get config :attr {})
(when-not built-in?
[:div.th
Expand Down Expand Up @@ -3318,7 +3331,7 @@
(query-refresh-button query-time {:full-text-search? full-text-search?
:on-mouse-down (fn [e]
(util/stop e)
(trigger-custom-query! state *query-error))}))]])])
(trigger-custom-query! state *query-error *query-triggered?))}))]])])
(if (or built-in? (not dsl-query?))
[:div {:style {:margin-left 2}}
(ui/foldable
Expand Down
23 changes: 12 additions & 11 deletions src/main/frontend/components/scheduled_deadlines.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@
(let [scheduled-or-deadlines (when (scheduled-or-deadlines? page-name)
(db/get-date-scheduled-or-deadlines (string/capitalize page-name)))]
(when (seq scheduled-or-deadlines)
(ui/foldable
[:h2.font-medium "SCHEDULED AND DEADLINE"]
[:div.scheduled-deadlines.references-blocks.mb-6
(let [ref-hiccup (block/->hiccup scheduled-or-deadlines
{:id (str page-name "-agenda")
:ref? true
:group-by-page? true
:editor-box editor/box}
{})]
(content/content page-name {:hiccup ref-hiccup}))]
{:title-trigger? true}))))
[:div.scheduled-or-deadlines.mt-8
(ui/foldable
[:h2.font-medium "SCHEDULED AND DEADLINE"]
[:div.scheduled-deadlines.references-blocks.mb-6
(let [ref-hiccup (block/->hiccup scheduled-or-deadlines
{:id (str page-name "-agenda")
:ref? true
:group-by-page? true
:editor-box editor/box}
{})]
(content/content page-name {:hiccup ref-hiccup}))]
{:title-trigger? true})])))
15 changes: 11 additions & 4 deletions src/main/frontend/db/model.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
[logseq.graph-parser.text :as text]
[logseq.graph-parser.util.page-ref :as page-ref]
[logseq.graph-parser.util.db :as db-util]
[logseq.graph-parser.util :as gp-util]))
[logseq.graph-parser.util :as gp-util]
[cljs-time.core :as t]
[cljs-time.format :as tf]))

;; lazy loading

Expand Down Expand Up @@ -1268,9 +1270,14 @@ independent of format as format specific heading characters are stripped"
(defn get-date-scheduled-or-deadlines
[journal-title]
(when-let [date (date/journal-title->int journal-title)]
(let [future-days (state/get-scheduled-future-days)]
(let [future-days (state/get-scheduled-future-days)
date-format "yyyyMMdd"
current-day (tf/parse (tf/formatter date-format) (str date))
future-day (->> (t/plus current-day (t/days future-days))
(tf/unparse date-format))]
(when-let [repo (state/get-current-repo)]
(->> (react/q repo [:custom :scheduled-deadline journal-title] {}
(->> (react/q repo [:custom :scheduled-deadline journal-title]
{:use-cache? false}
'[:find [(pull ?block ?block-attrs) ...]
:in $ ?day ?future ?block-attrs
:where
Expand All @@ -1287,7 +1294,7 @@ independent of format as format specific heading characters are stripped"
[(true? ?repeated)]
[(>= ?d ?day)])]
date
(+ date future-days)
future-day
block-attrs)
react
(sort-by-left-recursive)
Expand Down
2 changes: 1 addition & 1 deletion src/main/frontend/state.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ should be done through this fn in order to get global config and config defaults
(defn get-scheduled-future-days
[]
(let [days (:scheduled/future-days (get-config))]
(or (when (int? days) days) 0)))
(or (when (int? days) days) 7)))

(defn get-start-of-week
[]
Expand Down
55 changes: 31 additions & 24 deletions src/main/frontend/ui.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -722,8 +722,33 @@
{:class (if collapsed? "rotating-arrow collapsed" "rotating-arrow not-collapsed")}
(svg/caret-right)])

(rum/defcs foldable < db-mixins/query rum/reactive
(rum/defcs foldable-title <
(rum/local false ::control?)
[state {:keys [on-mouse-down header title-trigger? collapsed?]}]
(let [control? (get state ::control?)]
[:div.content
[:div.flex-1.flex-row.foldable-title (cond->
{:on-mouse-over #(reset! control? true)
:on-mouse-out #(reset! control? false)}
title-trigger?
(assoc :on-mouse-down on-mouse-down
:class "cursor"))
[:div.flex.flex-row.items-center
(when-not (mobile-util/native-platform?)
[:a.block-control.opacity-50.hover:opacity-100.mr-2
(cond->
{:style {:width 14
:height 16
:margin-left -30}}
(not title-trigger?)
(assoc :on-mouse-down on-mouse-down))
[:span {:class (if (or @control? @collapsed?) "control-show cursor-pointer" "control-hide")}
(rotating-arrow @collapsed?)]])
(if (fn? header)
(header @collapsed?)
header)]]]))

(rum/defcs foldable < db-mixins/query rum/reactive
(rum/local false ::collapsed?)
{:will-mount (fn [state]
(let [args (:rum/args state)]
Expand All @@ -736,35 +761,17 @@
state)}
[state header content {:keys [title-trigger? on-mouse-down
_default-collapsed? _init-collapsed]}]
(let [control? (get state ::control?)
collapsed? (get state ::collapsed?)
(let [collapsed? (get state ::collapsed?)
on-mouse-down (fn [e]
(util/stop e)
(swap! collapsed? not)
(when on-mouse-down
(on-mouse-down @collapsed?)))]
[:div.flex.flex-col
[:div.content
[:div.flex-1.flex-row.foldable-title (cond->
{:on-mouse-over #(reset! control? true)
:on-mouse-out #(reset! control? false)}
title-trigger?
(assoc :on-mouse-down on-mouse-down
:class "cursor"))
[:div.flex.flex-row.items-center
(when-not (mobile-util/native-platform?)
[:a.block-control.opacity-50.hover:opacity-100.mr-2
(cond->
{:style {:width 14
:height 16
:margin-left -30}}
(not title-trigger?)
(assoc :on-mouse-down on-mouse-down))
[:span {:class (if (or @control? @collapsed?) "control-show cursor-pointer" "control-hide")}
(rotating-arrow @collapsed?)]])
(if (fn? header)
(header @collapsed?)
header)]]]
(foldable-title {:on-mouse-down on-mouse-down
:header header
:title-trigger? title-trigger?
:collapsed? collapsed?})
[:div {:class (if @collapsed? "hidden" "initial")
:on-mouse-down (fn [e] (.stopPropagation e))}
(if (fn? content)
Expand Down