From 855916aff4a8ae6fc3b68e6c06435b4939ced812 Mon Sep 17 00:00:00 2001 From: Nicolas Thouvenin Date: Wed, 7 Feb 2024 17:50:34 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20identifier=20param?= =?UTF-8?q?=20(like=20[graph])?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plugin-core.md | 14 +++++++------- packages/analytics/src/pair.js | 10 +++++----- packages/analytics/test/network.js | 29 +++++++++++++++++++++++++++-- packages/core/README.md | 14 +++++++------- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/docs/plugin-core.md b/docs/plugin-core.md index 5ef07845..aaf006ab 100644 --- a/docs/plugin-core.md +++ b/docs/plugin-core.md @@ -12,13 +12,13 @@ npm install @ezs/core Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent : -- [delegate] : 1 sous flux pour tous les éléments -- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition -- [spaw] : 1 sous flux par élément -- [loop] : 1 sous flux par élément -- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline -- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux -- [singleton] : 1 sous flux pour le premier élément +- [delegate] : 1 sous flux pour tous les éléments +- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition +- [spaw] : 1 sous flux par élément +- [loop] : 1 sous flux par élément +- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline +- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux +- [singleton] : 1 sous flux pour le premier élément ## usage diff --git a/packages/analytics/src/pair.js b/packages/analytics/src/pair.js index 1f30a71f..9b5b0c14 100644 --- a/packages/analytics/src/pair.js +++ b/packages/analytics/src/pair.js @@ -14,10 +14,9 @@ const pair = (data, feed, ctx) => { feed.close(); return; } - let fields = ctx.getParam('path', []); - if (!Array.isArray(fields)) { - fields = [fields]; - } + const idt = ctx.getParam('identifier', false); + const weight = idt === false ? 1 : get(data, idt, 1); + const fields = [].concat(ctx.getParam('path', [])); const values = fields .map((key) => get(data, key)) @@ -29,7 +28,7 @@ const pair = (data, feed, ctx) => { const a = values.slice(i + 1).reduce((pre, cur) => pre.concat(cur), []); if (a.length > 0) { v.forEach((w) => { - a.forEach((x) => feed.write(core([w, x], 1))); + a.forEach((x) => feed.write(core([w, x], weight))); }); } }); @@ -82,6 +81,7 @@ const pair = (data, feed, ctx) => { * ``` * * @name pair + * @param {String} [identifier=false] path to use to set value result field (if not set or not exists, 1 is use as a default value) * @param {String} * * diff --git a/packages/analytics/test/network.js b/packages/analytics/test/network.js index 3537e539..c7c5788d 100644 --- a/packages/analytics/test/network.js +++ b/packages/analytics/test/network.js @@ -209,7 +209,7 @@ describe('network', () => { }); }); - it('pair', (done) => { + it('pair #1', (done) => { ezs.use(statements); const res = []; from([ @@ -232,7 +232,7 @@ describe('network', () => { }); }); - it('pair', (done) => { + it('pair #2', (done) => { ezs.use(statements); const res = []; from([ @@ -254,4 +254,29 @@ describe('network', () => { done(); }); }); + + it('pair #3', (done) => { + ezs.use(statements); + const res = []; + from([ + { i: 'doc#1', a: ['x', 'b', 'z'], b: 'A' }, + { i: 'doc#2', a: ['t', 'b', 'z'], b: 'B' }, + { i: 'doc#3', a: ['t', 'c', 'z'], b: 'C' }, + { i: 'doc#4', a: ['y', 'd', 'z'], b: 'D' }, + { i: 'doc#5', a: ['x', 'b', 'z'], b: 'E' }, + ]) + .pipe(ezs('pair', { path: ['a', 'b'], identifier: 'i' })) + .on('data', (chunk) => { + assert(typeof chunk === 'object'); + res.push(chunk); + }) + .on('end', () => { + assert.equal(15, res.length); + assert.equal('doc#1', res[0].value); + done(); + }); + }); + + + }); diff --git a/packages/core/README.md b/packages/core/README.md index 5ef07845..aaf006ab 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -12,13 +12,13 @@ npm install @ezs/core Plusieurs instructions permettent de créer des sous flux (sub pipeline), à partir d'un fichier d’instructions ou d'instructions imbriquées. Si elles s'utilisent toutes de la même manière (avec les mêmes paramètres) centaines peuvent apparaître comme similaires mais leur fonctionnement est différent : -- [delegate] : 1 sous flux pour tous les éléments -- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition -- [spaw] : 1 sous flux par élément -- [loop] : 1 sous flux par élément -- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline -- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux -- [singleton] : 1 sous flux pour le premier élément +- [delegate] : 1 sous flux pour tous les éléments +- [swing] : 1 sous flux pour tous les éléments filtrés selon une condition +- [spaw] : 1 sous flux par élément +- [loop] : 1 sous flux par élément +- [expand] : 1 sous flux pour N éléments (N = size), seul le champ sélectionné est envoyé dans le pipeline +- [combine] : 1 sous flux pour tous les éléments, seul le champ sélectionné est comparé avec le résultat du sous flux +- [singleton] : 1 sous flux pour le premier élément ## usage