Просмотр исходного кода

fix: extends `tags` query and support eid|title|db-ident

Previously `tags` doesn't return blocks that have children tag(s).

Also, `tags` support both db/ident and block/title to make it easy
to use:
(tags ?b #{144})
(tags ?b #{"Task"})
(tags ?b #{:logseq.class/Task})
Tienson Qin 14 часов назад
Родитель
Сommit
1ae9e2c496

+ 1 - 1
deps.edn

@@ -5,7 +5,7 @@
                                          :sha     "5d672bf84ed944414b9f61eeb83808ead7be9127"}
 
   datascript/datascript                 {:git/url "https://github.com/logseq/datascript" ;; fork
-                                         :sha     "36fd248dcdb2b2d427ed342c53a3ddb9cb540b33"}
+                                         :sha     "ff5a7d5326e2546f40146e4a489343f557519bc3"}
   ;; datascript/datascript                 {:local/root "../../datascript"}
 
   datascript-transit/datascript-transit {:mvn/version "0.3.0"}

+ 1 - 1
deps/cli/package.json

@@ -10,7 +10,7 @@
   },
   "license": "MIT",
   "dependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30",
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31",
     "@modelcontextprotocol/sdk": "^1.17.5",
     "better-sqlite3": "~11.10.0",
     "fastify": "5.3.2",

+ 3 - 3
deps/cli/yarn.lock

@@ -43,9 +43,9 @@
     "@fastify/forwarded" "^3.0.0"
     ipaddr.js "^2.1.0"
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/common/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30"
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31"
   },
   "scripts": {
     "test": "yarn nbb-logseq -cp test -m nextjournal.test-runner"

+ 3 - 3
deps/common/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/db/deps.edn

@@ -1,7 +1,7 @@
 {:deps
  ;; These nbb-logseq deps are kept in sync with https://github.com/logseq/nbb-logseq/blob/main/bb.edn
  {datascript/datascript {:git/url "https://github.com/logseq/datascript" ;; fork
-                         :sha     "36fd248dcdb2b2d427ed342c53a3ddb9cb540b33"}
+                         :sha     "ff5a7d5326e2546f40146e4a489343f557519bc3"}
   ;; datascript/datascript                 {:local/root "../../../../datascript"}
   datascript-transit/datascript-transit {:mvn/version "0.3.0"
                                          :exclusions [datascript/datascript]}

+ 1 - 1
deps/db/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30",
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31",
     "fs-extra": "^11.3.0"
   },
   "dependencies": {

+ 31 - 4
deps/db/src/logseq/db/frontend/rules.cljc

@@ -260,10 +260,35 @@
             [?pv :logseq.property/value ?val])))]
 
     :tags
-    '[(tags ?b ?tags)
-      [?b :block/tags ?tag]
-      [(contains? ?tags ?tag)]
-      [(missing? $ ?b :block/link)]]
+    '[;; Case 1: input is number entity id
+      [(tag-spec->tag ?tag ?spec)
+       [(number? ?spec)]
+       [(identity ?spec) ?tag]]
+
+      ;; Case 2: input is :block/title
+      [(tag-spec->tag ?tag ?spec)
+       [?tag :block/title ?spec]]
+
+      ;; Case 3: input is db/ident
+      [(tag-spec->tag ?tag ?spec)
+       [?tag :db/ident ?spec]]
+
+      ;; --- Main rule -----------------------------------------------------------
+
+      [(tags ?b ?tags)
+       ;; enumerate user input set
+       [(identity ?tags) [?spec ...]]
+       (tag-spec->tag ?tag ?spec)
+
+       ;; tag/class attached to block
+       [?b :block/tags ?tc]
+
+       ;; direct or descendant
+       (or
+        [(= ?tag ?tc)]
+        (class-extends ?tag ?tc))
+
+       [(missing? $ ?b :block/link)]]]
 
     :task
     '[(task ?b ?statuses)
@@ -285,6 +310,8 @@
    ;; simple query helpers
    :task #{:ref-property-with-default}
    :priority #{:ref-property-with-default}
+   :tags #{:class-extends}
+
    :has-property-or-object-property #{:object-has-class-property}
    :object-has-class-property #{:class-extends}
    :has-simple-query-property #{:has-property-or-object-property}

+ 36 - 0
deps/db/test/logseq/db/frontend/rules_test.cljs

@@ -137,3 +137,39 @@
                   (map (comp :block/title first))
                   set))
           "property can be used multiple times to query a property value's property"))))
+
+(deftest tags-test
+  (let [conn (db-test/create-conn-with-blocks
+              {:pages-and-blocks
+               [{:page {:block/title "Page1"
+                        :build/tags [:Person]}}
+                {:page {:block/title "Page2"
+                        :build/tags [:Person]}}
+                {:page {:block/title "Page3"
+                        :build/tags [:Employee]}}]})
+        person-eid (:db/id (d/entity @conn :user.class/Person))]
+    (d/transact! conn [{:db/ident :user.class/Employee
+                        :logseq.property.class/extends :user.class/Person}])
+    (testing "tags query with eid"
+      (is (= #{"Page1" "Page2" "Page3"}
+             (->> (d/q
+                   '[:find (pull ?b [:block/title])
+                     :in $ % ?tag-ids
+                     :where (tags ?b ?tag-ids)]
+                   @conn
+                   (rules/extract-rules rules/db-query-dsl-rules)
+                   #{person-eid})
+                  (map (comp :block/title first))
+                  set))))
+    (testing "tags query with db/ident"
+      (is (= #{"Page1" "Page2" "Page3"}
+             (->> (q-with-rules '[:find (pull ?b [:block/title]) :where (tags ?b #{:user.class/Person})]
+                                @conn)
+                  (map (comp :block/title first))
+                  set))))
+    (testing "tags query with block/title"
+      (is (= #{"Page1" "Page2" "Page3"}
+             (->> (q-with-rules '[:find (pull ?b [:block/title]) :where (tags ?b #{"Person"})]
+                                @conn)
+                  (map (comp :block/title first))
+                  set))))))

+ 3 - 3
deps/db/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/graph-parser/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30",
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31",
     "better-sqlite3": "11.10.0"
   },
   "dependencies": {

+ 3 - 3
deps/graph-parser/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/outliner/deps.edn

@@ -1,7 +1,7 @@
 {:deps
  ;; These nbb-logseq deps are kept in sync with https://github.com/logseq/nbb-logseq/blob/main/bb.edn
  {datascript/datascript {:git/url "https://github.com/logseq/datascript" ;; fork
-                         :sha     "36fd248dcdb2b2d427ed342c53a3ddb9cb540b33"}
+                         :sha     "ff5a7d5326e2546f40146e4a489343f557519bc3"}
   ;; datascript/datascript {:local/root "../../../../datascript"}
   com.cognitect/transit-cljs {:mvn/version "0.8.280"}
 

+ 1 - 1
deps/outliner/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30"
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31"
   },
   "dependencies": {
     "better-sqlite3": "11.10.0",

+ 3 - 3
deps/outliner/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
deps/publishing/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30",
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31",
     "mldoc": "^1.5.9"
   },
   "dependencies": {

+ 3 - 3
deps/publishing/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"
 

+ 1 - 1
scripts/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v30"
+    "@logseq/nbb-logseq": "github:logseq/nbb-logseq#feat-db-v31"
   },
   "dependencies": {
     "better-sqlite3": "11.10.0",

+ 3 - 3
scripts/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v30":
-  version "1.2.173-feat-db-v30"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/1ad8d923adfe1a3423337127b987d353910306ab"
+"@logseq/nbb-logseq@github:logseq/nbb-logseq#feat-db-v31":
+  version "1.2.173-feat-db-v31"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/d5b76a675f484dbfb5fbff8235aec6ff84b2f980"
   dependencies:
     import-meta-resolve "^4.1.0"