UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

182 lines 6.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.description = exports.properties = void 0; exports.execute = execute; const di_1 = require("@n8n/di"); const n8n_core_1 = require("n8n-core"); const n8n_workflow_1 = require("n8n-workflow"); const utilities_1 = require("../../../../../utils/utilities"); const descriptions_1 = require("../../helpers/descriptions"); const utils_1 = require("../../helpers/utils"); const sandbox_utils_1 = require("../../helpers/sandbox-utils"); exports.properties = [ descriptions_1.numberInputsProperty, { displayName: 'Query', name: 'query', type: 'string', default: 'SELECT * FROM input1 LEFT JOIN input2 ON input1.name = input2.id', noDataExpression: true, description: 'Input data available as tables with corresponding number, e.g. input1, input2', hint: 'Supports <a href="https://github.com/alasql/alasql/wiki/Supported-SQL-statements" target="_blank">most</a> of the SQL-99 language', required: true, typeOptions: { rows: 5, editor: 'sqlEditor', }, }, { displayName: 'Options', name: 'options', type: 'collection', placeholder: 'Add option', default: {}, options: [ { displayName: 'Empty Query Result', name: 'emptyQueryResult', type: 'options', description: 'What to return if the query executed successfully but returned no results', options: [ { name: 'Success', value: 'success', }, { name: 'Empty Result', value: 'empty', }, ], default: 'empty', }, ], displayOptions: { show: { '@version': [3.2], }, }, }, ]; const displayOptions = { show: { mode: ['combineBySql'], }, }; exports.description = (0, utilities_1.updateDisplayOptions)(displayOptions, exports.properties); const prepareError = (node, error) => { let message = ''; if (typeof error === 'string') { message = error; } else { message = error.message; } throw new n8n_workflow_1.NodeOperationError(node, error, { message: 'Issue while executing query', description: message, itemIndex: 0, }); }; async function executeSelectWithMappedPairedItems(node, inputsData, query, returnSuccessItemIfEmpty, context) { const returnData = []; const tableData = inputsData.map((inputData) => inputData.map((entry) => ({ ...entry.json, pairedItem: entry.pairedItem }))); try { const result = await (0, sandbox_utils_1.runAlaSqlInSandbox)(context, tableData, (0, utils_1.modifySelectQuery)(query, inputsData.length)); for (const item of result) { if (Array.isArray(item)) { returnData.push.apply(returnData, item.map(utils_1.rowToExecutionData)); } else if (typeof item === 'object') { returnData.push((0, utils_1.rowToExecutionData)(item)); } } if (!returnData.length && returnSuccessItemIfEmpty) { returnData.push({ json: { success: true } }); } } catch (error) { prepareError(node, error); } return [returnData]; } async function execute(inputsData) { const node = this.getNode(); const returnData = []; const pairedItem = []; const options = this.getNodeParameter('options', 0, {}); const workflowId = this.getWorkflow().id; let query = this.getNodeParameter('query', 0); for (const resolvable of (0, utilities_1.getResolvables)(query)) { query = query.replace(resolvable, this.evaluateExpression(resolvable, 0)); } const context = await (0, sandbox_utils_1.loadAlaSqlSandbox)(); const isSelectQuery = node.typeVersion >= 3.1 ? query.toLowerCase().startsWith('select') : false; const returnSuccessItemIfEmpty = node.typeVersion <= 3.1 ? true : options.emptyQueryResult === 'success'; if (isSelectQuery) { try { return await executeSelectWithMappedPairedItems(node, inputsData, query, returnSuccessItemIfEmpty, context); } catch (error) { di_1.Container.get(n8n_core_1.ErrorReporter).error(error, { extra: { nodeName: node.name, nodeType: node.type, nodeVersion: node.typeVersion, workflowId, }, }); } } for (let i = 0; i < inputsData.length; i++) { const inputData = inputsData[i]; inputData.forEach((item, index) => { if (item.pairedItem === undefined) { item.pairedItem = index; } if (typeof item.pairedItem === 'number') { pairedItem.push({ item: item.pairedItem, input: i, }); return; } if (Array.isArray(item.pairedItem)) { const pairedItems = item.pairedItem .filter((p) => p !== undefined) .map((p) => (typeof p === 'number' ? { item: p } : p)) .map((p) => { return { item: p.item, input: i, }; }); pairedItem.push.apply(pairedItem, pairedItems); return; } pairedItem.push({ item: item.pairedItem.item, input: i, }); }); } const tableData = inputsData.map((inputData) => inputData.map((entry) => entry.json)); try { const result = await (0, sandbox_utils_1.runAlaSqlInSandbox)(context, tableData, query); for (const item of result) { if (Array.isArray(item)) { returnData.push.apply(returnData, item.map((json) => ({ json, pairedItem }))); } else if (typeof item === 'object') { returnData.push({ json: item, pairedItem }); } } if (!returnData.length && returnSuccessItemIfEmpty) { returnData.push({ json: { success: true }, pairedItem }); } } catch (error) { prepareError(node, error); } return [returnData]; } //# sourceMappingURL=combineBySql.js.map