Skip to content

Commit 58460f1

Browse files
Add ability to omit fields during split (#386)
1 parent 2a1a32e commit 58460f1

File tree

2 files changed

+197
-2
lines changed

2 files changed

+197
-2
lines changed

src/utils/split.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import isFunction from 'lodash/isFunction';
22
import get from 'lodash/get';
3+
import omit from 'lodash/omit';
34

45
import { faulty } from './faults';
56

67
export const splitObject = ({ // eslint-disable-line import/prefer-default-export
78
splitOn,
89
splitTargetField = 'split',
10+
splitOnOmitFields = [],
911
...rule
1012
}) => {
1113
if (splitOn) {
@@ -16,8 +18,11 @@ export const splitObject = ({ // eslint-disable-line import/prefer-default-expor
1618
return (s) => s
1719
.flatMap(faulty((uow) => {
1820
const values = get(uow, splitOn);
19-
return values.map((v) => ({
20-
...uow,
21+
const valuesLength = values.length;
22+
return values.map((v, i) => ({
23+
...omit(uow, splitOnOmitFields),
24+
splitOnTotal: valuesLength,
25+
splitOnItemNumber: i + 1,
2126
[splitTargetField]: v,
2227
}));
2328
}));

test/unit/utils/split.test.js

+190
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
import 'mocha';
2+
import { expect } from 'chai';
3+
import sinon from 'sinon';
4+
import _ from 'highland';
5+
6+
import {
7+
splitObject,
8+
} from '../../../src/utils';
9+
10+
describe('utils/split.js', () => {
11+
afterEach(sinon.restore);
12+
13+
it('should split, defaults', (done) => {
14+
const queryResponse = [
15+
{
16+
id: '12340',
17+
},
18+
{
19+
id: '12341',
20+
},
21+
{
22+
id: '12342',
23+
},
24+
{
25+
id: '12343',
26+
},
27+
{
28+
id: '12344',
29+
},
30+
];
31+
const uows = [
32+
{
33+
queryResponse,
34+
},
35+
];
36+
37+
_(uows)
38+
.through(splitObject({
39+
splitOn: 'queryResponse',
40+
debug: (msg, v) => console.log(msg, v),
41+
}))
42+
.collect()
43+
.tap((collected) => {
44+
// console.log(JSON.stringify(collected, null, 2));
45+
expect(collected.length).to.equal(5);
46+
expect(collected[0].queryResponse).to.deep.equal(queryResponse);
47+
expect(collected[0].splitOnTotal).to.equal(5);
48+
expect(collected[0].splitOnItemNumber).to.equal(1);
49+
expect(collected[0].split).to.deep.equal(queryResponse[0]);
50+
expect(collected[1].queryResponse).to.deep.equal(queryResponse);
51+
expect(collected[1].splitOnTotal).to.equal(5);
52+
expect(collected[1].splitOnItemNumber).to.equal(2);
53+
expect(collected[1].split).to.deep.equal(queryResponse[1]);
54+
expect(collected[2].queryResponse).to.deep.equal(queryResponse);
55+
expect(collected[2].splitOnTotal).to.equal(5);
56+
expect(collected[2].splitOnItemNumber).to.equal(3);
57+
expect(collected[2].split).to.deep.equal(queryResponse[2]);
58+
expect(collected[3].queryResponse).to.deep.equal(queryResponse);
59+
expect(collected[3].splitOnTotal).to.equal(5);
60+
expect(collected[3].splitOnItemNumber).to.equal(4);
61+
expect(collected[3].split).to.deep.equal(queryResponse[3]);
62+
expect(collected[4].queryResponse).to.deep.equal(queryResponse);
63+
expect(collected[4].splitOnTotal).to.equal(5);
64+
expect(collected[4].splitOnItemNumber).to.equal(5);
65+
expect(collected[4].split).to.deep.equal(queryResponse[4]);
66+
})
67+
.done(done);
68+
});
69+
70+
it('should split, rename splitTargetField field', (done) => {
71+
const queryResponse = [
72+
{
73+
id: '12340',
74+
},
75+
{
76+
id: '12341',
77+
},
78+
{
79+
id: '12342',
80+
},
81+
{
82+
id: '12343',
83+
},
84+
{
85+
id: '12344',
86+
},
87+
];
88+
const uows = [
89+
{
90+
queryResponse,
91+
},
92+
];
93+
94+
_(uows)
95+
.through(splitObject({
96+
splitOn: 'queryResponse',
97+
splitTargetField: 'idObject',
98+
debug: (msg, v) => console.log(msg, v),
99+
}))
100+
.collect()
101+
.tap((collected) => {
102+
// console.log(JSON.stringify(collected, null, 2));
103+
expect(collected.length).to.equal(5);
104+
expect(collected[0].queryResponse).to.deep.equal(queryResponse);
105+
expect(collected[0].splitOnTotal).to.equal(5);
106+
expect(collected[0].splitOnItemNumber).to.equal(1);
107+
expect(collected[0].split).to.be.undefined;
108+
expect(collected[0].idObject).to.deep.equal(queryResponse[0]);
109+
expect(collected[1].queryResponse).to.deep.equal(queryResponse);
110+
expect(collected[1].splitOnTotal).to.equal(5);
111+
expect(collected[1].splitOnItemNumber).to.equal(2);
112+
expect(collected[1].split).to.be.undefined;
113+
expect(collected[1].idObject).to.deep.equal(queryResponse[1]);
114+
expect(collected[2].queryResponse).to.deep.equal(queryResponse);
115+
expect(collected[2].splitOnTotal).to.equal(5);
116+
expect(collected[2].splitOnItemNumber).to.equal(3);
117+
expect(collected[2].split).to.be.undefined;
118+
expect(collected[2].idObject).to.deep.equal(queryResponse[2]);
119+
expect(collected[3].queryResponse).to.deep.equal(queryResponse);
120+
expect(collected[3].splitOnTotal).to.equal(5);
121+
expect(collected[3].splitOnItemNumber).to.equal(4);
122+
expect(collected[3].split).to.be.undefined;
123+
expect(collected[3].idObject).to.deep.equal(queryResponse[3]);
124+
expect(collected[4].queryResponse).to.deep.equal(queryResponse);
125+
expect(collected[4].splitOnTotal).to.equal(5);
126+
expect(collected[4].splitOnItemNumber).to.equal(5);
127+
expect(collected[4].split).to.be.undefined;
128+
expect(collected[4].idObject).to.deep.equal(queryResponse[4]);
129+
})
130+
.done(done);
131+
});
132+
133+
it('should split, remove some fields', (done) => {
134+
const queryResponse = [
135+
{
136+
id: '12340',
137+
},
138+
{
139+
id: '12341',
140+
},
141+
{
142+
id: '12342',
143+
},
144+
{
145+
id: '12343',
146+
},
147+
{
148+
id: '12344',
149+
},
150+
];
151+
const uows = [
152+
{
153+
queryResponse,
154+
},
155+
];
156+
157+
_(uows)
158+
.through(splitObject({
159+
splitOn: 'queryResponse',
160+
splitOnOmitFields: 'queryResponse',
161+
debug: (msg, v) => console.log(msg, v),
162+
}))
163+
.collect()
164+
.tap((collected) => {
165+
// console.log(JSON.stringify(collected, null, 2));
166+
expect(collected.length).to.equal(5);
167+
expect(collected[0].queryResponse).to.be.undefined;
168+
expect(collected[0].splitOnTotal).to.equal(5);
169+
expect(collected[0].splitOnItemNumber).to.equal(1);
170+
expect(collected[0].split).to.deep.equal(queryResponse[0]);
171+
expect(collected[1].queryResponse).to.be.undefined;
172+
expect(collected[1].splitOnTotal).to.equal(5);
173+
expect(collected[1].splitOnItemNumber).to.equal(2);
174+
expect(collected[1].split).to.deep.equal(queryResponse[1]);
175+
expect(collected[2].queryResponse).to.be.undefined;
176+
expect(collected[2].splitOnTotal).to.equal(5);
177+
expect(collected[2].splitOnItemNumber).to.equal(3);
178+
expect(collected[2].split).to.deep.equal(queryResponse[2]);
179+
expect(collected[3].queryResponse).to.be.undefined;
180+
expect(collected[3].splitOnTotal).to.equal(5);
181+
expect(collected[3].splitOnItemNumber).to.equal(4);
182+
expect(collected[3].split).to.deep.equal(queryResponse[3]);
183+
expect(collected[4].queryResponse).to.be.undefined;
184+
expect(collected[4].splitOnTotal).to.equal(5);
185+
expect(collected[4].splitOnItemNumber).to.equal(5);
186+
expect(collected[4].split).to.deep.equal(queryResponse[4]);
187+
})
188+
.done(done);
189+
});
190+
});

0 commit comments

Comments
 (0)