@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinksHelper.js","names":["AbstractHelper","SpecificLinkQuery","LinksHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","getQuery","options","apiName","srcType","canonWhere","canonicalize","where","canonOrderBy","orderBy","linkCacheKey","get","pk","linkName","queries","subjects"],"sources":["LinksHelper.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 {
|
|
1
|
+
{"version":3,"file":"LinksHelper.js","names":["AbstractHelper","SpecificLinkQuery","LinksHelper","constructor","store","cacheKeys","whereCanonicalizer","orderByCanonicalizer","getQuery","options","apiName","type","sourceTypeKind","srcType","canonWhere","canonicalize","where","canonOrderBy","orderBy","linkCacheKey","get","sourceUnderlyingObjectType","pk","linkName","queries","subjects"],"sources":["LinksHelper.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 CompileTimeMetadata,\n ObjectOrInterfaceDefinition,\n} from \"@osdk/api\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\n\nimport type { Observer } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { CacheKeys } from \"../CacheKeys.js\";\nimport type { KnownCacheKey } from \"../KnownCacheKey.js\";\nimport type { OrderByCanonicalizer } from \"../OrderByCanonicalizer.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Store } from \"../Store.js\";\nimport type { WhereClauseCanonicalizer } from \"../WhereClauseCanonicalizer.js\";\nimport type { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\nimport { SpecificLinkQuery } from \"./SpecificLinkQuery.js\";\n\nexport interface LinksHelper {\n observe<\n T extends ObjectOrInterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(\n options: ObserveLinks.Options<T, L>,\n subFn: Observer<SpecificLinkPayload>,\n ): QuerySubscription<SpecificLinkQuery>;\n\n getQuery<\n T extends ObjectOrInterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(options: ObserveLinks.Options<T, L>): SpecificLinkQuery;\n}\n\nexport class LinksHelper extends AbstractHelper<\n SpecificLinkQuery,\n ObserveLinks.Options<ObjectOrInterfaceDefinition, string>\n> {\n whereCanonicalizer: WhereClauseCanonicalizer;\n orderByCanonicalizer: OrderByCanonicalizer;\n\n constructor(\n store: Store,\n cacheKeys: CacheKeys<KnownCacheKey>,\n whereCanonicalizer: WhereClauseCanonicalizer,\n orderByCanonicalizer: OrderByCanonicalizer,\n ) {\n super(store, cacheKeys);\n\n this.whereCanonicalizer = whereCanonicalizer;\n this.orderByCanonicalizer = orderByCanonicalizer;\n }\n\n getQuery<\n T extends ObjectOrInterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(options: ObserveLinks.Options<T, L>): SpecificLinkQuery {\n const { apiName, type: sourceTypeKind } = options.srcType;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(\n options.where ?? {},\n );\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(\n options.orderBy ?? {},\n );\n const linkCacheKey = this.cacheKeys.get<SpecificLinkCacheKey>(\n \"specificLink\",\n apiName,\n sourceTypeKind,\n options.sourceUnderlyingObjectType,\n options.pk,\n options.linkName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.store.queries.get(linkCacheKey, () => {\n return new SpecificLinkQuery(\n this.store,\n this.store.subjects.get(linkCacheKey),\n linkCacheKey,\n options,\n );\n });\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,cAAc,QAAQ,sBAAsB;AAQrD,SAASC,iBAAiB,QAAQ,wBAAwB;AAiB1D,OAAO,MAAMC,WAAW,SAASF,cAAc,CAG7C;EAIAG,WAAWA,CACTC,KAAY,EACZC,SAAmC,EACnCC,kBAA4C,EAC5CC,oBAA0C,EAC1C;IACA,KAAK,CAACH,KAAK,EAAEC,SAAS,CAAC;IAEvB,IAAI,CAACC,kBAAkB,GAAGA,kBAAkB;IAC5C,IAAI,CAACC,oBAAoB,GAAGA,oBAAoB;EAClD;EAEAC,QAAQA,CAGNC,OAAmC,EAAqB;IACxD,MAAM;MAAEC,OAAO;MAAEC,IAAI,EAAEC;IAAe,CAAC,GAAGH,OAAO,CAACI,OAAO;IAEzD,MAAMC,UAAU,GAAG,IAAI,CAACR,kBAAkB,CAACS,YAAY,CACrDN,OAAO,CAACO,KAAK,IAAI,CAAC,CACpB,CAAC;IACD,MAAMC,YAAY,GAAG,IAAI,CAACV,oBAAoB,CAACQ,YAAY,CACzDN,OAAO,CAACS,OAAO,IAAI,CAAC,CACtB,CAAC;IACD,MAAMC,YAAY,GAAG,IAAI,CAACd,SAAS,CAACe,GAAG,CACrC,cAAc,EACdV,OAAO,EACPE,cAAc,EACdH,OAAO,CAACY,0BAA0B,EAClCZ,OAAO,CAACa,EAAE,EACVb,OAAO,CAACc,QAAQ,EAChBT,UAAU,EACVG,YACF,CAAC;IAED,OAAO,IAAI,CAACb,KAAK,CAACoB,OAAO,CAACJ,GAAG,CAACD,YAAY,EAAE,MAAM;MAChD,OAAO,IAAIlB,iBAAiB,CAC1B,IAAI,CAACG,KAAK,EACV,IAAI,CAACA,KAAK,CAACqB,QAAQ,CAACL,GAAG,CAACD,YAAY,CAAC,EACrCA,YAAY,EACZV,OACF,CAAC;IACH,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
|
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
// Index constants for accessing otherKeys array elements
|
|
18
|
-
export const
|
|
19
|
-
export const
|
|
20
|
-
export const
|
|
21
|
-
export const
|
|
22
|
-
export const
|
|
18
|
+
export const SOURCE_API_NAME_IDX = 0;
|
|
19
|
+
export const SOURCE_TYPE_KIND_IDX = 1;
|
|
20
|
+
export const SOURCE_UNDERLYING_OBJECT_TYPE_IDX = 2;
|
|
21
|
+
export const SOURCE_PK_IDX = 3;
|
|
22
|
+
export const LINK_NAME_IDX = 4;
|
|
23
|
+
export const WHERE_CLAUSE_IDX = 5;
|
|
24
|
+
export const ORDER_BY_CLAUSE_IDX = 6;
|
|
23
25
|
|
|
24
26
|
/**
|
|
25
27
|
* Storage data format for link query cache entries, similar to ListStorageData
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificLinkCacheKey.js","names":["
|
|
1
|
+
{"version":3,"file":"SpecificLinkCacheKey.js","names":["SOURCE_API_NAME_IDX","SOURCE_TYPE_KIND_IDX","SOURCE_UNDERLYING_OBJECT_TYPE_IDX","SOURCE_PK_IDX","LINK_NAME_IDX","WHERE_CLAUSE_IDX","ORDER_BY_CLAUSE_IDX"],"sources":["SpecificLinkCacheKey.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 { ObjectTypeDefinition, PrimaryKeyType } from \"@osdk/api\";\nimport type { CollectionStorageData } from \"../base-list/BaseCollectionQuery.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { SpecificLinkQuery } from \"./SpecificLinkQuery.js\";\n\n// Index constants for accessing otherKeys array elements\nexport const SOURCE_API_NAME_IDX = 0;\nexport const SOURCE_TYPE_KIND_IDX = 1;\nexport const SOURCE_UNDERLYING_OBJECT_TYPE_IDX = 2;\nexport const SOURCE_PK_IDX = 3;\nexport const LINK_NAME_IDX = 4;\nexport const WHERE_CLAUSE_IDX = 5;\nexport const ORDER_BY_CLAUSE_IDX = 6;\n\n/**\n * Storage data format for link query cache entries, similar to ListStorageData\n */\nexport interface LinkStorageData extends CollectionStorageData {\n}\n/**\n * Cache key for a specific link query that uniquely identifies:\n * - The source object type\n * - The source object primary key\n * - The link name\n */\n\nexport interface SpecificLinkCacheKey extends\n CacheKey<\n \"specificLink\",\n LinkStorageData,\n SpecificLinkQuery,\n [\n sourceApiName: string,\n sourceTypeKind: \"object\" | \"interface\",\n sourceUnderlyingObjectType: string,\n sourcePk: PrimaryKeyType<ObjectTypeDefinition>,\n linkName: string,\n whereClause: Canonical<SimpleWhereClause>,\n orderByClause: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>,\n ]\n >\n{\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA,OAAO,MAAMA,mBAAmB,GAAG,CAAC;AACpC,OAAO,MAAMC,oBAAoB,GAAG,CAAC;AACrC,OAAO,MAAMC,iCAAiC,GAAG,CAAC;AAClD,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,gBAAgB,GAAG,CAAC;AACjC,OAAO,MAAMC,mBAAmB,GAAG,CAAC;;AAEpC;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA","ignoreList":[]}
|
|
@@ -28,6 +28,8 @@ import { tombstone } from "../tombstone.js";
|
|
|
28
28
|
*/
|
|
29
29
|
export class SpecificLinkQuery extends BaseListQuery {
|
|
30
30
|
#sourceApiName;
|
|
31
|
+
#sourceTypeKind;
|
|
32
|
+
#sourceUnderlyingObjectType;
|
|
31
33
|
#sourcePk;
|
|
32
34
|
#linkName;
|
|
33
35
|
#whereClause;
|
|
@@ -45,64 +47,72 @@ export class SpecificLinkQuery extends BaseListQuery {
|
|
|
45
47
|
}) : undefined);
|
|
46
48
|
|
|
47
49
|
// Extract the necessary parameters from the cache key
|
|
48
|
-
[this.#sourceApiName, this.#sourcePk, this.#linkName, this.#whereClause, this.#orderBy] = cacheKey.otherKeys;
|
|
50
|
+
[this.#sourceApiName, this.#sourceTypeKind, this.#sourceUnderlyingObjectType, this.#sourcePk, this.#linkName, this.#whereClause, this.#orderBy] = cacheKey.otherKeys;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
|
-
// _fetchAndStore is now implemented in BaseCollectionQuery
|
|
52
|
-
|
|
53
53
|
/**
|
|
54
54
|
* Implements fetchPageData from the BaseCollectionQuery template method pattern
|
|
55
|
-
* Fetches a page of linked objects
|
|
56
55
|
*/
|
|
57
56
|
async fetchPageData(signal) {
|
|
58
|
-
// Use the client API to create a query that pivots to linked objects
|
|
59
57
|
const client = this.store.client;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const sourceObjectDef = {
|
|
63
|
-
type: "object",
|
|
64
|
-
apiName: this.#sourceApiName
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
// Use the client's ontologyProvider to get metadata, which has built-in caching
|
|
68
|
-
const sourceMetadata = await client[additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
|
|
69
|
-
|
|
70
|
-
// Initialize sorting strategy with the link's target object type
|
|
58
|
+
const ontologyProvider = client[additionalContext].ontologyProvider;
|
|
59
|
+
const isInterface = this.#sourceTypeKind === "interface";
|
|
71
60
|
if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {
|
|
72
|
-
|
|
73
|
-
if (
|
|
74
|
-
|
|
61
|
+
let targetTypeApiName;
|
|
62
|
+
if (isInterface) {
|
|
63
|
+
const interfaceMetadata = await ontologyProvider.getInterfaceDefinition(this.#sourceApiName);
|
|
64
|
+
const linkDef = interfaceMetadata.links?.[this.#linkName];
|
|
65
|
+
if (!linkDef) {
|
|
66
|
+
throw new Error(`Missing link definition for link '${this.#linkName}' on interface '${this.#sourceApiName}'`);
|
|
67
|
+
}
|
|
68
|
+
targetTypeApiName = linkDef.targetTypeApiName;
|
|
69
|
+
} else {
|
|
70
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(this.#sourceApiName);
|
|
71
|
+
const linkDef = objectMetadata.links?.[this.#linkName];
|
|
72
|
+
if (!linkDef?.targetType) {
|
|
73
|
+
throw new Error(`Missing link definition or targetType for link '${this.#linkName}' on object type '${this.#sourceApiName}'`);
|
|
74
|
+
}
|
|
75
|
+
targetTypeApiName = linkDef.targetType;
|
|
75
76
|
}
|
|
76
|
-
this.sortingStrategy = new OrderBySortingStrategy(
|
|
77
|
+
this.sortingStrategy = new OrderBySortingStrategy(targetTypeApiName, this.#orderBy);
|
|
78
|
+
}
|
|
79
|
+
let linkQuery;
|
|
80
|
+
if (isInterface) {
|
|
81
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(this.#sourceUnderlyingObjectType);
|
|
82
|
+
const interfaceSet = client({
|
|
83
|
+
type: "interface",
|
|
84
|
+
apiName: this.#sourceApiName
|
|
85
|
+
});
|
|
86
|
+
const objectFilteredByPk = client({
|
|
87
|
+
type: "object",
|
|
88
|
+
apiName: this.#sourceUnderlyingObjectType
|
|
89
|
+
}).where({
|
|
90
|
+
[objectMetadata.primaryKeyApiName]: this.#sourcePk
|
|
91
|
+
});
|
|
92
|
+
const filteredSource = interfaceSet.intersect(objectFilteredByPk);
|
|
93
|
+
linkQuery = filteredSource.pivotTo(this.#linkName);
|
|
94
|
+
} else {
|
|
95
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(this.#sourceApiName);
|
|
96
|
+
const sourceSet = client({
|
|
97
|
+
type: "object",
|
|
98
|
+
apiName: this.#sourceApiName
|
|
99
|
+
});
|
|
100
|
+
const sourceQuery = sourceSet.where({
|
|
101
|
+
[objectMetadata.primaryKeyApiName]: this.#sourcePk
|
|
102
|
+
});
|
|
103
|
+
linkQuery = sourceQuery.pivotTo(this.#linkName);
|
|
77
104
|
}
|
|
78
|
-
|
|
79
|
-
// Query for the specific source object
|
|
80
|
-
const sourceQuery = client(sourceObjectDef).where({
|
|
81
|
-
[sourceMetadata.primaryKeyApiName]: this.#sourcePk
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
// Pivot to the linked objects
|
|
85
|
-
const linkQuery = sourceQuery.pivotTo(this.#linkName);
|
|
86
|
-
|
|
87
|
-
// Check for abort signal again before fetching
|
|
88
105
|
if (signal?.aborted) {
|
|
89
106
|
throw new Error("Aborted");
|
|
90
107
|
}
|
|
91
|
-
|
|
92
|
-
// Fetch the linked objects with pagination
|
|
93
|
-
// Add orderBy to the query parameters if specified
|
|
94
108
|
const queryParams = {
|
|
95
|
-
$pageSize: this.
|
|
109
|
+
$pageSize: this.getEffectiveFetchPageSize(),
|
|
96
110
|
$nextPageToken: this.nextPageToken,
|
|
97
111
|
$includeRid: true
|
|
98
112
|
};
|
|
99
|
-
|
|
100
|
-
// Include orderBy if it has entries
|
|
101
113
|
if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {
|
|
102
114
|
queryParams.$orderBy = this.#orderBy;
|
|
103
115
|
}
|
|
104
|
-
|
|
105
|
-
// Include whereClause if it has entries
|
|
106
116
|
if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {
|
|
107
117
|
queryParams.$where = this.#whereClause;
|
|
108
118
|
}
|
|
@@ -147,41 +157,66 @@ export class SpecificLinkQuery extends BaseListQuery {
|
|
|
147
157
|
* Implements Query.maybeUpdateAndRevalidate to handle cache invalidation
|
|
148
158
|
*/
|
|
149
159
|
maybeUpdateAndRevalidate = async changes => {
|
|
150
|
-
// TODO: Implement proper invalidation logic for linked objects
|
|
151
|
-
// This would check if any of the linked objects have changed,
|
|
152
|
-
// or if the source object's links might have changed
|
|
153
|
-
|
|
154
|
-
// For now, simply check if this specific link cache key was modified
|
|
155
160
|
if (changes.modified.has(this.cacheKey)) {
|
|
156
161
|
return this.revalidate(true);
|
|
157
162
|
}
|
|
158
|
-
|
|
159
|
-
// No relevant changes were detected
|
|
160
163
|
return Promise.resolve();
|
|
161
164
|
};
|
|
162
165
|
invalidateObjectType = (objectType, changes) => {
|
|
163
|
-
// We need to invalidate links in
|
|
166
|
+
// We need to invalidate links in multiple cases:
|
|
164
167
|
// 1. When the source object type matches the apiName (direct invalidation)
|
|
165
|
-
// 2. When the
|
|
168
|
+
// 2. When the source is an interface and the invalidated type implements it
|
|
169
|
+
// 3. When the target type matches the invalidated type
|
|
170
|
+
// 4. When the target is an interface and the invalidated type implements it
|
|
166
171
|
|
|
167
|
-
|
|
168
|
-
if (this.#sourceApiName === objectType) {
|
|
172
|
+
if (this.#sourceTypeKind === "object" && this.#sourceApiName === objectType) {
|
|
169
173
|
changes?.modified.add(this.cacheKey);
|
|
170
174
|
return this.revalidate(true);
|
|
171
|
-
} else {
|
|
172
|
-
// For case 2 - check if the link's target type matches the invalidated type
|
|
173
|
-
// We need to use the ontology provider to get the link metadata
|
|
174
|
-
// Since this is async, we'll collect all the metadata check promises
|
|
175
|
-
return (async () => {
|
|
176
|
-
// Get the source object metadata to determine link target type
|
|
177
|
-
const sourceMetadata = await this.store.client[additionalContext].ontologyProvider.getObjectDefinition(this.#sourceApiName);
|
|
178
|
-
const linkDef = sourceMetadata.links?.[this.#linkName];
|
|
179
|
-
if (!linkDef || linkDef.targetType !== objectType) return;
|
|
180
|
-
const promise = this.revalidate(true);
|
|
181
|
-
changes?.modified.add(this.cacheKey);
|
|
182
|
-
return promise;
|
|
183
|
-
})();
|
|
184
175
|
}
|
|
176
|
+
return (async () => {
|
|
177
|
+
try {
|
|
178
|
+
const ontologyProvider = this.store.client[additionalContext].ontologyProvider;
|
|
179
|
+
if (this.#sourceTypeKind === "interface") {
|
|
180
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(objectType);
|
|
181
|
+
if (this.#sourceApiName in objectMetadata.interfaceMap) {
|
|
182
|
+
changes?.modified.add(this.cacheKey);
|
|
183
|
+
return void (await this.revalidate(true));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
let targetTypeApiName;
|
|
187
|
+
let targetTypeKind;
|
|
188
|
+
if (this.#sourceTypeKind === "interface") {
|
|
189
|
+
const interfaceMetadata = await ontologyProvider.getInterfaceDefinition(this.#sourceApiName);
|
|
190
|
+
const linkDef = interfaceMetadata.links?.[this.#linkName];
|
|
191
|
+
targetTypeApiName = linkDef?.targetTypeApiName;
|
|
192
|
+
targetTypeKind = linkDef?.targetType;
|
|
193
|
+
} else {
|
|
194
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(this.#sourceApiName);
|
|
195
|
+
const linkDef = objectMetadata.links?.[this.#linkName];
|
|
196
|
+
// On object link defs, targetType is the target API name (not the kind)
|
|
197
|
+
targetTypeApiName = linkDef?.targetType;
|
|
198
|
+
targetTypeKind = "object";
|
|
199
|
+
}
|
|
200
|
+
if (!targetTypeApiName) return;
|
|
201
|
+
if (targetTypeApiName === objectType) {
|
|
202
|
+
changes?.modified.add(this.cacheKey);
|
|
203
|
+
return void (await this.revalidate(true));
|
|
204
|
+
}
|
|
205
|
+
if (targetTypeKind === "interface") {
|
|
206
|
+
const objectMetadata = await ontologyProvider.getObjectDefinition(objectType);
|
|
207
|
+
if (targetTypeApiName in objectMetadata.interfaceMap) {
|
|
208
|
+
changes?.modified.add(this.cacheKey);
|
|
209
|
+
return void (await this.revalidate(true));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
} catch (e) {
|
|
213
|
+
if (process.env.NODE_ENV !== "production") {
|
|
214
|
+
this.logger?.error("Failed to resolve metadata during invalidation", e);
|
|
215
|
+
}
|
|
216
|
+
changes?.modified.add(this.cacheKey);
|
|
217
|
+
return void (await this.revalidate(true));
|
|
218
|
+
}
|
|
219
|
+
})();
|
|
185
220
|
};
|
|
186
221
|
}
|
|
187
222
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecificLinkQuery.js","names":["deepEqual","additionalContext","BaseListQuery","OrderBySortingStrategy","tombstone","SpecificLinkQuery","sourceApiName","sourcePk","linkName","whereClause","orderBy","registerCacheChanges","batch","changes","modified","add","cacheKey","constructor","store","subject","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","fetchPageData","signal","sourceObjectDef","type","apiName","sourceMetadata","ontologyProvider","getObjectDefinition","Object","keys","length","linkDef","links","targetType","Error","sortingStrategy","sourceQuery","where","primaryKeyApiName","linkQuery","pivotTo","aborted","queryParams","$pageSize","options","pageSize","$nextPageToken","nextPageToken","$includeRid","$orderBy","$where","response","fetchPage","deleteFromStore","status","entry","read","value","methodName","debug","write","ret","delete","deleted","maybeUpdateAndRevalidate","has","revalidate","Promise","resolve","invalidateObjectType","objectType","promise","isSpecificLinkCacheKey","key"],"sources":["SpecificLinkQuery.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 ObjectTypeDefinition,\n Osdk,\n PageResult,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { type Subject } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { OptimisticId } from \"../OptimisticId.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\n\n/**\n * Query implementation for retrieving linked objects from a specific object.\n * - Stores links as ObjectCacheKey[] references\n * - Creates indirect dependencies on linked objects\n * - Supports filtering and sorting of linked collections\n * - Handles proper invalidation of related objects\n */\nexport class SpecificLinkQuery extends BaseListQuery<\n SpecificLinkCacheKey,\n SpecificLinkPayload,\n ObserveLinks.Options<ObjectTypeDefinition, string>\n> {\n #sourceApiName: string;\n #sourcePk: PrimaryKeyType<ObjectTypeDefinition>;\n #linkName: string;\n #whereClause: Canonical<SimpleWhereClause>;\n #orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n\n /**\n * Register changes to the cache specific to SpecificLinkQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.modified.add(this.cacheKey);\n }\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<SpecificLinkCacheKey>>,\n cacheKey: SpecificLinkCacheKey,\n opts: ObserveLinks.Options<\n ObjectTypeDefinition,\n string\n >,\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: `SpecificLinkQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n // Extract the necessary parameters from the cache key\n [\n this.#sourceApiName,\n this.#sourcePk,\n this.#linkName,\n this.#whereClause,\n this.#orderBy,\n ] = cacheKey.otherKeys;\n }\n\n // _fetchAndStore is now implemented in BaseCollectionQuery\n\n /**\n * Implements fetchPageData from the BaseCollectionQuery template method pattern\n * Fetches a page of linked objects\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n // Use the client API to create a query that pivots to linked objects\n const client = this.store.client;\n\n // First, get metadata for the source object to know the primary key field name\n const sourceObjectDef = {\n type: \"object\",\n apiName: this.#sourceApiName,\n } as ObjectTypeDefinition;\n\n // Use the client's ontologyProvider to get metadata, which has built-in caching\n const sourceMetadata = await client[additionalContext].ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n // Initialize sorting strategy with the link's target object type\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n const linkDef = sourceMetadata.links?.[this.#linkName];\n if (!linkDef?.targetType) {\n throw new Error(\n `Missing link definition or targetType for link '${this.#linkName}' on object type '${this.#sourceApiName}'`,\n );\n }\n this.sortingStrategy = new OrderBySortingStrategy(\n linkDef.targetType,\n this.#orderBy,\n );\n }\n\n // Query for the specific source object\n const sourceQuery = client(sourceObjectDef).where({\n [sourceMetadata.primaryKeyApiName]: this.#sourcePk,\n } as WhereClause<any>);\n\n // Pivot to the linked objects\n const linkQuery = sourceQuery.pivotTo(this.#linkName);\n\n // Check for abort signal again before fetching\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n // Fetch the linked objects with pagination\n // Add orderBy to the query parameters if specified\n const queryParams: {\n $pageSize: number;\n $nextPageToken: string | undefined;\n $includeRid: true;\n $orderBy?: Record<string, \"asc\" | \"desc\" | undefined>;\n $where?: Record<string, unknown>;\n } = {\n $pageSize: this.options.pageSize || 100,\n $nextPageToken: this.nextPageToken,\n $includeRid: true,\n };\n\n // Include orderBy if it has entries\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n queryParams.$orderBy = this.#orderBy;\n }\n\n // Include whereClause if it has entries\n if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {\n queryParams.$where = this.#whereClause;\n }\n\n const response = await linkQuery.fetchPage(queryParams);\n\n // Store the next page token for pagination\n this.nextPageToken = response.nextPageToken;\n\n return response;\n }\n\n /**\n * Removes a link query from the store\n */\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<SpecificLinkCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Links were already deleted, just setting status`,\n );\n }\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // If there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleted.add(this.cacheKey);\n\n return ret;\n }\n\n /**\n * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation\n */\n maybeUpdateAndRevalidate = async (\n changes: Changes,\n _optimisticId: OptimisticId | undefined,\n ): Promise<void> => {\n // TODO: Implement proper invalidation logic for linked objects\n // This would check if any of the linked objects have changed,\n // or if the source object's links might have changed\n\n // For now, simply check if this specific link cache key was modified\n if (changes.modified.has(this.cacheKey)) {\n return this.revalidate(true);\n }\n\n // No relevant changes were detected\n return Promise.resolve();\n };\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n // We need to invalidate links in two cases:\n // 1. When the source object type matches the apiName (direct invalidation)\n // 2. When the target object type might be the invalidated type (affected by target changes)\n\n // For case 1 - direct source object type match\n if (this.#sourceApiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n } else {\n // For case 2 - check if the link's target type matches the invalidated type\n // We need to use the ontology provider to get the link metadata\n // Since this is async, we'll collect all the metadata check promises\n return (async () => {\n // Get the source object metadata to determine link target type\n const sourceMetadata = await this.store.client[additionalContext]\n .ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n\n const linkDef = sourceMetadata.links?.[this.#linkName];\n if (!linkDef || linkDef.targetType !== objectType) return;\n\n const promise = this.revalidate(true);\n changes?.modified.add(this.cacheKey);\n return promise;\n })();\n }\n };\n}\n\n/**\n * Type guard to check if a cache key is a SpecificLinkCacheKey\n */\nexport function isSpecificLinkCacheKey(\n key: CacheKey,\n): key is SpecificLinkCacheKey {\n return key.type === \"specificLink\";\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SpecificLinkQuery.js","names":["deepEqual","additionalContext","BaseListQuery","OrderBySortingStrategy","tombstone","SpecificLinkQuery","sourceApiName","sourceTypeKind","sourceUnderlyingObjectType","sourcePk","linkName","whereClause","orderBy","registerCacheChanges","batch","changes","modified","add","cacheKey","constructor","store","subject","opts","process","env","NODE_ENV","client","logger","child","msgPrefix","otherKeys","map","x","JSON","stringify","join","undefined","fetchPageData","signal","ontologyProvider","isInterface","Object","keys","length","targetTypeApiName","interfaceMetadata","getInterfaceDefinition","linkDef","links","Error","objectMetadata","getObjectDefinition","targetType","sortingStrategy","linkQuery","interfaceSet","type","apiName","objectFilteredByPk","where","primaryKeyApiName","filteredSource","intersect","pivotTo","sourceSet","sourceQuery","aborted","queryParams","$pageSize","getEffectiveFetchPageSize","$nextPageToken","nextPageToken","$includeRid","$orderBy","$where","response","fetchPage","deleteFromStore","status","entry","read","value","methodName","debug","write","ret","delete","deleted","maybeUpdateAndRevalidate","has","revalidate","Promise","resolve","invalidateObjectType","objectType","interfaceMap","targetTypeKind","e","error","isSpecificLinkCacheKey","key"],"sources":["SpecificLinkQuery.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 InterfaceDefinition,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PageResult,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport { type Subject } from \"rxjs\";\nimport { additionalContext } from \"../../../Client.js\";\nimport type { SpecificLinkPayload } from \"../../LinkPayload.js\";\nimport type { Status } from \"../../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../../ObservableClient/ObserveLink.js\";\nimport { BaseListQuery } from \"../base-list/BaseListQuery.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { CacheKey } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Entry } from \"../Layer.js\";\nimport type { OptimisticId } from \"../OptimisticId.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport { OrderBySortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { Store } from \"../Store.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport type { SpecificLinkCacheKey } from \"./SpecificLinkCacheKey.js\";\n\n/**\n * Query implementation for retrieving linked objects from a specific object.\n * - Stores links as ObjectCacheKey[] references\n * - Creates indirect dependencies on linked objects\n * - Supports filtering and sorting of linked collections\n * - Handles proper invalidation of related objects\n */\nexport class SpecificLinkQuery extends BaseListQuery<\n SpecificLinkCacheKey,\n SpecificLinkPayload,\n ObserveLinks.Options<ObjectOrInterfaceDefinition, string>\n> {\n #sourceApiName: string;\n #sourceTypeKind: \"object\" | \"interface\";\n #sourceUnderlyingObjectType: string;\n #sourcePk: PrimaryKeyType<ObjectTypeDefinition>;\n #linkName: string;\n #whereClause: Canonical<SimpleWhereClause>;\n #orderBy: Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n\n /**\n * Register changes to the cache specific to SpecificLinkQuery\n */\n protected registerCacheChanges(batch: BatchContext): void {\n batch.changes.modified.add(this.cacheKey);\n }\n\n constructor(\n store: Store,\n subject: Subject<SubjectPayload<SpecificLinkCacheKey>>,\n cacheKey: SpecificLinkCacheKey,\n opts: ObserveLinks.Options<ObjectOrInterfaceDefinition, string>,\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: `SpecificLinkQuery<${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`,\n })\n )\n : undefined,\n );\n\n // Extract the necessary parameters from the cache key\n [\n this.#sourceApiName,\n this.#sourceTypeKind,\n this.#sourceUnderlyingObjectType,\n this.#sourcePk,\n this.#linkName,\n this.#whereClause,\n this.#orderBy,\n ] = cacheKey.otherKeys;\n }\n\n /**\n * Implements fetchPageData from the BaseCollectionQuery template method pattern\n */\n protected async fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>> {\n const client = this.store.client;\n const ontologyProvider = client[additionalContext].ontologyProvider;\n const isInterface = this.#sourceTypeKind === \"interface\";\n\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n let targetTypeApiName: string;\n\n if (isInterface) {\n const interfaceMetadata = await ontologyProvider.getInterfaceDefinition(\n this.#sourceApiName,\n );\n const linkDef = interfaceMetadata.links?.[this.#linkName];\n if (!linkDef) {\n throw new Error(\n `Missing link definition for link '${this.#linkName}' on interface '${this.#sourceApiName}'`,\n );\n }\n targetTypeApiName = linkDef.targetTypeApiName;\n } else {\n const objectMetadata = await ontologyProvider.getObjectDefinition(\n this.#sourceApiName,\n );\n const linkDef = objectMetadata.links?.[this.#linkName];\n if (!linkDef?.targetType) {\n throw new Error(\n `Missing link definition or targetType for link '${this.#linkName}' on object type '${this.#sourceApiName}'`,\n );\n }\n targetTypeApiName = linkDef.targetType;\n }\n\n this.sortingStrategy = new OrderBySortingStrategy(\n targetTypeApiName,\n this.#orderBy,\n );\n }\n\n let linkQuery: ObjectSet<ObjectOrInterfaceDefinition>;\n\n if (isInterface) {\n const objectMetadata = await ontologyProvider.getObjectDefinition(\n this.#sourceUnderlyingObjectType,\n );\n\n const interfaceSet = client({\n type: \"interface\",\n apiName: this.#sourceApiName,\n } as InterfaceDefinition) as ObjectSet<ObjectOrInterfaceDefinition>;\n\n const objectFilteredByPk = client({\n type: \"object\",\n apiName: this.#sourceUnderlyingObjectType,\n } as ObjectTypeDefinition).where({\n [objectMetadata.primaryKeyApiName]: this.#sourcePk,\n } as WhereClause<any>);\n\n const filteredSource = interfaceSet.intersect(objectFilteredByPk);\n\n linkQuery = filteredSource.pivotTo(this.#linkName);\n } else {\n const objectMetadata = await ontologyProvider.getObjectDefinition(\n this.#sourceApiName,\n );\n\n const sourceSet = client({\n type: \"object\",\n apiName: this.#sourceApiName,\n } as ObjectTypeDefinition);\n\n const sourceQuery = sourceSet.where({\n [objectMetadata.primaryKeyApiName]: this.#sourcePk,\n } as WhereClause<any>);\n\n linkQuery = sourceQuery.pivotTo(this.#linkName);\n }\n\n if (signal?.aborted) {\n throw new Error(\"Aborted\");\n }\n\n const queryParams: {\n $pageSize: number;\n $nextPageToken: string | undefined;\n $includeRid: true;\n $orderBy?: Record<string, \"asc\" | \"desc\" | undefined>;\n $where?: Record<string, unknown>;\n } = {\n $pageSize: this.getEffectiveFetchPageSize(),\n $nextPageToken: this.nextPageToken,\n $includeRid: true,\n };\n\n if (this.#orderBy && Object.keys(this.#orderBy).length > 0) {\n queryParams.$orderBy = this.#orderBy;\n }\n\n if (this.#whereClause && Object.keys(this.#whereClause).length > 0) {\n queryParams.$where = this.#whereClause;\n }\n\n const response = await linkQuery.fetchPage(queryParams);\n\n // Store the next page token for pagination\n this.nextPageToken = response.nextPageToken;\n\n return response;\n }\n\n /**\n * Removes a link query from the store\n */\n deleteFromStore(\n status: Status,\n batch: BatchContext,\n ): Entry<SpecificLinkCacheKey> | undefined {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(tombstone, entry.value)) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n `Links were already deleted, just setting status`,\n );\n }\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"deleteFromStore\" }).debug(\n JSON.stringify({ status }),\n );\n }\n\n // If there is no entry then there is nothing to do\n if (!entry || !entry.value) {\n return;\n }\n\n const ret = batch.delete(this.cacheKey, status);\n batch.changes.deleted.add(this.cacheKey);\n\n return ret;\n }\n\n /**\n * Implements Query.maybeUpdateAndRevalidate to handle cache invalidation\n */\n maybeUpdateAndRevalidate = async (\n changes: Changes,\n _optimisticId: OptimisticId | undefined,\n ): Promise<void> => {\n if (changes.modified.has(this.cacheKey)) {\n return this.revalidate(true);\n }\n\n return Promise.resolve();\n };\n\n invalidateObjectType = (\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void> => {\n // We need to invalidate links in multiple cases:\n // 1. When the source object type matches the apiName (direct invalidation)\n // 2. When the source is an interface and the invalidated type implements it\n // 3. When the target type matches the invalidated type\n // 4. When the target is an interface and the invalidated type implements it\n\n if (\n this.#sourceTypeKind === \"object\" && this.#sourceApiName === objectType\n ) {\n changes?.modified.add(this.cacheKey);\n return this.revalidate(true);\n }\n\n return (async () => {\n try {\n const ontologyProvider = this.store.client[additionalContext]\n .ontologyProvider;\n\n if (this.#sourceTypeKind === \"interface\") {\n const objectMetadata = await ontologyProvider.getObjectDefinition(\n objectType,\n );\n if (this.#sourceApiName in objectMetadata.interfaceMap) {\n changes?.modified.add(this.cacheKey);\n return void await this.revalidate(true);\n }\n }\n\n let targetTypeApiName: string | undefined;\n let targetTypeKind: \"object\" | \"interface\" | undefined;\n\n if (this.#sourceTypeKind === \"interface\") {\n const interfaceMetadata = await ontologyProvider\n .getInterfaceDefinition(this.#sourceApiName);\n const linkDef = interfaceMetadata.links?.[this.#linkName];\n targetTypeApiName = linkDef?.targetTypeApiName;\n targetTypeKind = linkDef?.targetType;\n } else {\n const objectMetadata = await ontologyProvider\n .getObjectDefinition(this.#sourceApiName);\n const linkDef = objectMetadata.links?.[this.#linkName];\n // On object link defs, targetType is the target API name (not the kind)\n targetTypeApiName = linkDef?.targetType;\n targetTypeKind = \"object\";\n }\n\n if (!targetTypeApiName) return;\n\n if (targetTypeApiName === objectType) {\n changes?.modified.add(this.cacheKey);\n return void await this.revalidate(true);\n }\n\n if (targetTypeKind === \"interface\") {\n const objectMetadata = await ontologyProvider.getObjectDefinition(\n objectType,\n );\n if (targetTypeApiName in objectMetadata.interfaceMap) {\n changes?.modified.add(this.cacheKey);\n return void await this.revalidate(true);\n }\n }\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.error(\n \"Failed to resolve metadata during invalidation\",\n e,\n );\n }\n changes?.modified.add(this.cacheKey);\n return void await this.revalidate(true);\n }\n })();\n };\n}\n\n/**\n * Type guard to check if a cache key is a SpecificLinkCacheKey\n */\nexport function isSpecificLinkCacheKey(\n key: CacheKey,\n): key is SpecificLinkCacheKey {\n return key.type === \"specificLink\";\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,10 +17,28 @@
|
|
|
17
17
|
import groupBy from "object.groupby";
|
|
18
18
|
import invariant from "tiny-invariant";
|
|
19
19
|
import { ObjectDefRef } from "../../../object/convertWireToOsdkObjects/InternalSymbols.js";
|
|
20
|
-
import { ListQuery, RDP_IDX } from "./ListQuery.js";
|
|
20
|
+
import { ListQuery, PIVOT_IDX, RDP_IDX } from "./ListQuery.js";
|
|
21
21
|
export class InterfaceListQuery extends ListQuery {
|
|
22
22
|
createObjectSet(store) {
|
|
23
23
|
const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];
|
|
24
|
+
const pivotInfo = this.cacheKey.otherKeys[PIVOT_IDX];
|
|
25
|
+
if (pivotInfo != null) {
|
|
26
|
+
const sourceSet = pivotInfo.sourceTypeKind === "interface" ? store.client({
|
|
27
|
+
type: "interface",
|
|
28
|
+
apiName: pivotInfo.sourceType
|
|
29
|
+
}) : store.client({
|
|
30
|
+
type: "object",
|
|
31
|
+
apiName: pivotInfo.sourceType
|
|
32
|
+
});
|
|
33
|
+
let objectSet = sourceSet.where(this.canonicalWhere).pivotTo(pivotInfo.linkName);
|
|
34
|
+
if (rdpConfig != null) {
|
|
35
|
+
objectSet = objectSet.withProperties(rdpConfig);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// intersectWith for pivot queries is deferred to fetchPageData
|
|
39
|
+
// where the target type can be resolved asynchronously
|
|
40
|
+
return objectSet;
|
|
41
|
+
}
|
|
24
42
|
const objectTypeDef = {
|
|
25
43
|
type: "interface",
|
|
26
44
|
apiName: this.apiName
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InterfaceListQuery.js","names":["groupBy","invariant","ObjectDefRef","ListQuery","RDP_IDX","InterfaceListQuery","createObjectSet","store","rdpConfig","cacheKey","otherKeys","objectTypeDef","type","apiName","client","withProperties","where","canonicalWhere","revalidateObjectType","objectMetadata","fetchMetadata","interfaceMap","revalidate","postProcessFetchedData","data","reloadDataAsFullObjects","createPayload","params","resolvedList","resolvedData","map","obj","$as","isOptimistic","fetchMore","hasMore","nextPageToken","status","lastUpdated","extractRelevantObjects","changes","matchesApiName","object","added","Array","from","addedObjects","filter","modified","modifiedObjects","all","strictMatches","Set","sortaMatches","length","groups","x","$objectType","objectTypeToPrimaryKeyToObject","Object","fromEntries","Promise","entries","objects","objectDef","primaryKeyApiName","$in","$primaryKey","result","fetchPage","$includeRid","fullObject","process","env","NODE_ENV"],"sources":["InterfaceListQuery.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 { ObjectSet, ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport groupBy from \"object.groupby\";\nimport invariant from \"tiny-invariant\";\nimport type { Client } from \"../../../Client.js\";\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport { ObjectDefRef } from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ListPayload } from \"../../ListPayload.js\";\nimport type { CollectionConnectableParams } from \"../base-list/BaseCollectionQuery.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport { ListQuery, RDP_IDX } from \"./ListQuery.js\";\n\ntype ExtractRelevantObjectsResult = Record<\"added\" | \"modified\", {\n all: (ObjectHolder | InterfaceHolder)[];\n strictMatches: Set<(ObjectHolder | InterfaceHolder)>;\n sortaMatches: Set<(ObjectHolder | InterfaceHolder)>;\n}>;\n\nexport class InterfaceListQuery extends ListQuery {\n protected createObjectSet(store: Store): ObjectSet<ObjectTypeDefinition> {\n const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];\n const type: string = \"interface\" as const;\n const objectTypeDef = {\n type,\n apiName: this.apiName,\n } as ObjectTypeDefinition;\n\n if (rdpConfig != null) {\n return store.client(objectTypeDef)\n .withProperties(rdpConfig as Rdp)\n .where(this.canonicalWhere);\n }\n\n return store.client(objectTypeDef)\n .where(this.canonicalWhere);\n }\n\n async revalidateObjectType(apiName: string): Promise<void> {\n const objectMetadata = await this.store.client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n\n if (this.apiName in objectMetadata.interfaceMap) {\n await this.revalidate(/* force */ true);\n }\n }\n\n protected async postProcessFetchedData(\n data: Osdk.Instance<any>[],\n ): Promise<Osdk.Instance<any>[]> {\n return reloadDataAsFullObjects(this.store.client, data);\n }\n\n protected createPayload(\n params: CollectionConnectableParams,\n ): ListPayload {\n const resolvedList = params.resolvedData.map((obj: ObjectHolder) =>\n obj.$as(this.apiName)\n );\n\n return {\n resolvedList,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n };\n }\n\n protected extractRelevantObjects(\n changes: Changes,\n ): ExtractRelevantObjectsResult {\n const matchesApiName = ([, object]: [unknown, ObjectHolder]) => {\n return this.apiName in object[ObjectDefRef].interfaceMap;\n };\n\n const added = Array.from(changes.addedObjects).filter(matchesApiName).map((\n [, object],\n ) => object.$as(this.apiName));\n\n const modified = Array.from(changes.modifiedObjects).filter(matchesApiName)\n .map((\n [, object],\n ) => object.$as(this.apiName));\n\n return {\n added: {\n all: added,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n modified: {\n all: modified,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n };\n }\n}\n\n// Hopefully this can go away when we can just request the full object properties on first load\nasync function reloadDataAsFullObjects(\n client: Client,\n data: Osdk.Instance<any>[],\n) {\n if (data.length === 0) {\n return data;\n }\n\n const groups = groupBy(data, (x) => x.$objectType);\n const objectTypeToPrimaryKeyToObject = Object.fromEntries(\n await Promise.all(\n Object.entries(groups).map<\n Promise<\n [\n /** objectType **/ string,\n Record<string | number, Osdk.Instance<ObjectTypeDefinition>>,\n ]\n >\n >(async ([apiName, objects]) => {\n // Interface query results don't have ObjectDefRef, so we fetch metadata to get primaryKeyApiName\n const objectDef = await client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n const where: SimpleWhereClause = {\n [objectDef.primaryKeyApiName]: {\n $in: objects.map(x => x.$primaryKey),\n },\n };\n\n const result = await client(\n objectDef as ObjectTypeDefinition,\n ).where(\n where as Parameters<ObjectSet<ObjectTypeDefinition>[\"where\"]>[0],\n ).fetchPage({ $includeRid: true });\n return [\n apiName,\n Object.fromEntries(result.data.map(\n x => [x.$primaryKey, x],\n )),\n ];\n }),\n ),\n );\n\n return data.map((obj) => {\n const fullObject =\n objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey];\n invariant(\n fullObject,\n `Could not find object ${obj.$objectType} ${obj.$primaryKey}`,\n );\n return fullObject;\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"InterfaceListQuery.js","names":["groupBy","invariant","ObjectDefRef","ListQuery","PIVOT_IDX","RDP_IDX","InterfaceListQuery","createObjectSet","store","rdpConfig","cacheKey","otherKeys","pivotInfo","sourceSet","sourceTypeKind","client","type","apiName","sourceType","objectSet","where","canonicalWhere","pivotTo","linkName","withProperties","objectTypeDef","revalidateObjectType","objectMetadata","fetchMetadata","interfaceMap","revalidate","postProcessFetchedData","data","reloadDataAsFullObjects","createPayload","params","resolvedList","resolvedData","map","obj","$as","isOptimistic","fetchMore","hasMore","nextPageToken","status","lastUpdated","extractRelevantObjects","changes","matchesApiName","object","added","Array","from","addedObjects","filter","modified","modifiedObjects","all","strictMatches","Set","sortaMatches","length","groups","x","$objectType","objectTypeToPrimaryKeyToObject","Object","fromEntries","Promise","entries","objects","objectDef","primaryKeyApiName","$in","$primaryKey","result","fetchPage","$includeRid","fullObject","process","env","NODE_ENV"],"sources":["InterfaceListQuery.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 DerivedProperty,\n InterfaceDefinition,\n ObjectOrInterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n WhereClause,\n} from \"@osdk/api\";\nimport groupBy from \"object.groupby\";\nimport invariant from \"tiny-invariant\";\nimport type { Client } from \"../../../Client.js\";\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport { ObjectDefRef } from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ListPayload } from \"../../ListPayload.js\";\nimport type { CollectionConnectableParams } from \"../base-list/BaseCollectionQuery.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport { ListQuery, PIVOT_IDX, RDP_IDX } from \"./ListQuery.js\";\n\ntype ExtractRelevantObjectsResult = Record<\"added\" | \"modified\", {\n all: (ObjectHolder | InterfaceHolder)[];\n strictMatches: Set<(ObjectHolder | InterfaceHolder)>;\n sortaMatches: Set<(ObjectHolder | InterfaceHolder)>;\n}>;\n\nexport class InterfaceListQuery extends ListQuery {\n protected createObjectSet(store: Store): ObjectSet<ObjectTypeDefinition> {\n const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];\n const pivotInfo = this.cacheKey.otherKeys[PIVOT_IDX];\n\n if (pivotInfo != null) {\n const sourceSet = (pivotInfo.sourceTypeKind === \"interface\"\n ? store.client({\n type: \"interface\",\n apiName: pivotInfo.sourceType,\n } as InterfaceDefinition)\n : store.client({\n type: \"object\",\n apiName: pivotInfo.sourceType,\n } as ObjectTypeDefinition)) as ObjectSet<ObjectOrInterfaceDefinition>;\n\n let objectSet = sourceSet\n .where(this.canonicalWhere as WhereClause<any>)\n .pivotTo(pivotInfo.linkName);\n\n if (rdpConfig != null) {\n objectSet = objectSet.withProperties(\n rdpConfig as DerivedProperty.Clause<ObjectTypeDefinition>,\n );\n }\n\n // intersectWith for pivot queries is deferred to fetchPageData\n // where the target type can be resolved asynchronously\n return objectSet;\n }\n\n const type: string = \"interface\" as const;\n const objectTypeDef = {\n type,\n apiName: this.apiName,\n } as ObjectTypeDefinition;\n\n if (rdpConfig != null) {\n return store.client(objectTypeDef)\n .withProperties(rdpConfig as Rdp)\n .where(this.canonicalWhere);\n }\n\n return store.client(objectTypeDef)\n .where(this.canonicalWhere);\n }\n\n async revalidateObjectType(apiName: string): Promise<void> {\n const objectMetadata = await this.store.client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n\n if (this.apiName in objectMetadata.interfaceMap) {\n await this.revalidate(/* force */ true);\n }\n }\n\n protected async postProcessFetchedData(\n data: Osdk.Instance<any>[],\n ): Promise<Osdk.Instance<any>[]> {\n return reloadDataAsFullObjects(this.store.client, data);\n }\n\n protected createPayload(\n params: CollectionConnectableParams,\n ): ListPayload {\n const resolvedList = params.resolvedData.map((obj: ObjectHolder) =>\n obj.$as(this.apiName)\n );\n\n return {\n resolvedList,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n };\n }\n\n protected extractRelevantObjects(\n changes: Changes,\n ): ExtractRelevantObjectsResult {\n const matchesApiName = ([, object]: [unknown, ObjectHolder]) => {\n return this.apiName in object[ObjectDefRef].interfaceMap;\n };\n\n const added = Array.from(changes.addedObjects).filter(matchesApiName).map((\n [, object],\n ) => object.$as(this.apiName));\n\n const modified = Array.from(changes.modifiedObjects).filter(matchesApiName)\n .map((\n [, object],\n ) => object.$as(this.apiName));\n\n return {\n added: {\n all: added,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n modified: {\n all: modified,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n };\n }\n}\n\n// Hopefully this can go away when we can just request the full object properties on first load\nasync function reloadDataAsFullObjects(\n client: Client,\n data: Osdk.Instance<any>[],\n) {\n if (data.length === 0) {\n return data;\n }\n\n const groups = groupBy(data, (x) => x.$objectType);\n const objectTypeToPrimaryKeyToObject = Object.fromEntries(\n await Promise.all(\n Object.entries(groups).map<\n Promise<\n [\n /** objectType **/ string,\n Record<string | number, Osdk.Instance<ObjectTypeDefinition>>,\n ]\n >\n >(async ([apiName, objects]) => {\n // Interface query results don't have ObjectDefRef, so we fetch metadata to get primaryKeyApiName\n const objectDef = await client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n const where: SimpleWhereClause = {\n [objectDef.primaryKeyApiName]: {\n $in: objects.map(x => x.$primaryKey),\n },\n };\n\n const result = await client(\n objectDef as ObjectTypeDefinition,\n ).where(\n where as Parameters<ObjectSet<ObjectTypeDefinition>[\"where\"]>[0],\n ).fetchPage({ $includeRid: true });\n return [\n apiName,\n Object.fromEntries(result.data.map(\n x => [x.$primaryKey, x],\n )),\n ];\n }),\n ),\n );\n\n return data.map((obj) => {\n const fullObject =\n objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey];\n invariant(\n fullObject,\n `Could not find object ${obj.$objectType} ${obj.$primaryKey}`,\n );\n return fullObject;\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,7 +22,7 @@ import { DEBUG_ONLY__changesToString } from "../Changes.js";
|
|
|
22
22
|
import { getObjectTypesThatInvalidate } from "../getObjectTypesThatInvalidate.js";
|
|
23
23
|
import { objectSortaMatchesWhereClause as objectMatchesWhereClause } from "../objectMatchesWhereClause.js";
|
|
24
24
|
import { OrderBySortingStrategy } from "../sorting/SortingStrategy.js";
|
|
25
|
-
import { INTERSECT_IDX, ORDER_BY_IDX, PIVOT_IDX, WHERE_IDX } from "./ListCacheKey.js";
|
|
25
|
+
import { INTERSECT_IDX, ORDER_BY_IDX, PIVOT_IDX, RDP_IDX, WHERE_IDX } from "./ListCacheKey.js";
|
|
26
26
|
export { API_NAME_IDX, INTERSECT_IDX, PIVOT_IDX, RDP_IDX, RIDS_IDX } from "./ListCacheKey.js";
|
|
27
27
|
/**
|
|
28
28
|
* Base class for filtered and sorted object collection queries.
|
|
@@ -41,6 +41,7 @@ export class ListQuery extends BaseListQuery {
|
|
|
41
41
|
#intersectWith;
|
|
42
42
|
#pivotInfo;
|
|
43
43
|
#objectSet;
|
|
44
|
+
#pivotIntersectApplied = false;
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
47
|
* Register changes to the cache specific to ListQuery
|
|
@@ -82,28 +83,47 @@ export class ListQuery extends BaseListQuery {
|
|
|
82
83
|
get canonicalPivotInfo() {
|
|
83
84
|
return this.#pivotInfo;
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Create the ObjectSet for this query.
|
|
88
|
-
*/
|
|
89
|
-
|
|
90
86
|
/**
|
|
91
87
|
* Implements fetchPageData from BaseCollectionQuery template method
|
|
92
88
|
* Fetches a page of data
|
|
93
89
|
*/
|
|
94
90
|
async fetchPageData(signal) {
|
|
95
|
-
|
|
91
|
+
const needsResultType = Object.keys(this.#orderBy).length > 0 && !(this.sortingStrategy instanceof OrderBySortingStrategy) || this.#pivotInfo != null && this.#intersectWith != null && this.#intersectWith.length > 0 && !this.#pivotIntersectApplied;
|
|
92
|
+
if (needsResultType) {
|
|
96
93
|
const wireObjectSet = getWireObjectSet(this.#objectSet);
|
|
97
94
|
const {
|
|
98
95
|
resultType
|
|
99
96
|
} = await getObjectTypesThatInvalidate(this.store.client[additionalContext], wireObjectSet);
|
|
100
|
-
this.
|
|
97
|
+
if (Object.keys(this.#orderBy).length > 0 && !(this.sortingStrategy instanceof OrderBySortingStrategy)) {
|
|
98
|
+
this.sortingStrategy = new OrderBySortingStrategy(resultType.apiName, this.#orderBy);
|
|
99
|
+
}
|
|
100
|
+
if (this.#pivotInfo != null && this.#intersectWith != null && this.#intersectWith.length > 0 && !this.#pivotIntersectApplied) {
|
|
101
|
+
const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];
|
|
102
|
+
const intersectSets = this.#intersectWith.map(whereClause => {
|
|
103
|
+
if (resultType.type === "object") {
|
|
104
|
+
let objectSet = this.store.client({
|
|
105
|
+
type: "object",
|
|
106
|
+
apiName: resultType.apiName
|
|
107
|
+
});
|
|
108
|
+
if (rdpConfig != null) {
|
|
109
|
+
objectSet = objectSet.withProperties(rdpConfig);
|
|
110
|
+
}
|
|
111
|
+
return objectSet.where(whereClause);
|
|
112
|
+
}
|
|
113
|
+
return this.store.client({
|
|
114
|
+
type: "interface",
|
|
115
|
+
apiName: resultType.apiName
|
|
116
|
+
}).where(whereClause);
|
|
117
|
+
});
|
|
118
|
+
this.#objectSet = this.#objectSet.intersect(...intersectSets);
|
|
119
|
+
this.#pivotIntersectApplied = true;
|
|
120
|
+
}
|
|
101
121
|
}
|
|
102
122
|
|
|
103
|
-
// Fetch the data with pagination
|
|
123
|
+
// Fetch the data with pagination using effective pageSize (max of all subscribers)
|
|
104
124
|
const resp = await this.#objectSet.fetchPage({
|
|
105
125
|
$nextPageToken: this.nextPageToken,
|
|
106
|
-
$pageSize: this.
|
|
126
|
+
$pageSize: this.getEffectiveFetchPageSize(),
|
|
107
127
|
$includeRid: true,
|
|
108
128
|
// For now this keeps the shared test code from falling apart
|
|
109
129
|
// but shouldn't be needed ideally
|