UNPKG

n8n-nodes-base

Version:

Base nodes of n8n

303 lines 13.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EvaluationTrigger = exports.DEFAULT_STARTING_ROW = void 0; const n8n_workflow_1 = require("n8n-workflow"); const selectMany_1 = require("../../DataTable/common/selectMany"); const GoogleSheetsTrigger_node_1 = require("../../Google/Sheet/GoogleSheetsTrigger.node"); const read_operation_1 = require("../../Google/Sheet/v2/actions/sheet/read.operation"); const versionDescription_1 = require("../../Google/Sheet/v2/actions/versionDescription"); const Description_node_1 = require("../Evaluation/Description.node"); const methods_1 = require("../methods"); const evaluationTriggerUtils_1 = require("../utils/evaluationTriggerUtils"); exports.DEFAULT_STARTING_ROW = 2; const MAX_ROWS = 1000; class EvaluationTrigger { description = { displayName: 'Evaluation Trigger', icon: 'fa:check-double', name: 'evaluationTrigger', group: ['trigger'], version: [4.6, 4.7], description: 'Run a test dataset through your workflow to check performance', eventTriggerDescription: '', defaults: { name: 'When fetching a dataset row', color: '#c3c9d5', }, inputs: [], outputs: [n8n_workflow_1.NodeConnectionTypes.Main], properties: [ { ...Description_node_1.sourcePicker, default: 'dataTable', displayOptions: { show: { '@version': [{ _cnd: { gte: 4.7 } }] } }, }, { ...Description_node_1.sourcePicker, default: 'googleSheets', displayOptions: { show: { '@version': [{ _cnd: { lte: 4.6 } }] } }, }, { displayName: 'Pulls a test dataset from a Google Sheet. The workflow will run once for each row, in sequence. Tips for wiring this node up <a href="https://docs.n8n.io/advanced-ai/evaluations/tips-and-common-issues/#combining-multiple-triggers">here</a>.', name: 'notice', type: 'notice', default: '', displayOptions: { hide: { source: ['dataTable'] } }, }, { displayName: 'Credentials', name: 'credentials', type: 'credentials', default: '', displayOptions: { hide: { source: ['dataTable'] } }, }, { ...versionDescription_1.authentication, displayOptions: { hide: { source: ['dataTable'], }, }, }, { ...GoogleSheetsTrigger_node_1.document, displayName: 'Document Containing Dataset', hint: 'Example dataset format <a href="https://docs.google.com/spreadsheets/d/1vD_IdeFUg7sHsK9okL6Doy1rGOkWTnPJV3Dro4FBUsY/edit?gid=0#gid=0">here</a>', displayOptions: { hide: { source: ['dataTable'] } }, }, { ...GoogleSheetsTrigger_node_1.sheet, displayName: 'Sheet Containing Dataset', displayOptions: { hide: { source: ['dataTable'] } }, }, { // eslint-disable-next-line n8n-nodes-base/node-param-display-name-miscased displayName: 'Data table', name: 'dataTableId', type: 'resourceLocator', default: { mode: 'list', value: '' }, required: true, modes: [ { displayName: 'From List', name: 'list', type: 'list', typeOptions: { searchListMethod: 'dataTableSearch', searchable: true, skipCredentialsCheckInRLC: true, }, }, { displayName: 'ID', name: 'id', type: 'string', }, ], displayOptions: { show: { source: ['dataTable'] } }, }, { displayName: 'Limit Rows', name: 'limitRows', type: 'boolean', default: false, noDataExpression: true, description: 'Whether to limit number of rows to process', }, { displayName: 'Max Rows to Process', name: 'maxRows', type: 'number', default: 10, description: 'Maximum number of rows to process', noDataExpression: false, displayOptions: { show: { limitRows: [true] } }, }, { ...read_operation_1.readFilter, displayOptions: { hide: { source: ['dataTable'] } } }, { displayName: 'Filter Rows', name: 'filterRows', type: 'boolean', default: false, noDataExpression: true, description: 'Whether to filter rows to process', displayOptions: { show: { source: ['dataTable'] } }, }, ...(0, selectMany_1.getSelectFields)({ show: { filterRows: [true] } }), ], codex: { alias: ['Test', 'Metrics', 'Evals', 'Set Output', 'Set Metrics'], }, credentials: [ { name: 'googleApi', required: true, displayOptions: { show: { authentication: ['serviceAccount'], }, }, testedBy: 'googleApiCredentialTest', }, { name: 'googleSheetsOAuth2Api', required: true, displayOptions: { show: { authentication: ['oAuth2'], }, }, }, ], }; methods = { loadOptions: methods_1.loadOptions, listSearch: methods_1.listSearch, credentialTest: methods_1.credentialTest, }; async execute() { const inputData = this.getInputData(); const source = this.getNodeParameter('source', 0); const previousRunRowNumber = inputData?.[0]?.json?.row_number; const previousRunRowsLeft = inputData?.[0]?.json?._rowsLeft; if (source === 'dataTable') { const maxRows = this.getNodeParameter('limitRows', 0, false) ? this.getNodeParameter('maxRows', 0, MAX_ROWS) : MAX_ROWS; if (this.helpers.getDataTableProxy === undefined) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Attempted to use Data table node but the module is disabled'); } const currentIndex = typeof previousRunRowNumber === 'number' && previousRunRowsLeft !== 0 ? previousRunRowNumber + 1 : 0; const dataTableId = this.getNodeParameter('dataTableId', 0, undefined, { extractValue: true, }); const dataTableProxy = await this.helpers.getDataTableProxy(dataTableId); const filter = await (0, selectMany_1.getSelectFilter)(this, 0); const previousRunRowId = inputData?.[0]?.json?.row_id; let effectiveFilter = filter; if (typeof previousRunRowId === 'number' && previousRunRowsLeft !== 0) { effectiveFilter = { type: 'and', filters: [ ...filter.filters, { columnName: 'id', condition: 'gt', value: previousRunRowId, }, ], }; } const { data, count } = await dataTableProxy.getManyRowsAndCount({ skip: 0, take: 1, filter: effectiveFilter, }); if (data.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No row found'); } const effectiveTotal = Math.min(count, maxRows); const rowsLeft = Math.max(0, effectiveTotal - 1); const currentRow = { json: { ...data[0], row_number: currentIndex, row_id: data[0].id, _rowsLeft: rowsLeft, }, }; return [[currentRow]]; } else if (source === 'googleSheets') { const maxRows = this.getNodeParameter('limitRows', 0, false) ? this.getNodeParameter('maxRows', 0, MAX_ROWS) + 1 : MAX_ROWS; const firstDataRow = typeof previousRunRowNumber === 'number' && previousRunRowsLeft !== 0 ? previousRunRowNumber + 1 : exports.DEFAULT_STARTING_ROW; const rangeOptions = { rangeDefinition: 'specifyRange', headerRow: 1, firstDataRow, }; const googleSheetInstance = evaluationTriggerUtils_1.getGoogleSheet.call(this); const googleSheet = await evaluationTriggerUtils_1.getSheet.call(this, googleSheetInstance); const allRows = await evaluationTriggerUtils_1.getResults.call(this, [], googleSheetInstance, googleSheet, rangeOptions); const hasFilter = this.getNodeParameter('filtersUI.values', 0, []); if (hasFilter.length > 0) { const currentRow = allRows[0]; const currentRowNumber = currentRow.json?.row_number; if (currentRow === undefined) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No row found'); } const rowsLeft = await evaluationTriggerUtils_1.getNumberOfRowsLeftFiltered.call(this, googleSheetInstance, googleSheet.title, currentRowNumber + 1, maxRows); currentRow.json._rowsLeft = rowsLeft; return [[currentRow]]; } else { const currentRow = allRows.find((row) => row?.json?.row_number === firstDataRow); const rowsLeft = await evaluationTriggerUtils_1.getRowsLeft.call(this, googleSheetInstance, googleSheet.title, `${googleSheet.title}!${firstDataRow}:${maxRows}`); if (currentRow === undefined) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'No row found'); } currentRow.json._rowsLeft = rowsLeft; return [[currentRow]]; } } throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown source "${source}"`); } customOperations = { dataset: { async getRows() { try { const source = this.getNodeParameter('source', 0); if (source === 'dataTable') { const maxRows = this.getNodeParameter('limitRows', 0, false) ? this.getNodeParameter('maxRows', 0, MAX_ROWS) : MAX_ROWS; if (this.helpers.getDataTableProxy === undefined) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Attempted to use Data table node but the module is disabled'); } const dataTableId = this.getNodeParameter('dataTableId', 0, undefined, { extractValue: true, }); const dataTableProxy = await this.helpers.getDataTableProxy(dataTableId); const filter = await (0, selectMany_1.getSelectFilter)(this, 0); const { data } = await dataTableProxy.getManyRowsAndCount({ skip: 0, take: maxRows, filter, }); const result = data.map((row, i) => ({ json: { ...row, row_id: row.id, row_number: i, }, pairedItem: { item: 0 }, })); return [result]; } else if (source === 'googleSheets') { const maxRows = this.getNodeParameter('limitRows', 0, false) ? this.getNodeParameter('maxRows', 0, MAX_ROWS) + 1 : MAX_ROWS; const googleSheetInstance = evaluationTriggerUtils_1.getGoogleSheet.call(this); const googleSheet = await evaluationTriggerUtils_1.getSheet.call(this, googleSheetInstance); const results = await evaluationTriggerUtils_1.getResults.call(this, [], googleSheetInstance, googleSheet, {}); const result = results.slice(0, maxRows - 1); return [result]; } throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown source "${source}"`); } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), error); } }, }, }; } exports.EvaluationTrigger = EvaluationTrigger; //# sourceMappingURL=EvaluationTrigger.node.ee.js.map