@osdk/client 2.7.1 → 2.8.0-beta.10
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/CHANGELOG.md +92 -157
- package/build/browser/Client.js +1 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/actions/applyAction.js +5 -0
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +2 -1
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +1 -0
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +9 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/intellisense.test.js +1 -1
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/object/aggregate.js +1 -0
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
- package/build/browser/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +4 -4
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +48 -27
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +18 -5
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/object.test.js +123 -0
- package/build/browser/object/object.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +6 -6
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +4 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +0 -4
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/objectSet/fetchLinksPage.js +1 -0
- package/build/browser/objectSet/fetchLinksPage.js.map +1 -1
- package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -1
- package/build/browser/observable/ObservableClient.js +11 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/AbstractHelper.js +56 -3
- package/build/browser/observable/internal/AbstractHelper.js.map +1 -1
- package/build/browser/observable/internal/AbstractHelper.test.js +114 -0
- package/build/browser/observable/internal/AbstractHelper.test.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.js +71 -9
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/browser/observable/internal/BulkObjectLoader.test.js +79 -0
- package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +19 -8
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/ListQueryView.js +120 -0
- package/build/browser/observable/internal/ListQueryView.js.map +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js +136 -24
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/PivotCanonicalizer.js +4 -4
- package/build/browser/observable/internal/PivotCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/Query.js +7 -5
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/RdpCanonicalizer.test.js +23 -7
- package/build/browser/observable/internal/RdpCanonicalizer.test.js.map +1 -1
- package/build/browser/observable/internal/Store.js +19 -2
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +328 -1
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/actions/ActionApplication.js +7 -4
- package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/browser/observable/internal/actions/OptimisticJob.js +1 -1
- package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationCacheKey.js +5 -3
- package/build/browser/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationQuery.js +28 -2
- package/build/browser/observable/internal/aggregation/AggregationQuery.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js +18 -2
- package/build/browser/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
- package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
- package/build/browser/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
- package/build/browser/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
- package/build/browser/observable/internal/base-list/BaseListQuery.js +73 -6
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/browser/observable/internal/function/FunctionQuery.js +27 -1
- package/build/browser/observable/internal/function/FunctionQuery.js.map +1 -1
- package/build/browser/observable/internal/function/FunctionsHelper.js +2 -1
- package/build/browser/observable/internal/function/FunctionsHelper.js.map +1 -1
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +2 -2
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
- package/build/browser/observable/internal/links/LinksHelper.js +3 -2
- package/build/browser/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +7 -5
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/browser/observable/internal/links/SpecificLinkQuery.js +97 -62
- package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js +19 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.js +30 -10
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/list/ListQuery.test.js +262 -1
- package/build/browser/observable/internal/list/ListQuery.test.js.map +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js +1 -1
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/browser/observable/internal/list/ObjectListQuery.js +22 -21
- package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectQuery.js +23 -6
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +12 -3
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.test.js +200 -0
- package/build/browser/observable/internal/object/ObjectsHelper.test.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js +3 -2
- package/build/browser/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
- package/build/browser/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js +4 -1
- package/build/browser/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/observable/internal/utils/rdpFieldOperations.js +7 -2
- package/build/browser/observable/internal/utils/rdpFieldOperations.js.map +1 -1
- package/build/browser/observable/internal/utils/rdpFieldOperations.test.js +55 -0
- package/build/browser/observable/internal/utils/rdpFieldOperations.test.js.map +1 -1
- package/build/browser/ontology/loadActionMetadata.js +3 -1
- package/build/browser/ontology/loadActionMetadata.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
- package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js +1 -0
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/interfaceUtils.js +7 -0
- package/build/browser/util/interfaceUtils.js.map +1 -1
- package/build/cjs/{chunk-OVZCGOMG.cjs → chunk-6VOFZIIJ.cjs} +196 -92
- package/build/cjs/chunk-6VOFZIIJ.cjs.map +1 -0
- package/build/cjs/{chunk-OZNDU7AU.cjs → chunk-YVZM2JPW.cjs} +237 -196
- package/build/cjs/chunk-YVZM2JPW.cjs.map +1 -0
- package/build/cjs/{createClient-BDmrDOzZ.d.cts → createClient-BPK4om7e.d.cts} +1 -0
- package/build/cjs/index.cjs +8 -8
- package/build/cjs/index.d.cts +1 -1
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +928 -360
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +65 -27
- package/build/esm/Client.js +1 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/actions/applyAction.js +5 -0
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +2 -1
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +1 -0
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +101 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js +1 -1
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +9 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/intellisense.test.js +1 -1
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/object/aggregate.js +1 -0
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js +3 -0
- package/build/esm/object/convertWireToOsdkObjects/InternalSymbols.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +4 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +85 -3
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +4 -4
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +48 -27
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +18 -5
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/object.test.js +123 -0
- package/build/esm/object/object.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +6 -6
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +4 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +3 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +0 -4
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/objectSet/fetchLinksPage.js +1 -0
- package/build/esm/objectSet/fetchLinksPage.js.map +1 -1
- package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -1
- package/build/esm/observable/ObservableClient.js +11 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/AbstractHelper.js +56 -3
- package/build/esm/observable/internal/AbstractHelper.js.map +1 -1
- package/build/esm/observable/internal/AbstractHelper.test.js +114 -0
- package/build/esm/observable/internal/AbstractHelper.test.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.js +71 -9
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/esm/observable/internal/BulkObjectLoader.test.js +79 -0
- package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +19 -8
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/ListQueryView.js +120 -0
- package/build/esm/observable/internal/ListQueryView.js.map +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js +136 -24
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/PivotCanonicalizer.js +4 -4
- package/build/esm/observable/internal/PivotCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/Query.js +7 -5
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/RdpCanonicalizer.test.js +23 -7
- package/build/esm/observable/internal/RdpCanonicalizer.test.js.map +1 -1
- package/build/esm/observable/internal/Store.js +19 -2
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +328 -1
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/actions/ActionApplication.js +7 -4
- package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -1
- package/build/esm/observable/internal/actions/OptimisticJob.js +1 -1
- package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationCacheKey.js +5 -3
- package/build/esm/observable/internal/aggregation/AggregationCacheKey.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationQuery.js +28 -2
- package/build/esm/observable/internal/aggregation/AggregationQuery.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js +18 -2
- package/build/esm/observable/internal/aggregation/AggregationsHelper.js.map +1 -1
- package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js +103 -0
- package/build/esm/observable/internal/aggregation/AggregationsHelper.test.js.map +1 -0
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js +22 -3
- package/build/esm/observable/internal/aggregation/ObjectAggregationQuery.js.map +1 -1
- package/build/esm/observable/internal/base-list/BaseListQuery.js +73 -6
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/esm/observable/internal/function/FunctionQuery.js +27 -1
- package/build/esm/observable/internal/function/FunctionQuery.js.map +1 -1
- package/build/esm/observable/internal/function/FunctionsHelper.js +2 -1
- package/build/esm/observable/internal/function/FunctionsHelper.js.map +1 -1
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +2 -2
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -1
- package/build/esm/observable/internal/links/LinksHelper.js +3 -2
- package/build/esm/observable/internal/links/LinksHelper.js.map +1 -1
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +7 -5
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -1
- package/build/esm/observable/internal/links/SpecificLinkQuery.js +97 -62
- package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js +19 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.js +30 -10
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/list/ListQuery.test.js +262 -1
- package/build/esm/observable/internal/list/ListQuery.test.js.map +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js +1 -1
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -1
- package/build/esm/observable/internal/list/ObjectListQuery.js +22 -21
- package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectQuery.js +23 -6
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +12 -3
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.test.js +200 -0
- package/build/esm/observable/internal/object/ObjectsHelper.test.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetCacheKey.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js +3 -2
- package/build/esm/observable/internal/objectset/ObjectSetHelper.js.map +1 -1
- package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js +94 -0
- package/build/esm/observable/internal/objectset/ObjectSetHelper.test.js.map +1 -0
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js +4 -1
- package/build/esm/observable/internal/objectset/ObjectSetQuery.js.map +1 -1
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +1 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/observable/internal/utils/rdpFieldOperations.js +7 -2
- package/build/esm/observable/internal/utils/rdpFieldOperations.js.map +1 -1
- package/build/esm/observable/internal/utils/rdpFieldOperations.test.js +55 -0
- package/build/esm/observable/internal/utils/rdpFieldOperations.test.js.map +1 -1
- package/build/esm/ontology/loadActionMetadata.js +3 -1
- package/build/esm/ontology/loadActionMetadata.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
- package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js +1 -0
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/interfaceUtils.js +7 -0
- package/build/esm/util/interfaceUtils.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/MinimalClientContext.d.ts +1 -1
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +1 -0
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/object/convertWireToOsdkObjects/InternalSymbols.d.ts +2 -0
- package/build/types/object/convertWireToOsdkObjects/InternalSymbols.d.ts.map +1 -1
- package/build/types/object/convertWireToOsdkObjects.d.ts +4 -4
- package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/object.test.d.ts.map +1 -1
- package/build/types/objectSet/createObjectSet.d.ts +5 -14
- package/build/types/objectSet/createObjectSet.d.ts.map +1 -1
- package/build/types/objectSet/fetchLinksPage.d.ts +1 -9
- package/build/types/objectSet/fetchLinksPage.d.ts.map +1 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts +2 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +71 -25
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/AbstractHelper.d.ts +1 -1
- package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -1
- package/build/types/observable/internal/AbstractHelper.test.d.ts +1 -0
- package/build/types/observable/internal/AbstractHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts +2 -1
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts +5 -0
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/ListQueryView.d.ts +21 -0
- package/build/types/observable/internal/ListQueryView.d.ts.map +1 -0
- package/build/types/observable/internal/PivotCanonicalizer.d.ts +2 -2
- package/build/types/observable/internal/PivotCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/Store.test.d.ts.map +1 -1
- package/build/types/observable/internal/actions/ActionApplication.d.ts.map +1 -1
- package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts +6 -4
- package/build/types/observable/internal/aggregation/AggregationCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts +8 -3
- package/build/types/observable/internal/aggregation/AggregationQuery.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts +19 -14
- package/build/types/observable/internal/aggregation/AggregationsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts +1 -0
- package/build/types/observable/internal/aggregation/AggregationsHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/aggregation/ObjectAggregationQuery.d.ts.map +1 -1
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +47 -2
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/function/FunctionQuery.d.ts +1 -1
- package/build/types/observable/internal/function/FunctionQuery.d.ts.map +1 -1
- package/build/types/observable/internal/function/FunctionsHelper.d.ts +1 -0
- package/build/types/observable/internal/function/FunctionsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/links/LinksHelper.d.ts +5 -5
- package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -1
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +8 -6
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +3 -4
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListQuery.d.ts +0 -3
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/list/ListsHelper.d.ts +4 -4
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts +2 -1
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts +8 -4
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.test.d.ts +1 -0
- package/build/types/observable/internal/object/ObjectsHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts +2 -1
- package/build/types/observable/internal/objectset/ObjectSetCacheKey.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts +3 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.d.ts.map +1 -1
- package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts +1 -0
- package/build/types/observable/internal/objectset/ObjectSetHelper.test.d.ts.map +1 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts +2 -0
- package/build/types/observable/internal/objectset/ObjectSetQuery.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +2 -2
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +1 -0
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/util/interfaceUtils.d.ts +2 -1
- package/build/types/util/interfaceUtils.d.ts.map +1 -1
- package/package.json +15 -14
- package/build/cjs/chunk-OVZCGOMG.cjs.map +0 -1
- package/build/cjs/chunk-OZNDU7AU.cjs.map +0 -1
|
@@ -84,15 +84,18 @@ export class ActionApplication {
|
|
|
84
84
|
promisesToWait.push(this.store.invalidateObject(obj.objectType, obj.primaryKey));
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
+
|
|
88
|
+
// Use the registry to find all RDP variant cache keys for each deleted object.
|
|
87
89
|
this.store.batch({}, batch => {
|
|
88
90
|
for (const {
|
|
89
91
|
objectType,
|
|
90
92
|
primaryKey
|
|
91
93
|
} of deletedObjects ?? []) {
|
|
92
|
-
const cacheKey
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
for (const cacheKey of this.store.objectCacheKeyRegistry.getVariants(objectType, primaryKey)) {
|
|
95
|
+
this.store.queries.peek(cacheKey)?.deleteFromStore("loaded",
|
|
96
|
+
// this is probably not the best value to use
|
|
97
|
+
batch);
|
|
98
|
+
}
|
|
96
99
|
}
|
|
97
100
|
});
|
|
98
101
|
await Promise.all(promisesToWait);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionApplication.js","names":["runOptimisticJob","ACTION_DELAY","process","env","NODE_ENV","ActionApplication","constructor","store","applyAction","action","args","optimisticUpdate","logger","child","methodName","removeOptimisticResult","Array","isArray","debug","results","client","batchApplyAction","$returnEdits","invalidateActionEditResponse","actionResults","Promise","resolve","setTimeout","actionEditResponse","deletedObjects","modifiedObjects","addedObjects","editedObjectTypes","type","changes","promisesToWait","list","obj","push","invalidateObject","objectType","primaryKey","batch","cacheKey","
|
|
1
|
+
{"version":3,"file":"ActionApplication.js","names":["runOptimisticJob","ACTION_DELAY","process","env","NODE_ENV","ActionApplication","constructor","store","applyAction","action","args","optimisticUpdate","logger","child","methodName","removeOptimisticResult","Array","isArray","debug","results","client","batchApplyAction","$returnEdits","invalidateActionEditResponse","actionResults","Promise","resolve","setTimeout","actionEditResponse","deletedObjects","modifiedObjects","addedObjects","editedObjectTypes","type","changes","promisesToWait","list","obj","push","invalidateObject","objectType","primaryKey","batch","cacheKey","objectCacheKeyRegistry","getVariants","queries","peek","deleteFromStore","all","apiName","invalidateObjectType"],"sources":["ActionApplication.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ActionReturnTypeForOptions,\n} from \"@osdk/api\";\nimport type { ActionSignatureFromDef } from \"../../../actions/applyAction.js\";\nimport { type Changes } from \"../Changes.js\";\nimport type { Store } from \"../Store.js\";\nimport { runOptimisticJob } from \"./OptimisticJob.js\";\n\nconst ACTION_DELAY = process.env.NODE_ENV === \"production\" ? 0 : 1000;\n\nexport class ActionApplication {\n constructor(private store: Store) {}\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (\n action,\n args,\n { optimisticUpdate } = {},\n ) => {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.store.logger?.child({ methodName: \"applyAction\" })\n : this.store.logger;\n const removeOptimisticResult = runOptimisticJob(\n this.store,\n optimisticUpdate,\n );\n\n return await (async () => {\n try {\n if (Array.isArray(args)) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"applying action to multiple args\", args);\n }\n\n const results: ActionReturnTypeForOptions<{ $returnEdits: true }> =\n await this.store\n .client(action).batchApplyAction(\n args,\n { $returnEdits: true },\n );\n\n await this.#invalidateActionEditResponse(results);\n\n return results;\n }\n\n // The types for client get confused when we dynamically applyAction so we\n // have to deal with the `any` here and force cast it to what it should be.\n // TODO: Update the types so this doesn't happen!\n\n const actionResults: ActionEditResponse = await this.store.client(\n action,\n ).applyAction(args as any, { $returnEdits: true });\n\n if (process.env.NODE_ENV !== \"production\") {\n if (ACTION_DELAY > 0) {\n logger?.debug(\"action done, pausing\", actionResults);\n await new Promise<void>(resolve =>\n setTimeout(resolve, ACTION_DELAY)\n );\n logger?.debug(\"action done, pausing done\");\n }\n }\n await this.#invalidateActionEditResponse(actionResults);\n return actionResults;\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\n \"optimistic action complete; remove the results\",\n );\n }\n // make sure this happens even if the action fails\n await removeOptimisticResult();\n }\n })();\n };\n\n #invalidateActionEditResponse = async (\n actionEditResponse: ActionEditResponse | undefined,\n ): Promise<void> => {\n if (actionEditResponse == null) {\n return;\n }\n const {\n deletedObjects,\n modifiedObjects,\n addedObjects,\n editedObjectTypes,\n type,\n } = actionEditResponse;\n let changes: Changes | undefined;\n if (type === \"edits\") {\n const promisesToWait: Promise<any>[] = [];\n\n for (const list of [deletedObjects, modifiedObjects, addedObjects]) {\n for (const obj of list ?? []) {\n promisesToWait.push(\n this.store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n }\n }\n\n // Use the registry to find all RDP variant cache keys for each deleted object.\n this.store.batch({}, (batch) => {\n for (const { objectType, primaryKey } of deletedObjects ?? []) {\n for (\n const cacheKey of this.store.objectCacheKeyRegistry.getVariants(\n objectType,\n primaryKey,\n )\n ) {\n this.store.queries.peek(cacheKey)?.deleteFromStore(\n \"loaded\", // this is probably not the best value to use\n batch,\n );\n }\n }\n });\n await Promise.all(promisesToWait);\n } else {\n for (const apiName of editedObjectTypes) {\n await this.store.invalidateObjectType(apiName as string, changes);\n }\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptimisticJob.js","names":["additionalContext","createOptimisticId","OptimisticJob","result","constructor","store","optimisticId","updatedObjects","addedObjectPromises","deletedObjects","getResult","addedObjects","Promise","allSettled","batchResult","batch","obj","status","objects","getQuery","apiName","value","$objectType","pk","$primaryKey","undefined","writeToStore","deleteFromStore","changes","context","updateObject","push","createObject","type","properties","create","client","objectFactory2","$apiName","then","objs","deleteObject","runOptimisticJob","optimisticUpdate","resolve","job","optimisticApplicationDone","finally","layers","remove"],"sources":["OptimisticJob.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { additionalContext } from \"../../../Client.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { OptimisticBuilder } from \"../../OptimisticBuilder.js\";\nimport { type Changes } from \"../Changes.js\";\nimport { createOptimisticId, type OptimisticId } from \"../OptimisticId.js\";\nimport type { Store } from \"../Store.js\";\n\nexport class OptimisticJob {\n context: OptimisticBuilder;\n getResult: () => Promise<Changes>;\n #result!: Promise<Changes>;\n\n constructor(store: Store, optimisticId: OptimisticId) {\n const updatedObjects: Array<\n ObjectHolder\n > = [];\n\n // due to potentially needing to fetch the object metadata,\n // the creation of objects needs to be async. In practice, the\n // metadata is cached.\n const addedObjectPromises: Array<\n Promise<ObjectHolder>\n > = [];\n\n const deletedObjects: Array<ObjectHolder> = [];\n\n // TODO, this code needs to be refactored. its weird right now\n // but the contract for `runOptimisticJob` is good.\n\n // todo memoize this\n this.getResult = () => {\n return this.#result ??= (async () => {\n const addedObjects = await Promise.allSettled(\n addedObjectPromises,\n );\n\n const { batchResult } = store.batch({ optimisticId }, (batch) => {\n for (const obj of addedObjects) {\n if (obj.status === \"fulfilled\") {\n store.objects.getQuery({\n apiName: obj.value.$objectType,\n pk: obj.value.$primaryKey,\n }, undefined).writeToStore(obj.value, \"loading\", batch);\n } else {\n // TODO FIXME\n throw obj;\n }\n }\n\n for (const obj of updatedObjects) {\n store.objects.getQuery({\n apiName: obj.$objectType,\n pk: obj.$primaryKey,\n }, undefined).writeToStore(obj, \"loading\", batch);\n }\n\n for (const obj of deletedObjects) {\n store.objects.getQuery({\n apiName: obj.$objectType,\n pk: obj.$primaryKey,\n }, undefined).deleteFromStore(\"loading\", batch);\n }\n });\n\n return batchResult.changes;\n })();\n };\n\n this.context = {\n updateObject(value) {\n updatedObjects.push(value as unknown as ObjectHolder<typeof value>);\n return this;\n },\n createObject(type, pk, properties) {\n const create = store.client[additionalContext].objectFactory2(\n store.client[additionalContext],\n [{\n $primaryKey: pk,\n $apiName: type.apiName,\n $objectType: type.apiName,\n ...properties,\n }],\n undefined,\n {},\n ).then(objs => {\n return objs[0];\n });\n\n addedObjectPromises.push(create);\n return this;\n },\n deleteObject(value) {\n deletedObjects.push(value as unknown as ObjectHolder<typeof value>);\n return this;\n },\n };\n }\n}\n\nexport function runOptimisticJob(\n store: Store,\n optimisticUpdate: undefined | ((ctx: OptimisticBuilder) => void),\n): () => Promise<void> {\n if (!optimisticUpdate) {\n return () => Promise.resolve();\n }\n\n const optimisticId = createOptimisticId();\n const job = new OptimisticJob(store, optimisticId);\n optimisticUpdate(job.context);\n const optimisticApplicationDone = job.getResult();\n\n return () => {\n return optimisticApplicationDone.then(\n // we don't want to leak the result\n () => undefined,\n ).finally(() => {\n store.layers.remove(optimisticId);\n });\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,oBAAoB;AAItD,SAASC,kBAAkB,QAA2B,oBAAoB;AAG1E,OAAO,MAAMC,aAAa,CAAC;EAGzB,CAACC,MAAM;EAEPC,WAAWA,CAACC,KAAY,EAAEC,YAA0B,EAAE;IACpD,MAAMC,cAEL,GAAG,EAAE;;IAEN;IACA;IACA;IACA,MAAMC,mBAEL,GAAG,EAAE;IAEN,MAAMC,cAAmC,GAAG,EAAE;;IAE9C;IACA;;IAEA;IACA,IAAI,CAACC,SAAS,GAAG,MAAM;MACrB,OAAO,IAAI,CAAC,CAACP,MAAM,KAAK,CAAC,YAAY;QACnC,MAAMQ,YAAY,GAAG,MAAMC,OAAO,CAACC,UAAU,CAC3CL,mBACF,CAAC;QAED,MAAM;UAAEM;QAAY,CAAC,GAAGT,KAAK,CAACU,KAAK,CAAC;UAAET;QAAa,CAAC,EAAGS,KAAK,IAAK;UAC/D,KAAK,MAAMC,GAAG,IAAIL,YAAY,EAAE;YAC9B,IAAIK,GAAG,CAACC,MAAM,KAAK,WAAW,EAAE;cAC9BZ,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;gBACrBC,OAAO,EAAEJ,GAAG,CAACK,KAAK,CAACC,WAAW;gBAC9BC,EAAE,EAAEP,GAAG,CAACK,KAAK,CAACG;cAChB,CAAC,EAAEC,SAAS,CAAC,CAACC,YAAY,CAACV,GAAG,CAACK,KAAK,EAAE,SAAS,EAAEN,KAAK,CAAC;YACzD,CAAC,MAAM;cACL;cACA,MAAMC,GAAG;YACX;UACF;UAEA,KAAK,MAAMA,GAAG,IAAIT,cAAc,EAAE;YAChCF,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;cACrBC,OAAO,EAAEJ,GAAG,CAACM,WAAW;cACxBC,EAAE,EAAEP,GAAG,CAACQ;YACV,CAAC,EAAEC,SAAS,CAAC,CAACC,YAAY,CAACV,GAAG,EAAE,SAAS,EAAED,KAAK,CAAC;UACnD;UAEA,KAAK,MAAMC,GAAG,IAAIP,cAAc,EAAE;YAChCJ,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;cACrBC,OAAO,EAAEJ,GAAG,CAACM,WAAW;cACxBC,EAAE,EAAEP,GAAG,CAACQ;YACV,CAAC,EAAEC,SAAS,CAAC,CAACE,eAAe,CAAC,SAAS,EAAEZ,KAAK,CAAC;UACjD;QACF,CAAC,CAAC;QAEF,OAAOD,WAAW,CAACc,OAAO;MAC5B,CAAC,EAAE,CAAC;IACN,CAAC;IAED,IAAI,CAACC,OAAO,GAAG;MACbC,YAAYA,CAACT,KAAK,EAAE;QAClBd,cAAc,CAACwB,IAAI,CAACV,KAA8C,CAAC;QACnE,OAAO,IAAI;MACb,CAAC;MACDW,YAAYA,CAACC,IAAI,EAAEV,EAAE,EAAEW,UAAU,EAAE;QACjC,MAAMC,MAAM,GAAG9B,KAAK,CAAC+B,MAAM,CAACpC,iBAAiB,CAAC,CAACqC,cAAc,CAC3DhC,KAAK,CAAC+B,MAAM,CAACpC,iBAAiB,CAAC,EAC/B,CAAC;UACCwB,WAAW,EAAED,EAAE;UACfe,QAAQ,EAAEL,IAAI,CAACb,OAAO;UACtBE,WAAW,EAAEW,IAAI,CAACb,OAAO;UACzB,GAAGc;QACL,CAAC,CAAC,EACFT,SAAS,EACT,CAAC,
|
|
1
|
+
{"version":3,"file":"OptimisticJob.js","names":["additionalContext","createOptimisticId","OptimisticJob","result","constructor","store","optimisticId","updatedObjects","addedObjectPromises","deletedObjects","getResult","addedObjects","Promise","allSettled","batchResult","batch","obj","status","objects","getQuery","apiName","value","$objectType","pk","$primaryKey","undefined","writeToStore","deleteFromStore","changes","context","updateObject","push","createObject","type","properties","create","client","objectFactory2","$apiName","then","objs","deleteObject","runOptimisticJob","optimisticUpdate","resolve","job","optimisticApplicationDone","finally","layers","remove"],"sources":["OptimisticJob.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { additionalContext } from \"../../../Client.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { OptimisticBuilder } from \"../../OptimisticBuilder.js\";\nimport { type Changes } from \"../Changes.js\";\nimport { createOptimisticId, type OptimisticId } from \"../OptimisticId.js\";\nimport type { Store } from \"../Store.js\";\n\nexport class OptimisticJob {\n context: OptimisticBuilder;\n getResult: () => Promise<Changes>;\n #result!: Promise<Changes>;\n\n constructor(store: Store, optimisticId: OptimisticId) {\n const updatedObjects: Array<\n ObjectHolder\n > = [];\n\n // due to potentially needing to fetch the object metadata,\n // the creation of objects needs to be async. In practice, the\n // metadata is cached.\n const addedObjectPromises: Array<\n Promise<ObjectHolder>\n > = [];\n\n const deletedObjects: Array<ObjectHolder> = [];\n\n // TODO, this code needs to be refactored. its weird right now\n // but the contract for `runOptimisticJob` is good.\n\n // todo memoize this\n this.getResult = () => {\n return this.#result ??= (async () => {\n const addedObjects = await Promise.allSettled(\n addedObjectPromises,\n );\n\n const { batchResult } = store.batch({ optimisticId }, (batch) => {\n for (const obj of addedObjects) {\n if (obj.status === \"fulfilled\") {\n store.objects.getQuery({\n apiName: obj.value.$objectType,\n pk: obj.value.$primaryKey,\n }, undefined).writeToStore(obj.value, \"loading\", batch);\n } else {\n // TODO FIXME\n throw obj;\n }\n }\n\n for (const obj of updatedObjects) {\n store.objects.getQuery({\n apiName: obj.$objectType,\n pk: obj.$primaryKey,\n }, undefined).writeToStore(obj, \"loading\", batch);\n }\n\n for (const obj of deletedObjects) {\n store.objects.getQuery({\n apiName: obj.$objectType,\n pk: obj.$primaryKey,\n }, undefined).deleteFromStore(\"loading\", batch);\n }\n });\n\n return batchResult.changes;\n })();\n };\n\n this.context = {\n updateObject(value) {\n updatedObjects.push(value as unknown as ObjectHolder<typeof value>);\n return this;\n },\n createObject(type, pk, properties) {\n const create = store.client[additionalContext].objectFactory2(\n store.client[additionalContext],\n [{\n $primaryKey: pk,\n $apiName: type.apiName,\n $objectType: type.apiName,\n ...properties,\n }],\n undefined,\n {},\n undefined,\n ).then(objs => {\n return objs[0];\n });\n\n addedObjectPromises.push(create);\n return this;\n },\n deleteObject(value) {\n deletedObjects.push(value as unknown as ObjectHolder<typeof value>);\n return this;\n },\n };\n }\n}\n\nexport function runOptimisticJob(\n store: Store,\n optimisticUpdate: undefined | ((ctx: OptimisticBuilder) => void),\n): () => Promise<void> {\n if (!optimisticUpdate) {\n return () => Promise.resolve();\n }\n\n const optimisticId = createOptimisticId();\n const job = new OptimisticJob(store, optimisticId);\n optimisticUpdate(job.context);\n const optimisticApplicationDone = job.getResult();\n\n return () => {\n return optimisticApplicationDone.then(\n // we don't want to leak the result\n () => undefined,\n ).finally(() => {\n store.layers.remove(optimisticId);\n });\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,iBAAiB,QAAQ,oBAAoB;AAItD,SAASC,kBAAkB,QAA2B,oBAAoB;AAG1E,OAAO,MAAMC,aAAa,CAAC;EAGzB,CAACC,MAAM;EAEPC,WAAWA,CAACC,KAAY,EAAEC,YAA0B,EAAE;IACpD,MAAMC,cAEL,GAAG,EAAE;;IAEN;IACA;IACA;IACA,MAAMC,mBAEL,GAAG,EAAE;IAEN,MAAMC,cAAmC,GAAG,EAAE;;IAE9C;IACA;;IAEA;IACA,IAAI,CAACC,SAAS,GAAG,MAAM;MACrB,OAAO,IAAI,CAAC,CAACP,MAAM,KAAK,CAAC,YAAY;QACnC,MAAMQ,YAAY,GAAG,MAAMC,OAAO,CAACC,UAAU,CAC3CL,mBACF,CAAC;QAED,MAAM;UAAEM;QAAY,CAAC,GAAGT,KAAK,CAACU,KAAK,CAAC;UAAET;QAAa,CAAC,EAAGS,KAAK,IAAK;UAC/D,KAAK,MAAMC,GAAG,IAAIL,YAAY,EAAE;YAC9B,IAAIK,GAAG,CAACC,MAAM,KAAK,WAAW,EAAE;cAC9BZ,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;gBACrBC,OAAO,EAAEJ,GAAG,CAACK,KAAK,CAACC,WAAW;gBAC9BC,EAAE,EAAEP,GAAG,CAACK,KAAK,CAACG;cAChB,CAAC,EAAEC,SAAS,CAAC,CAACC,YAAY,CAACV,GAAG,CAACK,KAAK,EAAE,SAAS,EAAEN,KAAK,CAAC;YACzD,CAAC,MAAM;cACL;cACA,MAAMC,GAAG;YACX;UACF;UAEA,KAAK,MAAMA,GAAG,IAAIT,cAAc,EAAE;YAChCF,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;cACrBC,OAAO,EAAEJ,GAAG,CAACM,WAAW;cACxBC,EAAE,EAAEP,GAAG,CAACQ;YACV,CAAC,EAAEC,SAAS,CAAC,CAACC,YAAY,CAACV,GAAG,EAAE,SAAS,EAAED,KAAK,CAAC;UACnD;UAEA,KAAK,MAAMC,GAAG,IAAIP,cAAc,EAAE;YAChCJ,KAAK,CAACa,OAAO,CAACC,QAAQ,CAAC;cACrBC,OAAO,EAAEJ,GAAG,CAACM,WAAW;cACxBC,EAAE,EAAEP,GAAG,CAACQ;YACV,CAAC,EAAEC,SAAS,CAAC,CAACE,eAAe,CAAC,SAAS,EAAEZ,KAAK,CAAC;UACjD;QACF,CAAC,CAAC;QAEF,OAAOD,WAAW,CAACc,OAAO;MAC5B,CAAC,EAAE,CAAC;IACN,CAAC;IAED,IAAI,CAACC,OAAO,GAAG;MACbC,YAAYA,CAACT,KAAK,EAAE;QAClBd,cAAc,CAACwB,IAAI,CAACV,KAA8C,CAAC;QACnE,OAAO,IAAI;MACb,CAAC;MACDW,YAAYA,CAACC,IAAI,EAAEV,EAAE,EAAEW,UAAU,EAAE;QACjC,MAAMC,MAAM,GAAG9B,KAAK,CAAC+B,MAAM,CAACpC,iBAAiB,CAAC,CAACqC,cAAc,CAC3DhC,KAAK,CAAC+B,MAAM,CAACpC,iBAAiB,CAAC,EAC/B,CAAC;UACCwB,WAAW,EAAED,EAAE;UACfe,QAAQ,EAAEL,IAAI,CAACb,OAAO;UACtBE,WAAW,EAAEW,IAAI,CAACb,OAAO;UACzB,GAAGc;QACL,CAAC,CAAC,EACFT,SAAS,EACT,CAAC,CAAC,EACFA,SACF,CAAC,CAACc,IAAI,CAACC,IAAI,IAAI;UACb,OAAOA,IAAI,CAAC,CAAC,CAAC;QAChB,CAAC,CAAC;QAEFhC,mBAAmB,CAACuB,IAAI,CAACI,MAAM,CAAC;QAChC,OAAO,IAAI;MACb,CAAC;MACDM,YAAYA,CAACpB,KAAK,EAAE;QAClBZ,cAAc,CAACsB,IAAI,CAACV,KAA8C,CAAC;QACnE,OAAO,IAAI;MACb;IACF,CAAC;EACH;AACF;AAEA,OAAO,SAASqB,gBAAgBA,CAC9BrC,KAAY,EACZsC,gBAAgE,EAC3C;EACrB,IAAI,CAACA,gBAAgB,EAAE;IACrB,OAAO,MAAM/B,OAAO,CAACgC,OAAO,CAAC,CAAC;EAChC;EAEA,MAAMtC,YAAY,GAAGL,kBAAkB,CAAC,CAAC;EACzC,MAAM4C,GAAG,GAAG,IAAI3C,aAAa,CAACG,KAAK,EAAEC,YAAY,CAAC;EAClDqC,gBAAgB,CAACE,GAAG,CAAChB,OAAO,CAAC;EAC7B,MAAMiB,yBAAyB,GAAGD,GAAG,CAACnC,SAAS,CAAC,CAAC;EAEjD,OAAO,MAAM;IACX,OAAOoC,yBAAyB,CAACP,IAAI;IACnC;IACA,MAAMd,SACR,CAAC,CAACsB,OAAO,CAAC,MAAM;MACd1C,KAAK,CAAC2C,MAAM,CAACC,MAAM,CAAC3C,YAAY,CAAC;IACnC,CAAC,CAAC;EACJ,CAAC;AACH","ignoreList":[]}
|
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
|
|
17
17
|
export const TYPE_IDX = 0;
|
|
18
18
|
export const API_NAME_IDX = 1;
|
|
19
|
-
export const
|
|
20
|
-
export const
|
|
21
|
-
export const
|
|
19
|
+
export const WIRE_OBJECT_SET_IDX = 2;
|
|
20
|
+
export const WHERE_IDX = 3;
|
|
21
|
+
export const RDP_IDX = 4;
|
|
22
|
+
export const INTERSECT_IDX = 5;
|
|
23
|
+
export const AGGREGATE_IDX = 6;
|
|
22
24
|
//# sourceMappingURL=AggregationCacheKey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregationCacheKey.js","names":["TYPE_IDX","API_NAME_IDX","WHERE_IDX","RDP_IDX","AGGREGATE_IDX"],"sources":["AggregationCacheKey.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AggregateOpts,\n AggregationsResults,\n ObjectOrInterfaceDefinition,\n} from \"@osdk/api\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { AggregationQuery } from \"./AggregationQuery.js\";\n\nexport const TYPE_IDX = 0;\nexport const API_NAME_IDX = 1;\nexport const
|
|
1
|
+
{"version":3,"file":"AggregationCacheKey.js","names":["TYPE_IDX","API_NAME_IDX","WIRE_OBJECT_SET_IDX","WHERE_IDX","RDP_IDX","INTERSECT_IDX","AGGREGATE_IDX"],"sources":["AggregationCacheKey.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AggregateOpts,\n AggregationsResults,\n ObjectOrInterfaceDefinition,\n} from \"@osdk/api\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { AggregationQuery } from \"./AggregationQuery.js\";\n\nexport const TYPE_IDX = 0;\nexport const API_NAME_IDX = 1;\nexport const WIRE_OBJECT_SET_IDX = 2;\nexport const WHERE_IDX = 3;\nexport const RDP_IDX = 4;\nexport const INTERSECT_IDX = 5;\nexport const AGGREGATE_IDX = 6;\n\nexport interface AggregationCacheKey extends\n CacheKey<\n \"aggregation\",\n | AggregationsResults<\n ObjectOrInterfaceDefinition,\n AggregateOpts<ObjectOrInterfaceDefinition>\n >\n | undefined,\n AggregationQuery,\n [\n type: \"object\" | \"interface\",\n apiName: string,\n wireObjectSet: string | undefined,\n whereClause: Canonical<SimpleWhereClause>,\n rdpConfig: Canonical<Rdp> | undefined,\n intersectWith: Canonical<Array<Canonical<SimpleWhereClause>>> | undefined,\n aggregateOpts: Canonical<AggregateOpts<ObjectOrInterfaceDefinition>>,\n ]\n >\n{\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAaA,OAAO,MAAMA,QAAQ,GAAG,CAAC;AACzB,OAAO,MAAMC,YAAY,GAAG,CAAC;AAC7B,OAAO,MAAMC,mBAAmB,GAAG,CAAC;AACpC,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,OAAO,GAAG,CAAC;AACxB,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,aAAa,GAAG,CAAC","ignoreList":[]}
|
|
@@ -16,9 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
import { BehaviorSubject, connectable, map } from "rxjs";
|
|
18
18
|
import { additionalContext } from "../../../Client.js";
|
|
19
|
+
import { getObjectTypesThatInvalidate } from "../getObjectTypesThatInvalidate.js";
|
|
19
20
|
import { Query } from "../Query.js";
|
|
20
|
-
import { AGGREGATE_IDX, API_NAME_IDX, RDP_IDX, WHERE_IDX } from "./AggregationCacheKey.js";
|
|
21
|
+
import { AGGREGATE_IDX, API_NAME_IDX, RDP_IDX, WHERE_IDX, WIRE_OBJECT_SET_IDX } from "./AggregationCacheKey.js";
|
|
21
22
|
export class AggregationQuery extends Query {
|
|
23
|
+
#invalidationTypes;
|
|
24
|
+
#invalidationTypesPromise;
|
|
22
25
|
constructor(store, subject, cacheKey, opts) {
|
|
23
26
|
super(store, subject, opts, cacheKey, process.env.NODE_ENV !== "production" ? store.client[additionalContext].logger?.child({}, {
|
|
24
27
|
msgPrefix: `AggregationQuery<${cacheKey.otherKeys.map(x => JSON.stringify(x)).join(", ")}>`
|
|
@@ -27,6 +30,29 @@ export class AggregationQuery extends Query {
|
|
|
27
30
|
this.canonicalWhere = cacheKey.otherKeys[WHERE_IDX];
|
|
28
31
|
this.rdpConfig = cacheKey.otherKeys[RDP_IDX];
|
|
29
32
|
this.canonicalAggregate = cacheKey.otherKeys[AGGREGATE_IDX];
|
|
33
|
+
const serializedObjectSet = cacheKey.otherKeys[WIRE_OBJECT_SET_IDX];
|
|
34
|
+
this.#invalidationTypes = new Set([this.apiName]);
|
|
35
|
+
if (serializedObjectSet) {
|
|
36
|
+
this.parsedWireObjectSet = JSON.parse(serializedObjectSet);
|
|
37
|
+
this.#invalidationTypesPromise = this.#computeInvalidationTypes(this.parsedWireObjectSet);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async #computeInvalidationTypes(wireObjectSet) {
|
|
41
|
+
try {
|
|
42
|
+
const {
|
|
43
|
+
invalidationSet
|
|
44
|
+
} = await getObjectTypesThatInvalidate(this.store.client[additionalContext], wireObjectSet);
|
|
45
|
+
return new Set([this.apiName, ...invalidationSet]);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
this.store.logger?.error("Failed to compute invalidation types for aggregation, falling back to base type only", error);
|
|
48
|
+
return new Set([this.apiName]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async ensureInvalidationTypesReady() {
|
|
52
|
+
if (this.#invalidationTypesPromise) {
|
|
53
|
+
this.#invalidationTypes = await this.#invalidationTypesPromise;
|
|
54
|
+
this.#invalidationTypesPromise = undefined;
|
|
55
|
+
}
|
|
30
56
|
}
|
|
31
57
|
_createConnectable(subject) {
|
|
32
58
|
return connectable(subject.pipe(map(x => {
|
|
@@ -67,7 +93,7 @@ export class AggregationQuery extends Query {
|
|
|
67
93
|
return batch.read(this.cacheKey);
|
|
68
94
|
}
|
|
69
95
|
invalidateObjectType = (objectType, changes) => {
|
|
70
|
-
if (this.
|
|
96
|
+
if (this.#invalidationTypes.has(objectType)) {
|
|
71
97
|
changes?.modified.add(this.cacheKey);
|
|
72
98
|
return this.revalidate(true);
|
|
73
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregationQuery.js","names":["BehaviorSubject","connectable","map","additionalContext","Query","AGGREGATE_IDX","API_NAME_IDX","RDP_IDX","WHERE_IDX","AggregationQuery","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","x","JSON","stringify","join","undefined","apiName","canonicalWhere","rdpConfig","canonicalAggregate","_createConnectable","pipe","status","result","value","lastUpdated","error","Error","connector","_fetchAndStore","methodName","debug","_fetchAggregation","batch","writeToStore","err","data","write","changes","modified","add","read","invalidateObjectType","objectType","revalidate","Promise","resolve"],"sources":["AggregationQuery.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AggregateOpts,\n AggregationsResults,\n DerivedProperty,\n ObjectOrInterfaceDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Connectable, Observable, Subject } from \"rxjs\";\nimport { BehaviorSubject, connectable, map } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { Query } from \"../Query.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport {\n AGGREGATE_IDX,\n type AggregationCacheKey,\n API_NAME_IDX,\n RDP_IDX,\n WHERE_IDX,\n} from \"./AggregationCacheKey.js\";\n\nexport interface AggregationPayload<\n Q extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<Q>,\n> {\n result: AggregationsResults<Q, A> | undefined;\n status: Status;\n lastUpdated: number;\n error?: Error;\n}\n\nexport interface AggregationQueryOptions<\n Q extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<Q>,\n> extends CommonObserveOptions {\n type: Q;\n where?: WhereClause<Q, Record<string, any>>;\n withProperties?: DerivedProperty.Clause<Q>;\n aggregate: A;\n}\n\nexport interface AggregationPayloadBase {\n result:\n | AggregationsResults<\n ObjectOrInterfaceDefinition,\n AggregateOpts<ObjectOrInterfaceDefinition>\n >\n | undefined;\n status: Status;\n lastUpdated: number;\n error?: Error;\n}\n\nexport abstract class AggregationQuery extends Query<\n AggregationCacheKey,\n AggregationPayloadBase,\n CommonObserveOptions\n> {\n protected apiName: string;\n protected canonicalWhere: Canonical<SimpleWhereClause>;\n protected canonicalAggregate: Canonical<\n AggregateOpts<ObjectOrInterfaceDefinition>\n >;\n protected rdpConfig: Canonical<Rdp> | undefined;\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<AggregationCacheKey>>,\n cacheKey: AggregationCacheKey,\n opts: CommonObserveOptions,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `AggregationQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n this.apiName = cacheKey.otherKeys[API_NAME_IDX];\n this.canonicalWhere = cacheKey.otherKeys[WHERE_IDX];\n this.rdpConfig = cacheKey.otherKeys[RDP_IDX];\n this.canonicalAggregate = cacheKey.otherKeys[AGGREGATE_IDX];\n }\n\n protected _createConnectable(\n subject: Observable<SubjectPayload<AggregationCacheKey>>,\n ): Connectable<AggregationPayloadBase> {\n return connectable<AggregationPayloadBase>(\n subject.pipe(\n map((x) => {\n return {\n status: x.status,\n result: x.value,\n lastUpdated: x.lastUpdated,\n error: x.status === \"error\"\n ? new Error(\"Aggregation failed\")\n : undefined,\n };\n }),\n ),\n {\n connector: () =>\n new BehaviorSubject<AggregationPayloadBase>({\n status: \"init\",\n result: undefined,\n lastUpdated: 0,\n }),\n },\n );\n }\n\n async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"calling _fetchAndStore\",\n );\n }\n\n try {\n const result = await this._fetchAggregation();\n\n this.store.batch({}, (batch) => {\n this.writeToStore(result, \"loaded\", batch);\n });\n } catch (err) {\n this.store.batch({}, (batch) => {\n this.writeToStore(undefined, \"error\", batch);\n });\n }\n }\n\n protected abstract _fetchAggregation(): Promise<\n AggregationCacheKey[\"__cacheKey\"][\"value\"]\n >;\n\n writeToStore(\n data: AggregationCacheKey[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<AggregationCacheKey> {\n batch.write(this.cacheKey, data, status);\n batch.changes.modified.add(this.cacheKey);\n return batch.read(this.cacheKey)!;\n }\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.apiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"AggregationQuery.js","names":["BehaviorSubject","connectable","map","additionalContext","getObjectTypesThatInvalidate","Query","AGGREGATE_IDX","API_NAME_IDX","RDP_IDX","WHERE_IDX","WIRE_OBJECT_SET_IDX","AggregationQuery","invalidationTypes","invalidationTypesPromise","constructor","store","subject","cacheKey","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","x","JSON","stringify","join","undefined","apiName","canonicalWhere","rdpConfig","canonicalAggregate","serializedObjectSet","Set","parsedWireObjectSet","parse","computeInvalidationTypes","#computeInvalidationTypes","wireObjectSet","invalidationSet","error","ensureInvalidationTypesReady","_createConnectable","pipe","status","result","value","lastUpdated","Error","connector","_fetchAndStore","methodName","debug","_fetchAggregation","batch","writeToStore","err","data","write","changes","modified","add","read","invalidateObjectType","objectType","has","revalidate","Promise","resolve"],"sources":["AggregationQuery.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AggregateOpts,\n AggregationsResults,\n DerivedProperty,\n ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { ObjectSet as WireObjectSet } from \"@osdk/foundry.ontologies\";\nimport type { Connectable, Observable, Subject } from \"rxjs\";\nimport { BehaviorSubject, connectable, map } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport { getObjectTypesThatInvalidate } from \"../getObjectTypesThatInvalidate.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { Query } from \"../Query.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport {\n AGGREGATE_IDX,\n type AggregationCacheKey,\n API_NAME_IDX,\n RDP_IDX,\n WHERE_IDX,\n WIRE_OBJECT_SET_IDX,\n} from \"./AggregationCacheKey.js\";\n\nexport interface AggregationPayload<\n Q extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<Q>,\n> {\n result: AggregationsResults<Q, A> | undefined;\n status: Status;\n lastUpdated: number;\n error?: Error;\n}\n\nexport interface AggregationQueryOptions<\n Q extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<Q>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n> extends CommonObserveOptions {\n type: Q;\n where?: WhereClause<Q, RDPs>;\n withProperties?: DerivedProperty.Clause<Q>;\n aggregate: A;\n}\n\nexport interface AggregationPayloadBase {\n result:\n | AggregationsResults<\n ObjectOrInterfaceDefinition,\n AggregateOpts<ObjectOrInterfaceDefinition>\n >\n | undefined;\n status: Status;\n lastUpdated: number;\n error?: Error;\n}\n\nexport abstract class AggregationQuery extends Query<\n AggregationCacheKey,\n AggregationPayloadBase,\n CommonObserveOptions\n> {\n protected apiName: string;\n protected canonicalWhere: Canonical<SimpleWhereClause>;\n protected canonicalAggregate: Canonical<\n AggregateOpts<ObjectOrInterfaceDefinition>\n >;\n protected rdpConfig: Canonical<Rdp> | undefined;\n protected parsedWireObjectSet: WireObjectSet | undefined;\n #invalidationTypes: Set<string>;\n #invalidationTypesPromise: Promise<Set<string>> | undefined;\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<AggregationCacheKey>>,\n cacheKey: AggregationCacheKey,\n opts: CommonObserveOptions,\n ) {\n super(\n store,\n subject,\n opts,\n cacheKey,\n process.env.NODE_ENV !== \"production\"\n ? (\n store.client[additionalContext].logger?.child({}, {\n msgPrefix: `AggregationQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n this.apiName = cacheKey.otherKeys[API_NAME_IDX];\n this.canonicalWhere = cacheKey.otherKeys[WHERE_IDX];\n this.rdpConfig = cacheKey.otherKeys[RDP_IDX];\n this.canonicalAggregate = cacheKey.otherKeys[AGGREGATE_IDX];\n\n const serializedObjectSet = cacheKey.otherKeys[WIRE_OBJECT_SET_IDX];\n this.#invalidationTypes = new Set([this.apiName]);\n if (serializedObjectSet) {\n this.parsedWireObjectSet = JSON.parse(\n serializedObjectSet,\n ) as WireObjectSet;\n this.#invalidationTypesPromise = this.#computeInvalidationTypes(\n this.parsedWireObjectSet,\n );\n }\n }\n\n async #computeInvalidationTypes(\n wireObjectSet: WireObjectSet,\n ): Promise<Set<string>> {\n try {\n const { invalidationSet } = await getObjectTypesThatInvalidate(\n this.store.client[additionalContext],\n wireObjectSet,\n );\n return new Set([this.apiName, ...invalidationSet]);\n } catch (error) {\n this.store.logger?.error(\n \"Failed to compute invalidation types for aggregation, falling back to base type only\",\n error,\n );\n return new Set([this.apiName]);\n }\n }\n\n async ensureInvalidationTypesReady(): Promise<void> {\n if (this.#invalidationTypesPromise) {\n this.#invalidationTypes = await this.#invalidationTypesPromise;\n this.#invalidationTypesPromise = undefined;\n }\n }\n\n protected _createConnectable(\n subject: Observable<SubjectPayload<AggregationCacheKey>>,\n ): Connectable<AggregationPayloadBase> {\n return connectable<AggregationPayloadBase>(\n subject.pipe(\n map((x) => {\n return {\n status: x.status,\n result: x.value,\n lastUpdated: x.lastUpdated,\n error: x.status === \"error\"\n ? new Error(\"Aggregation failed\")\n : undefined,\n };\n }),\n ),\n {\n connector: () =>\n new BehaviorSubject<AggregationPayloadBase>({\n status: \"init\",\n result: undefined,\n lastUpdated: 0,\n }),\n },\n );\n }\n\n async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"calling _fetchAndStore\",\n );\n }\n\n try {\n const result = await this._fetchAggregation();\n\n this.store.batch({}, (batch) => {\n this.writeToStore(result, \"loaded\", batch);\n });\n } catch (err) {\n this.store.batch({}, (batch) => {\n this.writeToStore(undefined, \"error\", batch);\n });\n }\n }\n\n protected abstract _fetchAggregation(): Promise<\n AggregationCacheKey[\"__cacheKey\"][\"value\"]\n >;\n\n writeToStore(\n data: AggregationCacheKey[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<AggregationCacheKey> {\n batch.write(this.cacheKey, data, status);\n batch.changes.modified.add(this.cacheKey);\n return batch.read(this.cacheKey)!;\n }\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n if (this.#invalidationTypes.has(objectType)) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n return Promise.resolve();\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,22 +14,37 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
|
|
17
18
|
import { AbstractHelper } from "../AbstractHelper.js";
|
|
18
19
|
import { ObjectAggregationQuery } from "./ObjectAggregationQuery.js";
|
|
19
20
|
export class AggregationsHelper extends AbstractHelper {
|
|
20
|
-
constructor(store, cacheKeys, whereCanonicalizer, rdpCanonicalizer) {
|
|
21
|
+
constructor(store, cacheKeys, whereCanonicalizer, rdpCanonicalizer, intersectCanonicalizer) {
|
|
21
22
|
super(store, cacheKeys);
|
|
22
23
|
this.whereCanonicalizer = whereCanonicalizer;
|
|
23
24
|
this.rdpCanonicalizer = rdpCanonicalizer;
|
|
25
|
+
this.intersectCanonicalizer = intersectCanonicalizer;
|
|
24
26
|
}
|
|
25
27
|
observe(options, subFn) {
|
|
26
28
|
return super.observe(options, subFn);
|
|
27
29
|
}
|
|
30
|
+
async observeAsync(options, subFn) {
|
|
31
|
+
const query = this.getQueryWithObjectSet(options);
|
|
32
|
+
await query.ensureInvalidationTypesReady();
|
|
33
|
+
return this._subscribe(query, options, subFn);
|
|
34
|
+
}
|
|
28
35
|
getQuery(options) {
|
|
36
|
+
return this.getOrCreateQuery(options, undefined);
|
|
37
|
+
}
|
|
38
|
+
getQueryWithObjectSet(options) {
|
|
39
|
+
const serializedObjectSet = JSON.stringify(getWireObjectSet(options.objectSet));
|
|
40
|
+
return this.getOrCreateQuery(options, serializedObjectSet);
|
|
41
|
+
}
|
|
42
|
+
getOrCreateQuery(options, serializedObjectSet) {
|
|
29
43
|
const {
|
|
30
44
|
type,
|
|
31
45
|
where,
|
|
32
46
|
withProperties,
|
|
47
|
+
intersectWith,
|
|
33
48
|
aggregate
|
|
34
49
|
} = options;
|
|
35
50
|
const {
|
|
@@ -38,8 +53,9 @@ export class AggregationsHelper extends AbstractHelper {
|
|
|
38
53
|
const typeKind = "type" in type ? type.type : "interface";
|
|
39
54
|
const canonWhere = this.whereCanonicalizer.canonicalize(where ?? {});
|
|
40
55
|
const canonRdp = withProperties ? this.rdpCanonicalizer.canonicalize(withProperties) : undefined;
|
|
56
|
+
const canonIntersect = intersectWith && intersectWith.length > 0 ? this.intersectCanonicalizer.canonicalize(intersectWith) : undefined;
|
|
41
57
|
const canonAggregate = this.canonicalizeAggregate(aggregate);
|
|
42
|
-
const aggregationCacheKey = this.cacheKeys.get("aggregation", typeKind, apiName, canonWhere, canonRdp, canonAggregate);
|
|
58
|
+
const aggregationCacheKey = this.cacheKeys.get("aggregation", typeKind, apiName, serializedObjectSet, canonWhere, canonRdp, canonIntersect, canonAggregate);
|
|
43
59
|
return this.store.queries.get(aggregationCacheKey, () => {
|
|
44
60
|
if (typeKind !== "object") {
|
|
45
61
|
throw new Error("Only ObjectTypeDefinition is currently supported for aggregations");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregationsHelper.js","names":["AbstractHelper","ObjectAggregationQuery","AggregationsHelper","constructor","store","cacheKeys","whereCanonicalizer","rdpCanonicalizer","observe","options","subFn","getQuery","type","where","withProperties","aggregate","apiName","typeKind","canonWhere","canonicalize","canonRdp","
|
|
1
|
+
{"version":3,"file":"AggregationsHelper.js","names":["getWireObjectSet","AbstractHelper","ObjectAggregationQuery","AggregationsHelper","constructor","store","cacheKeys","whereCanonicalizer","rdpCanonicalizer","intersectCanonicalizer","observe","options","subFn","observeAsync","query","getQueryWithObjectSet","ensureInvalidationTypesReady","_subscribe","getQuery","getOrCreateQuery","undefined","serializedObjectSet","JSON","stringify","objectSet","type","where","withProperties","intersectWith","aggregate","apiName","typeKind","canonWhere","canonicalize","canonRdp","canonIntersect","length","canonAggregate","canonicalizeAggregate","aggregationCacheKey","get","queries","Error","subjects","parse"],"sources":["AggregationsHelper.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n AggregateOpts,\n ObjectOrInterfaceDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport type {\n ObserveAggregationOptions,\n ObserveAggregationOptionsWithObjectSet,\n} from \"../../ObservableClient.js\";\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { IntersectCanonicalizer } from \"../IntersectCanonicalizer.js\";\nimport type { KnownCacheKey } from \"../KnownCacheKey.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { RdpCanonicalizer } from \"../RdpCanonicalizer.js\";\nimport type { Store } from \"../Store.js\";\nimport type { WhereClauseCanonicalizer } from \"../WhereClauseCanonicalizer.js\";\nimport type { AggregationCacheKey } from \"./AggregationCacheKey.js\";\nimport type {\n AggregationPayloadBase,\n AggregationQuery,\n} from \"./AggregationQuery.js\";\nimport { ObjectAggregationQuery } from \"./ObjectAggregationQuery.js\";\n\ntype AggregationOptions =\n | ObserveAggregationOptions<\n ObjectOrInterfaceDefinition,\n AggregateOpts<ObjectOrInterfaceDefinition>\n >\n | ObserveAggregationOptionsWithObjectSet<\n ObjectOrInterfaceDefinition,\n AggregateOpts<ObjectOrInterfaceDefinition>\n >;\n\nexport class AggregationsHelper extends AbstractHelper<\n AggregationQuery,\n AggregationOptions\n> {\n whereCanonicalizer: WhereClauseCanonicalizer;\n rdpCanonicalizer: RdpCanonicalizer;\n intersectCanonicalizer: IntersectCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n rdpCanonicalizer: RdpCanonicalizer,\n intersectCanonicalizer: IntersectCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.rdpCanonicalizer = rdpCanonicalizer;\n this.intersectCanonicalizer = intersectCanonicalizer;\n }\n\n observe<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptions<T, A, RDPs>,\n subFn: Observer<AggregationPayloadBase>,\n ): QuerySubscription<AggregationQuery> {\n return super.observe(options, subFn);\n }\n\n async observeAsync<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptionsWithObjectSet<T, A, RDPs>,\n subFn: Observer<AggregationPayloadBase>,\n ): Promise<QuerySubscription<AggregationQuery>> {\n const query = this.getQueryWithObjectSet(options);\n await query.ensureInvalidationTypesReady();\n return this._subscribe(\n query,\n options as AggregationOptions,\n subFn,\n );\n }\n\n getQuery<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptions<T, A, RDPs>,\n ): AggregationQuery {\n return this.getOrCreateQuery(options as AggregationOptions, undefined);\n }\n\n getQueryWithObjectSet<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n RDPs extends Record<string, SimplePropertyDef> = {},\n >(\n options: ObserveAggregationOptionsWithObjectSet<T, A, RDPs>,\n ): AggregationQuery {\n const serializedObjectSet = JSON.stringify(\n getWireObjectSet(options.objectSet),\n );\n return this.getOrCreateQuery(\n options as AggregationOptions,\n serializedObjectSet,\n );\n }\n\n private getOrCreateQuery(\n options: AggregationOptions,\n serializedObjectSet: string | undefined,\n ): AggregationQuery {\n const { type, where, withProperties, intersectWith, aggregate } = options;\n const { apiName } = type;\n const typeKind = \"type\" in type ? type.type : \"interface\";\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where ?? {});\n const canonRdp = withProperties\n ? this.rdpCanonicalizer.canonicalize(withProperties)\n : undefined;\n const canonIntersect = intersectWith && intersectWith.length > 0\n ? this.intersectCanonicalizer.canonicalize(intersectWith)\n : undefined;\n\n const canonAggregate = this.canonicalizeAggregate(aggregate);\n\n const aggregationCacheKey = this.cacheKeys.get<AggregationCacheKey>(\n \"aggregation\",\n typeKind,\n apiName,\n serializedObjectSet,\n canonWhere,\n canonRdp,\n canonIntersect,\n canonAggregate,\n );\n\n return this.store.queries.get(aggregationCacheKey, () => {\n if (typeKind !== \"object\") {\n throw new Error(\n \"Only ObjectTypeDefinition is currently supported for aggregations\",\n );\n }\n return new ObjectAggregationQuery(\n this.store,\n this.store.subjects.get(aggregationCacheKey),\n aggregationCacheKey,\n options,\n );\n });\n }\n\n private canonicalizeAggregate<\n T extends ObjectOrInterfaceDefinition,\n A extends AggregateOpts<T>,\n >(\n aggregate: A,\n ): Canonical<A> {\n return JSON.parse(JSON.stringify(aggregate)) as Canonical<A>;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { Employee, Office } from "@osdk/client.test.ontology";
|
|
18
|
+
import { FauxFoundry, ontologies, startNodeApiServer } from "@osdk/shared.test";
|
|
19
|
+
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
|
20
|
+
import { createClient } from "../../../createClient.js";
|
|
21
|
+
import { TestLogger } from "../../../logger/TestLogger.js";
|
|
22
|
+
import { getWireObjectSet } from "../../../objectSet/createObjectSet.js";
|
|
23
|
+
import { Store } from "../Store.js";
|
|
24
|
+
import { WIRE_OBJECT_SET_IDX } from "./AggregationCacheKey.js";
|
|
25
|
+
const logger = new TestLogger({}, {
|
|
26
|
+
level: "debug"
|
|
27
|
+
});
|
|
28
|
+
function setupOntology(fauxFoundry) {
|
|
29
|
+
const fauxOntology = fauxFoundry.getDefaultOntology();
|
|
30
|
+
ontologies.addEmployeeOntology(fauxOntology);
|
|
31
|
+
}
|
|
32
|
+
describe("aggregation ObjectSet support", () => {
|
|
33
|
+
let client;
|
|
34
|
+
let apiServer;
|
|
35
|
+
let fauxFoundry;
|
|
36
|
+
let store;
|
|
37
|
+
beforeAll(() => {
|
|
38
|
+
const testSetup = startNodeApiServer(new FauxFoundry("https://stack.palantir.com/", undefined, {
|
|
39
|
+
logger
|
|
40
|
+
}), createClient, {
|
|
41
|
+
logger
|
|
42
|
+
});
|
|
43
|
+
({
|
|
44
|
+
client,
|
|
45
|
+
apiServer,
|
|
46
|
+
fauxFoundry
|
|
47
|
+
} = testSetup);
|
|
48
|
+
setupOntology(fauxFoundry);
|
|
49
|
+
return () => {
|
|
50
|
+
testSetup.apiServer.close();
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
apiServer.resetHandlers();
|
|
55
|
+
store = new Store(client);
|
|
56
|
+
});
|
|
57
|
+
it("includes wireObjectSet in cache key when provided", () => {
|
|
58
|
+
const pivotedSet = client(Employee).pivotTo("officeLink");
|
|
59
|
+
const query = store.aggregations.getQueryWithObjectSet({
|
|
60
|
+
type: Office,
|
|
61
|
+
objectSet: pivotedSet,
|
|
62
|
+
where: {},
|
|
63
|
+
aggregate: {
|
|
64
|
+
$select: {
|
|
65
|
+
$count: "unordered"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
expect(query.cacheKey.otherKeys[WIRE_OBJECT_SET_IDX]).toEqual(JSON.stringify(getWireObjectSet(pivotedSet)));
|
|
70
|
+
});
|
|
71
|
+
it("invalidates pivoted aggregations on source type invalidation", async () => {
|
|
72
|
+
const pivotedSet = client(Employee).pivotTo("officeLink");
|
|
73
|
+
const query = store.aggregations.getQueryWithObjectSet({
|
|
74
|
+
type: Office,
|
|
75
|
+
objectSet: pivotedSet,
|
|
76
|
+
where: {},
|
|
77
|
+
aggregate: {
|
|
78
|
+
$select: {
|
|
79
|
+
$count: "unordered"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
await query.ensureInvalidationTypesReady();
|
|
84
|
+
const revalidateSpy = vi.spyOn(query, "revalidate").mockResolvedValue(undefined);
|
|
85
|
+
await query.invalidateObjectType("Employee", undefined);
|
|
86
|
+
expect(revalidateSpy).toHaveBeenCalledWith(true);
|
|
87
|
+
});
|
|
88
|
+
it("does not invalidate base aggregations on unrelated types", async () => {
|
|
89
|
+
const query = store.aggregations.getQuery({
|
|
90
|
+
type: Office,
|
|
91
|
+
where: {},
|
|
92
|
+
aggregate: {
|
|
93
|
+
$select: {
|
|
94
|
+
$count: "unordered"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const revalidateSpy = vi.spyOn(query, "revalidate").mockResolvedValue(undefined);
|
|
99
|
+
await query.invalidateObjectType("Employee", undefined);
|
|
100
|
+
expect(revalidateSpy).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=AggregationsHelper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AggregationsHelper.test.js","names":["Employee","Office","FauxFoundry","ontologies","startNodeApiServer","beforeAll","beforeEach","describe","expect","it","vi","createClient","TestLogger","getWireObjectSet","Store","WIRE_OBJECT_SET_IDX","logger","level","setupOntology","fauxFoundry","fauxOntology","getDefaultOntology","addEmployeeOntology","client","apiServer","store","testSetup","undefined","close","resetHandlers","pivotedSet","pivotTo","query","aggregations","getQueryWithObjectSet","type","objectSet","where","aggregate","$select","$count","cacheKey","otherKeys","toEqual","JSON","stringify","ensureInvalidationTypesReady","revalidateSpy","spyOn","mockResolvedValue","invalidateObjectType","toHaveBeenCalledWith","getQuery","not","toHaveBeenCalled"],"sources":["AggregationsHelper.test.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Employee, Office } from \"@osdk/client.test.ontology\";\nimport type { SetupServer } from \"@osdk/shared.test\";\nimport { FauxFoundry, ontologies, startNodeApiServer } from \"@osdk/shared.test\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { Client } from \"../../../Client.js\";\nimport { createClient } from \"../../../createClient.js\";\nimport { TestLogger } from \"../../../logger/TestLogger.js\";\nimport { getWireObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport { Store } from \"../Store.js\";\nimport { WIRE_OBJECT_SET_IDX } from \"./AggregationCacheKey.js\";\n\nconst logger = new TestLogger({}, { level: \"debug\" });\n\nfunction setupOntology(fauxFoundry: FauxFoundry) {\n const fauxOntology = fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n}\n\ndescribe(\"aggregation ObjectSet support\", () => {\n let client: Client;\n let apiServer: SetupServer;\n let fauxFoundry: FauxFoundry;\n let store: Store;\n\n beforeAll(() => {\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\", undefined, { logger }),\n createClient,\n { logger },\n );\n ({ client, apiServer, fauxFoundry } = testSetup);\n setupOntology(fauxFoundry);\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n apiServer.resetHandlers();\n store = new Store(client);\n });\n\n it(\"includes wireObjectSet in cache key when provided\", () => {\n const pivotedSet = client(Employee).pivotTo(\"officeLink\");\n\n const query = store.aggregations.getQueryWithObjectSet({\n type: Office,\n objectSet: pivotedSet,\n where: {},\n aggregate: { $select: { $count: \"unordered\" } },\n });\n\n expect(query.cacheKey.otherKeys[WIRE_OBJECT_SET_IDX]).toEqual(\n JSON.stringify(getWireObjectSet(pivotedSet)),\n );\n });\n\n it(\"invalidates pivoted aggregations on source type invalidation\", async () => {\n const pivotedSet = client(Employee).pivotTo(\"officeLink\");\n\n const query = store.aggregations.getQueryWithObjectSet({\n type: Office,\n objectSet: pivotedSet,\n where: {},\n aggregate: { $select: { $count: \"unordered\" } },\n });\n\n await query.ensureInvalidationTypesReady();\n\n const revalidateSpy = vi.spyOn(query, \"revalidate\")\n .mockResolvedValue(undefined);\n\n await query.invalidateObjectType(\"Employee\", undefined);\n expect(revalidateSpy).toHaveBeenCalledWith(true);\n });\n\n it(\"does not invalidate base aggregations on unrelated types\", async () => {\n const query = store.aggregations.getQuery({\n type: Office,\n where: {},\n aggregate: { $select: { $count: \"unordered\" } },\n });\n\n const revalidateSpy = vi.spyOn(query, \"revalidate\")\n .mockResolvedValue(undefined);\n\n await query.invalidateObjectType(\"Employee\", undefined);\n expect(revalidateSpy).not.toHaveBeenCalled();\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,19 +14,38 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { additionalContext } from "../../../Client.js";
|
|
18
|
+
import { createObjectSet } from "../../../objectSet/createObjectSet.js";
|
|
19
|
+
import { API_NAME_IDX, INTERSECT_IDX } from "./AggregationCacheKey.js";
|
|
18
20
|
import { AggregationQuery } from "./AggregationQuery.js";
|
|
19
21
|
export class ObjectAggregationQuery extends AggregationQuery {
|
|
20
22
|
async _fetchAggregation() {
|
|
21
23
|
const type = this.cacheKey.otherKeys[API_NAME_IDX];
|
|
22
|
-
|
|
24
|
+
const intersectWith = this.cacheKey.otherKeys[INTERSECT_IDX];
|
|
25
|
+
const objectTypeDef = {
|
|
23
26
|
type: "object",
|
|
24
27
|
apiName: type
|
|
25
|
-
}
|
|
28
|
+
};
|
|
29
|
+
let objectSet;
|
|
30
|
+
if (this.parsedWireObjectSet) {
|
|
31
|
+
objectSet = createObjectSet(objectTypeDef, this.store.client[additionalContext], this.parsedWireObjectSet);
|
|
32
|
+
} else {
|
|
33
|
+
objectSet = this.store.client(objectTypeDef);
|
|
34
|
+
}
|
|
26
35
|
if (this.rdpConfig) {
|
|
27
36
|
objectSet = objectSet.withProperties(this.rdpConfig);
|
|
28
37
|
}
|
|
29
38
|
objectSet = objectSet.where(this.canonicalWhere);
|
|
39
|
+
if (intersectWith != null && intersectWith.length > 0) {
|
|
40
|
+
const intersectSets = intersectWith.map(whereClause => {
|
|
41
|
+
let intersectSet = this.store.client(objectTypeDef);
|
|
42
|
+
if (this.rdpConfig) {
|
|
43
|
+
intersectSet = intersectSet.withProperties(this.rdpConfig);
|
|
44
|
+
}
|
|
45
|
+
return intersectSet.where(whereClause);
|
|
46
|
+
});
|
|
47
|
+
objectSet = objectSet.intersect(...intersectSets);
|
|
48
|
+
}
|
|
30
49
|
return await objectSet.aggregate(this.canonicalAggregate);
|
|
31
50
|
}
|
|
32
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectAggregationQuery.js","names":["API_NAME_IDX","AggregationQuery","ObjectAggregationQuery","_fetchAggregation","type","cacheKey","otherKeys","objectSet","
|
|
1
|
+
{"version":3,"file":"ObjectAggregationQuery.js","names":["additionalContext","createObjectSet","API_NAME_IDX","INTERSECT_IDX","AggregationQuery","ObjectAggregationQuery","_fetchAggregation","type","cacheKey","otherKeys","intersectWith","objectTypeDef","apiName","objectSet","parsedWireObjectSet","store","client","rdpConfig","withProperties","where","canonicalWhere","length","intersectSets","map","whereClause","intersectSet","intersect","aggregate","canonicalAggregate"],"sources":["ObjectAggregationQuery.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { DerivedProperty, ObjectTypeDefinition } from \"@osdk/api\";\nimport { additionalContext } from \"../../../Client.js\";\nimport { createObjectSet } from \"../../../objectSet/createObjectSet.js\";\nimport {\n type AggregationCacheKey,\n API_NAME_IDX,\n INTERSECT_IDX,\n} from \"./AggregationCacheKey.js\";\nimport { AggregationQuery } from \"./AggregationQuery.js\";\n\nexport class ObjectAggregationQuery extends AggregationQuery {\n protected async _fetchAggregation(): Promise<\n AggregationCacheKey[\"__cacheKey\"][\"value\"]\n > {\n const type = this.cacheKey.otherKeys[API_NAME_IDX];\n const intersectWith = this.cacheKey.otherKeys[INTERSECT_IDX];\n const objectTypeDef = {\n type: \"object\",\n apiName: type,\n } as ObjectTypeDefinition;\n\n let objectSet;\n if (this.parsedWireObjectSet) {\n objectSet = createObjectSet(\n objectTypeDef,\n this.store.client[additionalContext],\n this.parsedWireObjectSet,\n );\n } else {\n objectSet = this.store.client(objectTypeDef);\n }\n\n if (this.rdpConfig) {\n objectSet = objectSet.withProperties(\n this.rdpConfig as DerivedProperty.Clause<ObjectTypeDefinition>,\n );\n }\n\n objectSet = objectSet.where(this.canonicalWhere);\n\n if (intersectWith != null && intersectWith.length > 0) {\n const intersectSets = intersectWith.map(whereClause => {\n let intersectSet = this.store.client(objectTypeDef);\n\n if (this.rdpConfig) {\n intersectSet = intersectSet.withProperties(\n this.rdpConfig as DerivedProperty.Clause<ObjectTypeDefinition>,\n );\n }\n\n return intersectSet.where(whereClause);\n });\n\n objectSet = objectSet.intersect(...intersectSets);\n }\n\n return await objectSet.aggregate(\n this.canonicalAggregate as Parameters<typeof objectSet.aggregate>[0],\n );\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,iBAAiB,QAAQ,oBAAoB;AACtD,SAASC,eAAe,QAAQ,uCAAuC;AACvE,SAEEC,YAAY,EACZC,aAAa,QACR,0BAA0B;AACjC,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,MAAMC,sBAAsB,SAASD,gBAAgB,CAAC;EAC3D,MAAgBE,iBAAiBA,CAAA,EAE/B;IACA,MAAMC,IAAI,GAAG,IAAI,CAACC,QAAQ,CAACC,SAAS,CAACP,YAAY,CAAC;IAClD,MAAMQ,aAAa,GAAG,IAAI,CAACF,QAAQ,CAACC,SAAS,CAACN,aAAa,CAAC;IAC5D,MAAMQ,aAAa,GAAG;MACpBJ,IAAI,EAAE,QAAQ;MACdK,OAAO,EAAEL;IACX,CAAyB;IAEzB,IAAIM,SAAS;IACb,IAAI,IAAI,CAACC,mBAAmB,EAAE;MAC5BD,SAAS,GAAGZ,eAAe,CACzBU,aAAa,EACb,IAAI,CAACI,KAAK,CAACC,MAAM,CAAChB,iBAAiB,CAAC,EACpC,IAAI,CAACc,mBACP,CAAC;IACH,CAAC,MAAM;MACLD,SAAS,GAAG,IAAI,CAACE,KAAK,CAACC,MAAM,CAACL,aAAa,CAAC;IAC9C;IAEA,IAAI,IAAI,CAACM,SAAS,EAAE;MAClBJ,SAAS,GAAGA,SAAS,CAACK,cAAc,CAClC,IAAI,CAACD,SACP,CAAC;IACH;IAEAJ,SAAS,GAAGA,SAAS,CAACM,KAAK,CAAC,IAAI,CAACC,cAAc,CAAC;IAEhD,IAAIV,aAAa,IAAI,IAAI,IAAIA,aAAa,CAACW,MAAM,GAAG,CAAC,EAAE;MACrD,MAAMC,aAAa,GAAGZ,aAAa,CAACa,GAAG,CAACC,WAAW,IAAI;QACrD,IAAIC,YAAY,GAAG,IAAI,CAACV,KAAK,CAACC,MAAM,CAACL,aAAa,CAAC;QAEnD,IAAI,IAAI,CAACM,SAAS,EAAE;UAClBQ,YAAY,GAAGA,YAAY,CAACP,cAAc,CACxC,IAAI,CAACD,SACP,CAAC;QACH;QAEA,OAAOQ,YAAY,CAACN,KAAK,CAACK,WAAW,CAAC;MACxC,CAAC,CAAC;MAEFX,SAAS,GAAGA,SAAS,CAACa,SAAS,CAAC,GAAGJ,aAAa,CAAC;IACnD;IAEA,OAAO,MAAMT,SAAS,CAACc,SAAS,CAC9B,IAAI,CAACC,kBACP,CAAC;EACH;AACF","ignoreList":[]}
|