sfcc-cip-analytics-client
Version:
SFCC Commerce Intelligence Platform Analytics Client
101 lines (100 loc) • 4.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeQuery = executeQuery;
exports.executeParameterizedQuery = executeParameterizedQuery;
exports.formatDateRange = formatDateRange;
exports.validateRequiredParams = validateRequiredParams;
const types_1 = require("./types");
const utils_1 = require("../utils");
async function* executeQuery(client, sql, batchSize = 100) {
const statementId = await client.createStatement();
try {
const executeResponse = await client.execute(statementId, sql, batchSize);
if (executeResponse.results && executeResponse.results.length > 0) {
const result = executeResponse.results[0];
if (!result.firstFrame) {
return;
}
debugger;
const firstFrameData = (0, utils_1.processFrame)(result.signature || undefined, result.firstFrame);
if (firstFrameData.length > 0) {
yield firstFrameData;
}
let done = result.firstFrame.done;
let currentFrame = result.firstFrame;
while (!done && currentFrame) {
const currentOffset = currentFrame.offset || 0;
const currentRowCount = currentFrame.rows?.length || 0;
const nextResponse = await client.fetch(result.statementId || 0, currentOffset + currentRowCount, batchSize);
currentFrame = nextResponse.frame;
if (!currentFrame)
break;
const nextData = (0, utils_1.processFrame)(result.signature || undefined, currentFrame);
if (nextData.length > 0) {
yield nextData;
}
done = currentFrame.done;
}
}
}
finally {
await client.closeStatement(statementId);
}
}
async function* executeParameterizedQuery(client, sql, parameters = [], batchSize = 100) {
try {
const executeResponse = await client.prepareAndExecuteWithParameters(sql, parameters, batchSize);
if (executeResponse.results && executeResponse.results.length > 0) {
const result = executeResponse.results[0];
if (!result.firstFrame) {
return;
}
const firstFrameData = (0, utils_1.processFrame)(result.signature || undefined, result.firstFrame);
if (firstFrameData.length > 0) {
yield firstFrameData;
}
let done = result.firstFrame.done;
let currentFrame = result.firstFrame;
while (!done && currentFrame) {
const currentOffset = typeof currentFrame.offset === 'number' ? currentFrame.offset : (currentFrame.offset ? Number(currentFrame.offset) : 0);
const currentRowCount = currentFrame.rows?.length || 0;
const nextResponse = await client.fetch(result.statementId || 0, currentOffset + currentRowCount, batchSize);
currentFrame = nextResponse.frame;
if (!currentFrame)
break;
const nextData = (0, utils_1.processFrame)(result.signature || undefined, currentFrame);
if (nextData.length > 0) {
yield nextData;
}
done = currentFrame.done;
}
}
}
catch (error) {
throw new Error(`Failed to execute parameterized query: ${error}`);
}
}
function formatDateRange(dateRange) {
return {
startDate: (0, types_1.formatDateForSQL)(dateRange.startDate),
endDate: (0, types_1.formatDateForSQL)(dateRange.endDate)
};
}
function validateRequiredParams(params, requiredFields) {
const missingFields = [];
for (const field of requiredFields) {
if (params[field] === undefined || params[field] === null) {
missingFields.push(String(field));
}
}
if (missingFields.length > 0) {
throw new Error(`Missing required parameters: ${missingFields.join(', ')}`);
}
// Validate nested required fields
if ('dateRange' in params && params.dateRange) {
const dateRange = params.dateRange;
if (!dateRange.startDate || !dateRange.endDate) {
throw new Error('DateRange must include both startDate and endDate');
}
}
}