diff options
| author | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
|---|---|---|
| committer | rxliuli <rxliuli@gmail.com> | 2025-11-04 05:03:50 +0800 |
| commit | bce557cc2dc767628bed6aac87301a1be7c5431b (patch) | |
| tree | b51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js | |
init commit
Diffstat (limited to 'node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js')
| -rw-r--r-- | node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js b/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js new file mode 100644 index 0000000..f2430e9 --- /dev/null +++ b/node_modules/@jet-app/app-store/tmp/src/common/personalization/on-device-impression-demotion.js @@ -0,0 +1,73 @@ +import * as serverData from "../../foundation/json-parsing/server-data"; +import { demoteByEngagements } from "@amp/amd-apps"; +// The AMD key used to retrieve the engagement events from the app store. +export const AMSEngagementAppStoreEventKey = "appStore.getEngagementEvents"; +/** + * personalize the dataItems based on the impression data for that shelf. + * + * @param objectGraph The object graph. + * @param dataItems The data items to personalize. + * @param impressionData The impression data to use for personalization. + * @returns The personalized data items. + */ +export function personalizeDataItems(dataItems, impressionData, shelfRecoMetricsData) { + const shelfAlgoId = shelfRecoMetricsData["reco_algoId"]; + if (serverData.isNullOrEmpty(shelfAlgoId) || + serverData.isNullOrEmpty(dataItems) || + serverData.isNullOrEmpty(impressionData[shelfAlgoId])) { + return dataItems; + } + // First create Candidate objects from the data items. + const candidates = dataItems.map((dataItem) => { + var _a; + const adamId = serverData.asNumber(dataItem.id); + const score = (_a = serverData.asNumber(dataItem, "meta.personalizationData.score")) !== null && _a !== void 0 ? _a : 0; + const candidate = { identifier: adamId, score: score }; + return candidate; + }); + // Demote the candidates based on the impression data. + const shelfRecoData = impressionData[shelfAlgoId]; + const rerankedCandidates = demoteByEngagements(candidates, shelfRecoData); + // Create a lookup map from dataItems to allow faster rearranging + const dictionary = dataItems.reduce((acc, item) => ({ ...acc, [item.id]: item }), {}); + // create a new array based on the rearranged Candidate array + const rearranged = rerankedCandidates.map((candidate) => dictionary[candidate.identifier.toString()]); + return rearranged; +} +/** + * Takes the AMD response and creates a map of EngagementEvent per shelf. + * + * @param objectGraph The object graph. + * @param data The data to convert. + * @returns The map of EngagementEvent per shelf. + */ +export function impressionEventsFromData(objectGraph, data) { + // go through all the impressionData and return the EgagementData + if (!serverData.isDefinedNonNullNonEmpty(data)) { + return {}; + } + // Impression data is a map of shelf ids to impression arrays. + // We want to keep this relationship so only impressions for a given shelf are returned. + const impressionData = serverData.asDictionary(data, "data.engagementEvents.impression"); + const convertedMap = {}; + // Iterate over each key in the original map and convert the data into EngagementEvents which can be passed to the demoteByEngagements function. + for (const key in impressionData) { + if (serverData.isDefinedNonNullNonEmpty(key)) { + const impressions = serverData.asArrayOrEmpty(impressionData, key); + convertedMap[key] = impressions.map((impression) => { + const adamId = serverData.asNumber(impression["adamId"]); + const timestamp = serverData.asNumber(impression["eventTimeMillis"]); + const event = { adamIdentifier: adamId, timestamp: timestamp }; + return event; + }); + } + } + return convertedMap; +} +/** + * Convenience function for determining if data personalization is available. + */ +export function isImpressionDemotionAvailable(objectGraph) { + return objectGraph.client.isiOS && objectGraph.bag.enableRecoOnDeviceReordering; +} +//# sourceMappingURL=on-device-impression-demotion.js.map
\ No newline at end of file |
