diff --git a/api.ts b/api.ts index 9a3369b..d322236 100644 --- a/api.ts +++ b/api.ts @@ -32,38 +32,67 @@ await client.connect(); const query = await Deno.readTextFile("sql/get.pg.sql"); function apply_guidance(doc: any) { + let mostRelevantPrice = null; + let mostRelevantKey = null; + let highestRelevanceLevel = -1; // Assume -1 is less than any relevance level + + // Function to update price and assign relevance indicator + function updatePriceAndAssignRelevance(items, channelFirstChar, v1ds, v0ds, histKey) { + for (let item of items) { + // Update the last_price with the most recent price + const years = Object.keys(item.season); + if (years.length > 0) { + const recentYear = Math.max(...years.map(Number)); + const lastPrice = item.season[recentYear].price_usd; + item.last_price = lastPrice; + } else { + item.last_price = null; // or some default value as appropriate + } + + // Initialize relevance as numeric value + let relevance = 0; // Assume 0 is 'not relevant' + + // Check if the first character of the item's channel matches the first character of the document's channel + if (item.chan.charAt(0) === channelFirstChar) { + relevance = 1; // 'relevant' + + // Further refine relevance based on v1ds and v0ds + if (item.v1ds === v1ds) { + relevance = 2; // 'most relevant' because v1ds matches + } else if (item.v0ds === v0ds) { + relevance = relevance === 2 ? 2 : 1; // Keep relevance as is if v1ds was matched, otherwise it's just 'relevant' + } + } + + // Assign the calculated relevance to the item + item.relevance = relevance; + + // Update the most relevant price if this item's relevance is higher + if (relevance > highestRelevanceLevel) { + highestRelevanceLevel = relevance; + mostRelevantPrice = item.last_price; + mostRelevantKey = histKey; + } + } + } // Iterate over each key in the "hist" object for (let key of Object.keys(doc.hist)) { - // Update each item in the current key with the most recent price - updateWithMostRecentPrice(doc.hist[key]); - console.log(doc.chan[0]); - assignRelevanceIndicator(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds); + // Update price and relevance for each item in the current key + updatePriceAndAssignRelevance(doc.hist[key], doc.chan[0], doc.v1ds, doc.v0ds, key); } + + // Assign the most relevant price and key to the top level of the document + if (mostRelevantPrice !== null) { + doc.mostRelevantPriceInfo = { + price: mostRelevantPrice, + histKey: mostRelevantKey + }; + } + return doc; } -function assignRelevanceIndicator(items, channelFirstChar, v1ds, v0ds) { - for (let item of items) { - // Initialize relevance as numeric value - let relevance = 0; // Assume 0 is 'not relevant' - - // Check if the first character of the item's channel matches the first character of the document's channel - if (item.chan === channelFirstChar) { - relevance = 1; // 'relevant' - - // Further refine relevance based on v1ds and v0ds - if (v1ds === item.v1ds && relevance === 1) { - relevance = 2; // 'most relevant' because v1ds matches - } else if (v0ds === item.v0ds && relevance === 1) { - // Keep relevance as 1 because v0ds matches but is less relevant than v1ds - } - } - - // Assign the calculated relevance to the item - item.relevance = relevance; - } -} // Function to update each item with the most recent price function updateWithMostRecentPrice(items) {