mindoodb 0.0.24 → 0.0.32
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.
- package/README-server.md +9 -1
- package/README.md +5 -3
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +24 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +14 -2
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +124 -27
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +159 -4
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +334 -25
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +9 -0
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +77 -5
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +103 -0
- package/dist/core/BaseMindooDB.d.ts +662 -4
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +2769 -144
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +192 -1
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +633 -88
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +770 -10
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +2715 -292
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +2 -0
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +20 -0
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/accesscontrol/AccessDeniedError.d.ts +22 -0
- package/dist/core/accesscontrol/AccessDeniedError.d.ts.map +1 -0
- package/dist/core/accesscontrol/AccessDeniedError.js +28 -0
- package/dist/core/accesscontrol/AccessDeniedError.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts +220 -0
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js +297 -0
- package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts +118 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.d.ts.map +1 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js +173 -0
- package/dist/core/accesscontrol/DirectoryTimeTravelIndex.js.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts +26 -0
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -0
- package/dist/core/accesscontrol/directoryProjection.js +174 -0
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -0
- package/dist/core/accesscontrol/evaluate.d.ts +77 -0
- package/dist/core/accesscontrol/evaluate.d.ts.map +1 -0
- package/dist/core/accesscontrol/evaluate.js +206 -0
- package/dist/core/accesscontrol/evaluate.js.map +1 -0
- package/dist/core/accesscontrol/grantKeys.d.ts +113 -0
- package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -0
- package/dist/core/accesscontrol/grantKeys.js +302 -0
- package/dist/core/accesscontrol/grantKeys.js.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts +22 -0
- package/dist/core/accesscontrol/keyBagReconciler.d.ts.map +1 -0
- package/dist/core/accesscontrol/keyBagReconciler.js +3 -0
- package/dist/core/accesscontrol/keyBagReconciler.js.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts +89 -0
- package/dist/core/accesscontrol/materializationGuard.d.ts.map +1 -0
- package/dist/core/accesscontrol/materializationGuard.js +69 -0
- package/dist/core/accesscontrol/materializationGuard.js.map +1 -0
- package/dist/core/accesscontrol/quarantine.d.ts +65 -0
- package/dist/core/accesscontrol/quarantine.d.ts.map +1 -0
- package/dist/core/accesscontrol/quarantine.js +79 -0
- package/dist/core/accesscontrol/quarantine.js.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts +113 -0
- package/dist/core/accesscontrol/receiptValidation.d.ts.map +1 -0
- package/dist/core/accesscontrol/receiptValidation.js +142 -0
- package/dist/core/accesscontrol/receiptValidation.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts +31 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js +66 -0
- package/dist/core/accesscontrol/timestamp/Ed25519WitnessProvider.js.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts +79 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.d.ts.map +1 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js +22 -0
- package/dist/core/accesscontrol/timestamp/TimestampProvider.js.map +1 -0
- package/dist/core/accesscontrol/types.d.ts +825 -0
- package/dist/core/accesscontrol/types.d.ts.map +1 -0
- package/dist/core/accesscontrol/types.js +534 -0
- package/dist/core/accesscontrol/types.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +9 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +54 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +38 -2
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +199 -26
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +17 -3
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +58 -4
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js +4 -0
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/scanUtils.d.ts +27 -0
- package/dist/core/appendonlystores/scanUtils.d.ts.map +1 -0
- package/dist/core/appendonlystores/scanUtils.js +87 -0
- package/dist/core/appendonlystores/scanUtils.js.map +1 -0
- package/dist/core/appendonlystores/types.d.ts +23 -2
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.d.ts +13 -3
- package/dist/core/cache/CacheManager.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.js +7 -4
- package/dist/core/cache/CacheManager.js.map +1 -1
- package/dist/core/crypto/EntrySignature.d.ts +137 -0
- package/dist/core/crypto/EntrySignature.d.ts.map +1 -0
- package/dist/core/crypto/EntrySignature.js +210 -0
- package/dist/core/crypto/EntrySignature.js.map +1 -0
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
- package/dist/core/crypto/MindooDocSigner.js +6 -2
- package/dist/core/crypto/MindooDocSigner.js.map +1 -1
- package/dist/core/crypto/WitnessReceipt.d.ts +137 -0
- package/dist/core/crypto/WitnessReceipt.d.ts.map +1 -0
- package/dist/core/crypto/WitnessReceipt.js +182 -0
- package/dist/core/crypto/WitnessReceipt.js.map +1 -0
- package/dist/core/crypto/encryptedFields.d.ts +27 -0
- package/dist/core/crypto/encryptedFields.d.ts.map +1 -0
- package/dist/core/crypto/encryptedFields.js +58 -0
- package/dist/core/crypto/encryptedFields.js.map +1 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts +12 -0
- package/dist/core/crypto/pbkdf2Iterations.d.ts.map +1 -1
- package/dist/core/crypto/pbkdf2Iterations.js +23 -0
- package/dist/core/crypto/pbkdf2Iterations.js.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.js +3 -1
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
- package/dist/core/databaseIdValidation.d.ts +1 -1
- package/dist/core/databaseIdValidation.d.ts.map +1 -1
- package/dist/core/databaseIdValidation.js +4 -4
- package/dist/core/databaseIdValidation.js.map +1 -1
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +42 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/expressions/builder.d.ts +102 -0
- package/dist/core/expressions/builder.d.ts.map +1 -0
- package/dist/core/expressions/builder.js +249 -0
- package/dist/core/expressions/builder.js.map +1 -0
- package/dist/core/expressions/evaluateExpression.d.ts +78 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -0
- package/dist/core/expressions/evaluateExpression.js +386 -0
- package/dist/core/expressions/evaluateExpression.js.map +1 -0
- package/dist/core/expressions/formulaSource.d.ts +24 -0
- package/dist/core/expressions/formulaSource.d.ts.map +1 -0
- package/dist/core/expressions/formulaSource.js +765 -0
- package/dist/core/expressions/formulaSource.js.map +1 -0
- package/dist/core/expressions/index.d.ts +8 -0
- package/dist/core/expressions/index.d.ts.map +1 -0
- package/dist/core/expressions/index.js +46 -0
- package/dist/core/expressions/index.js.map +1 -0
- package/dist/core/expressions/metadata.d.ts +23 -0
- package/dist/core/expressions/metadata.d.ts.map +1 -0
- package/dist/core/expressions/metadata.js +191 -0
- package/dist/core/expressions/metadata.js.map +1 -0
- package/dist/core/expressions/types.d.ts +164 -0
- package/dist/core/expressions/types.d.ts.map +1 -0
- package/dist/core/expressions/types.js +3 -0
- package/dist/core/expressions/types.js.map +1 -0
- package/dist/core/extraction/types.d.ts +47 -0
- package/dist/core/extraction/types.d.ts.map +1 -0
- package/dist/core/extraction/types.js +42 -0
- package/dist/core/extraction/types.js.map +1 -0
- package/dist/core/index.d.ts +13 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +113 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/createViewDataProvider.d.ts +84 -0
- package/dist/core/indexing/createViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/createViewDataProvider.js +139 -0
- package/dist/core/indexing/createViewDataProvider.js.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts +180 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js +548 -0
- package/dist/core/indexing/fulltext/DocumentFullTextIndex.js.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts +69 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js +183 -0
- package/dist/core/indexing/fulltext/SearchEngineAdapter.js.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts +34 -0
- package/dist/core/indexing/fulltext/extractFulltextText.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js +129 -0
- package/dist/core/indexing/fulltext/extractFulltextText.js.map +1 -0
- package/dist/core/indexing/fulltext/index.d.ts +5 -0
- package/dist/core/indexing/fulltext/index.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/index.js +20 -0
- package/dist/core/indexing/fulltext/index.js.map +1 -0
- package/dist/core/indexing/fulltext/types.d.ts +168 -0
- package/dist/core/indexing/fulltext/types.d.ts.map +1 -0
- package/dist/core/indexing/fulltext/types.js +89 -0
- package/dist/core/indexing/fulltext/types.js.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts +137 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.d.ts.map +1 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js +438 -0
- package/dist/core/indexing/summary/DocumentSummaryStore.js.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts +72 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.d.ts.map +1 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js +221 -0
- package/dist/core/indexing/summary/SummaryVirtualViewDataProvider.js.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts +75 -0
- package/dist/core/indexing/summary/extractSummaryFields.d.ts.map +1 -0
- package/dist/core/indexing/summary/extractSummaryFields.js +266 -0
- package/dist/core/indexing/summary/extractSummaryFields.js.map +1 -0
- package/dist/core/indexing/summary/index.d.ts +5 -0
- package/dist/core/indexing/summary/index.d.ts.map +1 -0
- package/dist/core/indexing/summary/index.js +23 -0
- package/dist/core/indexing/summary/index.js.map +1 -0
- package/dist/core/indexing/summary/types.d.ts +119 -0
- package/dist/core/indexing/summary/types.d.ts.map +1 -0
- package/dist/core/indexing/summary/types.js +81 -0
- package/dist/core/indexing/summary/types.js.map +1 -0
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts +47 -1
- package/dist/core/indexing/virtualviews/IVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +24 -8
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +96 -41
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts +2 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js +8 -3
- package/dist/core/indexing/virtualviews/ViewEntrySortKey.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +111 -5
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +266 -75
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js +1 -0
- package/dist/core/indexing/virtualviews/VirtualViewColumn.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +12 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +66 -5
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts +50 -6
- package/dist/core/indexing/virtualviews/VirtualViewFactory.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js +54 -12
- package/dist/core/indexing/virtualviews/VirtualViewFactory.js.map +1 -1
- package/dist/core/indexing/virtualviews/index.d.ts +3 -3
- package/dist/core/indexing/virtualviews/index.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/index.js.map +1 -1
- package/dist/core/indexing/virtualviews/types.d.ts +6 -0
- package/dist/core/indexing/virtualviews/types.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/types.js +11 -3
- package/dist/core/indexing/virtualviews/types.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +25 -0
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +37 -1
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/query/executeQuery.d.ts +18 -0
- package/dist/core/query/executeQuery.d.ts.map +1 -0
- package/dist/core/query/executeQuery.js +313 -0
- package/dist/core/query/executeQuery.js.map +1 -0
- package/dist/core/query/index.d.ts +5 -0
- package/dist/core/query/index.d.ts.map +1 -0
- package/dist/core/query/index.js +14 -0
- package/dist/core/query/index.js.map +1 -0
- package/dist/core/query/queryLive.d.ts +27 -0
- package/dist/core/query/queryLive.d.ts.map +1 -0
- package/dist/core/query/queryLive.js +104 -0
- package/dist/core/query/queryLive.js.map +1 -0
- package/dist/core/query/queryView.d.ts +156 -0
- package/dist/core/query/queryView.d.ts.map +1 -0
- package/dist/core/query/queryView.js +266 -0
- package/dist/core/query/queryView.js.map +1 -0
- package/dist/core/query/types.d.ts +121 -0
- package/dist/core/query/types.d.ts.map +1 -0
- package/dist/core/query/types.js +18 -0
- package/dist/core/query/types.js.map +1 -0
- package/dist/core/storeEntryTime.d.ts +57 -0
- package/dist/core/storeEntryTime.d.ts.map +1 -0
- package/dist/core/storeEntryTime.js +72 -0
- package/dist/core/storeEntryTime.js.map +1 -0
- package/dist/core/types.d.ts +1371 -34
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +13 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts +53 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +135 -0
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/utils/urlSafety.d.ts +46 -0
- package/dist/core/utils/urlSafety.d.ts.map +1 -0
- package/dist/core/utils/urlSafety.js +144 -0
- package/dist/core/utils/urlSafety.js.map +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +14 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +95 -4
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +10 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
- package/dist/node/server/CapabilityMatcher.js +14 -2
- package/dist/node/server/CapabilityMatcher.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +117 -8
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +32 -0
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/node/server/PurgedDocRegistry.js +94 -0
- package/dist/node/server/PurgedDocRegistry.js.map +1 -0
- package/dist/node/server/ServerSync.d.ts.map +1 -1
- package/dist/node/server/ServerSync.js +5 -2
- package/dist/node/server/ServerSync.js.map +1 -1
- package/dist/node/server/SystemAdminAuth.d.ts +10 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
- package/dist/node/server/SystemAdminAuth.js +25 -0
- package/dist/node/server/SystemAdminAuth.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +95 -1
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +382 -15
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +5 -1
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/types.d.ts +29 -3
- package/dist/node/server/types.d.ts.map +1 -1
- package/dist/node/server/types.js +12 -0
- package/dist/node/server/types.js.map +1 -1
- package/dist/node/server/validation.d.ts +6 -0
- package/dist/node/server/validation.d.ts.map +1 -1
- package/dist/node/server/validation.js +7 -1
- package/dist/node/server/validation.js.map +1 -1
- package/package.json +4 -3
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts +0 -8
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.d.ts.map +0 -1
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js +0 -16
- package/dist/appendonlystores/BasicOnDiskContentAddressedStoreFactory.js.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +0 -68
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +0 -1
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js +0 -659
- package/dist/core/appendonlystores/BasicOnDiskContentAddressedStore.js.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.d.ts +0 -15
- package/dist/node/attachments/writeAttachmentToFile.d.ts.map +0 -1
- package/dist/node/attachments/writeAttachmentToFile.js +0 -73
- package/dist/node/attachments/writeAttachmentToFile.js.map +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeQueryLive = executeQueryLive;
|
|
4
|
+
const executeQuery_1 = require("./executeQuery");
|
|
5
|
+
/**
|
|
6
|
+
* Fingerprint of a query result: docIds + lastModified in result order.
|
|
7
|
+
* Any membership, ordering, or content change (content changes bump
|
|
8
|
+
* `lastModified`) alters the fingerprint; changes to non-matching
|
|
9
|
+
* documents cost only the scan, never an `onResult` call.
|
|
10
|
+
*
|
|
11
|
+
* Full-text relevance scores participate ROUNDED (two decimals): adding
|
|
12
|
+
* or removing documents shifts BM25 statistics slightly for every other
|
|
13
|
+
* match, and re-pushing an unchanged result list over marginal score
|
|
14
|
+
* drift would spam subscribers.
|
|
15
|
+
*/
|
|
16
|
+
function fingerprintResult(result) {
|
|
17
|
+
const parts = [String(result.total)];
|
|
18
|
+
for (const row of result.rows) {
|
|
19
|
+
parts.push(row.textScore === undefined
|
|
20
|
+
? `${row.docId}:${row.lastModified}`
|
|
21
|
+
: `${row.docId}:${row.lastModified}:${row.textScore.toFixed(2)}`);
|
|
22
|
+
}
|
|
23
|
+
return parts.join("|");
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Live query: delivers the initial result, keeps the summary current via
|
|
27
|
+
* the database's change listener, and re-evaluates the query after every
|
|
28
|
+
* (coalesced) change event. `onResult` only fires when the result
|
|
29
|
+
* fingerprint actually changed.
|
|
30
|
+
*
|
|
31
|
+
* Re-evaluations are single-flight with a pending flag, so bursts of
|
|
32
|
+
* change events never queue up more than one follow-up run. Evaluation
|
|
33
|
+
* errors are reported through `onError` (or logged to the console).
|
|
34
|
+
*/
|
|
35
|
+
function executeQueryLive(db, summary, query, onResult, options) {
|
|
36
|
+
if (!db.addChangeListener) {
|
|
37
|
+
throw new Error("This MindooDB instance does not support change listeners.");
|
|
38
|
+
}
|
|
39
|
+
let lastFingerprint = null;
|
|
40
|
+
let unsubscribed = false;
|
|
41
|
+
let running = false;
|
|
42
|
+
let pending = false;
|
|
43
|
+
const reportError = (error) => {
|
|
44
|
+
if (options?.onError) {
|
|
45
|
+
options.onError(error);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.warn("[MindooDB] queryLive evaluation failed:", error);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const evaluate = async (force) => {
|
|
52
|
+
const result = await (0, executeQuery_1.executeQuery)(db, summary, query, options);
|
|
53
|
+
if (unsubscribed) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const fingerprint = fingerprintResult(result);
|
|
57
|
+
if (force || fingerprint !== lastFingerprint) {
|
|
58
|
+
lastFingerprint = fingerprint;
|
|
59
|
+
onResult(result);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const run = async (force) => {
|
|
63
|
+
if (running) {
|
|
64
|
+
pending = true;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
running = true;
|
|
68
|
+
try {
|
|
69
|
+
do {
|
|
70
|
+
pending = false;
|
|
71
|
+
try {
|
|
72
|
+
await evaluate(force);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
reportError(error);
|
|
76
|
+
}
|
|
77
|
+
force = false;
|
|
78
|
+
} while (pending && !unsubscribed);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
running = false;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const removeListener = db.addChangeListener(() => {
|
|
85
|
+
if (!unsubscribed) {
|
|
86
|
+
void run(false);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// Deliver the initial result asynchronously.
|
|
90
|
+
void run(true);
|
|
91
|
+
return {
|
|
92
|
+
unsubscribe() {
|
|
93
|
+
unsubscribed = true;
|
|
94
|
+
removeListener();
|
|
95
|
+
},
|
|
96
|
+
async refresh() {
|
|
97
|
+
if (unsubscribed) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
await run(true);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=queryLive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryLive.js","sourceRoot":"","sources":["../../../src/core/query/queryLive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { MindooDB } from "../types";
|
|
2
|
+
import type { MindooDBAppBooleanExpression } from "../expressions/types";
|
|
3
|
+
import type { DocumentSummaryStore } from "../indexing/summary/DocumentSummaryStore";
|
|
4
|
+
import { VirtualView } from "../indexing/virtualviews/VirtualView";
|
|
5
|
+
import { VirtualViewColumn, type VirtualViewColumnOptions } from "../indexing/virtualviews/VirtualViewColumn";
|
|
6
|
+
import type { VirtualViewUpdateOptions } from "../indexing/virtualviews/IVirtualViewDataProvider";
|
|
7
|
+
import type { CategorizationStyle } from "../indexing/virtualviews/types";
|
|
8
|
+
import { type MindooQueryTextClause } from "./types";
|
|
9
|
+
/**
|
|
10
|
+
* Declarative definition of an ephemeral, summary-backed view. Fully
|
|
11
|
+
* JSON-serializable when columns use `expression` instead of
|
|
12
|
+
* `valueFunction` — the basis for view designs stored/synchronized as
|
|
13
|
+
* data.
|
|
14
|
+
*/
|
|
15
|
+
export interface MindooQueryViewDefinition {
|
|
16
|
+
/**
|
|
17
|
+
* Expression filter selecting which documents appear in the view.
|
|
18
|
+
* Applies to every source unless a source provides its own filter.
|
|
19
|
+
*/
|
|
20
|
+
filter?: MindooDBAppBooleanExpression;
|
|
21
|
+
/**
|
|
22
|
+
* Full-text pre-filter: only documents matching this search (in each
|
|
23
|
+
* source's full-text index) appear in the view, combined with `filter`
|
|
24
|
+
* as a logical AND. Applies to every source unless a source provides
|
|
25
|
+
* its own `text` clause. Requires full-text indexing to be enabled for
|
|
26
|
+
* each source database (`fulltext-not-enabled` otherwise) — see
|
|
27
|
+
* docs/fulltext-search.md.
|
|
28
|
+
*
|
|
29
|
+
* Matching documents expose the relevance as pseudo-fields to filter
|
|
30
|
+
* and column expressions: `_textScore` (0..1, normalized to the best
|
|
31
|
+
* hit of the current search, rounded to 2 decimals) and
|
|
32
|
+
* `_textScoreRaw` (engine-specific raw score).
|
|
33
|
+
*/
|
|
34
|
+
text?: MindooQueryTextClause;
|
|
35
|
+
/** View columns (categories/sorting/totals work as in persistent views). */
|
|
36
|
+
columns: Array<VirtualViewColumn | VirtualViewColumnOptions>;
|
|
37
|
+
categorizationStyle?: CategorizationStyle;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* One database feeding an ephemeral summary view. Like persistent
|
|
41
|
+
* VirtualViews, ephemeral views can combine multiple sources — different
|
|
42
|
+
* databases and even different tenants — each contributing entries under
|
|
43
|
+
* its own origin.
|
|
44
|
+
*/
|
|
45
|
+
export interface EphemeralViewSource {
|
|
46
|
+
/** The database whose summary buffer feeds this source. */
|
|
47
|
+
db: MindooDB;
|
|
48
|
+
/**
|
|
49
|
+
* Per-source filter. When set it replaces the definition-level filter
|
|
50
|
+
* for this source (e.g. different document types per database).
|
|
51
|
+
*/
|
|
52
|
+
filter?: MindooDBAppBooleanExpression;
|
|
53
|
+
/**
|
|
54
|
+
* Per-source full-text pre-filter. When set it replaces the
|
|
55
|
+
* definition-level `text` clause for this source.
|
|
56
|
+
*/
|
|
57
|
+
text?: MindooQueryTextClause;
|
|
58
|
+
/**
|
|
59
|
+
* Origin identifier for entries of this source. Must be unique within
|
|
60
|
+
* the view. Defaults to `<tenantId>/<storeId>#ephemeral`, which is
|
|
61
|
+
* already unique across databases and tenants.
|
|
62
|
+
*/
|
|
63
|
+
origin?: string;
|
|
64
|
+
}
|
|
65
|
+
/** Internally resolved source: summary store and origin are settled. */
|
|
66
|
+
interface ResolvedViewSource {
|
|
67
|
+
db: MindooDB;
|
|
68
|
+
summary: DocumentSummaryStore;
|
|
69
|
+
origin: string;
|
|
70
|
+
filter?: MindooDBAppBooleanExpression;
|
|
71
|
+
text?: MindooQueryTextClause;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* An ephemeral VirtualView over one or more document summary buffers,
|
|
75
|
+
* created by `db.queryView()` (single database) or {@link queryViewAcross}
|
|
76
|
+
* (multiple databases/tenants).
|
|
77
|
+
*
|
|
78
|
+
* Unlike persistent views it is not registered with a CacheManager —
|
|
79
|
+
* building it is a pure in-memory sort over summary entries, so dynamic
|
|
80
|
+
* re-sorting is cheap: {@link resort} swaps in a new column set over the
|
|
81
|
+
* SAME summaries (no document reload, no changefeed re-consumption).
|
|
82
|
+
*/
|
|
83
|
+
export declare class EphemeralSummaryView {
|
|
84
|
+
private readonly sources;
|
|
85
|
+
private definition;
|
|
86
|
+
private view;
|
|
87
|
+
private providers;
|
|
88
|
+
private disposed;
|
|
89
|
+
/** Whether a live binding is active (survives resort rebuilds). */
|
|
90
|
+
private liveBound;
|
|
91
|
+
constructor(sources: ResolvedViewSource[], definition: MindooQueryViewDefinition);
|
|
92
|
+
private buildView;
|
|
93
|
+
/** The underlying VirtualView (navigators, entries, totals as usual). */
|
|
94
|
+
getView(): VirtualView;
|
|
95
|
+
/** Bring the view up to date (summary updates + entry propagation). */
|
|
96
|
+
update(options?: VirtualViewUpdateOptions): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Replace the column set (and optionally the filter and/or full-text
|
|
99
|
+
* clause) and rebuild the view from the summaries — dynamic re-sorting
|
|
100
|
+
* without touching documents. A live binding created via {@link bindTo}
|
|
101
|
+
* carries over to the new view.
|
|
102
|
+
*/
|
|
103
|
+
resort(definition: Partial<MindooQueryViewDefinition> & Pick<MindooQueryViewDefinition, "columns">, options?: VirtualViewUpdateOptions): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Keep this view up to date automatically via the change feeds of ALL
|
|
106
|
+
* source databases (see {@link VirtualView.bindTo}). Combine with
|
|
107
|
+
* `getView().onDidUpdate()` for UI re-render hooks.
|
|
108
|
+
*
|
|
109
|
+
* @returns An unbind function.
|
|
110
|
+
*/
|
|
111
|
+
bindTo(): () => void;
|
|
112
|
+
private bindSources;
|
|
113
|
+
/** Detach all change-feed bindings. */
|
|
114
|
+
unbind(): void;
|
|
115
|
+
/**
|
|
116
|
+
* Release the view: detaches change-feed bindings and drops internal
|
|
117
|
+
* state. Ephemeral views hold no CacheManager registration, so nothing
|
|
118
|
+
* else needs cleanup.
|
|
119
|
+
*/
|
|
120
|
+
dispose(): void;
|
|
121
|
+
isDisposed(): boolean;
|
|
122
|
+
private assertNotDisposed;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build an ephemeral, summary-backed VirtualView over a single database
|
|
126
|
+
* and run its initial update. See {@link EphemeralSummaryView}.
|
|
127
|
+
*/
|
|
128
|
+
export declare function createEphemeralSummaryView(db: MindooDB, summary: DocumentSummaryStore, definition: MindooQueryViewDefinition, options?: VirtualViewUpdateOptions): Promise<EphemeralSummaryView>;
|
|
129
|
+
/**
|
|
130
|
+
* Build an ephemeral, summary-backed VirtualView spanning MULTIPLE
|
|
131
|
+
* databases — and, since every source brings its own tenant context, even
|
|
132
|
+
* multiple tenants. Each source contributes entries under its own origin
|
|
133
|
+
* from its own summary buffer; no documents are materialized anywhere.
|
|
134
|
+
*
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const view = await queryViewAcross(
|
|
137
|
+
* [
|
|
138
|
+
* { db: salesDb },
|
|
139
|
+
* { db: archiveDb, filter: v.eq(v.field("year"), 2025) },
|
|
140
|
+
* ],
|
|
141
|
+
* {
|
|
142
|
+
* filter: v.eq(v.field("type"), "deal"),
|
|
143
|
+
* columns: [
|
|
144
|
+
* VirtualViewColumn.category("region"),
|
|
145
|
+
* VirtualViewColumn.sorted("amount", ColumnSorting.DESCENDING),
|
|
146
|
+
* ],
|
|
147
|
+
* }
|
|
148
|
+
* );
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* A per-source `filter` replaces the definition-level filter for that
|
|
152
|
+
* source. `bindTo()` subscribes to the change feeds of all sources.
|
|
153
|
+
*/
|
|
154
|
+
export declare function queryViewAcross(sources: EphemeralViewSource[], definition: MindooQueryViewDefinition, options?: VirtualViewUpdateOptions): Promise<EphemeralSummaryView>;
|
|
155
|
+
export {};
|
|
156
|
+
//# sourceMappingURL=queryView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryView.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EphemeralSummaryView = void 0;
|
|
4
|
+
exports.createEphemeralSummaryView = createEphemeralSummaryView;
|
|
5
|
+
exports.queryViewAcross = queryViewAcross;
|
|
6
|
+
const expressions_1 = require("../expressions");
|
|
7
|
+
const SummaryVirtualViewDataProvider_1 = require("../indexing/summary/SummaryVirtualViewDataProvider");
|
|
8
|
+
const VirtualView_1 = require("../indexing/virtualviews/VirtualView");
|
|
9
|
+
const VirtualViewColumn_1 = require("../indexing/virtualviews/VirtualViewColumn");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
function defaultEphemeralOrigin(db) {
|
|
12
|
+
return `${db.getTenant().getId()}/${db.getStore().getId()}#ephemeral`;
|
|
13
|
+
}
|
|
14
|
+
function resolveSources(sources) {
|
|
15
|
+
if (sources.length === 0) {
|
|
16
|
+
throw new types_1.MindooQueryError("An ephemeral view needs at least one source database.");
|
|
17
|
+
}
|
|
18
|
+
const resolved = [];
|
|
19
|
+
const seenOrigins = new Set();
|
|
20
|
+
for (const source of sources) {
|
|
21
|
+
if (!source.db.getSummaryStore) {
|
|
22
|
+
throw new types_1.MindooQueryError("A source database does not support summary stores.");
|
|
23
|
+
}
|
|
24
|
+
const origin = source.origin ?? defaultEphemeralOrigin(source.db);
|
|
25
|
+
if (seenOrigins.has(origin)) {
|
|
26
|
+
throw new types_1.MindooQueryError(`Duplicate view source origin "${origin}" — pass distinct 'origin' values when combining the same database twice.`);
|
|
27
|
+
}
|
|
28
|
+
seenOrigins.add(origin);
|
|
29
|
+
resolved.push({
|
|
30
|
+
db: source.db,
|
|
31
|
+
summary: source.db.getSummaryStore(),
|
|
32
|
+
origin,
|
|
33
|
+
filter: source.filter,
|
|
34
|
+
text: source.text,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return resolved;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* An ephemeral VirtualView over one or more document summary buffers,
|
|
41
|
+
* created by `db.queryView()` (single database) or {@link queryViewAcross}
|
|
42
|
+
* (multiple databases/tenants).
|
|
43
|
+
*
|
|
44
|
+
* Unlike persistent views it is not registered with a CacheManager —
|
|
45
|
+
* building it is a pure in-memory sort over summary entries, so dynamic
|
|
46
|
+
* re-sorting is cheap: {@link resort} swaps in a new column set over the
|
|
47
|
+
* SAME summaries (no document reload, no changefeed re-consumption).
|
|
48
|
+
*/
|
|
49
|
+
class EphemeralSummaryView {
|
|
50
|
+
constructor(sources, definition) {
|
|
51
|
+
this.sources = sources;
|
|
52
|
+
this.definition = definition;
|
|
53
|
+
this.providers = [];
|
|
54
|
+
this.disposed = false;
|
|
55
|
+
/** Whether a live binding is active (survives resort rebuilds). */
|
|
56
|
+
this.liveBound = false;
|
|
57
|
+
this.view = this.buildView(definition);
|
|
58
|
+
}
|
|
59
|
+
buildView(definition) {
|
|
60
|
+
validateViewDefinition(this.sources, definition);
|
|
61
|
+
const columns = definition.columns.map((column) => column instanceof VirtualViewColumn_1.VirtualViewColumn ? column : new VirtualViewColumn_1.VirtualViewColumn(column));
|
|
62
|
+
const view = new VirtualView_1.VirtualView(columns);
|
|
63
|
+
if (definition.categorizationStyle !== undefined) {
|
|
64
|
+
view.setCategorizationStyle(definition.categorizationStyle);
|
|
65
|
+
}
|
|
66
|
+
this.providers = [];
|
|
67
|
+
for (const source of this.sources) {
|
|
68
|
+
const textClause = source.text ?? definition.text;
|
|
69
|
+
let text;
|
|
70
|
+
if (textClause) {
|
|
71
|
+
if (!source.db.getFullTextIndex) {
|
|
72
|
+
throw new types_1.MindooQueryError(`View source "${source.origin}" does not support full-text search.`, "fulltext-not-enabled");
|
|
73
|
+
}
|
|
74
|
+
text = { index: source.db.getFullTextIndex(), clause: textClause };
|
|
75
|
+
}
|
|
76
|
+
const provider = new SummaryVirtualViewDataProvider_1.SummaryVirtualViewDataProvider({
|
|
77
|
+
origin: source.origin,
|
|
78
|
+
summary: source.summary,
|
|
79
|
+
filter: source.filter ?? definition.filter,
|
|
80
|
+
text,
|
|
81
|
+
});
|
|
82
|
+
provider.init(view);
|
|
83
|
+
view.addDataProvider(provider);
|
|
84
|
+
this.providers.push(provider);
|
|
85
|
+
}
|
|
86
|
+
return view;
|
|
87
|
+
}
|
|
88
|
+
/** The underlying VirtualView (navigators, entries, totals as usual). */
|
|
89
|
+
getView() {
|
|
90
|
+
this.assertNotDisposed();
|
|
91
|
+
return this.view;
|
|
92
|
+
}
|
|
93
|
+
/** Bring the view up to date (summary updates + entry propagation). */
|
|
94
|
+
async update(options) {
|
|
95
|
+
this.assertNotDisposed();
|
|
96
|
+
await this.view.update(options);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Replace the column set (and optionally the filter and/or full-text
|
|
100
|
+
* clause) and rebuild the view from the summaries — dynamic re-sorting
|
|
101
|
+
* without touching documents. A live binding created via {@link bindTo}
|
|
102
|
+
* carries over to the new view.
|
|
103
|
+
*/
|
|
104
|
+
async resort(definition, options) {
|
|
105
|
+
this.assertNotDisposed();
|
|
106
|
+
this.definition = {
|
|
107
|
+
...this.definition,
|
|
108
|
+
...definition,
|
|
109
|
+
};
|
|
110
|
+
this.view.unbind();
|
|
111
|
+
this.view = this.buildView(this.definition);
|
|
112
|
+
if (this.liveBound) {
|
|
113
|
+
this.bindSources();
|
|
114
|
+
}
|
|
115
|
+
await this.view.update(options);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Keep this view up to date automatically via the change feeds of ALL
|
|
119
|
+
* source databases (see {@link VirtualView.bindTo}). Combine with
|
|
120
|
+
* `getView().onDidUpdate()` for UI re-render hooks.
|
|
121
|
+
*
|
|
122
|
+
* @returns An unbind function.
|
|
123
|
+
*/
|
|
124
|
+
bindTo() {
|
|
125
|
+
this.assertNotDisposed();
|
|
126
|
+
this.liveBound = true;
|
|
127
|
+
this.bindSources();
|
|
128
|
+
return () => {
|
|
129
|
+
this.unbind();
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
bindSources() {
|
|
133
|
+
for (const source of this.sources) {
|
|
134
|
+
this.view.bindTo(source.db);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Detach all change-feed bindings. */
|
|
138
|
+
unbind() {
|
|
139
|
+
this.liveBound = false;
|
|
140
|
+
this.view.unbind();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Release the view: detaches change-feed bindings and drops internal
|
|
144
|
+
* state. Ephemeral views hold no CacheManager registration, so nothing
|
|
145
|
+
* else needs cleanup.
|
|
146
|
+
*/
|
|
147
|
+
dispose() {
|
|
148
|
+
if (this.disposed) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.unbind();
|
|
152
|
+
this.disposed = true;
|
|
153
|
+
for (const provider of this.providers) {
|
|
154
|
+
provider.reset();
|
|
155
|
+
}
|
|
156
|
+
this.providers = [];
|
|
157
|
+
}
|
|
158
|
+
isDisposed() {
|
|
159
|
+
return this.disposed;
|
|
160
|
+
}
|
|
161
|
+
assertNotDisposed() {
|
|
162
|
+
if (this.disposed) {
|
|
163
|
+
throw new Error("This ephemeral view has been disposed.");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.EphemeralSummaryView = EphemeralSummaryView;
|
|
168
|
+
/**
|
|
169
|
+
* Managed pseudo-fields provided by the full-text pre-filter (not stored
|
|
170
|
+
* in the summary buffer): `_textScore` is the normalized 0..1 relevance of
|
|
171
|
+
* the match, `_textScoreRaw` the engine's raw score.
|
|
172
|
+
*/
|
|
173
|
+
const TEXT_SCORE_FIELDS = new Set(["_textScore", "_textScoreRaw"]);
|
|
174
|
+
/**
|
|
175
|
+
* Guardrails mirroring `db.query()`: expressions must be answerable from
|
|
176
|
+
* the summary buffers (no decrypt, no view-tree operations in filters,
|
|
177
|
+
* referenced fields covered by EACH source's summary configuration).
|
|
178
|
+
* The text-score pseudo-fields are exempt from coverage but require an
|
|
179
|
+
* effective `text` clause on the source.
|
|
180
|
+
*/
|
|
181
|
+
function validateViewDefinition(sources, definition) {
|
|
182
|
+
const columnPaths = new Set();
|
|
183
|
+
for (const column of definition.columns) {
|
|
184
|
+
const expression = column instanceof VirtualViewColumn_1.VirtualViewColumn ? column.expression : column.expression;
|
|
185
|
+
if (!expression) {
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const requirements = (0, expressions_1.analyzeExpressionRequirements)(expression);
|
|
189
|
+
if (requirements.needsDecryption) {
|
|
190
|
+
throw new types_1.MindooQueryError("View columns cannot use decrypt expressions: encrypted fields are not stored in the summary buffer.");
|
|
191
|
+
}
|
|
192
|
+
for (const path of (0, expressions_1.getReferencedFields)(expression)) {
|
|
193
|
+
columnPaths.add(path);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
for (const source of sources) {
|
|
197
|
+
const referencedPaths = new Set(columnPaths);
|
|
198
|
+
const filter = source.filter ?? definition.filter;
|
|
199
|
+
if (filter) {
|
|
200
|
+
const requirements = (0, expressions_1.analyzeExpressionRequirements)(filter);
|
|
201
|
+
if (requirements.needsViewContext) {
|
|
202
|
+
throw new types_1.MindooQueryError(`View filters cannot use view-tree operations (${requirements.viewContextOperations.join(", ")}).`);
|
|
203
|
+
}
|
|
204
|
+
if (requirements.needsDecryption) {
|
|
205
|
+
throw new types_1.MindooQueryError("View filters cannot use decrypt expressions: encrypted fields are not stored in the summary buffer.");
|
|
206
|
+
}
|
|
207
|
+
for (const path of (0, expressions_1.getReferencedFields)(filter)) {
|
|
208
|
+
referencedPaths.add(path);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const hasTextClause = (source.text ?? definition.text) !== undefined;
|
|
212
|
+
for (const path of referencedPaths) {
|
|
213
|
+
if (TEXT_SCORE_FIELDS.has(path)) {
|
|
214
|
+
if (!hasTextClause) {
|
|
215
|
+
throw new types_1.MindooQueryError(`Expression references "${path}", but source "${source.origin}" has no 'text' clause — ` +
|
|
216
|
+
`text scores only exist for full-text pre-filtered views.`);
|
|
217
|
+
}
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (!source.summary.isFieldCovered(path)) {
|
|
221
|
+
throw new types_1.MindooQueryError(`Field "${path}" is not covered by the summary configuration of source "${source.origin}" ` +
|
|
222
|
+
`(check include/exclude in SummaryConfig).`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Build an ephemeral, summary-backed VirtualView over a single database
|
|
229
|
+
* and run its initial update. See {@link EphemeralSummaryView}.
|
|
230
|
+
*/
|
|
231
|
+
async function createEphemeralSummaryView(db, summary, definition, options) {
|
|
232
|
+
const view = new EphemeralSummaryView([{ db, summary, origin: defaultEphemeralOrigin(db) }], definition);
|
|
233
|
+
await view.update(options);
|
|
234
|
+
return view;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Build an ephemeral, summary-backed VirtualView spanning MULTIPLE
|
|
238
|
+
* databases — and, since every source brings its own tenant context, even
|
|
239
|
+
* multiple tenants. Each source contributes entries under its own origin
|
|
240
|
+
* from its own summary buffer; no documents are materialized anywhere.
|
|
241
|
+
*
|
|
242
|
+
* ```typescript
|
|
243
|
+
* const view = await queryViewAcross(
|
|
244
|
+
* [
|
|
245
|
+
* { db: salesDb },
|
|
246
|
+
* { db: archiveDb, filter: v.eq(v.field("year"), 2025) },
|
|
247
|
+
* ],
|
|
248
|
+
* {
|
|
249
|
+
* filter: v.eq(v.field("type"), "deal"),
|
|
250
|
+
* columns: [
|
|
251
|
+
* VirtualViewColumn.category("region"),
|
|
252
|
+
* VirtualViewColumn.sorted("amount", ColumnSorting.DESCENDING),
|
|
253
|
+
* ],
|
|
254
|
+
* }
|
|
255
|
+
* );
|
|
256
|
+
* ```
|
|
257
|
+
*
|
|
258
|
+
* A per-source `filter` replaces the definition-level filter for that
|
|
259
|
+
* source. `bindTo()` subscribes to the change feeds of all sources.
|
|
260
|
+
*/
|
|
261
|
+
async function queryViewAcross(sources, definition, options) {
|
|
262
|
+
const view = new EphemeralSummaryView(resolveSources(sources), definition);
|
|
263
|
+
await view.update(options);
|
|
264
|
+
return view;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=queryView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryView.js","sourceRoot":"","sources":["../../../src/core/query/queryView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { MindooDBAppBooleanExpression, MindooDBAppExpression } from "../expressions/types";
|
|
2
|
+
import type { SummaryCoverage } from "../indexing/summary/types";
|
|
3
|
+
import type { VirtualViewUpdateOptions } from "../indexing/virtualviews/IVirtualViewDataProvider";
|
|
4
|
+
/**
|
|
5
|
+
* One sort key of a {@link MindooQuery}. Either a plain summary field
|
|
6
|
+
* path, a computed expression (evaluated per row before comparison), or a
|
|
7
|
+
* special pseudo-key (`{ special: "textScore" }` sorts by the full-text
|
|
8
|
+
* relevance score of the {@link MindooQuery.text} clause).
|
|
9
|
+
*/
|
|
10
|
+
export interface MindooQuerySortKey {
|
|
11
|
+
field?: string;
|
|
12
|
+
expression?: MindooDBAppExpression;
|
|
13
|
+
/**
|
|
14
|
+
* `"textScore"`: sort by the relevance score of the query's `text`
|
|
15
|
+
* clause (only meaningful together with one). Direction defaults to the
|
|
16
|
+
* regular `direction` field — note that for pure relevance ranking you
|
|
17
|
+
* usually want `descending` (best match first), which is also the
|
|
18
|
+
* implicit default ordering when a `text` clause is present and no
|
|
19
|
+
* `sortBy` was given.
|
|
20
|
+
*/
|
|
21
|
+
special?: "textScore";
|
|
22
|
+
direction?: "ascending" | "descending";
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Full-text clause of a {@link MindooQuery}: matches documents through
|
|
26
|
+
* the database's full-text index (see docs/fulltext-search.md) and makes
|
|
27
|
+
* a relevance score available for sorting (`{ special: "textScore" }`).
|
|
28
|
+
* Requires full-text indexing to be enabled for the database — otherwise
|
|
29
|
+
* the query fails with `fulltext-not-enabled` (no silent full scan).
|
|
30
|
+
*/
|
|
31
|
+
export interface MindooQueryTextClause {
|
|
32
|
+
/** The search string (tokenized like indexed content). */
|
|
33
|
+
query: string;
|
|
34
|
+
/**
|
|
35
|
+
* Restrict matching to these index fields (document field paths, plus
|
|
36
|
+
* the synthetic `_attachments` field). Default: all indexed fields.
|
|
37
|
+
*/
|
|
38
|
+
fields?: string[];
|
|
39
|
+
/** Match term prefixes (`"drag"` matches `"dragon"`). Default: `true`. */
|
|
40
|
+
prefix?: boolean;
|
|
41
|
+
/** Fuzzy matching tolerance (see `FulltextSearchOptions.fuzzy`). Default: `false`. */
|
|
42
|
+
fuzzy?: boolean | number;
|
|
43
|
+
/** How multiple terms combine: `"AND"` (default) or `"OR"`. */
|
|
44
|
+
combineWith?: "AND" | "OR";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* An ad-hoc query over the document summary buffer (see
|
|
48
|
+
* docs/adhoc-queries.md).
|
|
49
|
+
*
|
|
50
|
+
* The filter IS an expression of the MindooDB expression language — built
|
|
51
|
+
* with `createViewLanguage()` or parsed from formula text with
|
|
52
|
+
* `parseMindooDBFormulaBooleanExpression()` — so query definitions are
|
|
53
|
+
* plain JSON and travel safely across process boundaries.
|
|
54
|
+
*/
|
|
55
|
+
export interface MindooQuery {
|
|
56
|
+
filter?: MindooDBAppBooleanExpression;
|
|
57
|
+
/**
|
|
58
|
+
* Full-text clause: additionally require documents to match this
|
|
59
|
+
* full-text search (combined with `filter` as a logical AND). Adds a
|
|
60
|
+
* relevance score per row (`MindooQueryRow.textScore`); without an
|
|
61
|
+
* explicit `sortBy`, results are ordered best score first.
|
|
62
|
+
*/
|
|
63
|
+
text?: MindooQueryTextClause;
|
|
64
|
+
sortBy?: MindooQuerySortKey[];
|
|
65
|
+
limit?: number;
|
|
66
|
+
offset?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Projection: restrict the fields returned per row. Defaults to all
|
|
69
|
+
* summary fields of the matching document.
|
|
70
|
+
*/
|
|
71
|
+
fields?: string[];
|
|
72
|
+
}
|
|
73
|
+
export interface MindooQueryOptions extends VirtualViewUpdateOptions {
|
|
74
|
+
/**
|
|
75
|
+
* Escape hatch: materialize every document via the changefeed instead of
|
|
76
|
+
* querying the summary buffer. Removes the summary coverage requirement
|
|
77
|
+
* and allows `decrypt` expressions, but costs a full document scan —
|
|
78
|
+
* document as expensive, use only for one-off/administrative queries.
|
|
79
|
+
*/
|
|
80
|
+
allowFullScan?: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface MindooQueryRow {
|
|
83
|
+
docId: string;
|
|
84
|
+
fields: Record<string, unknown>;
|
|
85
|
+
lastModified: number;
|
|
86
|
+
/**
|
|
87
|
+
* Relevance score of the query's `text` clause (higher = better
|
|
88
|
+
* match). Only present when the query had a `text` clause.
|
|
89
|
+
*/
|
|
90
|
+
textScore?: number;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Which data answered the query: `"full"`/`"rebuilding"` from the summary
|
|
94
|
+
* buffer (see {@link SummaryCoverage}), `"full-scan"` when documents were
|
|
95
|
+
* materialized via `allowFullScan`.
|
|
96
|
+
*/
|
|
97
|
+
export type MindooQueryCoverage = SummaryCoverage | "full-scan";
|
|
98
|
+
export interface MindooQueryResult {
|
|
99
|
+
rows: MindooQueryRow[];
|
|
100
|
+
/** Number of matching documents before `offset`/`limit` were applied. */
|
|
101
|
+
total: number;
|
|
102
|
+
coverage: MindooQueryCoverage;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Machine-readable reason codes for {@link MindooQueryError}. Currently
|
|
106
|
+
* only `"fulltext-not-enabled"` (a `text` clause on a database without an
|
|
107
|
+
* enabled full-text index) is distinguished; other failures carry no code.
|
|
108
|
+
*/
|
|
109
|
+
export type MindooQueryErrorCode = "fulltext-not-enabled";
|
|
110
|
+
/**
|
|
111
|
+
* Thrown for queries that cannot be answered: referenced fields outside the
|
|
112
|
+
* summary coverage, `decrypt`/view-tree expressions without
|
|
113
|
+
* `allowFullScan`, a `text` clause without an enabled full-text index,
|
|
114
|
+
* or an aborted run.
|
|
115
|
+
*/
|
|
116
|
+
export declare class MindooQueryError extends Error {
|
|
117
|
+
/** Machine-readable reason, when one is defined for the failure. */
|
|
118
|
+
readonly code?: MindooQueryErrorCode;
|
|
119
|
+
constructor(message: string, code?: MindooQueryErrorCode);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=types.d.ts.map
|