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}
*
- path of the element who will be use to create the pair
* - chemin de l'élément qui vas etre utilisé pour créer le couple
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