@connecttomahdi/rxdb 17.0.0-beta.17 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +47 -4
  3. package/CLAUDE.md +2 -0
  4. package/dist/cjs/change-event-buffer.js +2 -1
  5. package/dist/cjs/change-event-buffer.js.map +1 -1
  6. package/dist/cjs/custom-index.js +85 -12
  7. package/dist/cjs/custom-index.js.map +1 -1
  8. package/dist/cjs/doc-cache.js +117 -35
  9. package/dist/cjs/doc-cache.js.map +1 -1
  10. package/dist/cjs/event-reduce.js +10 -1
  11. package/dist/cjs/event-reduce.js.map +1 -1
  12. package/dist/cjs/plugin-helpers.js +16 -0
  13. package/dist/cjs/plugin-helpers.js.map +1 -1
  14. package/dist/cjs/plugins/attachments/index.js +3 -3
  15. package/dist/cjs/plugins/attachments/index.js.map +1 -1
  16. package/dist/cjs/plugins/cleanup/cleanup.js +5 -3
  17. package/dist/cjs/plugins/cleanup/cleanup.js.map +1 -1
  18. package/dist/cjs/plugins/crdt/index.js +52 -0
  19. package/dist/cjs/plugins/crdt/index.js.map +1 -1
  20. package/dist/cjs/plugins/dev-mode/check-query.js +7 -1
  21. package/dist/cjs/plugins/dev-mode/check-query.js.map +1 -1
  22. package/dist/cjs/plugins/dev-mode/check-schema.js +2 -1
  23. package/dist/cjs/plugins/dev-mode/check-schema.js.map +1 -1
  24. package/dist/cjs/plugins/dev-mode/error-messages.js +43 -5
  25. package/dist/cjs/plugins/dev-mode/error-messages.js.map +1 -1
  26. package/dist/cjs/plugins/encryption-crypto-js/index.js +22 -6
  27. package/dist/cjs/plugins/encryption-crypto-js/index.js.map +1 -1
  28. package/dist/cjs/plugins/leader-election/index.js +5 -5
  29. package/dist/cjs/plugins/leader-election/index.js.map +1 -1
  30. package/dist/cjs/plugins/local-documents/local-documents.js +20 -13
  31. package/dist/cjs/plugins/local-documents/local-documents.js.map +1 -1
  32. package/dist/cjs/plugins/migration-schema/migration-helpers.js +3 -0
  33. package/dist/cjs/plugins/migration-schema/migration-helpers.js.map +1 -1
  34. package/dist/cjs/plugins/migration-schema/rx-migration-state.js +1 -1
  35. package/dist/cjs/plugins/migration-schema/rx-migration-state.js.map +1 -1
  36. package/dist/cjs/plugins/pipeline/rx-pipeline.js +5 -1
  37. package/dist/cjs/plugins/pipeline/rx-pipeline.js.map +1 -1
  38. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  39. package/dist/cjs/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  40. package/dist/cjs/plugins/replication/index.js +40 -2
  41. package/dist/cjs/plugins/replication/index.js.map +1 -1
  42. package/dist/cjs/plugins/replication-google-drive/document-handling.js +17 -6
  43. package/dist/cjs/plugins/replication-google-drive/document-handling.js.map +1 -1
  44. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js +1 -1
  45. package/dist/cjs/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  46. package/dist/cjs/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  47. package/dist/cjs/plugins/replication-google-drive/signaling.js +4 -1
  48. package/dist/cjs/plugins/replication-google-drive/signaling.js.map +1 -1
  49. package/dist/cjs/plugins/replication-google-drive/upstream.js +7 -4
  50. package/dist/cjs/plugins/replication-google-drive/upstream.js.map +1 -1
  51. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  52. package/dist/cjs/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  53. package/dist/cjs/plugins/state/rx-state.js +14 -3
  54. package/dist/cjs/plugins/state/rx-state.js.map +1 -1
  55. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js +10 -17
  56. package/dist/cjs/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  57. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js +112 -40
  58. package/dist/cjs/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  59. package/dist/cjs/plugins/storage-memory/memory-helper.js +127 -40
  60. package/dist/cjs/plugins/storage-memory/memory-helper.js.map +1 -1
  61. package/dist/cjs/plugins/storage-memory/memory-indexes.js +1 -0
  62. package/dist/cjs/plugins/storage-memory/memory-indexes.js.map +1 -1
  63. package/dist/cjs/plugins/storage-memory/memory-types.js.map +1 -1
  64. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js +97 -37
  65. package/dist/cjs/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  66. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js +42 -1
  67. package/dist/cjs/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  68. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js +7 -7
  69. package/dist/cjs/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  70. package/dist/cjs/plugins/test-utils/config.js +1 -1
  71. package/dist/cjs/plugins/test-utils/config.js.map +1 -1
  72. package/dist/cjs/plugins/test-utils/performance.js +122 -92
  73. package/dist/cjs/plugins/test-utils/performance.js.map +1 -1
  74. package/dist/cjs/plugins/test-utils/schema-objects.js +1 -1
  75. package/dist/cjs/plugins/test-utils/schema-objects.js.map +1 -1
  76. package/dist/cjs/plugins/test-utils/test-util.js +62 -0
  77. package/dist/cjs/plugins/test-utils/test-util.js.map +1 -1
  78. package/dist/cjs/plugins/utils/utils-map.js +2 -2
  79. package/dist/cjs/plugins/utils/utils-map.js.map +1 -1
  80. package/dist/cjs/plugins/utils/utils-object-deep-equal.js +3 -2
  81. package/dist/cjs/plugins/utils/utils-object-deep-equal.js.map +1 -1
  82. package/dist/cjs/plugins/utils/utils-object-dot-prop.js +25 -0
  83. package/dist/cjs/plugins/utils/utils-object-dot-prop.js.map +1 -1
  84. package/dist/cjs/plugins/utils/utils-object.js +102 -27
  85. package/dist/cjs/plugins/utils/utils-object.js.map +1 -1
  86. package/dist/cjs/plugins/utils/utils-other.js +9 -4
  87. package/dist/cjs/plugins/utils/utils-other.js.map +1 -1
  88. package/dist/cjs/plugins/utils/utils-premium.js +1 -19
  89. package/dist/cjs/plugins/utils/utils-premium.js.map +1 -1
  90. package/dist/cjs/plugins/utils/utils-revision.js +20 -10
  91. package/dist/cjs/plugins/utils/utils-revision.js.map +1 -1
  92. package/dist/cjs/plugins/utils/utils-rxdb-version.js +1 -1
  93. package/dist/cjs/plugins/utils/utils-rxdb-version.js.map +1 -1
  94. package/dist/cjs/plugins/utils/utils-string.js +11 -8
  95. package/dist/cjs/plugins/utils/utils-string.js.map +1 -1
  96. package/dist/cjs/plugins/utils/utils-time.js +21 -16
  97. package/dist/cjs/plugins/utils/utils-time.js.map +1 -1
  98. package/dist/cjs/query-cache.js +6 -4
  99. package/dist/cjs/query-cache.js.map +1 -1
  100. package/dist/cjs/query-planner.js +2 -2
  101. package/dist/cjs/query-planner.js.map +1 -1
  102. package/dist/cjs/replication-protocol/downstream.js +1 -1
  103. package/dist/cjs/replication-protocol/downstream.js.map +1 -1
  104. package/dist/cjs/rx-collection-helper.js +11 -6
  105. package/dist/cjs/rx-collection-helper.js.map +1 -1
  106. package/dist/cjs/rx-collection.js +34 -6
  107. package/dist/cjs/rx-collection.js.map +1 -1
  108. package/dist/cjs/rx-database.js +40 -7
  109. package/dist/cjs/rx-database.js.map +1 -1
  110. package/dist/cjs/rx-document.js +10 -3
  111. package/dist/cjs/rx-document.js.map +1 -1
  112. package/dist/cjs/rx-query-helper.js +35 -12
  113. package/dist/cjs/rx-query-helper.js.map +1 -1
  114. package/dist/cjs/rx-query-single-result.js +9 -2
  115. package/dist/cjs/rx-query-single-result.js.map +1 -1
  116. package/dist/cjs/rx-query.js +72 -29
  117. package/dist/cjs/rx-query.js.map +1 -1
  118. package/dist/cjs/rx-schema-helper.js +9 -3
  119. package/dist/cjs/rx-schema-helper.js.map +1 -1
  120. package/dist/cjs/rx-schema.js +1 -0
  121. package/dist/cjs/rx-schema.js.map +1 -1
  122. package/dist/cjs/rx-storage-helper.js +212 -129
  123. package/dist/cjs/rx-storage-helper.js.map +1 -1
  124. package/dist/cjs/types/rx-error.d.js.map +1 -1
  125. package/dist/cjs/types/rx-schema.d.js.map +1 -1
  126. package/dist/esm/change-event-buffer.js +2 -1
  127. package/dist/esm/change-event-buffer.js.map +1 -1
  128. package/dist/esm/custom-index.js +85 -12
  129. package/dist/esm/custom-index.js.map +1 -1
  130. package/dist/esm/doc-cache.js +118 -36
  131. package/dist/esm/doc-cache.js.map +1 -1
  132. package/dist/esm/event-reduce.js +10 -1
  133. package/dist/esm/event-reduce.js.map +1 -1
  134. package/dist/esm/plugin-helpers.js +16 -0
  135. package/dist/esm/plugin-helpers.js.map +1 -1
  136. package/dist/esm/plugins/attachments/index.js +3 -3
  137. package/dist/esm/plugins/attachments/index.js.map +1 -1
  138. package/dist/esm/plugins/cleanup/cleanup.js +5 -3
  139. package/dist/esm/plugins/cleanup/cleanup.js.map +1 -1
  140. package/dist/esm/plugins/crdt/index.js +52 -0
  141. package/dist/esm/plugins/crdt/index.js.map +1 -1
  142. package/dist/esm/plugins/dev-mode/check-query.js +7 -1
  143. package/dist/esm/plugins/dev-mode/check-query.js.map +1 -1
  144. package/dist/esm/plugins/dev-mode/check-schema.js +2 -1
  145. package/dist/esm/plugins/dev-mode/check-schema.js.map +1 -1
  146. package/dist/esm/plugins/dev-mode/error-messages.js +43 -5
  147. package/dist/esm/plugins/dev-mode/error-messages.js.map +1 -1
  148. package/dist/esm/plugins/encryption-crypto-js/index.js +22 -6
  149. package/dist/esm/plugins/encryption-crypto-js/index.js.map +1 -1
  150. package/dist/esm/plugins/leader-election/index.js +4 -4
  151. package/dist/esm/plugins/leader-election/index.js.map +1 -1
  152. package/dist/esm/plugins/local-documents/local-documents.js +20 -13
  153. package/dist/esm/plugins/local-documents/local-documents.js.map +1 -1
  154. package/dist/esm/plugins/migration-schema/migration-helpers.js +3 -0
  155. package/dist/esm/plugins/migration-schema/migration-helpers.js.map +1 -1
  156. package/dist/esm/plugins/migration-schema/rx-migration-state.js +1 -1
  157. package/dist/esm/plugins/migration-schema/rx-migration-state.js.map +1 -1
  158. package/dist/esm/plugins/pipeline/rx-pipeline.js +5 -1
  159. package/dist/esm/plugins/pipeline/rx-pipeline.js.map +1 -1
  160. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js +4 -2
  161. package/dist/esm/plugins/query-builder/mquery/nosql-query-builder.js.map +1 -1
  162. package/dist/esm/plugins/replication/index.js +40 -2
  163. package/dist/esm/plugins/replication/index.js.map +1 -1
  164. package/dist/esm/plugins/replication-google-drive/document-handling.js +17 -6
  165. package/dist/esm/plugins/replication-google-drive/document-handling.js.map +1 -1
  166. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js +1 -1
  167. package/dist/esm/plugins/replication-google-drive/google-drive-helper.js.map +1 -1
  168. package/dist/esm/plugins/replication-google-drive/google-drive-types.js.map +1 -1
  169. package/dist/esm/plugins/replication-google-drive/signaling.js +4 -1
  170. package/dist/esm/plugins/replication-google-drive/signaling.js.map +1 -1
  171. package/dist/esm/plugins/replication-google-drive/upstream.js +7 -4
  172. package/dist/esm/plugins/replication-google-drive/upstream.js.map +1 -1
  173. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js +4 -1
  174. package/dist/esm/plugins/replication-microsoft-onedrive/signaling.js.map +1 -1
  175. package/dist/esm/plugins/state/rx-state.js +15 -4
  176. package/dist/esm/plugins/state/rx-state.js.map +1 -1
  177. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js +11 -18
  178. package/dist/esm/plugins/storage-dexie/rx-storage-instance-dexie.js.map +1 -1
  179. package/dist/esm/plugins/storage-memory/binary-search-bounds.js +107 -40
  180. package/dist/esm/plugins/storage-memory/binary-search-bounds.js.map +1 -1
  181. package/dist/esm/plugins/storage-memory/memory-helper.js +128 -41
  182. package/dist/esm/plugins/storage-memory/memory-helper.js.map +1 -1
  183. package/dist/esm/plugins/storage-memory/memory-indexes.js +1 -0
  184. package/dist/esm/plugins/storage-memory/memory-indexes.js.map +1 -1
  185. package/dist/esm/plugins/storage-memory/memory-types.js.map +1 -1
  186. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js +90 -30
  187. package/dist/esm/plugins/storage-memory/rx-storage-instance-memory.js.map +1 -1
  188. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js +39 -0
  189. package/dist/esm/plugins/storage-mongodb/mongodb-helper.js.map +1 -1
  190. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js +8 -8
  191. package/dist/esm/plugins/storage-mongodb/rx-storage-instance-mongodb.js.map +1 -1
  192. package/dist/esm/plugins/test-utils/config.js +1 -1
  193. package/dist/esm/plugins/test-utils/config.js.map +1 -1
  194. package/dist/esm/plugins/test-utils/performance.js +122 -92
  195. package/dist/esm/plugins/test-utils/performance.js.map +1 -1
  196. package/dist/esm/plugins/test-utils/schema-objects.js +1 -1
  197. package/dist/esm/plugins/test-utils/schema-objects.js.map +1 -1
  198. package/dist/esm/plugins/test-utils/test-util.js +59 -0
  199. package/dist/esm/plugins/test-utils/test-util.js.map +1 -1
  200. package/dist/esm/plugins/utils/utils-map.js +2 -2
  201. package/dist/esm/plugins/utils/utils-map.js.map +1 -1
  202. package/dist/esm/plugins/utils/utils-object-deep-equal.js +3 -2
  203. package/dist/esm/plugins/utils/utils-object-deep-equal.js.map +1 -1
  204. package/dist/esm/plugins/utils/utils-object-dot-prop.js +25 -0
  205. package/dist/esm/plugins/utils/utils-object-dot-prop.js.map +1 -1
  206. package/dist/esm/plugins/utils/utils-object.js +102 -27
  207. package/dist/esm/plugins/utils/utils-object.js.map +1 -1
  208. package/dist/esm/plugins/utils/utils-other.js +9 -4
  209. package/dist/esm/plugins/utils/utils-other.js.map +1 -1
  210. package/dist/esm/plugins/utils/utils-premium.js +1 -19
  211. package/dist/esm/plugins/utils/utils-premium.js.map +1 -1
  212. package/dist/esm/plugins/utils/utils-revision.js +20 -10
  213. package/dist/esm/plugins/utils/utils-revision.js.map +1 -1
  214. package/dist/esm/plugins/utils/utils-rxdb-version.js +1 -1
  215. package/dist/esm/plugins/utils/utils-rxdb-version.js.map +1 -1
  216. package/dist/esm/plugins/utils/utils-string.js +11 -8
  217. package/dist/esm/plugins/utils/utils-string.js.map +1 -1
  218. package/dist/esm/plugins/utils/utils-time.js +21 -16
  219. package/dist/esm/plugins/utils/utils-time.js.map +1 -1
  220. package/dist/esm/query-cache.js +7 -5
  221. package/dist/esm/query-cache.js.map +1 -1
  222. package/dist/esm/query-planner.js +2 -2
  223. package/dist/esm/query-planner.js.map +1 -1
  224. package/dist/esm/replication-protocol/downstream.js +1 -1
  225. package/dist/esm/replication-protocol/downstream.js.map +1 -1
  226. package/dist/esm/rx-collection-helper.js +12 -7
  227. package/dist/esm/rx-collection-helper.js.map +1 -1
  228. package/dist/esm/rx-collection.js +35 -7
  229. package/dist/esm/rx-collection.js.map +1 -1
  230. package/dist/esm/rx-database.js +40 -7
  231. package/dist/esm/rx-database.js.map +1 -1
  232. package/dist/esm/rx-document.js +11 -4
  233. package/dist/esm/rx-document.js.map +1 -1
  234. package/dist/esm/rx-query-helper.js +35 -12
  235. package/dist/esm/rx-query-helper.js.map +1 -1
  236. package/dist/esm/rx-query-single-result.js +10 -3
  237. package/dist/esm/rx-query-single-result.js.map +1 -1
  238. package/dist/esm/rx-query.js +72 -29
  239. package/dist/esm/rx-query.js.map +1 -1
  240. package/dist/esm/rx-schema-helper.js +9 -3
  241. package/dist/esm/rx-schema-helper.js.map +1 -1
  242. package/dist/esm/rx-schema.js +1 -0
  243. package/dist/esm/rx-schema.js.map +1 -1
  244. package/dist/esm/rx-storage-helper.js +176 -94
  245. package/dist/esm/rx-storage-helper.js.map +1 -1
  246. package/dist/esm/types/rx-error.d.js.map +1 -1
  247. package/dist/esm/types/rx-schema.d.js.map +1 -1
  248. package/dist/types/custom-index.d.ts +5 -0
  249. package/dist/types/doc-cache.d.ts +1 -1
  250. package/dist/types/index.d.ts +25 -26
  251. package/dist/types/plugins/dev-mode/error-messages.d.ts +36 -0
  252. package/dist/types/plugins/leader-election/index.d.ts +1 -0
  253. package/dist/types/plugins/replication-google-drive/document-handling.d.ts +4 -1
  254. package/dist/types/plugins/replication-google-drive/google-drive-types.d.ts +1 -0
  255. package/dist/types/plugins/state/rx-state.d.ts +1 -1
  256. package/dist/types/plugins/storage-denokv/index.d.ts +1 -1
  257. package/dist/types/plugins/storage-dexie/rx-storage-dexie.d.ts +1 -1
  258. package/dist/types/plugins/storage-localstorage/index.d.ts +1 -1
  259. package/dist/types/plugins/storage-memory/binary-search-bounds.d.ts +21 -10
  260. package/dist/types/plugins/storage-memory/memory-helper.d.ts +7 -3
  261. package/dist/types/plugins/storage-memory/memory-types.d.ts +5 -0
  262. package/dist/types/plugins/storage-mongodb/mongodb-helper.d.ts +9 -1
  263. package/dist/types/plugins/storage-mongodb/rx-storage-instance-mongodb.d.ts +2 -2
  264. package/dist/types/plugins/storage-mongodb/rx-storage-mongodb.d.ts +1 -1
  265. package/dist/types/plugins/storage-remote/rx-storage-remote.d.ts +1 -1
  266. package/dist/types/plugins/storage-sqlite/index.d.ts +1 -1
  267. package/dist/types/plugins/test-utils/performance.d.ts +36 -0
  268. package/dist/types/plugins/test-utils/test-util.d.ts +17 -0
  269. package/dist/types/plugins/utils/utils-object.d.ts +8 -3
  270. package/dist/types/plugins/utils/utils-premium.d.ts +0 -2
  271. package/dist/types/plugins/utils/utils-rxdb-version.d.ts +1 -1
  272. package/dist/types/rx-database.d.ts +1 -1
  273. package/dist/types/rx-query-single-result.d.ts +1 -1
  274. package/dist/types/rx-query.d.ts +3 -2
  275. package/dist/types/rx-storage-helper.d.ts +15 -0
  276. package/eslint.config.mjs +2 -1
  277. package/package.json +732 -729
  278. package/scripts/check-code-block-line-length.js +91 -0
  279. package/scripts/check-em-dashes.js +53 -0
  280. package/scripts/docs-fetch-git-history.mjs +36 -0
  281. package/scripts/install-foundationdb.sh +0 -6
  282. package/scripts/notify-indexnow.mjs +171 -0
  283. package/scripts/start-foundationdb-docker.sh +73 -0
  284. package/src/change-event-buffer.ts +4 -1
  285. package/src/custom-index.ts +93 -16
  286. package/src/doc-cache.ts +117 -41
  287. package/src/event-reduce.ts +10 -1
  288. package/src/plugin-helpers.ts +10 -0
  289. package/src/plugins/attachments/index.ts +10 -12
  290. package/src/plugins/cleanup/cleanup.ts +5 -3
  291. package/src/plugins/crdt/index.ts +55 -0
  292. package/src/plugins/dev-mode/check-query.ts +7 -1
  293. package/src/plugins/dev-mode/check-schema.ts +2 -1
  294. package/src/plugins/dev-mode/error-messages.ts +45 -5
  295. package/src/plugins/encryption-crypto-js/index.ts +18 -6
  296. package/src/plugins/leader-election/index.ts +9 -8
  297. package/src/plugins/local-documents/local-documents.ts +21 -12
  298. package/src/plugins/migration-schema/migration-helpers.ts +3 -0
  299. package/src/plugins/migration-schema/rx-migration-state.ts +1 -1
  300. package/src/plugins/pipeline/rx-pipeline.ts +5 -1
  301. package/src/plugins/query-builder/mquery/nosql-query-builder.ts +8 -2
  302. package/src/plugins/replication/index.ts +41 -3
  303. package/src/plugins/replication-google-drive/document-handling.ts +17 -5
  304. package/src/plugins/replication-google-drive/google-drive-helper.ts +1 -1
  305. package/src/plugins/replication-google-drive/google-drive-types.ts +1 -0
  306. package/src/plugins/replication-google-drive/signaling.ts +4 -1
  307. package/src/plugins/replication-google-drive/upstream.ts +7 -4
  308. package/src/plugins/replication-microsoft-onedrive/signaling.ts +4 -1
  309. package/src/plugins/state/rx-state.ts +17 -5
  310. package/src/plugins/storage-dexie/rx-storage-instance-dexie.ts +0 -27
  311. package/src/plugins/storage-memory/binary-search-bounds.ts +105 -40
  312. package/src/plugins/storage-memory/memory-helper.ts +158 -67
  313. package/src/plugins/storage-memory/memory-indexes.ts +1 -0
  314. package/src/plugins/storage-memory/memory-types.ts +5 -0
  315. package/src/plugins/storage-memory/rx-storage-instance-memory.ts +104 -53
  316. package/src/plugins/storage-mongodb/mongodb-helper.ts +43 -1
  317. package/src/plugins/storage-mongodb/rx-storage-instance-mongodb.ts +11 -9
  318. package/src/plugins/test-utils/config.ts +2 -1
  319. package/src/plugins/test-utils/performance.ts +159 -85
  320. package/src/plugins/test-utils/schema-objects.ts +1 -1
  321. package/src/plugins/test-utils/test-util.ts +71 -0
  322. package/src/plugins/utils/utils-map.ts +2 -2
  323. package/src/plugins/utils/utils-object-deep-equal.ts +2 -4
  324. package/src/plugins/utils/utils-object-dot-prop.ts +25 -0
  325. package/src/plugins/utils/utils-object.ts +103 -28
  326. package/src/plugins/utils/utils-other.ts +9 -4
  327. package/src/plugins/utils/utils-premium.ts +11 -37
  328. package/src/plugins/utils/utils-revision.ts +20 -9
  329. package/src/plugins/utils/utils-rxdb-version.ts +1 -1
  330. package/src/plugins/utils/utils-string.ts +11 -9
  331. package/src/plugins/utils/utils-time.ts +21 -17
  332. package/src/query-cache.ts +6 -5
  333. package/src/query-planner.ts +2 -2
  334. package/src/replication-protocol/downstream.ts +1 -1
  335. package/src/rx-collection-helper.ts +12 -6
  336. package/src/rx-collection.ts +39 -8
  337. package/src/rx-database.ts +49 -17
  338. package/src/rx-document.ts +12 -3
  339. package/src/rx-query-helper.ts +36 -15
  340. package/src/rx-query-single-result.ts +10 -3
  341. package/src/rx-query.ts +48 -8
  342. package/src/rx-schema-helper.ts +7 -4
  343. package/src/rx-schema.ts +1 -0
  344. package/src/rx-storage-helper.ts +210 -139
  345. package/src/types/rx-error.d.ts +3 -0
  346. package/src/types/rx-schema.d.ts +5 -0
  347. package/dist/esm/package.json +0 -1
  348. package/dist/types/types/conflict-handling.d.ts +0 -48
  349. package/dist/types/types/couchdb.d.ts +0 -293
  350. package/dist/types/types/index.d.ts +0 -32
  351. package/dist/types/types/modules/index.d.ts +0 -0
  352. package/dist/types/types/modules/mocha.parallel.d.ts +0 -1
  353. package/dist/types/types/plugins/backup.d.ts +0 -35
  354. package/dist/types/types/plugins/cleanup.d.ts +0 -38
  355. package/dist/types/types/plugins/crdt.d.ts +0 -76
  356. package/dist/types/types/plugins/dexie.d.ts +0 -30
  357. package/dist/types/types/plugins/local-documents.d.ts +0 -49
  358. package/dist/types/types/plugins/migration.d.ts +0 -14
  359. package/dist/types/types/plugins/reactivity.d.ts +0 -40
  360. package/dist/types/types/plugins/replication-graphql.d.ts +0 -98
  361. package/dist/types/types/plugins/replication.d.ts +0 -175
  362. package/dist/types/types/plugins/state.d.ts +0 -4
  363. package/dist/types/types/plugins/update.d.ts +0 -23
  364. package/dist/types/types/plugins/webmcp.d.ts +0 -40
  365. package/dist/types/types/query-planner.d.ts +0 -47
  366. package/dist/types/types/replication-protocol.d.ts +0 -296
  367. package/dist/types/types/rx-attachment.d.ts +0 -46
  368. package/dist/types/types/rx-change-event.d.ts +0 -85
  369. package/dist/types/types/rx-collection.d.ts +0 -117
  370. package/dist/types/types/rx-database-internal-store.d.ts +0 -54
  371. package/dist/types/types/rx-database.d.ts +0 -124
  372. package/dist/types/types/rx-document.d.ts +0 -160
  373. package/dist/types/types/rx-error.d.ts +0 -222
  374. package/dist/types/types/rx-plugin.d.ts +0 -167
  375. package/dist/types/types/rx-query.d.ts +0 -144
  376. package/dist/types/types/rx-schema.d.ts +0 -209
  377. package/dist/types/types/rx-storage.d.ts +0 -347
  378. package/dist/types/types/rx-storage.interface.d.ts +0 -312
  379. package/dist/types/types/util.d.ts +0 -180
@@ -1 +1 @@
1
- {"version":3,"file":"rx-query-helper.js","names":["_queryPlanner","require","_rxSchemaHelper","_index","_util","_rxError","_rxQueryMingo","normalizeMangoQuery","schema","mangoQuery","skipSort","primaryKey","getPrimaryFieldOfPrimaryKey","normalizedMangoQuery","clone","skip","selector","Object","entries","forEach","field","matcher","$eq","index","indexAr","toArray","includes","push","sort","map","indexes","fieldsWithLogicalOperator","Set","hasLogical","keys","find","operator","LOGICAL_OPERATORS","has","add","currentFieldsAmount","currentBestIndexForSort","useIndex","isMaybeReadonlyArray","firstWrongIndex","findIndex","indexField","length","firstIndex","isPrimaryInSort","p","firstPropertyNameOfObject","slice","getSortComparator","query","newRxError","sortParts","sortBlock","key","direction","values","getValueFn","objectPathMonad","fun","a","b","i","sortPart","valueA","valueB","dirMultiplier","typeA","ret","mingoSortComparator","getQueryMatcher","_schema","mingoQuery","getMingoQuery","doc","test","runQueryUpdateFunction","rxQuery","fn","docs","exec","Array","isArray","Promise","all","Map","result","prepareQuery","mutateableQuery","queryPlan","getQueryPlan"],"sources":["../../src/rx-query-helper.ts"],"sourcesContent":["import { LOGICAL_OPERATORS, getQueryPlan } from './query-planner.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from './rx-schema-helper.ts';\r\nimport type {\r\n DeepReadonly,\r\n DeterministicSortComparator,\r\n FilledMangoQuery,\r\n MangoQuery,\r\n MangoQuerySortDirection,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxQuery\r\n} from './types/index.d.ts';\r\nimport {\r\n clone,\r\n firstPropertyNameOfObject,\r\n toArray,\r\n isMaybeReadonlyArray,\r\n objectPathMonad,\r\n ObjectPathMonadFunction\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n compare as mingoSortComparator\r\n} from 'mingo/util';\r\nimport { newRxError } from './rx-error.ts';\r\nimport { getMingoQuery } from './rx-query-mingo.ts';\r\n\r\n/**\r\n * Normalize the query to ensure we have all fields set\r\n * and queries that represent the same query logic are detected as equal by the caching.\r\n */\r\nexport function normalizeMangoQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mangoQuery: MangoQuery<RxDocType>,\r\n /**\r\n * @performance\r\n * Count queries do not need sort order.\r\n * Skipping the sort computation avoids iterating over schema indexes\r\n * and comparing fields, which improves count query performance.\r\n */\r\n skipSort?: boolean\r\n): FilledMangoQuery<RxDocType> {\r\n const primaryKey: string = getPrimaryFieldOfPrimaryKey(schema.primaryKey);\r\n\r\n const normalizedMangoQuery: FilledMangoQuery<RxDocType> = clone(mangoQuery) as any;\r\n if (typeof normalizedMangoQuery.skip !== 'number') {\r\n normalizedMangoQuery.skip = 0;\r\n }\r\n\r\n if (!normalizedMangoQuery.selector) {\r\n normalizedMangoQuery.selector = {};\r\n } else {\r\n normalizedMangoQuery.selector = normalizedMangoQuery.selector;\r\n /**\r\n * In mango query, it is possible to have an\r\n * equals comparison by directly assigning a value\r\n * to a property, without the '$eq' operator.\r\n * Like:\r\n * selector: {\r\n * foo: 'bar'\r\n * }\r\n * For normalization, we have to normalize this\r\n * so our checks can perform properly.\r\n *\r\n *\r\n * TODO this must work recursive with nested queries that\r\n * contain multiple selectors via $and or $or etc.\r\n */\r\n Object\r\n .entries(normalizedMangoQuery.selector)\r\n .forEach(([field, matcher]) => {\r\n if (typeof matcher !== 'object' || matcher === null) {\r\n (normalizedMangoQuery as any).selector[field] = {\r\n $eq: matcher\r\n };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Ensure that if an index is specified,\r\n * the primaryKey is inside of it.\r\n */\r\n if (normalizedMangoQuery.index) {\r\n const indexAr = toArray(normalizedMangoQuery.index);\r\n if (!indexAr.includes(primaryKey)) {\r\n indexAr.push(primaryKey);\r\n }\r\n normalizedMangoQuery.index = indexAr;\r\n }\r\n\r\n /**\r\n * To ensure a deterministic sorting,\r\n * we have to ensure the primary key is always part\r\n * of the sort query.\r\n * Primary sorting is added as last sort parameter,\r\n * similar to how we add the primary key to indexes that do not have it.\r\n *\r\n */\r\n if (skipSort && !normalizedMangoQuery.sort) {\r\n /**\r\n * @performance\r\n * Count queries do not need sorted results.\r\n * Use a simple primary key sort to avoid the expensive\r\n * index-matching sort computation.\r\n */\r\n normalizedMangoQuery.sort = [{ [primaryKey]: 'asc' }] as any;\r\n } else if (!normalizedMangoQuery.sort) {\r\n /**\r\n * If no sort is given at all,\r\n * we can assume that the user does not care about sort order at al.\r\n *\r\n * we cannot just use the primary key as sort parameter\r\n * because it would likely cause the query to run over the primary key index\r\n * which has a bad performance in most cases.\r\n */\r\n if (normalizedMangoQuery.index) {\r\n normalizedMangoQuery.sort = normalizedMangoQuery.index.map((field: string) => {\r\n return { [field as any]: 'asc' } as any;\r\n });\r\n } else {\r\n /**\r\n * Find the index that best matches the fields with the logical operators\r\n */\r\n if (schema.indexes) {\r\n const fieldsWithLogicalOperator: Set<string> = new Set();\r\n Object.entries(normalizedMangoQuery.selector).forEach(([field, matcher]) => {\r\n let hasLogical;\r\n if (typeof matcher === 'object' && matcher !== null) {\r\n hasLogical = !!Object.keys(matcher).find(operator => LOGICAL_OPERATORS.has(operator));\r\n } else {\r\n hasLogical = true;\r\n }\r\n if (hasLogical) {\r\n fieldsWithLogicalOperator.add(field);\r\n }\r\n });\r\n\r\n\r\n let currentFieldsAmount = -1;\r\n let currentBestIndexForSort: string[] | readonly string[] | undefined;\r\n schema.indexes.forEach(index => {\r\n const useIndex = isMaybeReadonlyArray(index) ? index : [index];\r\n const firstWrongIndex = useIndex.findIndex(indexField => !fieldsWithLogicalOperator.has(indexField));\r\n if (\r\n firstWrongIndex > 0 &&\r\n firstWrongIndex > currentFieldsAmount\r\n ) {\r\n currentFieldsAmount = firstWrongIndex;\r\n currentBestIndexForSort = useIndex;\r\n }\r\n });\r\n if (currentBestIndexForSort) {\r\n normalizedMangoQuery.sort = currentBestIndexForSort.map((field: string) => {\r\n return { [field as any]: 'asc' } as any;\r\n });\r\n }\r\n\r\n }\r\n\r\n /**\r\n * If no good index was found as default sort-order,\r\n * just use the first index of the schema.\r\n * If no index is in the schema, use the default-index which\r\n * is created by RxDB ONLY if there is no other index defined.\r\n */\r\n if (!normalizedMangoQuery.sort) {\r\n if (schema.indexes && schema.indexes.length > 0) {\r\n const firstIndex = schema.indexes[0];\r\n const useIndex = isMaybeReadonlyArray(firstIndex) ? firstIndex : [firstIndex];\r\n normalizedMangoQuery.sort = useIndex.map(field => ({ [field]: 'asc' })) as any;\r\n } else {\r\n normalizedMangoQuery.sort = [{ [primaryKey]: 'asc' }] as any;\r\n }\r\n }\r\n }\r\n } else {\r\n const isPrimaryInSort = normalizedMangoQuery.sort\r\n .find(p => firstPropertyNameOfObject(p) === primaryKey);\r\n if (!isPrimaryInSort) {\r\n normalizedMangoQuery.sort = normalizedMangoQuery.sort.slice(0);\r\n normalizedMangoQuery.sort.push({ [primaryKey]: 'asc' } as any);\r\n }\r\n }\r\n\r\n return normalizedMangoQuery;\r\n}\r\n\r\n/**\r\n * Returns the sort-comparator,\r\n * which is able to sort documents in the same way\r\n * a query over the db would do.\r\n */\r\nexport function getSortComparator<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): DeterministicSortComparator<RxDocType> {\r\n if (!query.sort) {\r\n throw newRxError('SNH', { query });\r\n }\r\n const sortParts: {\r\n key: string;\r\n direction: MangoQuerySortDirection;\r\n getValueFn: ObjectPathMonadFunction<RxDocType>;\r\n }[] = [];\r\n query.sort.forEach(sortBlock => {\r\n const key = Object.keys(sortBlock)[0];\r\n const direction = Object.values(sortBlock)[0];\r\n sortParts.push({\r\n key,\r\n direction,\r\n getValueFn: objectPathMonad(key)\r\n });\r\n });\r\n const fun: DeterministicSortComparator<RxDocType> = (a: RxDocType, b: RxDocType) => {\r\n for (let i = 0; i < sortParts.length; ++i) {\r\n const sortPart = sortParts[i];\r\n const valueA = sortPart.getValueFn(a);\r\n const valueB = sortPart.getValueFn(b);\r\n if (valueA !== valueB) {\r\n /**\r\n * @performance\r\n * Use a fast inline comparison for common types (string, number)\r\n * instead of the more general mingoSortComparator.\r\n * Mingo's compare does extra type checks that are unnecessary\r\n * when both values share the same primitive type.\r\n */\r\n const dirMultiplier = sortPart.direction === 'asc' ? 1 : -1;\r\n const typeA = typeof valueA;\r\n if (typeA === typeof valueB && (typeA === 'string' || typeA === 'number')) {\r\n return ((valueA < valueB ? -1 : 1) * dirMultiplier) as any;\r\n }\r\n const ret = sortPart.direction === 'asc' ? mingoSortComparator(valueA, valueB) : mingoSortComparator(valueB, valueA);\r\n return ret as any;\r\n }\r\n }\r\n };\r\n\r\n return fun;\r\n}\r\n\r\n\r\n/**\r\n * Returns a function\r\n * that can be used to check if a document\r\n * matches the query.\r\n */\r\nexport function getQueryMatcher<RxDocType>(\r\n _schema: RxJsonSchema<RxDocType> | RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): QueryMatcher<RxDocumentData<RxDocType>> {\r\n if (!query.sort) {\r\n throw newRxError('SNH', { query });\r\n }\r\n\r\n const mingoQuery = getMingoQuery(query.selector as any);\r\n const fun: QueryMatcher<RxDocumentData<RxDocType>> = (doc: RxDocumentData<RxDocType> | DeepReadonly<RxDocumentData<RxDocType>>) => {\r\n return mingoQuery.test(doc);\r\n };\r\n return fun;\r\n}\r\n\r\n\r\nexport async function runQueryUpdateFunction<RxDocType, RxQueryResult>(\r\n rxQuery: RxQuery<RxDocType, RxQueryResult>,\r\n fn: (doc: RxDocument<RxDocType>) => Promise<RxDocument<RxDocType>>\r\n): Promise<RxQueryResult> {\r\n const docs = await rxQuery.exec();\r\n if (!docs) {\r\n // only findOne() queries can return null\r\n return null as any;\r\n }\r\n if (Array.isArray(docs)) {\r\n return Promise.all(\r\n docs.map(doc => fn(doc))\r\n ) as any;\r\n } else if (docs instanceof Map) {\r\n return Promise.all(\r\n [...docs.values()].map((doc) => fn(doc))\r\n ) as any;\r\n } else {\r\n // via findOne()\r\n const result = await fn(docs as any);\r\n return result as any;\r\n }\r\n}\r\n\r\n/**\r\n * @returns a format of the query that can be used with the storage\r\n * when calling RxStorageInstance().query()\r\n */\r\nexport function prepareQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n): PreparedQuery<RxDocType> {\r\n if (!mutateableQuery.sort) {\r\n throw newRxError('SNH', {\r\n query: mutateableQuery\r\n });\r\n }\r\n\r\n /**\r\n * Store the query plan together with the\r\n * prepared query to save performance.\r\n */\r\n const queryPlan = getQueryPlan(\r\n schema,\r\n mutateableQuery\r\n );\r\n\r\n return {\r\n query: mutateableQuery,\r\n queryPlan\r\n };\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-query-helper.js","names":["_queryPlanner","require","_rxSchemaHelper","_index","_util","_rxError","_rxQueryMingo","normalizeMangoQuery","schema","mangoQuery","skipSort","primaryKey","getPrimaryFieldOfPrimaryKey","normalizedMangoQuery","clone","skip","selector","normalizeQuerySelectorShorthands","index","indexAr","toArray","includes","push","sort","map","field","indexes","fieldsWithLogicalOperator","Set","Object","entries","forEach","matcher","hasLogical","keys","find","operator","LOGICAL_OPERATORS","has","add","currentFieldsAmount","currentBestIndexForSort","useIndex","isMaybeReadonlyArray","firstWrongIndex","findIndex","indexField","matchingFieldCount","length","firstIndex","isPrimaryInSort","p","firstPropertyNameOfObject","slice","getSortComparator","query","newRxError","sortParts","sortBlock","key","direction","values","getValueFn","objectPathMonad","fun","a","b","i","sortPart","valueA","valueB","dirMultiplier","typeA","ret","mingoSortComparator","getQueryMatcher","_schema","mingoQuery","getMingoQuery","doc","test","runQueryUpdateFunction","rxQuery","fn","docs","exec","Array","isArray","Promise","all","Map","result","SELECTOR_ARRAY_OPERATORS","$eq","subSelector","startsWith","matcherObj","$elemMatch","prepareQuery","mutateableQuery","queryPlan","getQueryPlan"],"sources":["../../src/rx-query-helper.ts"],"sourcesContent":["import { LOGICAL_OPERATORS, getQueryPlan } from './query-planner.ts';\r\nimport { getPrimaryFieldOfPrimaryKey } from './rx-schema-helper.ts';\r\nimport type {\r\n DeepReadonly,\r\n DeterministicSortComparator,\r\n FilledMangoQuery,\r\n MangoQuery,\r\n MangoQuerySortDirection,\r\n PreparedQuery,\r\n QueryMatcher,\r\n RxDocument,\r\n RxDocumentData,\r\n RxJsonSchema,\r\n RxQuery\r\n} from './types/index.d.ts';\r\nimport {\r\n clone,\r\n firstPropertyNameOfObject,\r\n toArray,\r\n isMaybeReadonlyArray,\r\n objectPathMonad,\r\n ObjectPathMonadFunction\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n compare as mingoSortComparator\r\n} from 'mingo/util';\r\nimport { newRxError } from './rx-error.ts';\r\nimport { getMingoQuery } from './rx-query-mingo.ts';\r\n\r\n/**\r\n * Normalize the query to ensure we have all fields set\r\n * and queries that represent the same query logic are detected as equal by the caching.\r\n */\r\nexport function normalizeMangoQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mangoQuery: MangoQuery<RxDocType>,\r\n /**\r\n * @performance\r\n * Count queries do not need sort order.\r\n * Skipping the sort computation avoids iterating over schema indexes\r\n * and comparing fields, which improves count query performance.\r\n */\r\n skipSort?: boolean\r\n): FilledMangoQuery<RxDocType> {\r\n const primaryKey: string = getPrimaryFieldOfPrimaryKey(schema.primaryKey);\r\n\r\n const normalizedMangoQuery: FilledMangoQuery<RxDocType> = clone(mangoQuery) as any;\r\n if (typeof normalizedMangoQuery.skip !== 'number') {\r\n normalizedMangoQuery.skip = 0;\r\n }\r\n\r\n if (!normalizedMangoQuery.selector) {\r\n normalizedMangoQuery.selector = {};\r\n } else {\r\n normalizedMangoQuery.selector = normalizedMangoQuery.selector;\r\n /**\r\n * In mango query, it is possible to have an\r\n * equals comparison by directly assigning a value\r\n * to a property, without the '$eq' operator.\r\n * Like:\r\n * selector: {\r\n * foo: 'bar'\r\n * }\r\n * For normalization, we have to normalize this\r\n * so our checks can perform properly.\r\n *\r\n * This works recursively for nested queries that\r\n * contain multiple selectors via $and, $or, $nor or $not.\r\n */\r\n normalizeQuerySelectorShorthands(normalizedMangoQuery.selector);\r\n }\r\n\r\n /**\r\n * Ensure that if an index is specified,\r\n * the primaryKey is inside of it.\r\n */\r\n if (normalizedMangoQuery.index) {\r\n const indexAr = toArray(normalizedMangoQuery.index);\r\n if (!indexAr.includes(primaryKey)) {\r\n indexAr.push(primaryKey);\r\n }\r\n normalizedMangoQuery.index = indexAr;\r\n }\r\n\r\n /**\r\n * To ensure a deterministic sorting,\r\n * we have to ensure the primary key is always part\r\n * of the sort query.\r\n * Primary sorting is added as last sort parameter,\r\n * similar to how we add the primary key to indexes that do not have it.\r\n *\r\n */\r\n if (skipSort && !normalizedMangoQuery.sort) {\r\n /**\r\n * @performance\r\n * Count queries do not need sorted results.\r\n * Use a simple primary key sort to avoid the expensive\r\n * index-matching sort computation.\r\n */\r\n normalizedMangoQuery.sort = [{ [primaryKey]: 'asc' }] as any;\r\n } else if (!normalizedMangoQuery.sort) {\r\n /**\r\n * If no sort is given at all,\r\n * we can assume that the user does not care about sort order at al.\r\n *\r\n * we cannot just use the primary key as sort parameter\r\n * because it would likely cause the query to run over the primary key index\r\n * which has a bad performance in most cases.\r\n */\r\n if (normalizedMangoQuery.index) {\r\n normalizedMangoQuery.sort = normalizedMangoQuery.index.map((field: string) => {\r\n return { [field as any]: 'asc' } as any;\r\n });\r\n } else {\r\n /**\r\n * Find the index that best matches the fields with the logical operators\r\n */\r\n if (schema.indexes) {\r\n const fieldsWithLogicalOperator: Set<string> = new Set();\r\n Object.entries(normalizedMangoQuery.selector).forEach(([field, matcher]) => {\r\n let hasLogical;\r\n if (typeof matcher === 'object' && matcher !== null) {\r\n hasLogical = !!Object.keys(matcher).find(operator => LOGICAL_OPERATORS.has(operator));\r\n } else {\r\n hasLogical = true;\r\n }\r\n if (hasLogical) {\r\n fieldsWithLogicalOperator.add(field);\r\n }\r\n });\r\n\r\n\r\n let currentFieldsAmount = -1;\r\n let currentBestIndexForSort: string[] | readonly string[] | undefined;\r\n schema.indexes.forEach(index => {\r\n const useIndex = isMaybeReadonlyArray(index) ? index : [index];\r\n const firstWrongIndex = useIndex.findIndex(indexField => !fieldsWithLogicalOperator.has(indexField));\r\n const matchingFieldCount = firstWrongIndex === -1 ? useIndex.length : firstWrongIndex;\r\n if (\r\n matchingFieldCount > 0 &&\r\n matchingFieldCount > currentFieldsAmount\r\n ) {\r\n currentFieldsAmount = matchingFieldCount;\r\n currentBestIndexForSort = useIndex;\r\n }\r\n });\r\n if (currentBestIndexForSort) {\r\n normalizedMangoQuery.sort = currentBestIndexForSort.map((field: string) => {\r\n return { [field as any]: 'asc' } as any;\r\n });\r\n }\r\n\r\n }\r\n\r\n /**\r\n * If no good index was found as default sort-order,\r\n * just use the first index of the schema.\r\n * If no index is in the schema, use the default-index which\r\n * is created by RxDB ONLY if there is no other index defined.\r\n */\r\n if (!normalizedMangoQuery.sort) {\r\n if (schema.indexes && schema.indexes.length > 0) {\r\n const firstIndex = schema.indexes[0];\r\n const useIndex = isMaybeReadonlyArray(firstIndex) ? firstIndex : [firstIndex];\r\n normalizedMangoQuery.sort = useIndex.map(field => ({ [field]: 'asc' })) as any;\r\n } else {\r\n normalizedMangoQuery.sort = [{ [primaryKey]: 'asc' }] as any;\r\n }\r\n }\r\n }\r\n } else {\r\n const isPrimaryInSort = normalizedMangoQuery.sort\r\n .find(p => firstPropertyNameOfObject(p) === primaryKey);\r\n if (!isPrimaryInSort) {\r\n normalizedMangoQuery.sort = normalizedMangoQuery.sort.slice(0);\r\n normalizedMangoQuery.sort.push({ [primaryKey]: 'asc' } as any);\r\n }\r\n }\r\n\r\n return normalizedMangoQuery;\r\n}\r\n\r\n/**\r\n * Returns the sort-comparator,\r\n * which is able to sort documents in the same way\r\n * a query over the db would do.\r\n */\r\nexport function getSortComparator<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): DeterministicSortComparator<RxDocType> {\r\n if (!query.sort) {\r\n throw newRxError('SNH', { query });\r\n }\r\n const sortParts: {\r\n key: string;\r\n direction: MangoQuerySortDirection;\r\n getValueFn: ObjectPathMonadFunction<RxDocType>;\r\n }[] = [];\r\n query.sort.forEach(sortBlock => {\r\n const key = Object.keys(sortBlock)[0];\r\n const direction = Object.values(sortBlock)[0];\r\n sortParts.push({\r\n key,\r\n direction,\r\n getValueFn: objectPathMonad(key)\r\n });\r\n });\r\n const fun: DeterministicSortComparator<RxDocType> = (a: RxDocType, b: RxDocType) => {\r\n for (let i = 0; i < sortParts.length; ++i) {\r\n const sortPart = sortParts[i];\r\n const valueA = sortPart.getValueFn(a);\r\n const valueB = sortPart.getValueFn(b);\r\n if (valueA !== valueB) {\r\n /**\r\n * @performance\r\n * Use a fast inline comparison for common types (string, number)\r\n * instead of the more general mingoSortComparator.\r\n * Mingo's compare does extra type checks that are unnecessary\r\n * when both values share the same primitive type.\r\n */\r\n const dirMultiplier = sortPart.direction === 'asc' ? 1 : -1;\r\n const typeA = typeof valueA;\r\n if (typeA === typeof valueB && (typeA === 'string' || typeA === 'number')) {\r\n return ((valueA < valueB ? -1 : 1) * dirMultiplier) as any;\r\n }\r\n const ret = sortPart.direction === 'asc' ? mingoSortComparator(valueA, valueB) : mingoSortComparator(valueB, valueA);\r\n return ret as any;\r\n }\r\n }\r\n };\r\n\r\n return fun;\r\n}\r\n\r\n\r\n/**\r\n * Returns a function\r\n * that can be used to check if a document\r\n * matches the query.\r\n */\r\nexport function getQueryMatcher<RxDocType>(\r\n _schema: RxJsonSchema<RxDocType> | RxJsonSchema<RxDocumentData<RxDocType>>,\r\n query: FilledMangoQuery<RxDocType>\r\n): QueryMatcher<RxDocumentData<RxDocType>> {\r\n if (!query.sort) {\r\n throw newRxError('SNH', { query });\r\n }\r\n\r\n const mingoQuery = getMingoQuery(query.selector as any);\r\n const fun: QueryMatcher<RxDocumentData<RxDocType>> = (doc: RxDocumentData<RxDocType> | DeepReadonly<RxDocumentData<RxDocType>>) => {\r\n return mingoQuery.test(doc);\r\n };\r\n return fun;\r\n}\r\n\r\n\r\nexport async function runQueryUpdateFunction<RxDocType, RxQueryResult>(\r\n rxQuery: RxQuery<RxDocType, RxQueryResult>,\r\n fn: (doc: RxDocument<RxDocType>) => Promise<RxDocument<RxDocType>>\r\n): Promise<RxQueryResult> {\r\n const docs = await rxQuery.exec();\r\n if (!docs) {\r\n // only findOne() queries can return null\r\n return null as any;\r\n }\r\n if (Array.isArray(docs)) {\r\n return Promise.all(\r\n docs.map(doc => fn(doc))\r\n ) as any;\r\n } else if (docs instanceof Map) {\r\n return Promise.all(\r\n [...docs.values()].map((doc) => fn(doc))\r\n ) as any;\r\n } else {\r\n // via findOne()\r\n const result = await fn(docs as any);\r\n return result as any;\r\n }\r\n}\r\n\r\n/**\r\n * Normalizes selector shorthand values recursively.\r\n * Converts `{field: value}` to `{field: {$eq: value}}`\r\n * and recurses into $and, $or, $nor arrays and $not objects.\r\n */\r\nconst SELECTOR_ARRAY_OPERATORS = new Set(['$and', '$or', '$nor']);\r\nfunction normalizeQuerySelectorShorthands(selector: any): void {\r\n Object\r\n .entries(selector)\r\n .forEach(([field, matcher]) => {\r\n if (typeof matcher !== 'object' || matcher === null) {\r\n selector[field] = { $eq: matcher };\r\n } else if (SELECTOR_ARRAY_OPERATORS.has(field) && Array.isArray(matcher)) {\r\n (matcher as any[]).forEach(subSelector => normalizeQuerySelectorShorthands(subSelector));\r\n } else if (field === '$not' && typeof matcher === 'object') {\r\n normalizeQuerySelectorShorthands(matcher);\r\n } else if (!field.startsWith('$') && typeof matcher === 'object') {\r\n /**\r\n * Recurse into field-level operator objects to normalize\r\n * sub-selectors like $elemMatch which contain nested selectors.\r\n */\r\n const matcherObj = matcher as any;\r\n if (matcherObj.$elemMatch && typeof matcherObj.$elemMatch === 'object') {\r\n normalizeQuerySelectorShorthands(matcherObj.$elemMatch);\r\n }\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @returns a format of the query that can be used with the storage\r\n * when calling RxStorageInstance().query()\r\n */\r\nexport function prepareQuery<RxDocType>(\r\n schema: RxJsonSchema<RxDocumentData<RxDocType>>,\r\n mutateableQuery: FilledMangoQuery<RxDocType>\r\n): PreparedQuery<RxDocType> {\r\n if (!mutateableQuery.sort) {\r\n throw newRxError('SNH', {\r\n query: mutateableQuery\r\n });\r\n }\r\n\r\n /**\r\n * Store the query plan together with the\r\n * prepared query to save performance.\r\n */\r\n const queryPlan = getQueryPlan(\r\n schema,\r\n mutateableQuery\r\n );\r\n\r\n return {\r\n query: mutateableQuery,\r\n queryPlan\r\n };\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -9,6 +9,13 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/creat
9
9
  var _docCache = require("./doc-cache.js");
10
10
  var _index = require("./plugins/utils/index.js");
11
11
  var _rxError = require("./rx-error.js");
12
+ /**
13
+ * Counter to create unique result IDs cheaply.
14
+ * Used instead of now() to avoid expensive timestamp computation
15
+ * when we only need uniqueness for change detection.
16
+ */
17
+ var _resultIdCounter = 0;
18
+
12
19
  /**
13
20
  * RxDB needs the query results in multiple formats.
14
21
  * Sometimes as a Map or an array with only the documentData.
@@ -18,7 +25,7 @@ var _rxError = require("./rx-error.js");
18
25
  */
19
26
  var RxQuerySingleResult = exports.RxQuerySingleResult = /*#__PURE__*/function () {
20
27
  /**
21
- * Time at which the current _result state was created.
28
+ * Unique identifier for this result state.
22
29
  * Used to determine if the result set has changed since X
23
30
  * so that we do not emit the same result multiple times on subscription.
24
31
  */
@@ -28,7 +35,7 @@ var RxQuerySingleResult = exports.RxQuerySingleResult = /*#__PURE__*/function ()
28
35
  docsDataFromStorageInstance,
29
36
  // can be overwritten for count-queries
30
37
  count) {
31
- this.time = (0, _index.now)();
38
+ this.time = ++_resultIdCounter;
32
39
  this.query = query;
33
40
  this.count = count;
34
41
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"rx-query-single-result.js","names":["_docCache","require","_index","_rxError","RxQuerySingleResult","exports","query","docsDataFromStorageInstance","count","time","now","op","documents","mapDocumentsDataToCacheDocs","collection","_proto","prototype","getValue","throwIfMissing","doc","length","newRxError","name","mangoQuery","docsMap","slice","_createClass2","default","key","get","overwriteGetterForCaching","map","d","_data","Map","forEach","set","primary","i"],"sources":["../../src/rx-query-single-result.ts"],"sourcesContent":["import { mapDocumentsDataToCacheDocs } from './doc-cache.ts';\r\nimport { now, overwriteGetterForCaching } from './plugins/utils/index.ts';\r\nimport { newRxError } from './rx-error.ts';\r\nimport { RxQueryBase } from './rx-query.ts';\r\nimport type {\r\n RxDocument,\r\n RxDocumentData\r\n} from './types';\r\n\r\n/**\r\n * RxDB needs the query results in multiple formats.\r\n * Sometimes as a Map or an array with only the documentData.\r\n * For better performance we work with this class\r\n * that initializes stuff lazily so that\r\n * we can directly work with the query results after RxQuery.exec()\r\n */\r\nexport class RxQuerySingleResult<RxDocType> {\r\n /**\r\n * Time at which the current _result state was created.\r\n * Used to determine if the result set has changed since X\r\n * so that we do not emit the same result multiple times on subscription.\r\n */\r\n public readonly time = now();\r\n public readonly documents: RxDocument<RxDocType>[];\r\n constructor(\r\n public readonly query: RxQueryBase<RxDocType, unknown>,\r\n // only used internally, do not use outside, use this.docsData instead\r\n docsDataFromStorageInstance: RxDocumentData<RxDocType>[],\r\n // can be overwritten for count-queries\r\n public readonly count: number,\r\n ) {\r\n /**\r\n * @performance Skip document mapping for count queries\r\n * since they only need the count number and pass an empty array.\r\n */\r\n if (query.op === 'count') {\r\n this.documents = [];\r\n } else {\r\n this.documents = mapDocumentsDataToCacheDocs<RxDocType, any>(this.query.collection._docCache, docsDataFromStorageInstance);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Instead of using the newResultData in the result cache,\r\n * we directly use the objects that are stored in the RxDocument\r\n * to ensure we do not store the same data twice and fill up the memory.\r\n * @overwrites itself with the actual value\r\n */\r\n get docsData(): RxDocumentData<RxDocType>[] {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsData',\r\n this.documents.map(d => d._data)\r\n );\r\n }\r\n\r\n\r\n // A key->document map, used in the event reduce optimization.\r\n get docsDataMap(): Map<string, RxDocumentData<RxDocType>> {\r\n const map = new Map<string, RxDocumentData<RxDocType>>();\r\n this.documents.forEach(d => {\r\n map.set(d.primary, d._data);\r\n });\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsDataMap',\r\n map\r\n );\r\n }\r\n\r\n get docsMap(): Map<string, RxDocument<RxDocType>> {\r\n const map = new Map<string, RxDocument<RxDocType>>();\r\n const documents = this.documents;\r\n for (let i = 0; i < documents.length; i++) {\r\n const doc = documents[i];\r\n map.set(doc.primary, doc);\r\n }\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsMap',\r\n map\r\n );\r\n }\r\n\r\n getValue(throwIfMissing?: boolean) {\r\n const op = this.query.op;\r\n if (op === 'count') {\r\n return this.count;\r\n } else if (op === 'findOne') {\r\n // findOne()-queries emit RxDocument or null\r\n const doc = this.documents.length === 0 ? null : this.documents[0];\r\n if (!doc && throwIfMissing) {\r\n throw newRxError('QU10', {\r\n collection: this.query.collection.name,\r\n query: this.query.mangoQuery,\r\n op\r\n });\r\n } else {\r\n return doc;\r\n }\r\n } else if (op === 'findByIds') {\r\n return this.docsMap;\r\n } else {\r\n // find()-queries emit RxDocument[]\r\n // Flat copy the array so it won't matter if the user modifies it.\r\n return this.documents.slice(0);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"rx-query-single-result.js","names":["_docCache","require","_index","_rxError","_resultIdCounter","RxQuerySingleResult","exports","query","docsDataFromStorageInstance","count","time","op","documents","mapDocumentsDataToCacheDocs","collection","_proto","prototype","getValue","throwIfMissing","doc","length","newRxError","name","mangoQuery","docsMap","slice","_createClass2","default","key","get","overwriteGetterForCaching","map","d","_data","Map","forEach","set","primary","i"],"sources":["../../src/rx-query-single-result.ts"],"sourcesContent":["import { mapDocumentsDataToCacheDocs } from './doc-cache.ts';\r\nimport { overwriteGetterForCaching } from './plugins/utils/index.ts';\r\nimport { newRxError } from './rx-error.ts';\r\nimport { RxQueryBase } from './rx-query.ts';\r\nimport type {\r\n RxDocument,\r\n RxDocumentData\r\n} from './types';\r\n\r\n/**\r\n * Counter to create unique result IDs cheaply.\r\n * Used instead of now() to avoid expensive timestamp computation\r\n * when we only need uniqueness for change detection.\r\n */\r\nlet _resultIdCounter = 0;\r\n\r\n/**\r\n * RxDB needs the query results in multiple formats.\r\n * Sometimes as a Map or an array with only the documentData.\r\n * For better performance we work with this class\r\n * that initializes stuff lazily so that\r\n * we can directly work with the query results after RxQuery.exec()\r\n */\r\nexport class RxQuerySingleResult<RxDocType> {\r\n /**\r\n * Unique identifier for this result state.\r\n * Used to determine if the result set has changed since X\r\n * so that we do not emit the same result multiple times on subscription.\r\n */\r\n public readonly time = ++_resultIdCounter;\r\n public readonly documents: RxDocument<RxDocType>[];\r\n constructor(\r\n public readonly query: RxQueryBase<RxDocType, unknown>,\r\n // only used internally, do not use outside, use this.docsData instead\r\n docsDataFromStorageInstance: RxDocumentData<RxDocType>[],\r\n // can be overwritten for count-queries\r\n public readonly count: number,\r\n ) {\r\n /**\r\n * @performance Skip document mapping for count queries\r\n * since they only need the count number and pass an empty array.\r\n */\r\n if (query.op === 'count') {\r\n this.documents = [];\r\n } else {\r\n this.documents = mapDocumentsDataToCacheDocs<RxDocType, any>(this.query.collection._docCache, docsDataFromStorageInstance);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Instead of using the newResultData in the result cache,\r\n * we directly use the objects that are stored in the RxDocument\r\n * to ensure we do not store the same data twice and fill up the memory.\r\n * @overwrites itself with the actual value\r\n */\r\n get docsData(): RxDocumentData<RxDocType>[] {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsData',\r\n this.documents.map(d => d._data)\r\n );\r\n }\r\n\r\n\r\n // A key->document map, used in the event reduce optimization.\r\n get docsDataMap(): Map<string, RxDocumentData<RxDocType>> {\r\n const map = new Map<string, RxDocumentData<RxDocType>>();\r\n this.documents.forEach(d => {\r\n map.set(d.primary, d._data);\r\n });\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsDataMap',\r\n map\r\n );\r\n }\r\n\r\n get docsMap(): Map<string, RxDocument<RxDocType>> {\r\n const map = new Map<string, RxDocument<RxDocType>>();\r\n const documents = this.documents;\r\n for (let i = 0; i < documents.length; i++) {\r\n const doc = documents[i];\r\n map.set(doc.primary, doc);\r\n }\r\n return overwriteGetterForCaching(\r\n this,\r\n 'docsMap',\r\n map\r\n );\r\n }\r\n\r\n getValue(throwIfMissing?: boolean) {\r\n const op = this.query.op;\r\n if (op === 'count') {\r\n return this.count;\r\n } else if (op === 'findOne') {\r\n // findOne()-queries emit RxDocument or null\r\n const doc = this.documents.length === 0 ? null : this.documents[0];\r\n if (!doc && throwIfMissing) {\r\n throw newRxError('QU10', {\r\n collection: this.query.collection.name,\r\n query: this.query.mangoQuery,\r\n op\r\n });\r\n } else {\r\n return doc;\r\n }\r\n } else if (op === 'findByIds') {\r\n return this.docsMap;\r\n } else {\r\n // find()-queries emit RxDocument[]\r\n // Flat copy the array so it won't matter if the user modifies it.\r\n return this.documents.slice(0);\r\n }\r\n }\r\n}\r\n"],"mappings":";;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AAOA;AACA;AACA;AACA;AACA;AACA,IAAIG,gBAAgB,GAAG,CAAC;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;AANA,IAOaC,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA;EAC5B;AACJ;AACA;AACA;AACA;;EAGI,SAAAA,oBACoBE,KAAsC;EACtD;EACAC,2BAAwD;EACxD;EACgBC,KAAa,EAC/B;IAAA,KARcC,IAAI,GAAG,EAAEN,gBAAgB;IAAA,KAGrBG,KAAsC,GAAtCA,KAAsC;IAAA,KAItCE,KAAa,GAAbA,KAAa;IAE7B;AACR;AACA;AACA;IACQ,IAAIF,KAAK,CAACI,EAAE,KAAK,OAAO,EAAE;MACtB,IAAI,CAACC,SAAS,GAAG,EAAE;IACvB,CAAC,MAAM;MACH,IAAI,CAACA,SAAS,GAAG,IAAAC,qCAA2B,EAAiB,IAAI,CAACN,KAAK,CAACO,UAAU,CAACd,SAAS,EAAEQ,2BAA2B,CAAC;IAC9H;EACJ;;EAGA;AACJ;AACA;AACA;AACA;AACA;EALI,IAAAO,MAAA,GAAAV,mBAAA,CAAAW,SAAA;EAAAD,MAAA,CA0CAE,QAAQ,GAAR,SAAAA,QAAQA,CAACC,cAAwB,EAAE;IAC/B,IAAMP,EAAE,GAAG,IAAI,CAACJ,KAAK,CAACI,EAAE;IACxB,IAAIA,EAAE,KAAK,OAAO,EAAE;MAChB,OAAO,IAAI,CAACF,KAAK;IACrB,CAAC,MAAM,IAAIE,EAAE,KAAK,SAAS,EAAE;MACzB;MACA,IAAMQ,GAAG,GAAG,IAAI,CAACP,SAAS,CAACQ,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAACR,SAAS,CAAC,CAAC,CAAC;MAClE,IAAI,CAACO,GAAG,IAAID,cAAc,EAAE;QACxB,MAAM,IAAAG,mBAAU,EAAC,MAAM,EAAE;UACrBP,UAAU,EAAE,IAAI,CAACP,KAAK,CAACO,UAAU,CAACQ,IAAI;UACtCf,KAAK,EAAE,IAAI,CAACA,KAAK,CAACgB,UAAU;UAC5BZ;QACJ,CAAC,CAAC;MACN,CAAC,MAAM;QACH,OAAOQ,GAAG;MACd;IACJ,CAAC,MAAM,IAAIR,EAAE,KAAK,WAAW,EAAE;MAC3B,OAAO,IAAI,CAACa,OAAO;IACvB,CAAC,MAAM;MACH;MACA;MACA,OAAO,IAAI,CAACZ,SAAS,CAACa,KAAK,CAAC,CAAC,CAAC;IAClC;EACJ,CAAC;EAAA,WAAAC,aAAA,CAAAC,OAAA,EAAAtB,mBAAA;IAAAuB,GAAA;IAAAC,GAAA,EA3DD,SAAAA,CAAA,EAA4C;MACxC,OAAO,IAAAC,gCAAyB,EAC5B,IAAI,EACJ,UAAU,EACV,IAAI,CAAClB,SAAS,CAACmB,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,CACnC,CAAC;IACL;;IAGA;EAAA;IAAAL,GAAA;IAAAC,GAAA,EACA,SAAAA,CAAA,EAA0D;MACtD,IAAME,GAAG,GAAG,IAAIG,GAAG,CAAoC,CAAC;MACxD,IAAI,CAACtB,SAAS,CAACuB,OAAO,CAACH,CAAC,IAAI;QACxBD,GAAG,CAACK,GAAG,CAACJ,CAAC,CAACK,OAAO,EAAEL,CAAC,CAACC,KAAK,CAAC;MAC/B,CAAC,CAAC;MACF,OAAO,IAAAH,gCAAyB,EAC5B,IAAI,EACJ,aAAa,EACbC,GACJ,CAAC;IACL;EAAC;IAAAH,GAAA;IAAAC,GAAA,EAED,SAAAA,CAAA,EAAkD;MAC9C,IAAME,GAAG,GAAG,IAAIG,GAAG,CAAgC,CAAC;MACpD,IAAMtB,SAAS,GAAG,IAAI,CAACA,SAAS;MAChC,KAAK,IAAI0B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG1B,SAAS,CAACQ,MAAM,EAAEkB,CAAC,EAAE,EAAE;QACvC,IAAMnB,GAAG,GAAGP,SAAS,CAAC0B,CAAC,CAAC;QACxBP,GAAG,CAACK,GAAG,CAACjB,GAAG,CAACkB,OAAO,EAAElB,GAAG,CAAC;MAC7B;MACA,OAAO,IAAAW,gCAAyB,EAC5B,IAAI,EACJ,SAAS,EACTC,GACJ,CAAC;IACL;EAAC;AAAA","ignoreList":[]}
@@ -33,27 +33,6 @@ var newQueryID = function () {
33
33
  */
34
34
  var _ensureEqualCount = 0;
35
35
  var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
36
- /**
37
- * Some stats then are used for debugging and cache replacement policies
38
- */
39
-
40
- /**
41
- * @performance
42
- * Use Date.now() instead of now() for creation time.
43
- * The monotonic uniqueness guarantee of now() is not needed here
44
- * since _creationTime is only used by the cache replacement policy
45
- * for rough lifetime comparisons.
46
- */
47
-
48
- // used in the query-cache to determine if the RxQuery can be cleaned up.
49
-
50
- // used to count the subscribers to the query
51
-
52
- /**
53
- * Contains the current result state
54
- * or null if query has not run yet.
55
- */
56
-
57
36
  function RxQueryBase(op, mangoQuery, collection,
58
37
  // used by some plugins
59
38
  other = {}) {
@@ -62,7 +41,7 @@ var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
62
41
  this._creationTime = Date.now();
63
42
  this._lastEnsureEqual = 0;
64
43
  this.uncached = false;
65
- this.refCount$ = new _rxjs.BehaviorSubject(null);
44
+ this._refCount$ = null;
66
45
  this._result = null;
67
46
  this._latestChangeEvent = -1;
68
47
  this._ensureEqualQueue = _index.PROMISE_RESOLVE_FALSE;
@@ -225,12 +204,26 @@ var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
225
204
  * @overwrites itself with the actual value
226
205
  */
227
206
  _proto.toString = function toString() {
228
- var stringObj = (0, _index.sortObject)({
229
- op: this.op,
230
- query: this.normalizedQuery,
231
- other: this.other
232
- }, true);
233
- var value = JSON.stringify(stringObj);
207
+ /**
208
+ * For findByIds queries, build the cache key directly from the IDs
209
+ * to avoid the expensive normalizeMangoQuery + sortObject + JSON.stringify.
210
+ * The selector structure is guaranteed by findByIds() which always creates
211
+ * { [primaryPath]: { $in: ids } }
212
+ */
213
+ var value;
214
+ if (this.op === 'findByIds') {
215
+ var ids = this.mangoQuery.selector[this.collection.schema.primaryPath].$in;
216
+ // slice() is needed because sort() mutates the array in-place
217
+ var sortedIds = ids.slice().sort();
218
+ value = '|findByIds|' + JSON.stringify(sortedIds);
219
+ } else {
220
+ var stringObj = (0, _index.sortObject)({
221
+ op: this.op,
222
+ query: this.normalizedQuery,
223
+ other: this.other
224
+ }, true);
225
+ value = JSON.stringify(stringObj);
226
+ }
234
227
  this.toString = () => value;
235
228
  return value;
236
229
  }
@@ -274,7 +267,14 @@ var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
274
267
  * deletes all found documents
275
268
  * @return promise with deleted documents
276
269
  */;
277
- _proto.remove = async function remove() {
270
+ _proto.remove = async function remove(throwIfMissing) {
271
+ if (throwIfMissing && this.op !== 'findOne') {
272
+ throw (0, _rxError.newRxError)('QU9', {
273
+ collection: this.collection.name,
274
+ query: this.mangoQuery,
275
+ op: this.op
276
+ });
277
+ }
278
278
  var docs = await this.exec();
279
279
  if (Array.isArray(docs)) {
280
280
  var result = await this.collection.bulkRemove(docs);
@@ -284,6 +284,17 @@ var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
284
284
  return result.success;
285
285
  }
286
286
  } else {
287
+ // findOne() can return null when no document matches
288
+ if (!docs) {
289
+ if (throwIfMissing) {
290
+ throw (0, _rxError.newRxError)('QU10', {
291
+ collection: this.collection.name,
292
+ query: this.mangoQuery,
293
+ op: this.op
294
+ });
295
+ }
296
+ return null;
297
+ }
287
298
  return docs.remove();
288
299
  }
289
300
  };
@@ -330,6 +341,38 @@ var RxQueryBase = exports.RxQueryBase = /*#__PURE__*/function () {
330
341
  throw (0, _index.pluginMissing)('query-builder');
331
342
  };
332
343
  return (0, _createClass2.default)(RxQueryBase, [{
344
+ key: "refCount$",
345
+ get:
346
+ /**
347
+ * Some stats then are used for debugging and cache replacement policies
348
+ */
349
+
350
+ /**
351
+ * @performance
352
+ * Use Date.now() instead of now() for creation time.
353
+ * The monotonic uniqueness guarantee of now() is not needed here
354
+ * since _creationTime is only used by the cache replacement policy
355
+ * for rough lifetime comparisons.
356
+ */
357
+
358
+ // used in the query-cache to determine if the RxQuery can be cleaned up.
359
+ // 0 means never executed. Updated to an incrementing counter on each _ensureEqual call.
360
+
361
+ // used to count the subscribers to the query
362
+ // Lazy-initialized to avoid BehaviorSubject overhead for .exec()-only queries
363
+
364
+ function () {
365
+ if (!this._refCount$) {
366
+ this._refCount$ = new _rxjs.BehaviorSubject(null);
367
+ }
368
+ return this._refCount$;
369
+ }
370
+
371
+ /**
372
+ * Contains the current result state
373
+ * or null if query has not run yet.
374
+ */
375
+ }, {
333
376
  key: "$",
334
377
  get: function () {
335
378
  if (!this._$) {
@@ -1 +1 @@
1
- {"version":3,"file":"rx-query.js","names":["_rxjs","require","_operators","_index","_rxError","_hooks","_eventReduce","_queryCache","_rxQueryHelper","_rxQuerySingleResult","_queryCount","newQueryID","_ensureEqualCount","RxQueryBase","exports","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","Date","now","_lastEnsureEqual","uncached","refCount$","BehaviorSubject","_result","_latestChangeEvent","_ensureEqualQueue","PROMISE_RESOLVE_FALSE","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","newRxError","database","name","RxQuerySingleResult","Map","Array","from","values","newQueryResult","length","_execOverDatabase","rerunCount","result","counterBefore","_changeEventBuffer","getCounter","ids","ensureNotFalsy","selector","$in","docsData","mustBeQueried","i","docData","_docCache","getLatestDocumentDataIfExists","_deleted","push","docs","storageInstance","findDocumentsById","counter","preparedQuery","getPreparedQuery","countResult","count","mode","allowSlowCount","queryObj","queryResult","queryCollection","promiseWait","exec","throwIfMissing","query","_ensureEqual","useResult","getValue","toString","stringObj","sortObject","normalizedQuery","value","JSON","stringify","hookInput","rxQuery","clone","$eq","index","unshift","runPluginHooks","prepareQuery","jsonSchema","doesDocumentDataMatch","queryMatcher","remove","isArray","bulkRemove","error","rxStorageWriteErrorToRxError","success","incrementalRemove","runQueryUpdateFunction","asRxQuery","doc","update","_updateObj","pluginMissing","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","sort","_params","skip","_amount","limit","_createClass2","default","key","get","_$","results$","eventBulks$","pipe","filter","bulk","isLocal","startWith","mergeMap","map","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","distinctUntilChanged","prev","curr","time","merge","reactivity","getReactivityFactory","fromObservable","$","undefined","overwriteGetterForCaching","normalizeMangoQuery","getQueryMatcher","tunnelQueryCache","getByQuery","createRxQuery","ret","triggerCacheReplacement","_isResultsInSync","currentLatestEventNumber","awaitBeforeReads","size","Promise","all","fn","then","__ensureEqual","closed","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","previousCount","newCount","forEach","cE","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","calculateNewResults","runFullQueryAgain","changed","newResults","areRxDocumentArraysEqual","resolve","primarySelectorValue","hasExtraOperators","Object","keys","hasOtherSelectors","docIdArray","docIds","Set","cacheMisses","docId","docsFromStorage","concat","sortComparator","getSortComparator","slice","limitIsNumber","documents","hasOwnProperty","call","find","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\r\n BehaviorSubject,\r\n Observable,\r\n merge\r\n} from 'rxjs';\r\nimport {\r\n mergeMap,\r\n filter,\r\n map,\r\n startWith,\r\n distinctUntilChanged,\r\n shareReplay\r\n} from 'rxjs/operators';\r\nimport {\r\n sortObject,\r\n pluginMissing,\r\n overwriteGetterForCaching,\r\n clone,\r\n PROMISE_RESOLVE_FALSE,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n ensureNotFalsy,\r\n areRxDocumentArraysEqual,\r\n promiseWait\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError,\r\n rxStorageWriteErrorToRxError\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\nimport type {\r\n RxCollection,\r\n RxDocument,\r\n RxQueryOP,\r\n RxQuery,\r\n MangoQuery,\r\n MangoQuerySortPart,\r\n MangoQuerySelector,\r\n PreparedQuery,\r\n FilledMangoQuery,\r\n RxDocumentWriteData,\r\n RxDocumentData,\r\n QueryMatcher,\r\n ModifyFunction,\r\n RxStorageChangeEvent,\r\n Reactified\r\n} from './types/index.d.ts';\r\nimport { calculateNewResults } from './event-reduce.ts';\r\nimport { triggerCacheReplacement } from './query-cache.ts';\r\nimport {\r\n getQueryMatcher,\r\n getSortComparator,\r\n normalizeMangoQuery,\r\n prepareQuery,\r\n runQueryUpdateFunction\r\n\r\n} from './rx-query-helper.ts';\r\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\r\n\r\nlet _queryCount = 0;\r\nconst newQueryID = function (): number {\r\n return ++_queryCount;\r\n};\r\n\r\n/**\r\n * Counter for _lastEnsureEqual.\r\n * We only need ordering and zero-check for cache replacement,\r\n * so a counter is cheaper than Date.now().\r\n */\r\nlet _ensureEqualCount = 0;\r\n\r\nexport class RxQueryBase<\r\n RxDocType,\r\n RxQueryResult,\r\n OrmMethods = {},\r\n Reactivity = unknown,\r\n> {\r\n\r\n public id: number = newQueryID();\r\n\r\n /**\r\n * Some stats then are used for debugging and cache replacement policies\r\n */\r\n public _execOverDatabaseCount: number = 0;\r\n /**\r\n * @performance\r\n * Use Date.now() instead of now() for creation time.\r\n * The monotonic uniqueness guarantee of now() is not needed here\r\n * since _creationTime is only used by the cache replacement policy\r\n * for rough lifetime comparisons.\r\n */\r\n public _creationTime = Date.now();\r\n\r\n // used in the query-cache to determine if the RxQuery can be cleaned up.\r\n public _lastEnsureEqual = 0;\r\n\r\n public uncached = false;\r\n\r\n // used to count the subscribers to the query\r\n public refCount$ = new BehaviorSubject(null);\r\n\r\n public isFindOneByIdQuery: false | string | string[];\r\n\r\n\r\n /**\r\n * Contains the current result state\r\n * or null if query has not run yet.\r\n */\r\n public _result: RxQuerySingleResult<RxDocType> | null = null;\r\n\r\n\r\n constructor(\r\n public op: RxQueryOP,\r\n public mangoQuery: Readonly<MangoQuery<RxDocType>>,\r\n public collection: RxCollection<RxDocType>,\r\n // used by some plugins\r\n public other: any = {}\r\n ) {\r\n if (!mangoQuery) {\r\n this.mangoQuery = _getDefaultQuery();\r\n }\r\n\r\n /**\r\n * @performance\r\n * isFindOneByIdQuery is only used by queryCollection()\r\n * which is not called for 'count' queries.\r\n * Skip the check for count queries to avoid unnecessary work.\r\n */\r\n if (op === 'count') {\r\n this.isFindOneByIdQuery = false;\r\n } else {\r\n this.isFindOneByIdQuery = isFindOneByIdQuery(\r\n this.collection.schema.primaryPath as string,\r\n mangoQuery\r\n );\r\n }\r\n }\r\n get $(): Observable<RxQueryResult> {\r\n if (!this._$) {\r\n const results$ = this.collection.eventBulks$.pipe(\r\n /**\r\n * Performance shortcut.\r\n * Changes to local documents are not relevant for the query.\r\n */\r\n filter((bulk: any) => !bulk.isLocal),\r\n /**\r\n * Start once to ensure the querying also starts\r\n * when there where no changes.\r\n */\r\n startWith(null),\r\n // ensure query results are up to date.\r\n mergeMap(() => _ensureEqual(this as any)),\r\n // use the current result set, written by _ensureEqual().\r\n map(() => this._result),\r\n // do not run stuff above for each new subscriber, only once.\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n // do not proceed if result set has not changed.\r\n distinctUntilChanged((prev: RxQuerySingleResult<RxDocType> | null, curr: RxQuerySingleResult<RxDocType> | null) => {\r\n if (prev && prev.time === ensureNotFalsy(curr).time) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n filter((result: RxQuerySingleResult<RxDocType> | null) => !!result),\r\n /**\r\n * Map the result set to a single RxDocument or an array,\r\n * depending on query type\r\n */\r\n map((result: RxQuerySingleResult<RxDocType> | null) => {\r\n return ensureNotFalsy(result).getValue();\r\n })\r\n );\r\n\r\n this._$ = merge<any>(\r\n results$,\r\n /**\r\n * Also add the refCount$ to the query observable\r\n * to allow us to count the amount of subscribers.\r\n */\r\n this.refCount$.pipe(\r\n filter(() => false)\r\n )\r\n );\r\n }\r\n return this._$ as any;\r\n }\r\n\r\n get $$(): Reactified<Reactivity, RxQueryResult> {\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n this.$,\r\n undefined,\r\n this.collection.database\r\n ) as any;\r\n }\r\n\r\n // stores the changeEvent-number of the last handled change-event\r\n public _latestChangeEvent: -1 | number = -1;\r\n\r\n /**\r\n * ensures that the exec-runs\r\n * are not run in parallel\r\n */\r\n public _ensureEqualQueue: Promise<boolean> = PROMISE_RESOLVE_FALSE;\r\n\r\n /**\r\n * Returns an observable that emits the results\r\n * This should behave like an rxjs-BehaviorSubject which means:\r\n * - Emit the current result-set on subscribe\r\n * - Emit the new result-set when an RxChangeEvent comes in\r\n * - Do not emit anything before the first result-set was created (no null)\r\n */\r\n public _$?: Observable<RxQueryResult>;\r\n\r\n /**\r\n * set the new result-data as result-docs of the query\r\n * @param newResultData json-docs that were received from the storage\r\n */\r\n _setResultData(newResultData: RxDocumentData<RxDocType>[] | number | Map<string, RxDocumentData<RxDocType>>): void {\r\n if (typeof newResultData === 'undefined') {\r\n throw newRxError('QU18', {\r\n database: this.collection.database.name,\r\n collection: this.collection.name\r\n });\r\n }\r\n if (typeof newResultData === 'number') {\r\n this._result = new RxQuerySingleResult<RxDocType>(\r\n this as any,\r\n [],\r\n newResultData\r\n );\r\n return;\r\n } else if (newResultData instanceof Map) {\r\n newResultData = Array.from((newResultData as Map<string, RxDocumentData<RxDocType>>).values());\r\n }\r\n\r\n const newQueryResult = new RxQuerySingleResult<RxDocType>(\r\n this as any,\r\n newResultData,\r\n newResultData.length\r\n );\r\n this._result = newQueryResult;\r\n }\r\n\r\n /**\r\n * executes the query on the database\r\n * @return results-array with document-data\r\n */\r\n async _execOverDatabase(rerunCount = 0): Promise<{\r\n result: RxDocumentData<RxDocType>[] | number;\r\n counter: number;\r\n }> {\r\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\r\n let result: {\r\n result: RxDocumentData<RxDocType>[] | number;\r\n counter: number;\r\n };\r\n\r\n /**\r\n * @performance\r\n * Instead of subscribing to eventBulks$ to detect concurrent writes,\r\n * we snapshot the change event counter before and after the query.\r\n * If the counter changed, a write happened during execution and\r\n * we must re-run the query to ensure correct results.\r\n * This avoids the overhead of RxJS Subject subscribe/unsubscribe per query.\r\n *\r\n * @link https://github.com/pubkey/rxdb/issues/7067\r\n */\r\n const counterBefore = this.collection._changeEventBuffer.getCounter();\r\n\r\n if (this.op === 'findByIds') {\r\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\r\n const docsData: RxDocumentData<RxDocType>[] = [];\r\n const mustBeQueried: string[] = [];\r\n // first try to fill from docCache\r\n for (let i = 0; i < ids.length; i++) {\r\n const id = ids[i];\r\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\r\n if (docData) {\r\n if (!docData._deleted) {\r\n docsData.push(docData);\r\n }\r\n } else {\r\n mustBeQueried.push(id);\r\n }\r\n }\r\n // everything which was not in docCache must be fetched from the storage\r\n if (mustBeQueried.length > 0) {\r\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\r\n for (let i = 0; i < docs.length; i++) {\r\n docsData.push(docs[i]);\r\n }\r\n }\r\n result = {\r\n result: docsData,\r\n counter: this.collection._changeEventBuffer.getCounter()\r\n };\r\n } else if (this.op === 'count') {\r\n const preparedQuery = this.getPreparedQuery();\r\n const countResult = await this.collection.storageInstance.count(preparedQuery);\r\n if (countResult.mode === 'slow' && !this.collection.database.allowSlowCount) {\r\n throw newRxError('QU14', {\r\n collection: this.collection,\r\n queryObj: this.mangoQuery\r\n });\r\n } else {\r\n result = {\r\n result: countResult.count,\r\n counter: this.collection._changeEventBuffer.getCounter()\r\n };\r\n }\r\n } else {\r\n const queryResult = await queryCollection<RxDocType>(this as any);\r\n result = {\r\n result: queryResult.docs,\r\n counter: queryResult.counter\r\n };\r\n }\r\n\r\n if (this.collection._changeEventBuffer.getCounter() !== counterBefore) {\r\n await promiseWait(rerunCount * 20);\r\n return this._execOverDatabase(rerunCount + 1);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Execute the query\r\n * To have an easier implementations,\r\n * just subscribe and use the first result\r\n */\r\n public exec(throwIfMissing: true): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;\r\n public exec(): Promise<RxQueryResult>;\r\n public async exec(throwIfMissing?: boolean): Promise<any> {\r\n if (throwIfMissing && this.op !== 'findOne') {\r\n throw newRxError('QU9', {\r\n collection: this.collection.name,\r\n query: this.mangoQuery,\r\n op: this.op\r\n });\r\n }\r\n\r\n /**\r\n * run _ensureEqual() here,\r\n * this will make sure that errors in the query which throw inside of the RxStorage,\r\n * will be thrown at this execution context and not in the background.\r\n */\r\n await _ensureEqual(this as any);\r\n const useResult = ensureNotFalsy(this._result);\r\n return useResult.getValue(throwIfMissing);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Returns the normalized query.\r\n * Caches the result so that multiple calls to\r\n * queryMatcher, toString() and getPreparedQuery()\r\n * do not have to run the normalization again.\r\n * @overwrites itself with the actual value.\r\n */\r\n get normalizedQuery(): FilledMangoQuery<RxDocType> {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'normalizedQuery',\r\n normalizeMangoQuery<RxDocType>(\r\n this.collection.schema.jsonSchema,\r\n this.mangoQuery,\r\n this.op === 'count'\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * cached call to get the queryMatcher\r\n * @overwrites itself with the actual value\r\n */\r\n get queryMatcher(): QueryMatcher<RxDocumentWriteData<RxDocType>> {\r\n const schema = this.collection.schema.jsonSchema;\r\n return overwriteGetterForCaching(\r\n this,\r\n 'queryMatcher',\r\n getQueryMatcher(\r\n schema,\r\n this.normalizedQuery\r\n ) as any\r\n );\r\n }\r\n\r\n /**\r\n * returns a string that is used for equal-comparisons\r\n * @overwrites itself with the actual value\r\n */\r\n toString(): string {\r\n const stringObj = sortObject({\r\n op: this.op,\r\n query: this.normalizedQuery,\r\n other: this.other\r\n }, true);\r\n const value = JSON.stringify(stringObj);\r\n this.toString = () => value;\r\n return value;\r\n }\r\n\r\n /**\r\n * returns the prepared query\r\n * which can be sent to the storage instance to query for documents.\r\n * @overwrites itself with the actual value.\r\n */\r\n getPreparedQuery(): PreparedQuery<RxDocType> {\r\n const hookInput = {\r\n rxQuery: this,\r\n // can be mutated by the hooks so we have to deep clone first.\r\n mangoQuery: clone(this.normalizedQuery) as FilledMangoQuery<RxDocType>\r\n };\r\n (hookInput.mangoQuery.selector as any)._deleted = { $eq: false };\r\n if (hookInput.mangoQuery.index) {\r\n hookInput.mangoQuery.index.unshift('_deleted');\r\n }\r\n runPluginHooks('prePrepareQuery', hookInput);\r\n\r\n const value = prepareQuery(\r\n this.collection.schema.jsonSchema,\r\n hookInput.mangoQuery as any\r\n );\r\n\r\n this.getPreparedQuery = () => value;\r\n return value;\r\n }\r\n\r\n /**\r\n * returns true if the document matches the query,\r\n * does not use the 'skip' and 'limit'\r\n */\r\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\r\n // if doc is deleted, it cannot match\r\n if (docData._deleted) {\r\n return false;\r\n }\r\n\r\n return this.queryMatcher(docData);\r\n }\r\n\r\n /**\r\n * deletes all found documents\r\n * @return promise with deleted documents\r\n */\r\n async remove(): Promise<RxQueryResult> {\r\n const docs = await this.exec();\r\n if (Array.isArray(docs)) {\r\n const result = await this.collection.bulkRemove(docs);\r\n if (result.error.length > 0) {\r\n throw rxStorageWriteErrorToRxError(result.error[0]);\r\n } else {\r\n return result.success as any;\r\n }\r\n } else {\r\n return (docs as any).remove();\r\n }\r\n }\r\n incrementalRemove(): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalRemove(),\r\n );\r\n }\r\n\r\n\r\n /**\r\n * helper function to transform RxQueryBase to RxQuery type\r\n */\r\n get asRxQuery(): RxQuery<RxDocType, RxQueryResult> {\r\n return this as any;\r\n }\r\n\r\n /**\r\n * updates all found documents\r\n * @overwritten by plugin (optional)\r\n */\r\n update(_updateObj: any): Promise<RxQueryResult> {\r\n throw pluginMissing('update');\r\n }\r\n\r\n patch(patch: Partial<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.patch(patch),\r\n );\r\n }\r\n incrementalPatch(patch: Partial<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalPatch(patch),\r\n );\r\n }\r\n modify(mutationFunction: ModifyFunction<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.modify(mutationFunction),\r\n );\r\n }\r\n incrementalModify(mutationFunction: ModifyFunction<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalModify(mutationFunction),\r\n );\r\n }\r\n\r\n\r\n // we only set some methods of query-builder here\r\n // because the others depend on these ones\r\n where(_queryObj: MangoQuerySelector<RxDocType> | keyof RxDocType | string): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n sort(_params: string | MangoQuerySortPart<RxDocType>): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n skip(_amount: number | null): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n limit(_amount: number | null): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n}\r\n\r\n\r\nexport function _getDefaultQuery<RxDocType>(): MangoQuery<RxDocType> {\r\n return {\r\n selector: {}\r\n };\r\n}\r\n\r\n/**\r\n * run this query through the QueryCache\r\n */\r\nexport function tunnelQueryCache<RxDocumentType, RxQueryResult>(\r\n rxQuery: RxQueryBase<RxDocumentType, RxQueryResult>\r\n): RxQuery<RxDocumentType, RxQueryResult> {\r\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\r\n}\r\n\r\nexport function createRxQuery<RxDocType>(\r\n op: RxQueryOP,\r\n queryObj: MangoQuery<RxDocType>,\r\n collection: RxCollection<RxDocType>,\r\n other?: any\r\n) {\r\n runPluginHooks('preCreateRxQuery', {\r\n op,\r\n queryObj,\r\n collection,\r\n other\r\n });\r\n\r\n let ret = new RxQueryBase<RxDocType, any>(op, queryObj, collection, other);\r\n\r\n // ensure when created with same params, only one is created\r\n ret = tunnelQueryCache(ret);\r\n triggerCacheReplacement(collection);\r\n\r\n return ret;\r\n}\r\n\r\n/**\r\n * Check if the current results-state is in sync with the database\r\n * which means that no write event happened since the last run.\r\n * @return false if not which means it should re-execute\r\n */\r\nfunction _isResultsInSync(rxQuery: RxQueryBase<any, any>): boolean {\r\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\r\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * wraps __ensureEqual()\r\n * to ensure it does not run in parallel\r\n * @return true if has changed, false if not\r\n *\r\n * @performance\r\n * Avoid async wrapper when awaitBeforeReads is empty (common case).\r\n * This eliminates one unnecessary Promise allocation per query execution.\r\n */\r\nfunction _ensureEqual(rxQuery: RxQueryBase<any, any>): Promise<boolean> {\r\n if (rxQuery.collection.awaitBeforeReads.size > 0) {\r\n return Promise.all(Array.from(rxQuery.collection.awaitBeforeReads).map(fn => fn()))\r\n .then(() => {\r\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\r\n .then(() => __ensureEqual(rxQuery));\r\n return rxQuery._ensureEqualQueue;\r\n });\r\n }\r\n\r\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\r\n .then(() => __ensureEqual(rxQuery));\r\n return rxQuery._ensureEqualQueue;\r\n}\r\n\r\n/**\r\n * ensures that the results of this query is equal to the results which a query over the database would give\r\n * @return true if results have changed\r\n */\r\nfunction __ensureEqual<RxDocType>(rxQuery: RxQueryBase<RxDocType, any>): Promise<boolean> {\r\n /**\r\n * @performance\r\n * Use a counter instead of Date.now() since _lastEnsureEqual\r\n * is only used by the cache replacement policy for sorting queries\r\n * by last usage and zero-check, not for time-based comparison.\r\n */\r\n rxQuery._lastEnsureEqual = ++_ensureEqualCount;\r\n\r\n /**\r\n * Optimisation shortcuts\r\n */\r\n if (\r\n // db is closed\r\n rxQuery.collection.database.closed ||\r\n // nothing happened since last run\r\n _isResultsInSync(rxQuery)\r\n ) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n\r\n let ret = false;\r\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\r\n if (rxQuery._latestChangeEvent === -1) {\r\n // have not executed yet -> must run\r\n mustReExec = true;\r\n }\r\n\r\n /**\r\n * try to use EventReduce to calculate the new results\r\n */\r\n if (!mustReExec) {\r\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\r\n if (missedChangeEvents === null) {\r\n // changeEventBuffer is of bounds -> we must re-execute over the database\r\n mustReExec = true;\r\n } else {\r\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\r\n const runChangeEvents: RxStorageChangeEvent<RxDocType>[] = rxQuery.asRxQuery.collection\r\n ._changeEventBuffer\r\n .reduceByLastOfDoc(missedChangeEvents);\r\n\r\n if (rxQuery.op === 'count') {\r\n // 'count' query\r\n const previousCount = ensureNotFalsy(rxQuery._result).count;\r\n let newCount = previousCount;\r\n runChangeEvents.forEach(cE => {\r\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\r\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\r\n\r\n if (!didMatchBefore && doesMatchNow) {\r\n newCount++;\r\n }\r\n if (didMatchBefore && !doesMatchNow) {\r\n newCount--;\r\n }\r\n });\r\n if (newCount !== previousCount) {\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(newCount as any);\r\n }\r\n } else {\r\n // 'find' or 'findOne' query\r\n const eventReduceResult = calculateNewResults(\r\n rxQuery as any,\r\n runChangeEvents\r\n );\r\n if (eventReduceResult.runFullQueryAgain) {\r\n // could not calculate the new results, execute must be done\r\n mustReExec = true;\r\n } else if (eventReduceResult.changed) {\r\n // we got the new results, we do not have to re-execute, mustReExec stays false\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(eventReduceResult.newResults as any);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // oh no we have to re-execute the whole query over the database\r\n if (mustReExec) {\r\n return rxQuery._execOverDatabase()\r\n .then(result => {\r\n const newResultData = result.result;\r\n\r\n /**\r\n * The RxStorage is defined to always first emit events and then return\r\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\r\n * has been run, not the one from before.\r\n */\r\n rxQuery._latestChangeEvent = result.counter;\r\n\r\n // A count query needs a different has-changed check.\r\n if (typeof newResultData === 'number') {\r\n if (\r\n !rxQuery._result ||\r\n newResultData !== rxQuery._result.count\r\n ) {\r\n ret = true;\r\n rxQuery._setResultData(newResultData as any);\r\n }\r\n return ret;\r\n }\r\n if (\r\n !rxQuery._result ||\r\n !areRxDocumentArraysEqual(\r\n rxQuery.collection.schema.primaryPath,\r\n newResultData,\r\n rxQuery._result.docsData\r\n )\r\n ) {\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(newResultData as any);\r\n }\r\n return ret;\r\n });\r\n }\r\n return Promise.resolve(ret); // true if results have changed\r\n}\r\n\r\n\r\n/**\r\n * Runs the query over the storage instance\r\n * of the collection.\r\n * Does some optimizations to ensure findById is used\r\n * when specific queries are used.\r\n */\r\nexport async function queryCollection<RxDocType>(\r\n rxQuery: RxQuery<RxDocType> | RxQueryBase<RxDocType, any>\r\n): Promise<{\r\n docs: RxDocumentData<RxDocType>[];\r\n /**\r\n * We need to remember the counter directly here\r\n * because getting if after the returned Promise is resolved,\r\n * can result in a value that no longer matches the result set.\r\n */\r\n counter: number;\r\n}> {\r\n let docs: RxDocumentData<RxDocType>[] = [];\r\n const collection = rxQuery.collection;\r\n\r\n /**\r\n * Optimizations shortcut.\r\n * If query is find-one-document-by-id,\r\n * then we do not have to use the slow query() method\r\n * but instead can use findDocumentsById()\r\n */\r\n if (rxQuery.isFindOneByIdQuery) {\r\n const selector = rxQuery.mangoQuery.selector;\r\n const primaryPath = collection.schema.primaryPath as string;\r\n // isFindOneByIdQuery guarantees the primary key is in the selector\r\n const primarySelectorValue = selector ? (selector as any)[primaryPath] : undefined;\r\n\r\n // Check if there are extra operators on the primary key selector (e.g. $ne alongside $in)\r\n const hasExtraOperators = typeof primarySelectorValue === 'object' &&\r\n primarySelectorValue !== null &&\r\n Object.keys(primarySelectorValue).length > 1;\r\n\r\n // Check if there are selectors OTHER than the primary key\r\n const hasOtherSelectors = selector ? Object.keys(selector).length > 1 : false;\r\n\r\n // Normalize single ID to array and de-duplicate to avoid returning the same document multiple times\r\n const docIdArray = Array.isArray(rxQuery.isFindOneByIdQuery)\r\n ? rxQuery.isFindOneByIdQuery\r\n : [rxQuery.isFindOneByIdQuery];\r\n const docIds = Array.from(new Set(docIdArray));\r\n\r\n // Separate cache hits from storage misses\r\n const cacheMisses: string[] = [];\r\n docIds.forEach(docId => {\r\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\r\n if (docData && !docData._deleted) {\r\n docs.push(docData);\r\n } else if (!docData) {\r\n // Only fetch from storage if not in cache\r\n cacheMisses.push(docId);\r\n }\r\n // If found but deleted, skip entirely (no refetch)\r\n });\r\n\r\n // Fetch only cache misses from storage\r\n if (cacheMisses.length > 0) {\r\n const docsFromStorage = await collection.storageInstance.findDocumentsById(cacheMisses, false);\r\n docs = docs.concat(docsFromStorage);\r\n }\r\n\r\n // Apply query matcher if there are extra operators or other selectors\r\n if (hasExtraOperators || hasOtherSelectors) {\r\n docs = docs.filter(doc => rxQuery.queryMatcher(doc));\r\n }\r\n\r\n /**\r\n * The findDocumentsById() fast-path also does not apply `skip`/`limit`/`sort`.\r\n * To keep behavior consistent with storageInstance.query(), we must\r\n * apply them after queryMatcher for both find() and findOne() queries.\r\n */\r\n // Apply sorting for both find and findOne\r\n if (docs.length > 1) {\r\n const preparedQuery = rxQuery.getPreparedQuery();\r\n const sortComparator = getSortComparator(collection.schema.jsonSchema, preparedQuery.query);\r\n docs = docs.sort(sortComparator);\r\n }\r\n\r\n // Apply skip for both find and findOne\r\n const skip = typeof rxQuery.mangoQuery.skip === 'number' && rxQuery.mangoQuery.skip > 0\r\n ? rxQuery.mangoQuery.skip\r\n : 0;\r\n if (skip > 0) {\r\n docs = docs.slice(skip);\r\n }\r\n\r\n // Apply limit for both find and findOne\r\n const limitIsNumber = typeof rxQuery.mangoQuery.limit === 'number' && rxQuery.mangoQuery.limit > 0;\r\n if (limitIsNumber) {\r\n const limit = rxQuery.mangoQuery.limit as number;\r\n docs = docs.slice(0, limit);\r\n }\r\n\r\n } else {\r\n const preparedQuery = rxQuery.getPreparedQuery();\r\n const queryResult = await collection.storageInstance.query(preparedQuery);\r\n docs = queryResult.documents;\r\n }\r\n\r\n return {\r\n docs,\r\n counter: collection._changeEventBuffer.getCounter()\r\n };\r\n\r\n}\r\n\r\n/**\r\n * Returns true if the given query\r\n * selects documents by primary key using $eq or $in.\r\n * Used to optimize performance: these queries use get-by-id\r\n * instead of a full index scan. Additional operators beyond\r\n * $eq/$in are handled via the queryMatcher after fetching.\r\n * Skip, limit, and sort are also applied after fetching.\r\n * Returns false if no such optimization is possible.\r\n * Returns the document id (string) or ids (string[]) otherwise.\r\n */\r\nexport function isFindOneByIdQuery(\r\n primaryPath: string,\r\n query: MangoQuery<any>\r\n): false | string | string[] {\r\n // primary key constraint can coexist with other selectors, skip, limit, and sort\r\n // The optimization will fetch by ID, then apply queryMatcher, sort, skip, and limit\r\n // Use hasOwnProperty to avoid prototype pollution from user-controlled input\r\n if (\r\n query.selector &&\r\n Object.prototype.hasOwnProperty.call(query.selector, primaryPath)\r\n ) {\r\n const value: any = (query.selector as any)[primaryPath];\r\n if (typeof value === 'string') {\r\n return value;\r\n } else if (\r\n typeof value.$eq === 'string'\r\n ) {\r\n return value.$eq;\r\n }\r\n\r\n // same with $in string arrays\r\n if (\r\n Array.isArray(value.$in) &&\r\n // must only contain strings\r\n !(value.$in as any[]).find(r => typeof r !== 'string')\r\n ) {\r\n return value.$in;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\n\r\nexport function isRxQuery(obj: any): boolean {\r\n return obj instanceof RxQueryBase;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAKA,IAAAC,UAAA,GAAAD,OAAA;AAQA,IAAAE,MAAA,GAAAF,OAAA;AAWA,IAAAG,QAAA,GAAAH,OAAA;AAIA,IAAAI,MAAA,GAAAJ,OAAA;AAoBA,IAAAK,YAAA,GAAAL,OAAA;AACA,IAAAM,WAAA,GAAAN,OAAA;AACA,IAAAO,cAAA,GAAAP,OAAA;AAQA,IAAAQ,oBAAA,GAAAR,OAAA;AAEA,IAAIS,WAAW,GAAG,CAAC;AACnB,IAAMC,UAAU,GAAG,SAAAA,CAAA,EAAoB;EACnC,OAAO,EAAED,WAAW;AACxB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,IAAIE,iBAAiB,GAAG,CAAC;AAAC,IAEbC,WAAW,GAAAC,OAAA,CAAAD,WAAA;EASpB;AACJ;AACA;;EAEI;AACJ;AACA;AACA;AACA;AACA;AACA;;EAGI;;EAKA;;EAMA;AACJ;AACA;AACA;;EAII,SAAAA,YACWE,EAAa,EACbC,UAA2C,EAC3CC,UAAmC;EAC1C;EACOC,KAAU,GAAG,CAAC,CAAC,EACxB;IAAA,KAvCKC,EAAE,GAAWR,UAAU,CAAC,CAAC;IAAA,KAKzBS,sBAAsB,GAAW,CAAC;IAAA,KAQlCC,aAAa,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IAAA,KAG1BC,gBAAgB,GAAG,CAAC;IAAA,KAEpBC,QAAQ,GAAG,KAAK;IAAA,KAGhBC,SAAS,GAAG,IAAIC,qBAAe,CAAC,IAAI,CAAC;IAAA,KASrCC,OAAO,GAA0C,IAAI;IAAA,KA0FrDC,kBAAkB,GAAgB,CAAC,CAAC;IAAA,KAMpCC,iBAAiB,GAAqBC,4BAAqB;IAAA,KA5FvDhB,EAAa,GAAbA,EAAa;IAAA,KACbC,UAA2C,GAA3CA,UAA2C;IAAA,KAC3CC,UAAmC,GAAnCA,UAAmC;IAAA,KAEnCC,KAAU,GAAVA,KAAU;IAEjB,IAAI,CAACF,UAAU,EAAE;MACb,IAAI,CAACA,UAAU,GAAGgB,gBAAgB,CAAC,CAAC;IACxC;;IAEA;AACR;AACA;AACA;AACA;AACA;IACQ,IAAIjB,EAAE,KAAK,OAAO,EAAE;MAChB,IAAI,CAACkB,kBAAkB,GAAG,KAAK;IACnC,CAAC,MAAM;MACH,IAAI,CAACA,kBAAkB,GAAGA,kBAAkB,CACxC,IAAI,CAAChB,UAAU,CAACiB,MAAM,CAACC,WAAW,EAClCnB,UACJ,CAAC;IACL;EACJ;EAAC,IAAAoB,MAAA,GAAAvB,WAAA,CAAAwB,SAAA;EAsED;AACJ;AACA;AACA;AACA;AACA;AACA;EAGI;AACJ;AACA;AACA;EAHID,MAAA,CAIAE,cAAc,GAAd,SAAAA,cAAcA,CAACC,aAA4F,EAAQ;IAC/G,IAAI,OAAOA,aAAa,KAAK,WAAW,EAAE;MACtC,MAAM,IAAAC,mBAAU,EAAC,MAAM,EAAE;QACrBC,QAAQ,EAAE,IAAI,CAACxB,UAAU,CAACwB,QAAQ,CAACC,IAAI;QACvCzB,UAAU,EAAE,IAAI,CAACA,UAAU,CAACyB;MAChC,CAAC,CAAC;IACN;IACA,IAAI,OAAOH,aAAa,KAAK,QAAQ,EAAE;MACnC,IAAI,CAACX,OAAO,GAAG,IAAIe,wCAAmB,CAClC,IAAI,EACJ,EAAE,EACFJ,aACJ,CAAC;MACD;IACJ,CAAC,MAAM,IAAIA,aAAa,YAAYK,GAAG,EAAE;MACrCL,aAAa,GAAGM,KAAK,CAACC,IAAI,CAAEP,aAAa,CAA4CQ,MAAM,CAAC,CAAC,CAAC;IAClG;IAEA,IAAMC,cAAc,GAAG,IAAIL,wCAAmB,CAC1C,IAAI,EACJJ,aAAa,EACbA,aAAa,CAACU,MAClB,CAAC;IACD,IAAI,CAACrB,OAAO,GAAGoB,cAAc;EACjC;;EAEA;AACJ;AACA;AACA,KAHI;EAAAZ,MAAA,CAIMc,iBAAiB,GAAvB,eAAMA,iBAAiBA,CAACC,UAAU,GAAG,CAAC,EAGnC;IACC,IAAI,CAAC/B,sBAAsB,GAAG,IAAI,CAACA,sBAAsB,GAAG,CAAC;IAC7D,IAAIgC,MAGH;;IAED;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQ,IAAMC,aAAa,GAAG,IAAI,CAACpC,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC,CAAC;IAErE,IAAI,IAAI,CAACxC,EAAE,KAAK,WAAW,EAAE;MACzB,IAAMyC,GAAa,GAAG,IAAAC,qBAAc,EAAC,IAAI,CAACzC,UAAU,CAAC0C,QAAe,CAAC,CAAC,IAAI,CAACzC,UAAU,CAACiB,MAAM,CAACC,WAAW,CAAC,CAACwB,GAAG;MAC7G,IAAMC,QAAqC,GAAG,EAAE;MAChD,IAAMC,aAAuB,GAAG,EAAE;MAClC;MACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,GAAG,CAACP,MAAM,EAAEa,CAAC,EAAE,EAAE;QACjC,IAAM3C,EAAE,GAAGqC,GAAG,CAACM,CAAC,CAAC;QACjB,IAAMC,OAAO,GAAG,IAAI,CAAC9C,UAAU,CAAC+C,SAAS,CAACC,6BAA6B,CAAC9C,EAAE,CAAC;QAC3E,IAAI4C,OAAO,EAAE;UACT,IAAI,CAACA,OAAO,CAACG,QAAQ,EAAE;YACnBN,QAAQ,CAACO,IAAI,CAACJ,OAAO,CAAC;UAC1B;QACJ,CAAC,MAAM;UACHF,aAAa,CAACM,IAAI,CAAChD,EAAE,CAAC;QAC1B;MACJ;MACA;MACA,IAAI0C,aAAa,CAACZ,MAAM,GAAG,CAAC,EAAE;QAC1B,IAAMmB,IAAI,GAAG,MAAM,IAAI,CAACnD,UAAU,CAACoD,eAAe,CAACC,iBAAiB,CAACT,aAAa,EAAE,KAAK,CAAC;QAC1F,KAAK,IAAIC,EAAC,GAAG,CAAC,EAAEA,EAAC,GAAGM,IAAI,CAACnB,MAAM,EAAEa,EAAC,EAAE,EAAE;UAClCF,QAAQ,CAACO,IAAI,CAACC,IAAI,CAACN,EAAC,CAAC,CAAC;QAC1B;MACJ;MACAV,MAAM,GAAG;QACLA,MAAM,EAAEQ,QAAQ;QAChBW,OAAO,EAAE,IAAI,CAACtD,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC;MAC3D,CAAC;IACL,CAAC,MAAM,IAAI,IAAI,CAACxC,EAAE,KAAK,OAAO,EAAE;MAC5B,IAAMyD,aAAa,GAAG,IAAI,CAACC,gBAAgB,CAAC,CAAC;MAC7C,IAAMC,WAAW,GAAG,MAAM,IAAI,CAACzD,UAAU,CAACoD,eAAe,CAACM,KAAK,CAACH,aAAa,CAAC;MAC9E,IAAIE,WAAW,CAACE,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC3D,UAAU,CAACwB,QAAQ,CAACoC,cAAc,EAAE;QACzE,MAAM,IAAArC,mBAAU,EAAC,MAAM,EAAE;UACrBvB,UAAU,EAAE,IAAI,CAACA,UAAU;UAC3B6D,QAAQ,EAAE,IAAI,CAAC9D;QACnB,CAAC,CAAC;MACN,CAAC,MAAM;QACHoC,MAAM,GAAG;UACLA,MAAM,EAAEsB,WAAW,CAACC,KAAK;UACzBJ,OAAO,EAAE,IAAI,CAACtD,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC;QAC3D,CAAC;MACL;IACJ,CAAC,MAAM;MACH,IAAMwB,WAAW,GAAG,MAAMC,eAAe,CAAY,IAAW,CAAC;MACjE5B,MAAM,GAAG;QACLA,MAAM,EAAE2B,WAAW,CAACX,IAAI;QACxBG,OAAO,EAAEQ,WAAW,CAACR;MACzB,CAAC;IACL;IAEA,IAAI,IAAI,CAACtD,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC,CAAC,KAAKF,aAAa,EAAE;MACnE,MAAM,IAAA4B,kBAAW,EAAC9B,UAAU,GAAG,EAAE,CAAC;MAClC,OAAO,IAAI,CAACD,iBAAiB,CAACC,UAAU,GAAG,CAAC,CAAC;IACjD;IAEA,OAAOC,MAAM;EACjB;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAhB,MAAA,CAOa8C,IAAI,GAAjB,eAAaA,IAAIA,CAACC,cAAwB,EAAgB;IACtD,IAAIA,cAAc,IAAI,IAAI,CAACpE,EAAE,KAAK,SAAS,EAAE;MACzC,MAAM,IAAAyB,mBAAU,EAAC,KAAK,EAAE;QACpBvB,UAAU,EAAE,IAAI,CAACA,UAAU,CAACyB,IAAI;QAChC0C,KAAK,EAAE,IAAI,CAACpE,UAAU;QACtBD,EAAE,EAAE,IAAI,CAACA;MACb,CAAC,CAAC;IACN;;IAEA;AACR;AACA;AACA;AACA;IACQ,MAAMsE,YAAY,CAAC,IAAW,CAAC;IAC/B,IAAMC,SAAS,GAAG,IAAA7B,qBAAc,EAAC,IAAI,CAAC7B,OAAO,CAAC;IAC9C,OAAO0D,SAAS,CAACC,QAAQ,CAACJ,cAAc,CAAC;EAC7C;;EAIA;AACJ;AACA;AACA;AACA;AACA;AACA,KANI;EAmCA;AACJ;AACA;AACA;EAHI/C,MAAA,CAIAoD,QAAQ,GAAR,SAAAA,QAAQA,CAAA,EAAW;IACf,IAAMC,SAAS,GAAG,IAAAC,iBAAU,EAAC;MACzB3E,EAAE,EAAE,IAAI,CAACA,EAAE;MACXqE,KAAK,EAAE,IAAI,CAACO,eAAe;MAC3BzE,KAAK,EAAE,IAAI,CAACA;IAChB,CAAC,EAAE,IAAI,CAAC;IACR,IAAM0E,KAAK,GAAGC,IAAI,CAACC,SAAS,CAACL,SAAS,CAAC;IACvC,IAAI,CAACD,QAAQ,GAAG,MAAMI,KAAK;IAC3B,OAAOA,KAAK;EAChB;;EAEA;AACJ;AACA;AACA;AACA,KAJI;EAAAxD,MAAA,CAKAqC,gBAAgB,GAAhB,SAAAA,gBAAgBA,CAAA,EAA6B;IACzC,IAAMsB,SAAS,GAAG;MACdC,OAAO,EAAE,IAAI;MACb;MACAhF,UAAU,EAAE,IAAAiF,YAAK,EAAC,IAAI,CAACN,eAAe;IAC1C,CAAC;IACAI,SAAS,CAAC/E,UAAU,CAAC0C,QAAQ,CAASQ,QAAQ,GAAG;MAAEgC,GAAG,EAAE;IAAM,CAAC;IAChE,IAAIH,SAAS,CAAC/E,UAAU,CAACmF,KAAK,EAAE;MAC5BJ,SAAS,CAAC/E,UAAU,CAACmF,KAAK,CAACC,OAAO,CAAC,UAAU,CAAC;IAClD;IACA,IAAAC,qBAAc,EAAC,iBAAiB,EAAEN,SAAS,CAAC;IAE5C,IAAMH,KAAK,GAAG,IAAAU,2BAAY,EACtB,IAAI,CAACrF,UAAU,CAACiB,MAAM,CAACqE,UAAU,EACjCR,SAAS,CAAC/E,UACd,CAAC;IAED,IAAI,CAACyD,gBAAgB,GAAG,MAAMmB,KAAK;IACnC,OAAOA,KAAK;EAChB;;EAEA;AACJ;AACA;AACA,KAHI;EAAAxD,MAAA,CAIAoE,qBAAqB,GAArB,SAAAA,qBAAqBA,CAACzC,OAAwB,EAAW;IACrD;IACA,IAAIA,OAAO,CAACG,QAAQ,EAAE;MAClB,OAAO,KAAK;IAChB;IAEA,OAAO,IAAI,CAACuC,YAAY,CAAC1C,OAAO,CAAC;EACrC;;EAEA;AACJ;AACA;AACA,KAHI;EAAA3B,MAAA,CAIMsE,MAAM,GAAZ,eAAMA,MAAMA,CAAA,EAA2B;IACnC,IAAMtC,IAAI,GAAG,MAAM,IAAI,CAACc,IAAI,CAAC,CAAC;IAC9B,IAAIrC,KAAK,CAAC8D,OAAO,CAACvC,IAAI,CAAC,EAAE;MACrB,IAAMhB,MAAM,GAAG,MAAM,IAAI,CAACnC,UAAU,CAAC2F,UAAU,CAACxC,IAAI,CAAC;MACrD,IAAIhB,MAAM,CAACyD,KAAK,CAAC5D,MAAM,GAAG,CAAC,EAAE;QACzB,MAAM,IAAA6D,qCAA4B,EAAC1D,MAAM,CAACyD,KAAK,CAAC,CAAC,CAAC,CAAC;MACvD,CAAC,MAAM;QACH,OAAOzD,MAAM,CAAC2D,OAAO;MACzB;IACJ,CAAC,MAAM;MACH,OAAQ3C,IAAI,CAASsC,MAAM,CAAC,CAAC;IACjC;EACJ,CAAC;EAAAtE,MAAA,CACD4E,iBAAiB,GAAjB,SAAAA,iBAAiBA,CAAA,EAA2B;IACxC,OAAO,IAAAC,qCAAsB,EACzB,IAAI,CAACC,SAAS,EACbC,GAAG,IAAKA,GAAG,CAACH,iBAAiB,CAAC,CACnC,CAAC;EACL;;EAGA;AACJ;AACA,KAFI;EAOA;AACJ;AACA;AACA;EAHI5E,MAAA,CAIAgF,MAAM,GAAN,SAAAA,MAAMA,CAACC,UAAe,EAA0B;IAC5C,MAAM,IAAAC,oBAAa,EAAC,QAAQ,CAAC;EACjC,CAAC;EAAAlF,MAAA,CAEDmF,KAAK,GAAL,SAAAA,KAAKA,CAACA,MAAyB,EAA0B;IACrD,OAAO,IAAAN,qCAAsB,EACzB,IAAI,CAACC,SAAS,EACbC,GAAG,IAAKA,GAAG,CAACI,KAAK,CAACA,MAAK,CAC5B,CAAC;EACL,CAAC;EAAAnF,MAAA,CACDoF,gBAAgB,GAAhB,SAAAA,gBAAgBA,CAACD,KAAyB,EAA0B;IAChE,OAAO,IAAAN,qCAAsB,EACzB,IAAI,CAACC,SAAS,EACbC,GAAG,IAAKA,GAAG,CAACK,gBAAgB,CAACD,KAAK,CACvC,CAAC;EACL,CAAC;EAAAnF,MAAA,CACDqF,MAAM,GAAN,SAAAA,MAAMA,CAACC,gBAA2C,EAA0B;IACxE,OAAO,IAAAT,qCAAsB,EACzB,IAAI,CAACC,SAAS,EACbC,GAAG,IAAKA,GAAG,CAACM,MAAM,CAACC,gBAAgB,CACxC,CAAC;EACL,CAAC;EAAAtF,MAAA,CACDuF,iBAAiB,GAAjB,SAAAA,iBAAiBA,CAACD,gBAA2C,EAA0B;IACnF,OAAO,IAAAT,qCAAsB,EACzB,IAAI,CAACC,SAAS,EACbC,GAAG,IAAKA,GAAG,CAACQ,iBAAiB,CAACD,gBAAgB,CACnD,CAAC;EACL;;EAGA;EACA;AAAA;EAAAtF,MAAA,CACAwF,KAAK,GAAL,SAAAA,KAAKA,CAACC,SAAmE,EAAqC;IAC1G,MAAM,IAAAP,oBAAa,EAAC,eAAe,CAAC;EACxC,CAAC;EAAAlF,MAAA,CACD0F,IAAI,GAAJ,SAAAA,IAAIA,CAACC,OAA+C,EAAqC;IACrF,MAAM,IAAAT,oBAAa,EAAC,eAAe,CAAC;EACxC,CAAC;EAAAlF,MAAA,CACD4F,IAAI,GAAJ,SAAAA,IAAIA,CAACC,OAAsB,EAAqC;IAC5D,MAAM,IAAAX,oBAAa,EAAC,eAAe,CAAC;EACxC,CAAC;EAAAlF,MAAA,CACD8F,KAAK,GAAL,SAAAA,KAAKA,CAACD,OAAsB,EAAqC;IAC7D,MAAM,IAAAX,oBAAa,EAAC,eAAe,CAAC;EACxC,CAAC;EAAA,WAAAa,aAAA,CAAAC,OAAA,EAAAvH,WAAA;IAAAwH,GAAA;IAAAC,GAAA,EAnYD,SAAAA,CAAA,EAAmC;MAC/B,IAAI,CAAC,IAAI,CAACC,EAAE,EAAE;QACV,IAAMC,QAAQ,GAAG,IAAI,CAACvH,UAAU,CAACwH,WAAW,CAACC,IAAI;QAC7C;AAChB;AACA;AACA;QACgB,IAAAC,iBAAM,EAAEC,IAAS,IAAK,CAACA,IAAI,CAACC,OAAO,CAAC;QACpC;AAChB;AACA;AACA;QACgB,IAAAC,oBAAS,EAAC,IAAI,CAAC;QACf;QACA,IAAAC,mBAAQ,EAAC,MAAM1D,YAAY,CAAC,IAAW,CAAC,CAAC;QACzC;QACA,IAAA2D,cAAG,EAAC,MAAM,IAAI,CAACpH,OAAO,CAAC;QACvB;QACA,IAAAqH,sBAAW,EAACC,iCAA0B,CAAC;QACvC;QACA,IAAAC,+BAAoB,EAAC,CAACC,IAA2C,EAAEC,IAA2C,KAAK;UAC/G,IAAID,IAAI,IAAIA,IAAI,CAACE,IAAI,KAAK,IAAA7F,qBAAc,EAAC4F,IAAI,CAAC,CAACC,IAAI,EAAE;YACjD,OAAO,IAAI;UACf,CAAC,MAAM;YACH,OAAO,KAAK;UAChB;QACJ,CAAC,CAAC,EACF,IAAAX,iBAAM,EAAEvF,MAA6C,IAAK,CAAC,CAACA,MAAM,CAAC;QACnE;AAChB;AACA;AACA;QACgB,IAAA4F,cAAG,EAAE5F,MAA6C,IAAK;UACnD,OAAO,IAAAK,qBAAc,EAACL,MAAM,CAAC,CAACmC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CACL,CAAC;QAED,IAAI,CAACgD,EAAE,GAAG,IAAAgB,WAAK,EACXf,QAAQ;QACR;AAChB;AACA;AACA;QACgB,IAAI,CAAC9G,SAAS,CAACgH,IAAI,CACf,IAAAC,iBAAM,EAAC,MAAM,KAAK,CACtB,CACJ,CAAC;MACL;MACA,OAAO,IAAI,CAACJ,EAAE;IAClB;EAAC;IAAAF,GAAA;IAAAC,GAAA,EAED,SAAAA,CAAA,EAAgD;MAC5C,IAAMkB,UAAU,GAAG,IAAI,CAACvI,UAAU,CAACwB,QAAQ,CAACgH,oBAAoB,CAAC,CAAC;MAClE,OAAOD,UAAU,CAACE,cAAc,CAC5B,IAAI,CAACC,CAAC,EACNC,SAAS,EACT,IAAI,CAAC3I,UAAU,CAACwB,QACpB,CAAC;IACL;;IAEA;;IAGA;AACJ;AACA;AACA;EAHI;IAAA4F,GAAA;IAAAC,GAAA,EAmKA,SAAAA,CAAA,EAAmD;MAC/C,OAAO,IAAAuB,gCAAyB,EAC5B,IAAI,EACJ,iBAAiB,EACjB,IAAAC,kCAAmB,EACf,IAAI,CAAC7I,UAAU,CAACiB,MAAM,CAACqE,UAAU,EACjC,IAAI,CAACvF,UAAU,EACf,IAAI,CAACD,EAAE,KAAK,OAChB,CACJ,CAAC;IACL;;IAEA;AACJ;AACA;AACA;EAHI;IAAAsH,GAAA;IAAAC,GAAA,EAIA,SAAAA,CAAA,EAAiE;MAC7D,IAAMpG,MAAM,GAAG,IAAI,CAACjB,UAAU,CAACiB,MAAM,CAACqE,UAAU;MAChD,OAAO,IAAAsD,gCAAyB,EAC5B,IAAI,EACJ,cAAc,EACd,IAAAE,8BAAe,EACX7H,MAAM,EACN,IAAI,CAACyD,eACT,CACJ,CAAC;IACL;EAAC;IAAA0C,GAAA;IAAAC,GAAA,EAoFD,SAAAA,CAAA,EAAmD;MAC/C,OAAO,IAAI;IACf;EAAC;AAAA;AAqDE,SAAStG,gBAAgBA,CAAA,EAAqC;EACjE,OAAO;IACH0B,QAAQ,EAAE,CAAC;EACf,CAAC;AACL;;AAEA;AACA;AACA;AACO,SAASsG,gBAAgBA,CAC5BhE,OAAmD,EACb;EACtC,OAAOA,OAAO,CAAC/E,UAAU,CAACV,WAAW,CAAC0J,UAAU,CAACjE,OAAc,CAAC;AACpE;AAEO,SAASkE,aAAaA,CACzBnJ,EAAa,EACb+D,QAA+B,EAC/B7D,UAAmC,EACnCC,KAAW,EACb;EACE,IAAAmF,qBAAc,EAAC,kBAAkB,EAAE;IAC/BtF,EAAE;IACF+D,QAAQ;IACR7D,UAAU;IACVC;EACJ,CAAC,CAAC;EAEF,IAAIiJ,GAAG,GAAG,IAAItJ,WAAW,CAAiBE,EAAE,EAAE+D,QAAQ,EAAE7D,UAAU,EAAEC,KAAK,CAAC;;EAE1E;EACAiJ,GAAG,GAAGH,gBAAgB,CAACG,GAAG,CAAC;EAC3B,IAAAC,mCAAuB,EAACnJ,UAAU,CAAC;EAEnC,OAAOkJ,GAAG;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASE,gBAAgBA,CAACrE,OAA8B,EAAW;EAC/D,IAAMsE,wBAAwB,GAAGtE,OAAO,CAACkB,SAAS,CAACjG,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC,CAAC;EAC7F,IAAIyC,OAAO,CAACnE,kBAAkB,IAAIyI,wBAAwB,EAAE;IACxD,OAAO,IAAI;EACf,CAAC,MAAM;IACH,OAAO,KAAK;EAChB;AACJ;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASjF,YAAYA,CAACW,OAA8B,EAAoB;EACpE,IAAIA,OAAO,CAAC/E,UAAU,CAACsJ,gBAAgB,CAACC,IAAI,GAAG,CAAC,EAAE;IAC9C,OAAOC,OAAO,CAACC,GAAG,CAAC7H,KAAK,CAACC,IAAI,CAACkD,OAAO,CAAC/E,UAAU,CAACsJ,gBAAgB,CAAC,CAACvB,GAAG,CAAC2B,EAAE,IAAIA,EAAE,CAAC,CAAC,CAAC,CAAC,CAC9EC,IAAI,CAAC,MAAM;MACR5E,OAAO,CAAClE,iBAAiB,GAAGkE,OAAO,CAAClE,iBAAiB,CAChD8I,IAAI,CAAC,MAAMC,aAAa,CAAC7E,OAAO,CAAC,CAAC;MACvC,OAAOA,OAAO,CAAClE,iBAAiB;IACpC,CAAC,CAAC;EACV;EAEAkE,OAAO,CAAClE,iBAAiB,GAAGkE,OAAO,CAAClE,iBAAiB,CAChD8I,IAAI,CAAC,MAAMC,aAAa,CAAC7E,OAAO,CAAC,CAAC;EACvC,OAAOA,OAAO,CAAClE,iBAAiB;AACpC;;AAEA;AACA;AACA;AACA;AACA,SAAS+I,aAAaA,CAAY7E,OAAoC,EAAoB;EACtF;AACJ;AACA;AACA;AACA;AACA;EACIA,OAAO,CAACxE,gBAAgB,GAAG,EAAEZ,iBAAiB;;EAE9C;AACJ;AACA;EACI;EACI;EACAoF,OAAO,CAAC/E,UAAU,CAACwB,QAAQ,CAACqI,MAAM;EAClC;EACAT,gBAAgB,CAACrE,OAAO,CAAC,EAC3B;IACE,OAAOjE,4BAAqB;EAChC;EAEA,IAAIoI,GAAG,GAAG,KAAK;EACf,IAAIY,UAAU,GAAG,KAAK,CAAC,CAAC;EACxB,IAAI/E,OAAO,CAACnE,kBAAkB,KAAK,CAAC,CAAC,EAAE;IACnC;IACAkJ,UAAU,GAAG,IAAI;EACrB;;EAEA;AACJ;AACA;EACI,IAAI,CAACA,UAAU,EAAE;IACb,IAAMC,kBAAkB,GAAGhF,OAAO,CAACkB,SAAS,CAACjG,UAAU,CAACqC,kBAAkB,CAAC2H,OAAO,CAACjF,OAAO,CAACnE,kBAAkB,GAAG,CAAC,CAAC;IAClH,IAAImJ,kBAAkB,KAAK,IAAI,EAAE;MAC7B;MACAD,UAAU,GAAG,IAAI;IACrB,CAAC,MAAM;MACH/E,OAAO,CAACnE,kBAAkB,GAAGmE,OAAO,CAACkB,SAAS,CAACjG,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC,CAAC;MACzF,IAAM2H,eAAkD,GAAGlF,OAAO,CAACkB,SAAS,CAACjG,UAAU,CAClFqC,kBAAkB,CAClB6H,iBAAiB,CAACH,kBAAkB,CAAC;MAE1C,IAAIhF,OAAO,CAACjF,EAAE,KAAK,OAAO,EAAE;QACxB;QACA,IAAMqK,aAAa,GAAG,IAAA3H,qBAAc,EAACuC,OAAO,CAACpE,OAAO,CAAC,CAAC+C,KAAK;QAC3D,IAAI0G,QAAQ,GAAGD,aAAa;QAC5BF,eAAe,CAACI,OAAO,CAACC,EAAE,IAAI;UAC1B,IAAMC,cAAc,GAAGD,EAAE,CAACE,oBAAoB,IAAIzF,OAAO,CAACQ,qBAAqB,CAAC+E,EAAE,CAACE,oBAAoB,CAAC;UACxG,IAAMC,YAAY,GAAG1F,OAAO,CAACQ,qBAAqB,CAAC+E,EAAE,CAACI,YAAY,CAAC;UAEnE,IAAI,CAACH,cAAc,IAAIE,YAAY,EAAE;YACjCL,QAAQ,EAAE;UACd;UACA,IAAIG,cAAc,IAAI,CAACE,YAAY,EAAE;YACjCL,QAAQ,EAAE;UACd;QACJ,CAAC,CAAC;QACF,IAAIA,QAAQ,KAAKD,aAAa,EAAE;UAC5BjB,GAAG,GAAG,IAAI,CAAC,CAAC;UACZnE,OAAO,CAAC1D,cAAc,CAAC+I,QAAe,CAAC;QAC3C;MACJ,CAAC,MAAM;QACH;QACA,IAAMO,iBAAiB,GAAG,IAAAC,gCAAmB,EACzC7F,OAAO,EACPkF,eACJ,CAAC;QACD,IAAIU,iBAAiB,CAACE,iBAAiB,EAAE;UACrC;UACAf,UAAU,GAAG,IAAI;QACrB,CAAC,MAAM,IAAIa,iBAAiB,CAACG,OAAO,EAAE;UAClC;UACA5B,GAAG,GAAG,IAAI,CAAC,CAAC;UACZnE,OAAO,CAAC1D,cAAc,CAACsJ,iBAAiB,CAACI,UAAiB,CAAC;QAC/D;MACJ;IACJ;EACJ;;EAEA;EACA,IAAIjB,UAAU,EAAE;IACZ,OAAO/E,OAAO,CAAC9C,iBAAiB,CAAC,CAAC,CAC7B0H,IAAI,CAACxH,MAAM,IAAI;MACZ,IAAMb,aAAa,GAAGa,MAAM,CAACA,MAAM;;MAEnC;AAChB;AACA;AACA;AACA;MACgB4C,OAAO,CAACnE,kBAAkB,GAAGuB,MAAM,CAACmB,OAAO;;MAE3C;MACA,IAAI,OAAOhC,aAAa,KAAK,QAAQ,EAAE;QACnC,IACI,CAACyD,OAAO,CAACpE,OAAO,IAChBW,aAAa,KAAKyD,OAAO,CAACpE,OAAO,CAAC+C,KAAK,EACzC;UACEwF,GAAG,GAAG,IAAI;UACVnE,OAAO,CAAC1D,cAAc,CAACC,aAAoB,CAAC;QAChD;QACA,OAAO4H,GAAG;MACd;MACA,IACI,CAACnE,OAAO,CAACpE,OAAO,IAChB,CAAC,IAAAqK,+BAAwB,EACrBjG,OAAO,CAAC/E,UAAU,CAACiB,MAAM,CAACC,WAAW,EACrCI,aAAa,EACbyD,OAAO,CAACpE,OAAO,CAACgC,QACpB,CAAC,EACH;QACEuG,GAAG,GAAG,IAAI,CAAC,CAAC;QACZnE,OAAO,CAAC1D,cAAc,CAACC,aAAoB,CAAC;MAChD;MACA,OAAO4H,GAAG;IACd,CAAC,CAAC;EACV;EACA,OAAOM,OAAO,CAACyB,OAAO,CAAC/B,GAAG,CAAC,CAAC,CAAC;AACjC;;AAGA;AACA;AACA;AACA;AACA;AACA;AACO,eAAenF,eAAeA,CACjCgB,OAAyD,EAS1D;EACC,IAAI5B,IAAiC,GAAG,EAAE;EAC1C,IAAMnD,UAAU,GAAG+E,OAAO,CAAC/E,UAAU;;EAErC;AACJ;AACA;AACA;AACA;AACA;EACI,IAAI+E,OAAO,CAAC/D,kBAAkB,EAAE;IAC5B,IAAMyB,QAAQ,GAAGsC,OAAO,CAAChF,UAAU,CAAC0C,QAAQ;IAC5C,IAAMvB,WAAW,GAAGlB,UAAU,CAACiB,MAAM,CAACC,WAAqB;IAC3D;IACA,IAAMgK,oBAAoB,GAAGzI,QAAQ,GAAIA,QAAQ,CAASvB,WAAW,CAAC,GAAGyH,SAAS;;IAElF;IACA,IAAMwC,iBAAiB,GAAG,OAAOD,oBAAoB,KAAK,QAAQ,IAC9DA,oBAAoB,KAAK,IAAI,IAC7BE,MAAM,CAACC,IAAI,CAACH,oBAAoB,CAAC,CAAClJ,MAAM,GAAG,CAAC;;IAEhD;IACA,IAAMsJ,iBAAiB,GAAG7I,QAAQ,GAAG2I,MAAM,CAACC,IAAI,CAAC5I,QAAQ,CAAC,CAACT,MAAM,GAAG,CAAC,GAAG,KAAK;;IAE7E;IACA,IAAMuJ,UAAU,GAAG3J,KAAK,CAAC8D,OAAO,CAACX,OAAO,CAAC/D,kBAAkB,CAAC,GACtD+D,OAAO,CAAC/D,kBAAkB,GAC1B,CAAC+D,OAAO,CAAC/D,kBAAkB,CAAC;IAClC,IAAMwK,MAAM,GAAG5J,KAAK,CAACC,IAAI,CAAC,IAAI4J,GAAG,CAACF,UAAU,CAAC,CAAC;;IAE9C;IACA,IAAMG,WAAqB,GAAG,EAAE;IAChCF,MAAM,CAACnB,OAAO,CAACsB,KAAK,IAAI;MACpB,IAAM7I,OAAO,GAAGiC,OAAO,CAAC/E,UAAU,CAAC+C,SAAS,CAACC,6BAA6B,CAAC2I,KAAK,CAAC;MACjF,IAAI7I,OAAO,IAAI,CAACA,OAAO,CAACG,QAAQ,EAAE;QAC9BE,IAAI,CAACD,IAAI,CAACJ,OAAO,CAAC;MACtB,CAAC,MAAM,IAAI,CAACA,OAAO,EAAE;QACjB;QACA4I,WAAW,CAACxI,IAAI,CAACyI,KAAK,CAAC;MAC3B;MACA;IACJ,CAAC,CAAC;;IAEF;IACA,IAAID,WAAW,CAAC1J,MAAM,GAAG,CAAC,EAAE;MACxB,IAAM4J,eAAe,GAAG,MAAM5L,UAAU,CAACoD,eAAe,CAACC,iBAAiB,CAACqI,WAAW,EAAE,KAAK,CAAC;MAC9FvI,IAAI,GAAGA,IAAI,CAAC0I,MAAM,CAACD,eAAe,CAAC;IACvC;;IAEA;IACA,IAAIT,iBAAiB,IAAIG,iBAAiB,EAAE;MACxCnI,IAAI,GAAGA,IAAI,CAACuE,MAAM,CAACxB,GAAG,IAAInB,OAAO,CAACS,YAAY,CAACU,GAAG,CAAC,CAAC;IACxD;;IAEA;AACR;AACA;AACA;AACA;IACQ;IACA,IAAI/C,IAAI,CAACnB,MAAM,GAAG,CAAC,EAAE;MACjB,IAAMuB,aAAa,GAAGwB,OAAO,CAACvB,gBAAgB,CAAC,CAAC;MAChD,IAAMsI,cAAc,GAAG,IAAAC,gCAAiB,EAAC/L,UAAU,CAACiB,MAAM,CAACqE,UAAU,EAAE/B,aAAa,CAACY,KAAK,CAAC;MAC3FhB,IAAI,GAAGA,IAAI,CAAC0D,IAAI,CAACiF,cAAc,CAAC;IACpC;;IAEA;IACA,IAAM/E,IAAI,GAAG,OAAOhC,OAAO,CAAChF,UAAU,CAACgH,IAAI,KAAK,QAAQ,IAAIhC,OAAO,CAAChF,UAAU,CAACgH,IAAI,GAAG,CAAC,GACjFhC,OAAO,CAAChF,UAAU,CAACgH,IAAI,GACvB,CAAC;IACP,IAAIA,IAAI,GAAG,CAAC,EAAE;MACV5D,IAAI,GAAGA,IAAI,CAAC6I,KAAK,CAACjF,IAAI,CAAC;IAC3B;;IAEA;IACA,IAAMkF,aAAa,GAAG,OAAOlH,OAAO,CAAChF,UAAU,CAACkH,KAAK,KAAK,QAAQ,IAAIlC,OAAO,CAAChF,UAAU,CAACkH,KAAK,GAAG,CAAC;IAClG,IAAIgF,aAAa,EAAE;MACf,IAAMhF,KAAK,GAAGlC,OAAO,CAAChF,UAAU,CAACkH,KAAe;MAChD9D,IAAI,GAAGA,IAAI,CAAC6I,KAAK,CAAC,CAAC,EAAE/E,KAAK,CAAC;IAC/B;EAEJ,CAAC,MAAM;IACH,IAAM1D,cAAa,GAAGwB,OAAO,CAACvB,gBAAgB,CAAC,CAAC;IAChD,IAAMM,WAAW,GAAG,MAAM9D,UAAU,CAACoD,eAAe,CAACe,KAAK,CAACZ,cAAa,CAAC;IACzEJ,IAAI,GAAGW,WAAW,CAACoI,SAAS;EAChC;EAEA,OAAO;IACH/I,IAAI;IACJG,OAAO,EAAEtD,UAAU,CAACqC,kBAAkB,CAACC,UAAU,CAAC;EACtD,CAAC;AAEL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAStB,kBAAkBA,CAC9BE,WAAmB,EACnBiD,KAAsB,EACG;EACzB;EACA;EACA;EACA,IACIA,KAAK,CAAC1B,QAAQ,IACd2I,MAAM,CAAChK,SAAS,CAAC+K,cAAc,CAACC,IAAI,CAACjI,KAAK,CAAC1B,QAAQ,EAAEvB,WAAW,CAAC,EACnE;IACE,IAAMyD,KAAU,GAAIR,KAAK,CAAC1B,QAAQ,CAASvB,WAAW,CAAC;IACvD,IAAI,OAAOyD,KAAK,KAAK,QAAQ,EAAE;MAC3B,OAAOA,KAAK;IAChB,CAAC,MAAM,IACH,OAAOA,KAAK,CAACM,GAAG,KAAK,QAAQ,EAC/B;MACE,OAAON,KAAK,CAACM,GAAG;IACpB;;IAEA;IACA,IACIrD,KAAK,CAAC8D,OAAO,CAACf,KAAK,CAACjC,GAAG,CAAC;IACxB;IACA,CAAEiC,KAAK,CAACjC,GAAG,CAAW2J,IAAI,CAACC,CAAC,IAAI,OAAOA,CAAC,KAAK,QAAQ,CAAC,EACxD;MACE,OAAO3H,KAAK,CAACjC,GAAG;IACpB;EACJ;EACA,OAAO,KAAK;AAChB;AAIO,SAAS6J,SAASA,CAACC,GAAQ,EAAW;EACzC,OAAOA,GAAG,YAAY5M,WAAW;AACrC","ignoreList":[]}
1
+ {"version":3,"file":"rx-query.js","names":["_rxjs","require","_operators","_index","_rxError","_hooks","_eventReduce","_queryCache","_rxQueryHelper","_rxQuerySingleResult","_queryCount","newQueryID","_ensureEqualCount","RxQueryBase","exports","op","mangoQuery","collection","other","id","_execOverDatabaseCount","_creationTime","Date","now","_lastEnsureEqual","uncached","_refCount$","_result","_latestChangeEvent","_ensureEqualQueue","PROMISE_RESOLVE_FALSE","_getDefaultQuery","isFindOneByIdQuery","schema","primaryPath","_proto","prototype","_setResultData","newResultData","newRxError","database","name","RxQuerySingleResult","Map","Array","from","values","newQueryResult","length","_execOverDatabase","rerunCount","result","counterBefore","_changeEventBuffer","getCounter","ids","ensureNotFalsy","selector","$in","docsData","mustBeQueried","i","docData","_docCache","getLatestDocumentDataIfExists","_deleted","push","docs","storageInstance","findDocumentsById","counter","preparedQuery","getPreparedQuery","countResult","count","mode","allowSlowCount","queryObj","queryResult","queryCollection","promiseWait","exec","throwIfMissing","query","_ensureEqual","useResult","getValue","toString","value","sortedIds","slice","sort","JSON","stringify","stringObj","sortObject","normalizedQuery","hookInput","rxQuery","clone","$eq","index","unshift","runPluginHooks","prepareQuery","jsonSchema","doesDocumentDataMatch","queryMatcher","remove","isArray","bulkRemove","error","rxStorageWriteErrorToRxError","success","incrementalRemove","runQueryUpdateFunction","asRxQuery","doc","update","_updateObj","pluginMissing","patch","incrementalPatch","modify","mutationFunction","incrementalModify","where","_queryObj","_params","skip","_amount","limit","_createClass2","default","key","get","BehaviorSubject","_$","results$","eventBulks$","pipe","filter","bulk","isLocal","startWith","mergeMap","map","shareReplay","RXJS_SHARE_REPLAY_DEFAULTS","distinctUntilChanged","prev","curr","time","merge","refCount$","reactivity","getReactivityFactory","fromObservable","$","undefined","overwriteGetterForCaching","normalizeMangoQuery","getQueryMatcher","tunnelQueryCache","getByQuery","createRxQuery","ret","triggerCacheReplacement","_isResultsInSync","currentLatestEventNumber","awaitBeforeReads","size","Promise","all","fn","then","__ensureEqual","closed","mustReExec","missedChangeEvents","getFrom","runChangeEvents","reduceByLastOfDoc","previousCount","newCount","forEach","cE","didMatchBefore","previousDocumentData","doesMatchNow","documentData","eventReduceResult","calculateNewResults","runFullQueryAgain","changed","newResults","areRxDocumentArraysEqual","resolve","primarySelectorValue","hasExtraOperators","Object","keys","hasOtherSelectors","docIdArray","docIds","Set","cacheMisses","docId","docsFromStorage","concat","sortComparator","getSortComparator","limitIsNumber","documents","hasOwnProperty","call","find","r","isRxQuery","obj"],"sources":["../../src/rx-query.ts"],"sourcesContent":["import {\r\n BehaviorSubject,\r\n Observable,\r\n merge\r\n} from 'rxjs';\r\nimport {\r\n mergeMap,\r\n filter,\r\n map,\r\n startWith,\r\n distinctUntilChanged,\r\n shareReplay\r\n} from 'rxjs/operators';\r\nimport {\r\n sortObject,\r\n pluginMissing,\r\n overwriteGetterForCaching,\r\n clone,\r\n PROMISE_RESOLVE_FALSE,\r\n RXJS_SHARE_REPLAY_DEFAULTS,\r\n ensureNotFalsy,\r\n areRxDocumentArraysEqual,\r\n promiseWait\r\n} from './plugins/utils/index.ts';\r\nimport {\r\n newRxError,\r\n rxStorageWriteErrorToRxError\r\n} from './rx-error.ts';\r\nimport {\r\n runPluginHooks\r\n} from './hooks.ts';\r\nimport type {\r\n RxCollection,\r\n RxDocument,\r\n RxQueryOP,\r\n RxQuery,\r\n MangoQuery,\r\n MangoQuerySortPart,\r\n MangoQuerySelector,\r\n PreparedQuery,\r\n FilledMangoQuery,\r\n RxDocumentWriteData,\r\n RxDocumentData,\r\n QueryMatcher,\r\n ModifyFunction,\r\n RxStorageChangeEvent,\r\n Reactified\r\n} from './types/index.d.ts';\r\nimport { calculateNewResults } from './event-reduce.ts';\r\nimport { triggerCacheReplacement } from './query-cache.ts';\r\nimport {\r\n getQueryMatcher,\r\n getSortComparator,\r\n normalizeMangoQuery,\r\n prepareQuery,\r\n runQueryUpdateFunction\r\n\r\n} from './rx-query-helper.ts';\r\nimport { RxQuerySingleResult } from './rx-query-single-result.ts';\r\n\r\nlet _queryCount = 0;\r\nconst newQueryID = function (): number {\r\n return ++_queryCount;\r\n};\r\n\r\n/**\r\n * Counter for _lastEnsureEqual.\r\n * We only need ordering and zero-check for cache replacement,\r\n * so a counter is cheaper than Date.now().\r\n */\r\nlet _ensureEqualCount = 0;\r\n\r\nexport class RxQueryBase<\r\n RxDocType,\r\n RxQueryResult,\r\n OrmMethods = {},\r\n Reactivity = unknown,\r\n> {\r\n\r\n public id: number = newQueryID();\r\n\r\n /**\r\n * Some stats then are used for debugging and cache replacement policies\r\n */\r\n public _execOverDatabaseCount: number = 0;\r\n /**\r\n * @performance\r\n * Use Date.now() instead of now() for creation time.\r\n * The monotonic uniqueness guarantee of now() is not needed here\r\n * since _creationTime is only used by the cache replacement policy\r\n * for rough lifetime comparisons.\r\n */\r\n public _creationTime = Date.now();\r\n\r\n // used in the query-cache to determine if the RxQuery can be cleaned up.\r\n // 0 means never executed. Updated to an incrementing counter on each _ensureEqual call.\r\n public _lastEnsureEqual = 0;\r\n\r\n public uncached = false;\r\n\r\n // used to count the subscribers to the query\r\n // Lazy-initialized to avoid BehaviorSubject overhead for .exec()-only queries\r\n public _refCount$: BehaviorSubject<null> | null = null;\r\n public get refCount$(): BehaviorSubject<null> {\r\n if (!this._refCount$) {\r\n this._refCount$ = new BehaviorSubject<null>(null);\r\n }\r\n return this._refCount$;\r\n }\r\n\r\n public isFindOneByIdQuery: false | string | string[];\r\n\r\n\r\n /**\r\n * Contains the current result state\r\n * or null if query has not run yet.\r\n */\r\n public _result: RxQuerySingleResult<RxDocType> | null = null;\r\n\r\n\r\n constructor(\r\n public op: RxQueryOP,\r\n public mangoQuery: Readonly<MangoQuery<RxDocType>>,\r\n public collection: RxCollection<RxDocType>,\r\n // used by some plugins\r\n public other: any = {}\r\n ) {\r\n if (!mangoQuery) {\r\n this.mangoQuery = _getDefaultQuery();\r\n }\r\n\r\n /**\r\n * @performance\r\n * isFindOneByIdQuery is only used by queryCollection()\r\n * which is not called for 'count' queries.\r\n * Skip the check for count queries to avoid unnecessary work.\r\n */\r\n if (op === 'count') {\r\n this.isFindOneByIdQuery = false;\r\n } else {\r\n this.isFindOneByIdQuery = isFindOneByIdQuery(\r\n this.collection.schema.primaryPath as string,\r\n mangoQuery\r\n );\r\n }\r\n }\r\n get $(): Observable<RxQueryResult> {\r\n if (!this._$) {\r\n const results$ = this.collection.eventBulks$.pipe(\r\n /**\r\n * Performance shortcut.\r\n * Changes to local documents are not relevant for the query.\r\n */\r\n filter((bulk: any) => !bulk.isLocal),\r\n /**\r\n * Start once to ensure the querying also starts\r\n * when there where no changes.\r\n */\r\n startWith(null),\r\n // ensure query results are up to date.\r\n mergeMap(() => _ensureEqual(this as any)),\r\n // use the current result set, written by _ensureEqual().\r\n map(() => this._result),\r\n // do not run stuff above for each new subscriber, only once.\r\n shareReplay(RXJS_SHARE_REPLAY_DEFAULTS),\r\n // do not proceed if result set has not changed.\r\n distinctUntilChanged((prev: RxQuerySingleResult<RxDocType> | null, curr: RxQuerySingleResult<RxDocType> | null) => {\r\n if (prev && prev.time === ensureNotFalsy(curr).time) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n filter((result: RxQuerySingleResult<RxDocType> | null) => !!result),\r\n /**\r\n * Map the result set to a single RxDocument or an array,\r\n * depending on query type\r\n */\r\n map((result: RxQuerySingleResult<RxDocType> | null) => {\r\n return ensureNotFalsy(result).getValue();\r\n })\r\n );\r\n\r\n this._$ = merge<any>(\r\n results$,\r\n /**\r\n * Also add the refCount$ to the query observable\r\n * to allow us to count the amount of subscribers.\r\n */\r\n this.refCount$.pipe(\r\n filter(() => false)\r\n )\r\n );\r\n }\r\n return this._$ as any;\r\n }\r\n\r\n get $$(): Reactified<Reactivity, RxQueryResult> {\r\n const reactivity = this.collection.database.getReactivityFactory();\r\n return reactivity.fromObservable(\r\n this.$,\r\n undefined,\r\n this.collection.database\r\n ) as any;\r\n }\r\n\r\n // stores the changeEvent-number of the last handled change-event\r\n public _latestChangeEvent: -1 | number = -1;\r\n\r\n /**\r\n * ensures that the exec-runs\r\n * are not run in parallel\r\n */\r\n public _ensureEqualQueue: Promise<boolean> = PROMISE_RESOLVE_FALSE;\r\n\r\n /**\r\n * Returns an observable that emits the results\r\n * This should behave like an rxjs-BehaviorSubject which means:\r\n * - Emit the current result-set on subscribe\r\n * - Emit the new result-set when an RxChangeEvent comes in\r\n * - Do not emit anything before the first result-set was created (no null)\r\n */\r\n public _$?: Observable<RxQueryResult>;\r\n\r\n /**\r\n * set the new result-data as result-docs of the query\r\n * @param newResultData json-docs that were received from the storage\r\n */\r\n _setResultData(newResultData: RxDocumentData<RxDocType>[] | number | Map<string, RxDocumentData<RxDocType>>): void {\r\n if (typeof newResultData === 'undefined') {\r\n throw newRxError('QU18', {\r\n database: this.collection.database.name,\r\n collection: this.collection.name\r\n });\r\n }\r\n if (typeof newResultData === 'number') {\r\n this._result = new RxQuerySingleResult<RxDocType>(\r\n this as any,\r\n [],\r\n newResultData\r\n );\r\n return;\r\n } else if (newResultData instanceof Map) {\r\n newResultData = Array.from((newResultData as Map<string, RxDocumentData<RxDocType>>).values());\r\n }\r\n\r\n const newQueryResult = new RxQuerySingleResult<RxDocType>(\r\n this as any,\r\n newResultData,\r\n newResultData.length\r\n );\r\n this._result = newQueryResult;\r\n }\r\n\r\n /**\r\n * executes the query on the database\r\n * @return results-array with document-data\r\n */\r\n async _execOverDatabase(rerunCount = 0): Promise<{\r\n result: RxDocumentData<RxDocType>[] | number;\r\n counter: number;\r\n }> {\r\n this._execOverDatabaseCount = this._execOverDatabaseCount + 1;\r\n let result: {\r\n result: RxDocumentData<RxDocType>[] | number;\r\n counter: number;\r\n };\r\n\r\n /**\r\n * @performance\r\n * Instead of subscribing to eventBulks$ to detect concurrent writes,\r\n * we snapshot the change event counter before and after the query.\r\n * If the counter changed, a write happened during execution and\r\n * we must re-run the query to ensure correct results.\r\n * This avoids the overhead of RxJS Subject subscribe/unsubscribe per query.\r\n *\r\n * @link https://github.com/pubkey/rxdb/issues/7067\r\n */\r\n const counterBefore = this.collection._changeEventBuffer.getCounter();\r\n\r\n if (this.op === 'findByIds') {\r\n const ids: string[] = ensureNotFalsy(this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\r\n const docsData: RxDocumentData<RxDocType>[] = [];\r\n const mustBeQueried: string[] = [];\r\n // first try to fill from docCache\r\n for (let i = 0; i < ids.length; i++) {\r\n const id = ids[i];\r\n const docData = this.collection._docCache.getLatestDocumentDataIfExists(id);\r\n if (docData) {\r\n if (!docData._deleted) {\r\n docsData.push(docData);\r\n }\r\n } else {\r\n mustBeQueried.push(id);\r\n }\r\n }\r\n // everything which was not in docCache must be fetched from the storage\r\n if (mustBeQueried.length > 0) {\r\n const docs = await this.collection.storageInstance.findDocumentsById(mustBeQueried, false);\r\n for (let i = 0; i < docs.length; i++) {\r\n docsData.push(docs[i]);\r\n }\r\n }\r\n result = {\r\n result: docsData,\r\n counter: this.collection._changeEventBuffer.getCounter()\r\n };\r\n } else if (this.op === 'count') {\r\n const preparedQuery = this.getPreparedQuery();\r\n const countResult = await this.collection.storageInstance.count(preparedQuery);\r\n if (countResult.mode === 'slow' && !this.collection.database.allowSlowCount) {\r\n throw newRxError('QU14', {\r\n collection: this.collection,\r\n queryObj: this.mangoQuery\r\n });\r\n } else {\r\n result = {\r\n result: countResult.count,\r\n counter: this.collection._changeEventBuffer.getCounter()\r\n };\r\n }\r\n } else {\r\n const queryResult = await queryCollection<RxDocType>(this as any);\r\n result = {\r\n result: queryResult.docs,\r\n counter: queryResult.counter\r\n };\r\n }\r\n\r\n if (this.collection._changeEventBuffer.getCounter() !== counterBefore) {\r\n await promiseWait(rerunCount * 20);\r\n return this._execOverDatabase(rerunCount + 1);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Execute the query\r\n * To have an easier implementations,\r\n * just subscribe and use the first result\r\n */\r\n public exec(throwIfMissing: true): Promise<RxDocument<RxDocType, OrmMethods, Reactivity>>;\r\n public exec(): Promise<RxQueryResult>;\r\n public async exec(throwIfMissing?: boolean): Promise<any> {\r\n if (throwIfMissing && this.op !== 'findOne') {\r\n throw newRxError('QU9', {\r\n collection: this.collection.name,\r\n query: this.mangoQuery,\r\n op: this.op\r\n });\r\n }\r\n\r\n /**\r\n * run _ensureEqual() here,\r\n * this will make sure that errors in the query which throw inside of the RxStorage,\r\n * will be thrown at this execution context and not in the background.\r\n */\r\n await _ensureEqual(this as any);\r\n const useResult = ensureNotFalsy(this._result);\r\n return useResult.getValue(throwIfMissing);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Returns the normalized query.\r\n * Caches the result so that multiple calls to\r\n * queryMatcher, toString() and getPreparedQuery()\r\n * do not have to run the normalization again.\r\n * @overwrites itself with the actual value.\r\n */\r\n get normalizedQuery(): FilledMangoQuery<RxDocType> {\r\n return overwriteGetterForCaching(\r\n this,\r\n 'normalizedQuery',\r\n normalizeMangoQuery<RxDocType>(\r\n this.collection.schema.jsonSchema,\r\n this.mangoQuery,\r\n this.op === 'count'\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * cached call to get the queryMatcher\r\n * @overwrites itself with the actual value\r\n */\r\n get queryMatcher(): QueryMatcher<RxDocumentWriteData<RxDocType>> {\r\n const schema = this.collection.schema.jsonSchema;\r\n return overwriteGetterForCaching(\r\n this,\r\n 'queryMatcher',\r\n getQueryMatcher(\r\n schema,\r\n this.normalizedQuery\r\n ) as any\r\n );\r\n }\r\n\r\n /**\r\n * returns a string that is used for equal-comparisons\r\n * @overwrites itself with the actual value\r\n */\r\n toString(): string {\r\n /**\r\n * For findByIds queries, build the cache key directly from the IDs\r\n * to avoid the expensive normalizeMangoQuery + sortObject + JSON.stringify.\r\n * The selector structure is guaranteed by findByIds() which always creates\r\n * { [primaryPath]: { $in: ids } }\r\n */\r\n let value: string;\r\n if (this.op === 'findByIds') {\r\n const ids: string[] = (this.mangoQuery.selector as any)[this.collection.schema.primaryPath].$in;\r\n // slice() is needed because sort() mutates the array in-place\r\n const sortedIds = ids.slice().sort();\r\n value = '|findByIds|' + JSON.stringify(sortedIds);\r\n } else {\r\n const stringObj = sortObject({\r\n op: this.op,\r\n query: this.normalizedQuery,\r\n other: this.other\r\n }, true);\r\n value = JSON.stringify(stringObj);\r\n }\r\n this.toString = () => value;\r\n return value;\r\n }\r\n\r\n /**\r\n * returns the prepared query\r\n * which can be sent to the storage instance to query for documents.\r\n * @overwrites itself with the actual value.\r\n */\r\n getPreparedQuery(): PreparedQuery<RxDocType> {\r\n const hookInput = {\r\n rxQuery: this,\r\n // can be mutated by the hooks so we have to deep clone first.\r\n mangoQuery: clone(this.normalizedQuery) as FilledMangoQuery<RxDocType>\r\n };\r\n (hookInput.mangoQuery.selector as any)._deleted = { $eq: false };\r\n if (hookInput.mangoQuery.index) {\r\n hookInput.mangoQuery.index.unshift('_deleted');\r\n }\r\n runPluginHooks('prePrepareQuery', hookInput);\r\n\r\n const value = prepareQuery(\r\n this.collection.schema.jsonSchema,\r\n hookInput.mangoQuery as any\r\n );\r\n\r\n this.getPreparedQuery = () => value;\r\n return value;\r\n }\r\n\r\n /**\r\n * returns true if the document matches the query,\r\n * does not use the 'skip' and 'limit'\r\n */\r\n doesDocumentDataMatch(docData: RxDocType | any): boolean {\r\n // if doc is deleted, it cannot match\r\n if (docData._deleted) {\r\n return false;\r\n }\r\n\r\n return this.queryMatcher(docData);\r\n }\r\n\r\n /**\r\n * deletes all found documents\r\n * @return promise with deleted documents\r\n */\r\n async remove(throwIfMissing?: boolean): Promise<RxQueryResult> {\r\n if (throwIfMissing && this.op !== 'findOne') {\r\n throw newRxError('QU9', {\r\n collection: this.collection.name,\r\n query: this.mangoQuery,\r\n op: this.op\r\n });\r\n }\r\n const docs = await this.exec();\r\n if (Array.isArray(docs)) {\r\n const result = await this.collection.bulkRemove(docs);\r\n if (result.error.length > 0) {\r\n throw rxStorageWriteErrorToRxError(result.error[0]);\r\n } else {\r\n return result.success as any;\r\n }\r\n } else {\r\n // findOne() can return null when no document matches\r\n if (!docs) {\r\n if (throwIfMissing) {\r\n throw newRxError('QU10', {\r\n collection: this.collection.name,\r\n query: this.mangoQuery,\r\n op: this.op\r\n });\r\n }\r\n return null as any;\r\n }\r\n return (docs as any).remove();\r\n }\r\n }\r\n incrementalRemove(): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalRemove(),\r\n );\r\n }\r\n\r\n\r\n /**\r\n * helper function to transform RxQueryBase to RxQuery type\r\n */\r\n get asRxQuery(): RxQuery<RxDocType, RxQueryResult> {\r\n return this as any;\r\n }\r\n\r\n /**\r\n * updates all found documents\r\n * @overwritten by plugin (optional)\r\n */\r\n update(_updateObj: any): Promise<RxQueryResult> {\r\n throw pluginMissing('update');\r\n }\r\n\r\n patch(patch: Partial<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.patch(patch),\r\n );\r\n }\r\n incrementalPatch(patch: Partial<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalPatch(patch),\r\n );\r\n }\r\n modify(mutationFunction: ModifyFunction<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.modify(mutationFunction),\r\n );\r\n }\r\n incrementalModify(mutationFunction: ModifyFunction<RxDocType>): Promise<RxQueryResult> {\r\n return runQueryUpdateFunction(\r\n this.asRxQuery,\r\n (doc) => doc.incrementalModify(mutationFunction),\r\n );\r\n }\r\n\r\n\r\n // we only set some methods of query-builder here\r\n // because the others depend on these ones\r\n where(_queryObj: MangoQuerySelector<RxDocType> | keyof RxDocType | string): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n sort(_params: string | MangoQuerySortPart<RxDocType>): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n skip(_amount: number | null): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n limit(_amount: number | null): RxQuery<RxDocType, RxQueryResult> {\r\n throw pluginMissing('query-builder');\r\n }\r\n}\r\n\r\n\r\nexport function _getDefaultQuery<RxDocType>(): MangoQuery<RxDocType> {\r\n return {\r\n selector: {}\r\n };\r\n}\r\n\r\n/**\r\n * run this query through the QueryCache\r\n */\r\nexport function tunnelQueryCache<RxDocumentType, RxQueryResult>(\r\n rxQuery: RxQueryBase<RxDocumentType, RxQueryResult>\r\n): RxQuery<RxDocumentType, RxQueryResult> {\r\n return rxQuery.collection._queryCache.getByQuery(rxQuery as any);\r\n}\r\n\r\nexport function createRxQuery<RxDocType>(\r\n op: RxQueryOP,\r\n queryObj: MangoQuery<RxDocType>,\r\n collection: RxCollection<RxDocType>,\r\n other?: any\r\n) {\r\n runPluginHooks('preCreateRxQuery', {\r\n op,\r\n queryObj,\r\n collection,\r\n other\r\n });\r\n\r\n let ret = new RxQueryBase<RxDocType, any>(op, queryObj, collection, other);\r\n\r\n // ensure when created with same params, only one is created\r\n ret = tunnelQueryCache(ret);\r\n triggerCacheReplacement(collection);\r\n\r\n return ret;\r\n}\r\n\r\n/**\r\n * Check if the current results-state is in sync with the database\r\n * which means that no write event happened since the last run.\r\n * @return false if not which means it should re-execute\r\n */\r\nfunction _isResultsInSync(rxQuery: RxQueryBase<any, any>): boolean {\r\n const currentLatestEventNumber = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\r\n if (rxQuery._latestChangeEvent >= currentLatestEventNumber) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * wraps __ensureEqual()\r\n * to ensure it does not run in parallel\r\n * @return true if has changed, false if not\r\n *\r\n * @performance\r\n * Avoid async wrapper when awaitBeforeReads is empty (common case).\r\n * This eliminates one unnecessary Promise allocation per query execution.\r\n */\r\nfunction _ensureEqual(rxQuery: RxQueryBase<any, any>): Promise<boolean> {\r\n if (rxQuery.collection.awaitBeforeReads.size > 0) {\r\n return Promise.all(Array.from(rxQuery.collection.awaitBeforeReads).map(fn => fn()))\r\n .then(() => {\r\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\r\n .then(() => __ensureEqual(rxQuery));\r\n return rxQuery._ensureEqualQueue;\r\n });\r\n }\r\n\r\n rxQuery._ensureEqualQueue = rxQuery._ensureEqualQueue\r\n .then(() => __ensureEqual(rxQuery));\r\n return rxQuery._ensureEqualQueue;\r\n}\r\n\r\n/**\r\n * ensures that the results of this query is equal to the results which a query over the database would give\r\n * @return true if results have changed\r\n */\r\nfunction __ensureEqual<RxDocType>(rxQuery: RxQueryBase<RxDocType, any>): Promise<boolean> {\r\n /**\r\n * @performance\r\n * Use a counter instead of Date.now() since _lastEnsureEqual\r\n * is only used by the cache replacement policy for sorting queries\r\n * by last usage and zero-check, not for time-based comparison.\r\n */\r\n rxQuery._lastEnsureEqual = ++_ensureEqualCount;\r\n\r\n /**\r\n * Optimisation shortcuts\r\n */\r\n if (\r\n // db is closed\r\n rxQuery.collection.database.closed ||\r\n // nothing happened since last run\r\n _isResultsInSync(rxQuery)\r\n ) {\r\n return PROMISE_RESOLVE_FALSE;\r\n }\r\n\r\n let ret = false;\r\n let mustReExec = false; // if this becomes true, a whole execution over the database is made\r\n if (rxQuery._latestChangeEvent === -1) {\r\n // have not executed yet -> must run\r\n mustReExec = true;\r\n }\r\n\r\n /**\r\n * try to use EventReduce to calculate the new results\r\n */\r\n if (!mustReExec) {\r\n const missedChangeEvents = rxQuery.asRxQuery.collection._changeEventBuffer.getFrom(rxQuery._latestChangeEvent + 1);\r\n if (missedChangeEvents === null) {\r\n // changeEventBuffer is of bounds -> we must re-execute over the database\r\n mustReExec = true;\r\n } else {\r\n rxQuery._latestChangeEvent = rxQuery.asRxQuery.collection._changeEventBuffer.getCounter();\r\n const runChangeEvents: RxStorageChangeEvent<RxDocType>[] = rxQuery.asRxQuery.collection\r\n ._changeEventBuffer\r\n .reduceByLastOfDoc(missedChangeEvents);\r\n\r\n if (rxQuery.op === 'count') {\r\n // 'count' query\r\n const previousCount = ensureNotFalsy(rxQuery._result).count;\r\n let newCount = previousCount;\r\n runChangeEvents.forEach(cE => {\r\n const didMatchBefore = cE.previousDocumentData && rxQuery.doesDocumentDataMatch(cE.previousDocumentData);\r\n const doesMatchNow = rxQuery.doesDocumentDataMatch(cE.documentData);\r\n\r\n if (!didMatchBefore && doesMatchNow) {\r\n newCount++;\r\n }\r\n if (didMatchBefore && !doesMatchNow) {\r\n newCount--;\r\n }\r\n });\r\n if (newCount !== previousCount) {\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(newCount as any);\r\n }\r\n } else {\r\n // 'find' or 'findOne' query\r\n const eventReduceResult = calculateNewResults(\r\n rxQuery as any,\r\n runChangeEvents\r\n );\r\n if (eventReduceResult.runFullQueryAgain) {\r\n // could not calculate the new results, execute must be done\r\n mustReExec = true;\r\n } else if (eventReduceResult.changed) {\r\n // we got the new results, we do not have to re-execute, mustReExec stays false\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(eventReduceResult.newResults as any);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // oh no we have to re-execute the whole query over the database\r\n if (mustReExec) {\r\n return rxQuery._execOverDatabase()\r\n .then(result => {\r\n const newResultData = result.result;\r\n\r\n /**\r\n * The RxStorage is defined to always first emit events and then return\r\n * on bulkWrite() calls. So here we have to use the counter AFTER the execOverDatabase()\r\n * has been run, not the one from before.\r\n */\r\n rxQuery._latestChangeEvent = result.counter;\r\n\r\n // A count query needs a different has-changed check.\r\n if (typeof newResultData === 'number') {\r\n if (\r\n !rxQuery._result ||\r\n newResultData !== rxQuery._result.count\r\n ) {\r\n ret = true;\r\n rxQuery._setResultData(newResultData as any);\r\n }\r\n return ret;\r\n }\r\n if (\r\n !rxQuery._result ||\r\n !areRxDocumentArraysEqual(\r\n rxQuery.collection.schema.primaryPath,\r\n newResultData,\r\n rxQuery._result.docsData\r\n )\r\n ) {\r\n ret = true; // true because results changed\r\n rxQuery._setResultData(newResultData as any);\r\n }\r\n return ret;\r\n });\r\n }\r\n return Promise.resolve(ret); // true if results have changed\r\n}\r\n\r\n\r\n/**\r\n * Runs the query over the storage instance\r\n * of the collection.\r\n * Does some optimizations to ensure findById is used\r\n * when specific queries are used.\r\n */\r\nexport async function queryCollection<RxDocType>(\r\n rxQuery: RxQuery<RxDocType> | RxQueryBase<RxDocType, any>\r\n): Promise<{\r\n docs: RxDocumentData<RxDocType>[];\r\n /**\r\n * We need to remember the counter directly here\r\n * because getting if after the returned Promise is resolved,\r\n * can result in a value that no longer matches the result set.\r\n */\r\n counter: number;\r\n}> {\r\n let docs: RxDocumentData<RxDocType>[] = [];\r\n const collection = rxQuery.collection;\r\n\r\n /**\r\n * Optimizations shortcut.\r\n * If query is find-one-document-by-id,\r\n * then we do not have to use the slow query() method\r\n * but instead can use findDocumentsById()\r\n */\r\n if (rxQuery.isFindOneByIdQuery) {\r\n const selector = rxQuery.mangoQuery.selector;\r\n const primaryPath = collection.schema.primaryPath as string;\r\n // isFindOneByIdQuery guarantees the primary key is in the selector\r\n const primarySelectorValue = selector ? (selector as any)[primaryPath] : undefined;\r\n\r\n // Check if there are extra operators on the primary key selector (e.g. $ne alongside $in)\r\n const hasExtraOperators = typeof primarySelectorValue === 'object' &&\r\n primarySelectorValue !== null &&\r\n Object.keys(primarySelectorValue).length > 1;\r\n\r\n // Check if there are selectors OTHER than the primary key\r\n const hasOtherSelectors = selector ? Object.keys(selector).length > 1 : false;\r\n\r\n // Normalize single ID to array and de-duplicate to avoid returning the same document multiple times\r\n const docIdArray = Array.isArray(rxQuery.isFindOneByIdQuery)\r\n ? rxQuery.isFindOneByIdQuery\r\n : [rxQuery.isFindOneByIdQuery];\r\n const docIds = Array.from(new Set(docIdArray));\r\n\r\n // Separate cache hits from storage misses\r\n const cacheMisses: string[] = [];\r\n docIds.forEach(docId => {\r\n const docData = rxQuery.collection._docCache.getLatestDocumentDataIfExists(docId);\r\n if (docData && !docData._deleted) {\r\n docs.push(docData);\r\n } else if (!docData) {\r\n // Only fetch from storage if not in cache\r\n cacheMisses.push(docId);\r\n }\r\n // If found but deleted, skip entirely (no refetch)\r\n });\r\n\r\n // Fetch only cache misses from storage\r\n if (cacheMisses.length > 0) {\r\n const docsFromStorage = await collection.storageInstance.findDocumentsById(cacheMisses, false);\r\n docs = docs.concat(docsFromStorage);\r\n }\r\n\r\n // Apply query matcher if there are extra operators or other selectors\r\n if (hasExtraOperators || hasOtherSelectors) {\r\n docs = docs.filter(doc => rxQuery.queryMatcher(doc));\r\n }\r\n\r\n /**\r\n * The findDocumentsById() fast-path also does not apply `skip`/`limit`/`sort`.\r\n * To keep behavior consistent with storageInstance.query(), we must\r\n * apply them after queryMatcher for both find() and findOne() queries.\r\n */\r\n // Apply sorting for both find and findOne\r\n if (docs.length > 1) {\r\n const preparedQuery = rxQuery.getPreparedQuery();\r\n const sortComparator = getSortComparator(collection.schema.jsonSchema, preparedQuery.query);\r\n docs = docs.sort(sortComparator);\r\n }\r\n\r\n // Apply skip for both find and findOne\r\n const skip = typeof rxQuery.mangoQuery.skip === 'number' && rxQuery.mangoQuery.skip > 0\r\n ? rxQuery.mangoQuery.skip\r\n : 0;\r\n if (skip > 0) {\r\n docs = docs.slice(skip);\r\n }\r\n\r\n // Apply limit for both find and findOne\r\n const limitIsNumber = typeof rxQuery.mangoQuery.limit === 'number' && rxQuery.mangoQuery.limit > 0;\r\n if (limitIsNumber) {\r\n const limit = rxQuery.mangoQuery.limit as number;\r\n docs = docs.slice(0, limit);\r\n }\r\n\r\n } else {\r\n const preparedQuery = rxQuery.getPreparedQuery();\r\n const queryResult = await collection.storageInstance.query(preparedQuery);\r\n docs = queryResult.documents;\r\n }\r\n\r\n return {\r\n docs,\r\n counter: collection._changeEventBuffer.getCounter()\r\n };\r\n\r\n}\r\n\r\n/**\r\n * Returns true if the given query\r\n * selects documents by primary key using $eq or $in.\r\n * Used to optimize performance: these queries use get-by-id\r\n * instead of a full index scan. Additional operators beyond\r\n * $eq/$in are handled via the queryMatcher after fetching.\r\n * Skip, limit, and sort are also applied after fetching.\r\n * Returns false if no such optimization is possible.\r\n * Returns the document id (string) or ids (string[]) otherwise.\r\n */\r\nexport function isFindOneByIdQuery(\r\n primaryPath: string,\r\n query: MangoQuery<any>\r\n): false | string | string[] {\r\n // primary key constraint can coexist with other selectors, skip, limit, and sort\r\n // The optimization will fetch by ID, then apply queryMatcher, sort, skip, and limit\r\n // Use hasOwnProperty to avoid prototype pollution from user-controlled input\r\n if (\r\n query.selector &&\r\n Object.prototype.hasOwnProperty.call(query.selector, primaryPath)\r\n ) {\r\n const value: any = (query.selector as any)[primaryPath];\r\n if (typeof value === 'string') {\r\n return value;\r\n } else if (\r\n typeof value.$eq === 'string'\r\n ) {\r\n return value.$eq;\r\n }\r\n\r\n // same with $in string arrays\r\n if (\r\n Array.isArray(value.$in) &&\r\n // must only contain strings\r\n !(value.$in as any[]).find(r => typeof r !== 'string')\r\n ) {\r\n return value.$in;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n\r\n\r\nexport function isRxQuery(obj: any): boolean {\r\n return obj instanceof RxQueryBase;\r\n}\r\n"],"mappings":"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","ignoreList":[]}