mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
fix(Compare Datasets Node): Support for dot notation in skip fields
This commit is contained in:
parent
5ff3dea7bb
commit
83e25c066a
|
@ -93,6 +93,42 @@ export class CompareDatasets implements INodeType {
|
||||||
description: 'Output contains all data (but structure more complex)',
|
description: 'Output contains all data (but structure more complex)',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
'@version': [1, 2],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
displayName: 'When There Are Differences',
|
||||||
|
name: 'resolve',
|
||||||
|
type: 'options',
|
||||||
|
default: 'includeBoth',
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
name: 'Use Input A Version',
|
||||||
|
value: 'preferInput1',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Use Input B Version',
|
||||||
|
value: 'preferInput2',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Use a Mix of Versions',
|
||||||
|
value: 'mix',
|
||||||
|
description: 'Output uses different inputs for different fields',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Include Both Versions',
|
||||||
|
value: 'includeBoth',
|
||||||
|
description: 'Output contains all data (but structure more complex)',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
displayOptions: {
|
||||||
|
hide: {
|
||||||
|
'@version': [1, 2],
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
displayName: 'Fuzzy Compare',
|
displayName: 'Fuzzy Compare',
|
||||||
|
|
|
@ -5,6 +5,8 @@ import get from 'lodash.get';
|
||||||
import intersection from 'lodash.intersection';
|
import intersection from 'lodash.intersection';
|
||||||
import isEmpty from 'lodash.isempty';
|
import isEmpty from 'lodash.isempty';
|
||||||
import omit from 'lodash.omit';
|
import omit from 'lodash.omit';
|
||||||
|
import unset from 'lodash.unset';
|
||||||
|
import { cloneDeep } from 'lodash';
|
||||||
import set from 'lodash.set';
|
import set from 'lodash.set';
|
||||||
import union from 'lodash.union';
|
import union from 'lodash.union';
|
||||||
import { fuzzyCompare } from '../../utils/utilities';
|
import { fuzzyCompare } from '../../utils/utilities';
|
||||||
|
@ -65,7 +67,7 @@ function compareItems(
|
||||||
const different: IDataObject = {};
|
const different: IDataObject = {};
|
||||||
const skipped: IDataObject = {};
|
const skipped: IDataObject = {};
|
||||||
|
|
||||||
differentKeys.forEach((key) => {
|
differentKeys.forEach((key, i) => {
|
||||||
const processNullishValue = processNullishValueFunction(options.nodeVersion as number);
|
const processNullishValue = processNullishValueFunction(options.nodeVersion as number);
|
||||||
|
|
||||||
switch (options.resolve) {
|
switch (options.resolve) {
|
||||||
|
@ -76,18 +78,63 @@ function compareItems(
|
||||||
different[key] = processNullishValue(item2.json[key]);
|
different[key] = processNullishValue(item2.json[key]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
const input1 = processNullishValue(item1.json[key]);
|
let input1 = processNullishValue(item1.json[key]);
|
||||||
const input2 = processNullishValue(item2.json[key]);
|
let input2 = processNullishValue(item2.json[key]);
|
||||||
|
|
||||||
let [firstInputName, secondInputName] = ['input1', 'input2'];
|
let [firstInputName, secondInputName] = ['input1', 'input2'];
|
||||||
if ((options.nodeVersion as number) >= 2) {
|
if ((options.nodeVersion as number) >= 2) {
|
||||||
[firstInputName, secondInputName] = ['inputA', 'inputB'];
|
[firstInputName, secondInputName] = ['inputA', 'inputB'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skipFields.includes(key)) {
|
if (
|
||||||
skipped[key] = { [firstInputName]: input1, [secondInputName]: input2 };
|
(options.nodeVersion as number) >= 2.1 &&
|
||||||
} else {
|
!options.disableDotNotation &&
|
||||||
|
!skipFields.some((field) => field === key)
|
||||||
|
) {
|
||||||
|
const skippedFieldsWithDotNotation = skipFields.filter(
|
||||||
|
(field) => field.startsWith(key) && field.includes('.'),
|
||||||
|
);
|
||||||
|
|
||||||
|
input1 = cloneDeep(input1);
|
||||||
|
input2 = cloneDeep(input2);
|
||||||
|
|
||||||
|
if (
|
||||||
|
skippedFieldsWithDotNotation.length &&
|
||||||
|
(typeof input1 !== 'object' || typeof input2 !== 'object')
|
||||||
|
) {
|
||||||
|
throw new Error(
|
||||||
|
`The field \'${key}\' in item ${i} is not an object. It is not possible to use dot notation.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skipped[key] === undefined && skippedFieldsWithDotNotation.length) {
|
||||||
|
skipped[key] = { [firstInputName]: {}, [secondInputName]: {} };
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const skippedField of skippedFieldsWithDotNotation) {
|
||||||
|
const nestedField = skippedField.replace(`${key}.`, '');
|
||||||
|
set(
|
||||||
|
(skipped[key] as IDataObject)[firstInputName] as IDataObject,
|
||||||
|
nestedField,
|
||||||
|
get(input1, nestedField),
|
||||||
|
);
|
||||||
|
set(
|
||||||
|
(skipped[key] as IDataObject)[secondInputName] as IDataObject,
|
||||||
|
nestedField,
|
||||||
|
get(input2, nestedField),
|
||||||
|
);
|
||||||
|
|
||||||
|
unset(input1, nestedField);
|
||||||
|
unset(input2, nestedField);
|
||||||
|
}
|
||||||
|
|
||||||
different[key] = { [firstInputName]: input1, [secondInputName]: input2 };
|
different[key] = { [firstInputName]: input1, [secondInputName]: input2 };
|
||||||
|
} else {
|
||||||
|
if (skipFields.includes(key)) {
|
||||||
|
skipped[key] = { [firstInputName]: input1, [secondInputName]: input2 };
|
||||||
|
} else {
|
||||||
|
different[key] = { [firstInputName]: input1, [secondInputName]: input2 };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -205,6 +252,15 @@ export function findMatches(
|
||||||
const multipleMatches = (options.multipleMatches as string) || 'first';
|
const multipleMatches = (options.multipleMatches as string) || 'first';
|
||||||
const skipFields = ((options.skipFields as string) || '').split(',').map((field) => field.trim());
|
const skipFields = ((options.skipFields as string) || '').split(',').map((field) => field.trim());
|
||||||
|
|
||||||
|
if (disableDotNotation && skipFields.some((field) => field.includes('.'))) {
|
||||||
|
const fieldToSkip = skipFields.find((field) => field.includes('.'));
|
||||||
|
throw new Error(
|
||||||
|
`Dot notation is disabled, but field to skip comparing '${
|
||||||
|
fieldToSkip as string
|
||||||
|
}' contains dot`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const filteredData = {
|
const filteredData = {
|
||||||
matched: [] as EntryMatches[],
|
matched: [] as EntryMatches[],
|
||||||
unmatched1: [] as INodeExecutionData[],
|
unmatched1: [] as INodeExecutionData[],
|
||||||
|
@ -265,8 +321,18 @@ export function findMatches(
|
||||||
let entryFromInput2 = match.json;
|
let entryFromInput2 = match.json;
|
||||||
|
|
||||||
if (skipFields.length) {
|
if (skipFields.length) {
|
||||||
entryFromInput1 = omit(entryFromInput1, skipFields);
|
if (disableDotNotation || !skipFields.some((field) => field.includes('.'))) {
|
||||||
entryFromInput2 = omit(entryFromInput2, skipFields);
|
entryFromInput1 = omit(entryFromInput1, skipFields);
|
||||||
|
entryFromInput2 = omit(entryFromInput2, skipFields);
|
||||||
|
} else {
|
||||||
|
entryFromInput1 = cloneDeep(entryFromInput1);
|
||||||
|
entryFromInput2 = cloneDeep(entryFromInput2);
|
||||||
|
|
||||||
|
skipFields.forEach((field) => {
|
||||||
|
unset(entryFromInput1, field);
|
||||||
|
unset(entryFromInput2, field);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let isItemsEqual = true;
|
let isItemsEqual = true;
|
||||||
|
|
|
@ -0,0 +1,897 @@
|
||||||
|
{
|
||||||
|
"name": "skip fields dot test",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"parameters": {},
|
||||||
|
"id": "eb18dcd4-3251-493f-ae3f-d4a89b16cee8",
|
||||||
|
"name": "When clicking \"Execute Workflow\"",
|
||||||
|
"type": "n8n-nodes-base.manualTrigger",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [400, 800]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"jsCode": "return [\n\t{\n\t\tid: 1,\n\t\tdata: {\n\t\t\tname: 'John',\n\t\t\tage: 31,\n active: true,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'New York',\n\t\t\tcountry: 'USA',\n\t\t},\n\t},\n\t{\n\t\tid: 2,\n\t\tdata: {\n\t\t\tname: 'Jane',\n\t\t\tage: 26,\n active: true,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'London',\n\t\t\tcountry: 'UK',\n\t\t},\n\t},\n\t{\n\t\tid: 3,\n\t\tdata: {\n\t\t\tname: 'Jack',\n\t\t\tage: 36,\n active: true,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'Paris',\n\t\t\tcountry: 'France',\n\t\t},\n\t},\n]"
|
||||||
|
},
|
||||||
|
"id": "77327bfe-a4a8-49b8-a237-2f264536e5e3",
|
||||||
|
"name": "Code",
|
||||||
|
"type": "n8n-nodes-base.code",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [660, 640]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"jsCode": "return [\n\t{\n\t\tid: 1,\n\t\tdata: {\n\t\t\tname: 'John',\n\t\t\tage: 30,\n active: false,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'New York',\n\t\t\tcountry: 'us',\n \n\t\t},\n\t},\n\t{\n\t\tid: 2,\n\t\tdata: {\n\t\t\tname: 'Jane',\n\t\t\tage: 25,\n active: false,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'London',\n\t\t\tcountry: 'uk',\n\t\t},\n\t},\n\t{\n\t\tid: 3,\n\t\tdata: {\n\t\t\tname: 'Jack',\n\t\t\tage: 35,\n active: false,\n\t\t},\n\t\taddress: {\n\t\t\tcity: 'Paris',\n\t\t\tcountry: 'fr',\n\t\t},\n\t},\n]"
|
||||||
|
},
|
||||||
|
"id": "8ea09201-1ed6-4f9c-afb4-1261142a74a3",
|
||||||
|
"name": "Code1",
|
||||||
|
"type": "n8n-nodes-base.code",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [660, 920]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "750c4213-42e0-4e66-96b0-24dcb82d3d67",
|
||||||
|
"name": "Any skipped",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1020, 220]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"skipFields": "data, address"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "2912ebdb-ddb8-4c53-a357-66e8b20ff947",
|
||||||
|
"name": "skip whole object",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1020, 420]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"skipFields": "data.age, data.active, address.country"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "9ea72e2e-f062-4ae7-bfb1-9266848d0f3c",
|
||||||
|
"name": "skip each key",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1020, 620]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"skipFields": "address.country"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "fca0048b-a493-4ca4-861b-2ca8216fbfba",
|
||||||
|
"name": "skipped contain contry",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1040, 1060]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"skipFields": "data, address.country"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "498b2f65-1117-4ff2-acde-a51049fd9b89",
|
||||||
|
"name": "skip object and key",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1040, 860],
|
||||||
|
"continueOnFail": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"mergeByFields": {
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"field1": "id",
|
||||||
|
"field2": "id"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"skipFields": "data.age, address.country"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"id": "77ad3a73-8683-41ed-9040-cef1a2895704",
|
||||||
|
"name": "skip includes age and contry",
|
||||||
|
"type": "n8n-nodes-base.compareDatasets",
|
||||||
|
"typeVersion": 2.1,
|
||||||
|
"position": [1040, 1260]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "be74368b-6d04-43ae-ad01-e2efbd2758c3",
|
||||||
|
"name": "Set",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 240]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "4cb1a37a-ce93-4a3e-b613-8ae9e8265718",
|
||||||
|
"name": "Set1",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 380]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "ab00a0a0-34be-4a65-a1de-8f69db895b76",
|
||||||
|
"name": "Set2",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 520]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "b23e2bf9-9a4b-4f87-a21f-cd24c56af3c1",
|
||||||
|
"name": "Set3",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 660]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "2cf57ec3-72c4-43e2-ad28-6755b19cc8f3",
|
||||||
|
"name": "Set4",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 800]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameters": {
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
"id": "fdf62bd3-5e54-43cd-b70e-be159aa1722f",
|
||||||
|
"name": "Set5",
|
||||||
|
"type": "n8n-nodes-base.set",
|
||||||
|
"typeVersion": 1,
|
||||||
|
"position": [1340, 940]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"pinData": {
|
||||||
|
"Set": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 31,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 30,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "New York",
|
||||||
|
"country": "USA"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "New York",
|
||||||
|
"country": "us"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 26,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 25,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "London",
|
||||||
|
"country": "UK"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "London",
|
||||||
|
"country": "uk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 36,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 35,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "Paris",
|
||||||
|
"country": "France"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "Paris",
|
||||||
|
"country": "fr"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Set1": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 1,
|
||||||
|
"data": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 31,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "New York",
|
||||||
|
"country": "USA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 2,
|
||||||
|
"data": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 26,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "London",
|
||||||
|
"country": "UK"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 3,
|
||||||
|
"data": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 36,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "Paris",
|
||||||
|
"country": "France"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Set2": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 1,
|
||||||
|
"data": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 31,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "New York",
|
||||||
|
"country": "USA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 2,
|
||||||
|
"data": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 26,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "London",
|
||||||
|
"country": "UK"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 3,
|
||||||
|
"data": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 36,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "Paris",
|
||||||
|
"country": "France"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Set3": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 1,
|
||||||
|
"data": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 31,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "New York",
|
||||||
|
"country": "USA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 2,
|
||||||
|
"data": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 26,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "London",
|
||||||
|
"country": "UK"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"id": 3,
|
||||||
|
"data": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 36,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"city": "Paris",
|
||||||
|
"country": "France"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Set5": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "John",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "John",
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "New York"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "New York"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"age": 31
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"age": 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "USA"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "us"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jane",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jane",
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "London"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "London"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"age": 26
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"age": 25
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "UK"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "uk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jack",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jack",
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "Paris"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "Paris"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"age": 36
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"age": 35
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "France"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "fr"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Set4": [
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 1
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 31,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "John",
|
||||||
|
"age": 30,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "New York"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "New York"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "USA"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "us"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 2
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 26,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jane",
|
||||||
|
"age": 25,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "London"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "London"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "UK"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "uk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"json": {
|
||||||
|
"keys": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"same": {
|
||||||
|
"id": 3
|
||||||
|
},
|
||||||
|
"different": {
|
||||||
|
"data": {
|
||||||
|
"inputA": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 36,
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"name": "Jack",
|
||||||
|
"age": 35,
|
||||||
|
"active": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"city": "Paris"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"city": "Paris"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"address": {
|
||||||
|
"inputA": {
|
||||||
|
"country": "France"
|
||||||
|
},
|
||||||
|
"inputB": {
|
||||||
|
"country": "fr"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"connections": {
|
||||||
|
"When clicking \"Execute Workflow\"": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Code",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "Code1",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Code": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Any skipped",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip whole object",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip each key",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip object and key",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skipped contain contry",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip includes age and contry",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Code1": {
|
||||||
|
"main": [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Any skipped",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip whole object",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip each key",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip object and key",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skipped contain contry",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"node": "skip includes age and contry",
|
||||||
|
"type": "main",
|
||||||
|
"index": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Any skipped": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"skip whole object": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set1",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"skip each key": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set2",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"skip object and key": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set3",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"skipped contain contry": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set4",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"skip includes age and contry": {
|
||||||
|
"main": [
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"node": "Set5",
|
||||||
|
"type": "main",
|
||||||
|
"index": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"active": false,
|
||||||
|
"settings": {},
|
||||||
|
"versionId": "853bfbd2-7a94-4859-98e2-ad4df10bf922",
|
||||||
|
"id": "146",
|
||||||
|
"meta": {
|
||||||
|
"instanceId": "36203ea1ce3cef713fa25999bd9874ae26b9e4c2c3a90a365f2882a154d031d0"
|
||||||
|
},
|
||||||
|
"tags": []
|
||||||
|
}
|
Loading…
Reference in a new issue