sfcc-cip-analytics-client
Version:
SFCC Commerce Intelligence Platform Analytics Client
63 lines (62 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.querySearchQueryPerformance = void 0;
const types_1 = require("../types");
const helpers_1 = require("../helpers");
/**
* Query search term performance to identify revenue drivers and missed opportunities
* Business Question: Which search terms drive revenue vs which represent missed opportunities?
* Primary users: Merchandising and UX teams
* @param client The Avatica client instance (must have an open connection)
* @param params Query parameters including siteId, dateRange, and hasResults
* @param batchSize Size of each batch to yield (default: 100)
*/
const querySearchQueryPerformance = async function* querySearchQueryPerformance(client, params, batchSize = 100) {
const { sql, parameters } = querySearchQueryPerformance.QUERY(params);
yield* (0, helpers_1.executeParameterizedQuery)(client, (0, types_1.cleanSQL)(sql), parameters, batchSize);
};
exports.querySearchQueryPerformance = querySearchQueryPerformance;
exports.querySearchQueryPerformance.metadata = {
name: "search-query-performance",
description: "Identify which search terms drive revenue vs missed opportunities",
category: "Search Analytics",
requiredParams: ["siteId", "hasResults", "from", "to"],
};
exports.querySearchQueryPerformance.QUERY = (params) => {
(0, helpers_1.validateRequiredParams)(params, ["siteId", "dateRange", "hasResults"]);
const { startDate, endDate } = (0, helpers_1.formatDateRange)(params.dateRange);
const sql = `
WITH conversion AS (
SELECT
LOWER(sc.query) AS query,
SUM(sc.num_searches) AS converted_searches,
SUM(sc.num_orders) AS orders,
SUM(sc.std_revenue) AS std_revenue,
SUM(sc.std_revenue) / NULLIF(CAST(SUM(sc.num_orders) AS FLOAT), 0) AS std_revenue_per_order
FROM ccdw_aggr_search_conversion sc
JOIN ccdw_dim_site s
ON s.site_id = sc.site_id
WHERE sc.search_date >= '${startDate}'
AND sc.search_date <= '${endDate}'
AND s.nsite_id = '${params.siteId}'
AND sc.has_results = ${params.hasResults}
GROUP BY LOWER(sc.query)
)
SELECT
query,
converted_searches,
orders,
std_revenue,
std_revenue_per_order,
CASE WHEN converted_searches > 0
THEN (CAST(orders AS FLOAT) / converted_searches) * 100
ELSE 0
END AS conversion_rate
FROM conversion
ORDER BY std_revenue DESC
`;
return {
sql,
parameters: [],
};
};