view pagination

This commit is contained in:
Tienson Qin
2025-03-10 10:14:12 +08:00
parent 5abdfca0ec
commit 726de5917a
3 changed files with 48 additions and 33 deletions

View File

@@ -239,8 +239,10 @@
(keep (fn [id] (non-hidden-e id))))
nil)))
(defonce *view-cache (atom {}))
(defn get-view-data
[db view-id]
[repo db view-id {:keys [offset limit]
:or {limit 50}}]
(time
(let [view (d/entity db view-id)
feat-type (:logseq.property.view/feature-type view)
@@ -256,28 +258,35 @@
all-pages? (= feat-type :all-pages)
filters (:logseq.property.table/filters view)]
(when index-attr
(let [entities (get-entities db view feat-type index-attr)
sorting (let [sorting* (:logseq.property.table/sorting view)]
(if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
[{:id :block/updated-at, :asc? false}]
sorting*))
data (->>
;; filter
(cond->> entities
(seq filters)
(filter (fn [row] (row-matched? db row filters))))
;; sort
(sort-rows db sorting)
;; pagination
(take 100)
;; convert entity to map for serialization
(map (fn [e]
(cond->
(-> (into {} e)
(assoc
:id (:db/id e)
:db/id (:db/id e)))
all-pages?
(assoc :block.temp/refs-count (count (:block/_refs e)))))))]
{:count (count entities)
(let [data* (if-let [cache (get-in @*view-cache [repo view-id])]
cache
(let [entities (get-entities db view feat-type index-attr)
sorting (let [sorting* (:logseq.property.table/sorting view)]
(if (or (= sorting* :logseq.property/empty-placeholder) (empty? sorting*))
[{:id :block/updated-at, :asc? false}]
sorting*))
result (->>
;; filter
(cond->> entities
(seq filters)
(filter (fn [row] (row-matched? db row filters))))
;; sort
(sort-rows db sorting))]
(swap! *view-cache assoc-in [repo view-id] result)
result))
data (->> data*
;; pagination
(drop offset)
(take limit)
;; convert entity to map for serialization
(map (fn [e]
(cond->
(-> (into {} e)
(assoc
:id (:db/id e)
:db/id (:db/id e)))
all-pages?
(assoc :block.temp/refs-count (count (:block/_refs e)))))))]
{:count (count data*)
:data (vec data)})))))

View File

@@ -1688,15 +1688,16 @@
(str "view-" (:db/id view-entity')))))
(defn- <load-view-data
[view]
(p/let [data-str (.get-view-data ^js @state/*db-worker (state/get-current-repo) (:db/id view))]
[view offset]
(p/let [data-str (.get-view-data ^js @state/*db-worker (state/get-current-repo) (:db/id view)
(ldb/write-transit-str {:offset offset :limit 100}))]
(ldb/read-transit-str data-str)))
(rum/defc view < rum/static
[{:keys [view-parent view-feature-type view-entity] :as option}]
(let [[view-entity set-view-entity!] (hooks/use-state view-entity)
[views set-views!] (hooks/use-state nil)
[count set-count!] (hooks/use-state (count (:data option)))]
[items-count set-count!] (hooks/use-state (count (:data option)))]
(hooks/use-effect!
(fn []
(let [repo (state/get-current-repo)]
@@ -1714,15 +1715,19 @@
new-view)))]
(when (and current-view
(nil? (:data option)))
(p/let [{:keys [count data]} (<load-view-data current-view)
(p/let [{:keys [count data]} (<load-view-data current-view 0)
set-data! (:set-data! option)]
(set-data! data)
(set-count! count))))))
[])
(view-container view-entity (assoc option
:items-count count
:items-count items-count
:views views
:set-views! set-views!
:set-view-entity! set-view-entity!
:end-reached (fn []
(prn :debug :end-reached))))))
(when view-entity
(p/let [prev-data (:data option)
{:keys [_count data]} (<load-view-data view-entity (count prev-data))
set-data! (:set-data! option)]
(set-data! (into prev-data data)))))))))

View File

@@ -909,9 +909,10 @@
:error])))))
(get-view-data
[_this repo view-id]
[_this repo view-id opts-str]
(let [conn (worker-state/get-datascript-conn repo)
data (ldb/get-view-data @conn view-id)]
opts (ldb/read-transit-str opts-str)
data (ldb/get-view-data repo @conn view-id opts)]
(ldb/write-transit-str data)))
(dangerousRemoveAllDbs