@sis-cc/dotstatsuite-components 14.1.1 → 14.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/rules/src/table/preparators/prepareData.js +9 -6
- package/lib/rules2/src/getHCodelistsRefsInData.js +1 -1
- package/lib/rules2/src/{hierarchiseDimension.js → hierarchiseDimensionWithAdvancedHierarchy.js} +14 -14
- package/lib/rules2/src/hierarchiseDimensionWithNativeHierarchy.js +28 -0
- package/lib/rules2/src/parseHierarchicalCodelist.js +39 -4
- package/package.json +1 -1
- package/src/rules/src/table/preparators/prepareData.js +10 -7
- package/src/rules2/src/getHCodelistsRefsInData.js +1 -1
- package/src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy.js +44 -0
- package/src/rules2/src/hierarchiseDimensionWithNativeHierarchy.js +24 -0
- package/src/rules2/src/parseHierarchicalCodelist.js +38 -4
- package/test/getHCodelistsRefs.test.js +2 -2
- package/test/{hierarchiseDimension.test.js → hierarchiseDimensionWithAdvancedHierarchy.test.js} +11 -11
- package/test/hierarchiseDimensionWithNativeHierarchy.test.js +32 -0
- package/test/parseHierarchicalCodelist.test.js +64 -0
- package/lib/rules2/src/getDimensionsSimpleHierarchies.js +0 -42
- package/src/rules2/src/getDimensionsSimpleHierarchies.js +0 -34
- package/src/rules2/src/hierarchiseDimension.js +0 -38
|
@@ -53,11 +53,11 @@ var _getMetadataCoordinates = require('../../../../rules2/src/getMetadataCoordin
|
|
|
53
53
|
|
|
54
54
|
var _getAdvancedAttributes = require('../../../../rules2/src/getAdvancedAttributes');
|
|
55
55
|
|
|
56
|
-
var _getDimensionsSimpleHierarchies = require('../../../../rules2/src/getDimensionsSimpleHierarchies');
|
|
57
|
-
|
|
58
56
|
var _duplicateObservations = require('../../../../rules2/src/duplicateObservations');
|
|
59
57
|
|
|
60
|
-
var
|
|
58
|
+
var _hierarchiseDimensionWithAdvancedHierarchy = require('../../../../rules2/src/hierarchiseDimensionWithAdvancedHierarchy');
|
|
59
|
+
|
|
60
|
+
var _hierarchiseDimensionWithNativeHierarchy = require('../../../../rules2/src/hierarchiseDimensionWithNativeHierarchy');
|
|
61
61
|
|
|
62
62
|
var _getDimensionValuesIndexes = require('../../../../rules2/src/getDimensionValuesIndexes');
|
|
63
63
|
|
|
@@ -84,8 +84,7 @@ var prepareData = exports.prepareData = function prepareData(sdmxJson, customAtt
|
|
|
84
84
|
var _customAttributes = R.assoc('units', unitsDefinitionCodes, customAttributes);
|
|
85
85
|
var dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);
|
|
86
86
|
|
|
87
|
-
var
|
|
88
|
-
var hierarchies = R.mergeRight(simpleHierarchies, _options.hierarchies || {});
|
|
87
|
+
var hierarchies = _options.hierarchies || {};
|
|
89
88
|
var dimensionsIndexedByIds = R.indexBy(R.prop('id'), dimensions);
|
|
90
89
|
|
|
91
90
|
var parsedDimensionsIds = (0, _parseDimensionsIds.parseDimensionsIds)(dimensions);
|
|
@@ -167,8 +166,12 @@ var prepareData = exports.prepareData = function prepareData(sdmxJson, customAtt
|
|
|
167
166
|
var seriesAdvancedAttributes = (0, _getAdvancedAttributes.getSeriesAdvancedAttributes)(seriesAttributesValues, dimensions, seriesAdvancedAttributesIds);
|
|
168
167
|
|
|
169
168
|
var hierarchisedDimensions = R.map(function (dim) {
|
|
170
|
-
|
|
169
|
+
if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {
|
|
170
|
+
return (0, _hierarchiseDimensionWithNativeHierarchy.hierarchiseDimensionWithNativeHierarchy)(dim);
|
|
171
|
+
}
|
|
172
|
+
return (0, _hierarchiseDimensionWithAdvancedHierarchy.hierarchiseDimensionWithAdvancedHierarchy)(dim, R.prop(dim.id, hierarchies));
|
|
171
173
|
})(manyValuesDimensions);
|
|
174
|
+
|
|
172
175
|
var valuesIndexes = R.reduce(function (acc, dim) {
|
|
173
176
|
return (0, _extends4.default)({}, acc, (0, _defineProperty3.default)({}, dim.__index, (0, _getDimensionValuesIndexes.getDimensionValuesIndexes)(dim.values)));
|
|
174
177
|
}, {}, R.values(hierarchisedDimensions));
|
|
@@ -22,7 +22,7 @@ var getHCodelistsRefs = exports.getHCodelistsRefs = function getHCodelistsRefs(a
|
|
|
22
22
|
if (annotation.type !== 'HIER_CONTEXT') {
|
|
23
23
|
return acc;
|
|
24
24
|
}
|
|
25
|
-
var reference = annotation.text || '';
|
|
25
|
+
var reference = annotation.text || annotation.title || '';
|
|
26
26
|
var match = reference.match(/([\w@_.]+):([\w@_.]+):([\w@_.]+)\(([\d.]+)\).([\w@_.]+)$/);
|
|
27
27
|
if (R.isNil(match)) {
|
|
28
28
|
return acc;
|
package/lib/rules2/src/{hierarchiseDimension.js → hierarchiseDimensionWithAdvancedHierarchy.js}
RENAMED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.hierarchiseDimensionWithAdvancedHierarchy = undefined;
|
|
7
7
|
|
|
8
8
|
var _extends2 = require('babel-runtime/helpers/extends');
|
|
9
9
|
|
|
@@ -17,21 +17,13 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
|
|
|
17
17
|
|
|
18
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var hierarchiseDimensionWithAdvancedHierarchy = exports.hierarchiseDimensionWithAdvancedHierarchy = function hierarchiseDimensionWithAdvancedHierarchy(dimension, hierarchy) {
|
|
21
21
|
var indexed = R.indexBy(R.prop('id'), dimension.values);
|
|
22
|
-
var _hierarchy = hierarchy;
|
|
23
|
-
if (!R.has('#ROOT', hierarchy)) {
|
|
24
|
-
var indexes = R.pluck('id', dimension.values);
|
|
25
|
-
var refinedHierarchy = R.pick(indexes, _hierarchy);
|
|
26
|
-
var childrenIds = R.pipe(R.values, R.unnest, R.indexBy(R.identity))(refinedHierarchy);
|
|
27
|
-
var rootIds = R.pipe(R.reject(function (val) {
|
|
28
|
-
return R.has(val.id, childrenIds);
|
|
29
|
-
}), R.sortBy(R.prop('__indexPosition')), R.pluck('id'))(dimension.values);
|
|
30
|
-
_hierarchy = R.assoc('#ROOT', rootIds, hierarchy);
|
|
31
|
-
}
|
|
32
22
|
|
|
23
|
+
var rest = indexed;
|
|
33
24
|
var getChildren = function getChildren(parents) {
|
|
34
25
|
return R.pipe(function (ids) {
|
|
26
|
+
rest = R.omit(ids, rest);
|
|
35
27
|
return R.props(ids, indexed);
|
|
36
28
|
}, R.filter(R.identity), R.map(function (val) {
|
|
37
29
|
var _val = (0, _extends3.default)({}, val, {
|
|
@@ -40,8 +32,16 @@ var hierarchiseDimension = exports.hierarchiseDimension = function hierarchiseDi
|
|
|
40
32
|
});
|
|
41
33
|
var children = getChildren(R.append(val.id, parents));
|
|
42
34
|
return R.prepend(_val, children);
|
|
43
|
-
}))(R.propOr([], R.
|
|
35
|
+
}))(R.propOr([], R.isEmpty(parents) ? '#ROOT' : R.join('.', parents), hierarchy));
|
|
44
36
|
};
|
|
45
37
|
|
|
46
|
-
return R.set(R.lensProp('values'), R.
|
|
38
|
+
return R.set(R.lensProp('values'), R.pipe(getChildren, R.flatten, function (values) {
|
|
39
|
+
if (R.isEmpty(rest)) {
|
|
40
|
+
return values;
|
|
41
|
+
}
|
|
42
|
+
var sortedRest = R.pipe(R.values, R.map(function (val) {
|
|
43
|
+
return (0, _extends3.default)({}, val, { parent: undefined, parents: [] });
|
|
44
|
+
}), R.sortBy(R.prop('__indexPosition')))(rest);
|
|
45
|
+
return R.concat(sortedRest, values);
|
|
46
|
+
})([]))(dimension);
|
|
47
47
|
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.hierarchiseDimensionWithNativeHierarchy = undefined;
|
|
7
|
+
|
|
8
|
+
var _ramda = require('ramda');
|
|
9
|
+
|
|
10
|
+
var R = _interopRequireWildcard(_ramda);
|
|
11
|
+
|
|
12
|
+
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
13
|
+
|
|
14
|
+
var hierarchiseDimensionWithNativeHierarchy = exports.hierarchiseDimensionWithNativeHierarchy = function hierarchiseDimensionWithNativeHierarchy(dimension) {
|
|
15
|
+
var values = R.sortBy(R.prop('__indexPosition'), dimension.values || []);
|
|
16
|
+
var grouped = R.groupBy(R.propOr('#ROOT', 'parent'), values);
|
|
17
|
+
|
|
18
|
+
var getChildren = function getChildren(parents) {
|
|
19
|
+
var childs = R.propOr([], R.last(parents) || '#ROOT', grouped);
|
|
20
|
+
return R.reduce(function (acc, child) {
|
|
21
|
+
var refined = R.assoc('parents', parents, child);
|
|
22
|
+
var children = getChildren(R.append(child.id, parents));
|
|
23
|
+
return R.concat(acc, R.prepend(refined, children));
|
|
24
|
+
}, [], childs);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
return R.set(R.lensProp('values'), getChildren([]))(dimension);
|
|
28
|
+
};
|
|
@@ -5,18 +5,53 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.parseHierarchicalCodelist = undefined;
|
|
7
7
|
|
|
8
|
+
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
|
|
9
|
+
|
|
10
|
+
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
|
|
11
|
+
|
|
12
|
+
var _extends4 = require('babel-runtime/helpers/extends');
|
|
13
|
+
|
|
14
|
+
var _extends5 = _interopRequireDefault(_extends4);
|
|
15
|
+
|
|
8
16
|
var _ramda = require('ramda');
|
|
9
17
|
|
|
10
18
|
var R = _interopRequireWildcard(_ramda);
|
|
11
19
|
|
|
12
20
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
13
21
|
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
14
24
|
var parseHierarchicalCodelist = exports.parseHierarchicalCodelist = function parseHierarchicalCodelist(sdmxJson, hierarchyId) {
|
|
15
25
|
var hCodelist = R.pathOr({}, ['data', 'hierarchicalCodelists', 0], sdmxJson);
|
|
16
26
|
var hierarchy = R.find(R.propEq('id', hierarchyId), hCodelist.hierarchies || []);
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
var
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
var getParentedCodes = function getParentedCodes(codes, parent) {
|
|
29
|
+
var ids = R.pluck('codeID', codes);
|
|
30
|
+
|
|
31
|
+
var siblings = R.reduce(function (acc, code) {
|
|
32
|
+
if (R.isEmpty(code.hierarchicalCodes || [])) {
|
|
33
|
+
return acc;
|
|
34
|
+
}
|
|
35
|
+
return R.mergeRight(acc, getParentedCodes(code.hierarchicalCodes, code.id));
|
|
36
|
+
}, {}, codes);
|
|
37
|
+
|
|
38
|
+
return (0, _extends5.default)({}, siblings, (0, _defineProperty3.default)({}, parent, ids));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var getChildren = function getChildren(codes, parents) {
|
|
42
|
+
var ids = R.pluck('codeID', codes);
|
|
43
|
+
|
|
44
|
+
var children = R.reduce(function (acc, code) {
|
|
45
|
+
if (R.isEmpty(code.hierarchicalCodes || [])) {
|
|
46
|
+
return acc;
|
|
47
|
+
}
|
|
48
|
+
return (0, _extends5.default)({}, acc, getChildren(code.hierarchicalCodes, R.append(code.codeID, parents)));
|
|
49
|
+
}, {}, codes);
|
|
50
|
+
var key = R.isEmpty(parents) ? '#ROOT' : R.join('.', parents);
|
|
51
|
+
return (0, _extends5.default)({}, children, (0, _defineProperty3.default)({}, key, ids));
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
return R.pipe(R.propOr([], 'hierarchicalCodes'), function (codes) {
|
|
55
|
+
return getChildren(codes, []);
|
|
56
|
+
})(hierarchy);
|
|
22
57
|
};
|
package/package.json
CHANGED
|
@@ -24,9 +24,9 @@ import {
|
|
|
24
24
|
getObservationsAdvancedAttributes,
|
|
25
25
|
getSeriesAdvancedAttributes
|
|
26
26
|
} from '../../../../rules2/src/getAdvancedAttributes';
|
|
27
|
-
import { getDimensionsSimpleHierarchies } from '../../../../rules2/src/getDimensionsSimpleHierarchies';
|
|
28
27
|
import { duplicateObservations } from '../../../../rules2/src/duplicateObservations';
|
|
29
|
-
import {
|
|
28
|
+
import { hierarchiseDimensionWithAdvancedHierarchy } from '../../../../rules2/src/hierarchiseDimensionWithAdvancedHierarchy';
|
|
29
|
+
import { hierarchiseDimensionWithNativeHierarchy } from '../../../../rules2/src/hierarchiseDimensionWithNativeHierarchy';
|
|
30
30
|
import { getDimensionValuesIndexes } from '../../../../rules2/src/getDimensionValuesIndexes';
|
|
31
31
|
|
|
32
32
|
export const prepareData = (sdmxJson, customAttributes, unitsProps={}, _options={}) => {
|
|
@@ -41,8 +41,7 @@ export const prepareData = (sdmxJson, customAttributes, unitsProps={}, _options=
|
|
|
41
41
|
const _customAttributes = R.assoc('units', unitsDefinitionCodes, customAttributes);
|
|
42
42
|
const dimensions = R.pathOr([], ['data', 'structure', 'dimensions', 'observation'], sdmxJson);
|
|
43
43
|
|
|
44
|
-
const
|
|
45
|
-
const hierarchies = R.mergeRight(simpleHierarchies, _options.hierarchies || {});
|
|
44
|
+
const hierarchies = _options.hierarchies || {};
|
|
46
45
|
const dimensionsIndexedByIds = R.indexBy(R.prop('id'), dimensions);
|
|
47
46
|
|
|
48
47
|
const parsedDimensionsIds = parseDimensionsIds(dimensions);
|
|
@@ -166,9 +165,13 @@ export const prepareData = (sdmxJson, customAttributes, unitsProps={}, _options=
|
|
|
166
165
|
seriesAdvancedAttributesIds
|
|
167
166
|
);
|
|
168
167
|
|
|
169
|
-
const hierarchisedDimensions = R.map(
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
const hierarchisedDimensions = R.map(dim => {
|
|
169
|
+
if (R.isEmpty(R.propOr({}, dim.id, hierarchies))) {
|
|
170
|
+
return hierarchiseDimensionWithNativeHierarchy(dim);
|
|
171
|
+
}
|
|
172
|
+
return hierarchiseDimensionWithAdvancedHierarchy(dim, R.prop(dim.id, hierarchies));
|
|
173
|
+
})(manyValuesDimensions);
|
|
174
|
+
|
|
172
175
|
const valuesIndexes = R.reduce(
|
|
173
176
|
(acc, dim) => ({ ...acc, [dim.__index]: getDimensionValuesIndexes(dim.values) }),
|
|
174
177
|
{},
|
|
@@ -5,7 +5,7 @@ export const getHCodelistsRefs = annotations => R.reduce(
|
|
|
5
5
|
if (annotation.type !== 'HIER_CONTEXT') {
|
|
6
6
|
return acc;
|
|
7
7
|
}
|
|
8
|
-
const reference = annotation.text || '';
|
|
8
|
+
const reference = annotation.text || annotation.title || '';
|
|
9
9
|
const match = reference.match(/([\w@_.]+):([\w@_.]+):([\w@_.]+)\(([\d.]+)\).([\w@_.]+)$/);
|
|
10
10
|
if (R.isNil(match)) {
|
|
11
11
|
return acc;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
|
|
3
|
+
export const hierarchiseDimensionWithAdvancedHierarchy = (dimension, hierarchy) => {
|
|
4
|
+
const indexed = R.indexBy(R.prop('id'), dimension.values);
|
|
5
|
+
|
|
6
|
+
let rest = indexed;
|
|
7
|
+
const getChildren = (parents) => R.pipe(
|
|
8
|
+
ids => {
|
|
9
|
+
rest = R.omit(ids, rest);
|
|
10
|
+
return R.props(ids, indexed)
|
|
11
|
+
},
|
|
12
|
+
R.filter(R.identity),
|
|
13
|
+
R.map(
|
|
14
|
+
(val) => {
|
|
15
|
+
const _val = {
|
|
16
|
+
...val,
|
|
17
|
+
parent: R.last(parents),
|
|
18
|
+
parents
|
|
19
|
+
};
|
|
20
|
+
const children = getChildren(R.append(val.id, parents));
|
|
21
|
+
return R.prepend(_val, children);
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
)(R.propOr([], R.isEmpty(parents) ? '#ROOT' : R.join('.', parents), hierarchy));
|
|
25
|
+
|
|
26
|
+
return R.set(
|
|
27
|
+
R.lensProp('values'),
|
|
28
|
+
R.pipe(
|
|
29
|
+
getChildren,
|
|
30
|
+
R.flatten,
|
|
31
|
+
values => {
|
|
32
|
+
if (R.isEmpty(rest)) {
|
|
33
|
+
return values;
|
|
34
|
+
}
|
|
35
|
+
const sortedRest = R.pipe(
|
|
36
|
+
R.values,
|
|
37
|
+
R.map(val => ({ ...val, parent: undefined, parents: [] })),
|
|
38
|
+
R.sortBy(R.prop('__indexPosition'))
|
|
39
|
+
)(rest);
|
|
40
|
+
return R.concat(sortedRest, values);
|
|
41
|
+
}
|
|
42
|
+
)([])
|
|
43
|
+
)(dimension);
|
|
44
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as R from 'ramda';
|
|
2
|
+
|
|
3
|
+
export const hierarchiseDimensionWithNativeHierarchy = (dimension) => {
|
|
4
|
+
const values = R.sortBy(R.prop('__indexPosition'), dimension.values || []);
|
|
5
|
+
const grouped = R.groupBy(R.propOr('#ROOT', 'parent'), values);
|
|
6
|
+
|
|
7
|
+
const getChildren = (parents) => {
|
|
8
|
+
const childs = R.propOr([], R.last(parents) || '#ROOT', grouped);
|
|
9
|
+
return R.reduce(
|
|
10
|
+
(acc, child) => {
|
|
11
|
+
const refined = R.assoc('parents', parents, child);
|
|
12
|
+
const children = getChildren(R.append(child.id, parents));
|
|
13
|
+
return R.concat(acc, R.prepend(refined, children));
|
|
14
|
+
},
|
|
15
|
+
[],
|
|
16
|
+
childs
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return R.set(
|
|
21
|
+
R.lensProp('values'),
|
|
22
|
+
getChildren([])
|
|
23
|
+
)(dimension);
|
|
24
|
+
};
|
|
@@ -4,11 +4,45 @@ export const parseHierarchicalCodelist = (sdmxJson, hierarchyId) => {
|
|
|
4
4
|
const hCodelist = R.pathOr({}, ['data', 'hierarchicalCodelists', 0], sdmxJson);
|
|
5
5
|
const hierarchy = R.find(R.propEq('id', hierarchyId), hCodelist.hierarchies || []);
|
|
6
6
|
|
|
7
|
+
const getParentedCodes = (codes, parent) => {
|
|
8
|
+
const ids = R.pluck('codeID', codes);
|
|
9
|
+
|
|
10
|
+
const siblings = R.reduce(
|
|
11
|
+
(acc, code) => {
|
|
12
|
+
if (R.isEmpty(code.hierarchicalCodes || [])) {
|
|
13
|
+
return acc;
|
|
14
|
+
}
|
|
15
|
+
return R.mergeRight(acc, getParentedCodes(code.hierarchicalCodes, code.id));
|
|
16
|
+
},
|
|
17
|
+
{},
|
|
18
|
+
codes
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
return ({ ...siblings, [parent]: ids });
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const getChildren = (codes, parents) => {
|
|
25
|
+
const ids = R.pluck('codeID', codes);
|
|
26
|
+
|
|
27
|
+
const children = R.reduce(
|
|
28
|
+
(acc, code) => {
|
|
29
|
+
if (R.isEmpty(code.hierarchicalCodes || [])) {
|
|
30
|
+
return acc;
|
|
31
|
+
}
|
|
32
|
+
return ({
|
|
33
|
+
...acc,
|
|
34
|
+
...getChildren(code.hierarchicalCodes, R.append(code.codeID, parents))
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
{},
|
|
38
|
+
codes
|
|
39
|
+
);
|
|
40
|
+
const key = R.isEmpty(parents) ? '#ROOT' : R.join('.', parents);
|
|
41
|
+
return ({ ...children, [key]: ids });
|
|
42
|
+
}
|
|
43
|
+
|
|
7
44
|
return R.pipe(
|
|
8
45
|
R.propOr([], 'hierarchicalCodes'),
|
|
9
|
-
|
|
10
|
-
const children = R.pluck('id', parentCode.hierarchicalCodes || []);
|
|
11
|
-
return R.assoc(parentCode.id, children, acc);
|
|
12
|
-
}, {}),
|
|
46
|
+
codes => getChildren(codes, []),
|
|
13
47
|
)(hierarchy);
|
|
14
48
|
};
|
|
@@ -2,11 +2,11 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { getHCodelistsRefs } from '../src/rules2/src';
|
|
3
3
|
|
|
4
4
|
describe('getHCodelistsRefs tests', () => {
|
|
5
|
-
it('
|
|
5
|
+
it('complete case', () => {
|
|
6
6
|
const annotations = [
|
|
7
7
|
{ type: 'test' },
|
|
8
8
|
{ type: 'HIER_CONTEXT', text: 'C1:A:HCL1(1.0).HIER1' },
|
|
9
|
-
{ type: 'HIER_CONTEXT',
|
|
9
|
+
{ type: 'HIER_CONTEXT', title: 'C2:A:HCL2(1.0).HIER1' },
|
|
10
10
|
{ type: 'HIER_CONTEXT', text: 'C1:A:HCL1(1.0).HIER2' },
|
|
11
11
|
];
|
|
12
12
|
|
package/test/{hierarchiseDimension.test.js → hierarchiseDimensionWithAdvancedHierarchy.test.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { expect } from 'chai';
|
|
2
|
-
import {
|
|
2
|
+
import { hierarchiseDimensionWithAdvancedHierarchy } from '../src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy';
|
|
3
3
|
|
|
4
|
-
describe('
|
|
4
|
+
describe('hierarchiseDimensionWithAdvancedHierarchy tests', () => {
|
|
5
5
|
it('basic test', () => {
|
|
6
6
|
const dimension = {
|
|
7
7
|
id: 'test',
|
|
@@ -12,12 +12,12 @@ describe('hierarchiseDimension tests', () => {
|
|
|
12
12
|
{ id: 'USA' },
|
|
13
13
|
{ id: 'A' },
|
|
14
14
|
{ id: 'EA' },
|
|
15
|
-
{ id: 'CHI' },
|
|
16
15
|
{ id: 'MEX' },
|
|
17
16
|
]
|
|
18
17
|
};
|
|
19
18
|
|
|
20
19
|
const hierarchy = {
|
|
20
|
+
'#ROOT': ['OECD', 'A', 'EA'],
|
|
21
21
|
OECD: ['GER', 'FRA', 'USA'],
|
|
22
22
|
A: ['USA', 'MEX'],
|
|
23
23
|
EA: ['FRA', 'GER']
|
|
@@ -36,20 +36,20 @@ describe('hierarchiseDimension tests', () => {
|
|
|
36
36
|
{ id: 'EA', parent: undefined, parents: [] },
|
|
37
37
|
{ id: 'FRA', parent: 'EA', parents: ['EA'] },
|
|
38
38
|
{ id: 'GER', parent: 'EA', parents: ['EA'] },
|
|
39
|
-
{ id: 'CHI', parent: undefined, parents: [] },
|
|
40
39
|
]
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
expect(
|
|
42
|
+
expect(hierarchiseDimensionWithAdvancedHierarchy(dimension, hierarchy)).to.deep.equal(hierarchised);
|
|
44
43
|
});
|
|
45
44
|
it('missing ids defined in the hierarchy', () => {
|
|
46
45
|
const hierarchy = {
|
|
46
|
+
'#ROOT': ['W'],
|
|
47
47
|
W: ['EA', 'A'],
|
|
48
|
-
A: ['NA', 'SA'],
|
|
49
|
-
NA: ['USA', 'CAN'],
|
|
50
|
-
SA: ['BRA'],
|
|
51
|
-
EA: ['FRA', 'GER'],
|
|
52
|
-
FRA: ['IDF', 'BRE', 'ALS']
|
|
48
|
+
'W.A': ['NA', 'SA'],
|
|
49
|
+
'W.A.NA': ['USA', 'CAN'],
|
|
50
|
+
'W.A.SA': ['BRA'],
|
|
51
|
+
'W.EA': ['FRA', 'GER'],
|
|
52
|
+
'W.EA.FRA': ['IDF', 'BRE', 'ALS']
|
|
53
53
|
};
|
|
54
54
|
|
|
55
55
|
const dimension = {
|
|
@@ -82,6 +82,6 @@ describe('hierarchiseDimension tests', () => {
|
|
|
82
82
|
]
|
|
83
83
|
};
|
|
84
84
|
|
|
85
|
-
expect(
|
|
85
|
+
expect(hierarchiseDimensionWithAdvancedHierarchy(dimension, hierarchy)).to.deep.equal(hierarchised);
|
|
86
86
|
});
|
|
87
87
|
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import { hierarchiseDimensionWithNativeHierarchy } from '../src/rules2/src/hierarchiseDimensionWithNativeHierarchy';
|
|
3
|
+
|
|
4
|
+
describe('hierarchiseDimensionWithNativeHierarchy tests', () => {
|
|
5
|
+
it('basic test', () => {
|
|
6
|
+
const dimension = {
|
|
7
|
+
id: 'test',
|
|
8
|
+
values: [
|
|
9
|
+
{ id: 'FRA', parent: 'EA', __indexPosition: 101 },
|
|
10
|
+
{ id: 'GER', parent: 'EA', __indexPosition: 100 },
|
|
11
|
+
{ id: 'EA', parent: 'W', __indexPosition: 30 },
|
|
12
|
+
{ id: 'A', parent: 'W', __indexPosition: 20 },
|
|
13
|
+
{ id: 'W', parent: undefined, __indexPosition: 5 },
|
|
14
|
+
{ id: 'CHI', parent: undefined, __indexPosition: 0 }
|
|
15
|
+
]
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const expected = {
|
|
19
|
+
id: 'test',
|
|
20
|
+
values: [
|
|
21
|
+
{ id: 'CHI', parent: undefined, parents: [], __indexPosition: 0 },
|
|
22
|
+
{ id: 'W', parent: undefined, parents: [], __indexPosition: 5 },
|
|
23
|
+
{ id: 'A', parent: 'W', parents: ['W'], __indexPosition: 20 },
|
|
24
|
+
{ id: 'EA', parent: 'W', parents: ['W'], __indexPosition: 30 },
|
|
25
|
+
{ id: 'GER', parent: 'EA', parents: ['W', 'EA'], __indexPosition: 100 },
|
|
26
|
+
{ id: 'FRA', parent: 'EA', parents: ['W', 'EA'], __indexPosition: 101 }
|
|
27
|
+
]
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
expect(hierarchiseDimensionWithNativeHierarchy(dimension)).to.deep.equal(expected);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -5,6 +5,7 @@ import hierarchicalCodelist from './mocks/h-codelist.json';
|
|
|
5
5
|
describe('parseHierarchicalCodelist tests', () => {
|
|
6
6
|
it('simple case', () => {
|
|
7
7
|
const expected = {
|
|
8
|
+
'#ROOT': ['W', 'A', 'A2', 'OECD', 'EA00'],
|
|
8
9
|
W: ['A', 'E', 'F', 'O', 'S', 'W_X'],
|
|
9
10
|
A: ['A2', 'A3', 'A4', 'A5', 'A7', 'A8', 'A8_M', 'A9', 'A_X', 'A_O'],
|
|
10
11
|
A2: ['BMU', 'CAN', 'GRL', 'SPM', 'USA'],
|
|
@@ -73,4 +74,67 @@ describe('parseHierarchicalCodelist tests', () => {
|
|
|
73
74
|
|
|
74
75
|
expect(parseHierarchicalCodelist(hierarchicalCodelist, 'CONT_EN')).to.deep.equal(expected);
|
|
75
76
|
});
|
|
77
|
+
it('deep hierarchies case', () => {
|
|
78
|
+
const hCodelist = {
|
|
79
|
+
data: {
|
|
80
|
+
hierarchicalCodelists: [{
|
|
81
|
+
hierarchies: [{
|
|
82
|
+
id: 'HIER',
|
|
83
|
+
hierarchicalCodes: [
|
|
84
|
+
{
|
|
85
|
+
codeID: 'OECD',
|
|
86
|
+
hierarchicalCodes: [
|
|
87
|
+
{
|
|
88
|
+
codeID: 'GER',
|
|
89
|
+
hierarchicalCodes: [
|
|
90
|
+
{ codeID: 'BAV' }
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
codeID: 'FRA',
|
|
95
|
+
hierarchicalCodes: [
|
|
96
|
+
{ codeID: 'BZH' },
|
|
97
|
+
{ codeID: 'IDF' }
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
codeID: 'EA',
|
|
104
|
+
hierarchicalCodes: [
|
|
105
|
+
{
|
|
106
|
+
codeID: 'FRA',
|
|
107
|
+
hierarchicalCodes: [
|
|
108
|
+
{ codeID: 'IDF' },
|
|
109
|
+
{ codeID: 'ALS' },
|
|
110
|
+
{ codeID: 'BZH' },
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
codeID: 'GER',
|
|
115
|
+
hierarchicalCodes: [
|
|
116
|
+
{ codeID: 'BAV' },
|
|
117
|
+
{ codeID: 'RHN' }
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}]
|
|
124
|
+
}]
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const expected = {
|
|
129
|
+
'#ROOT': ['OECD', 'EA'],
|
|
130
|
+
'OECD': ['GER', 'FRA'],
|
|
131
|
+
'OECD.GER': ['BAV'],
|
|
132
|
+
'OECD.FRA': ['BZH', 'IDF'],
|
|
133
|
+
'EA': ['FRA', 'GER'],
|
|
134
|
+
'EA.FRA': ['IDF', 'ALS', 'BZH'],
|
|
135
|
+
'EA.GER': ['BAV', 'RHN']
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
expect(parseHierarchicalCodelist(hCodelist, 'HIER')).to.deep.equal(expected);
|
|
139
|
+
});
|
|
76
140
|
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getDimensionsSimpleHierarchies = undefined;
|
|
7
|
-
|
|
8
|
-
var _ramda = require('ramda');
|
|
9
|
-
|
|
10
|
-
var R = _interopRequireWildcard(_ramda);
|
|
11
|
-
|
|
12
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
13
|
-
|
|
14
|
-
var getDimensionSimpleHierarchy = function getDimensionSimpleHierarchy(_ref) {
|
|
15
|
-
var values = _ref.values;
|
|
16
|
-
|
|
17
|
-
var indexed = R.indexBy(R.prop('id'), values);
|
|
18
|
-
return R.pipe(R.reduce(function (acc, value) {
|
|
19
|
-
var id = value.id,
|
|
20
|
-
parent = value.parent;
|
|
21
|
-
|
|
22
|
-
var _parent = R.isNil(parent) || !R.has(parent, indexed) ? '#ROOT' : parent;
|
|
23
|
-
return R.over(R.lensProp(_parent), function (ids) {
|
|
24
|
-
return R.isNil(ids) ? [id] : R.append(id, ids);
|
|
25
|
-
})(acc);
|
|
26
|
-
}, {}), R.map(R.sortBy(function (id) {
|
|
27
|
-
return R.pathOr(-1, [id, '__indexPosition'], indexed);
|
|
28
|
-
})))(values);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
var getDimensionsSimpleHierarchies = exports.getDimensionsSimpleHierarchies = function getDimensionsSimpleHierarchies(dimensions) {
|
|
32
|
-
return R.reduce(function (acc, dim) {
|
|
33
|
-
var id = dim.id,
|
|
34
|
-
values = dim.values;
|
|
35
|
-
|
|
36
|
-
if (R.length(values) < 2) {
|
|
37
|
-
return acc;
|
|
38
|
-
}
|
|
39
|
-
var hierarchy = getDimensionSimpleHierarchy(dim);
|
|
40
|
-
return R.assoc(id, hierarchy, acc);
|
|
41
|
-
}, {}, dimensions);
|
|
42
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as R from 'ramda';
|
|
2
|
-
|
|
3
|
-
const getDimensionSimpleHierarchy = ({ values }) => {
|
|
4
|
-
const indexed = R.indexBy(R.prop('id'), values);
|
|
5
|
-
return R.pipe(
|
|
6
|
-
R.reduce(
|
|
7
|
-
(acc, value) => {
|
|
8
|
-
const { id, parent } = value;
|
|
9
|
-
const _parent = R.isNil(parent) || !R.has(parent, indexed)
|
|
10
|
-
? '#ROOT'
|
|
11
|
-
: parent;
|
|
12
|
-
return R.over(
|
|
13
|
-
R.lensProp(_parent),
|
|
14
|
-
ids => R.isNil(ids) ? [id] : R.append(id, ids)
|
|
15
|
-
)(acc);
|
|
16
|
-
},
|
|
17
|
-
{}
|
|
18
|
-
),
|
|
19
|
-
R.map(R.sortBy(id => R.pathOr(-1, [id, '__indexPosition'], indexed)))
|
|
20
|
-
)(values);
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const getDimensionsSimpleHierarchies = (dimensions) => R.reduce(
|
|
24
|
-
(acc, dim) => {
|
|
25
|
-
const { id, values } = dim;
|
|
26
|
-
if (R.length(values) < 2) {
|
|
27
|
-
return acc;
|
|
28
|
-
}
|
|
29
|
-
const hierarchy = getDimensionSimpleHierarchy(dim);
|
|
30
|
-
return R.assoc(id, hierarchy, acc);
|
|
31
|
-
},
|
|
32
|
-
{},
|
|
33
|
-
dimensions
|
|
34
|
-
);
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import * as R from 'ramda';
|
|
2
|
-
|
|
3
|
-
export const hierarchiseDimension = (dimension, hierarchy) => {
|
|
4
|
-
const indexed = R.indexBy(R.prop('id'), dimension.values);
|
|
5
|
-
let _hierarchy = hierarchy;
|
|
6
|
-
if (!R.has('#ROOT', hierarchy)) {
|
|
7
|
-
const indexes = R.pluck('id', dimension.values);
|
|
8
|
-
const refinedHierarchy = R.pick(indexes, _hierarchy);
|
|
9
|
-
const childrenIds = R.pipe(R.values, R.unnest, R.indexBy(R.identity))(refinedHierarchy);
|
|
10
|
-
const rootIds = R.pipe(
|
|
11
|
-
R.reject(val => R.has(val.id, childrenIds)),
|
|
12
|
-
R.sortBy(R.prop('__indexPosition')),
|
|
13
|
-
R.pluck('id')
|
|
14
|
-
)(dimension.values);
|
|
15
|
-
_hierarchy = R.assoc('#ROOT', rootIds, hierarchy);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const getChildren = (parents) => R.pipe(
|
|
19
|
-
ids => R.props(ids, indexed),
|
|
20
|
-
R.filter(R.identity),
|
|
21
|
-
R.map(
|
|
22
|
-
(val) => {
|
|
23
|
-
const _val = {
|
|
24
|
-
...val,
|
|
25
|
-
parent: R.last(parents),
|
|
26
|
-
parents
|
|
27
|
-
};
|
|
28
|
-
const children = getChildren(R.append(val.id, parents));
|
|
29
|
-
return R.prepend(_val, children);
|
|
30
|
-
},
|
|
31
|
-
)
|
|
32
|
-
)(R.propOr([], R.last(parents) || '#ROOT', _hierarchy));
|
|
33
|
-
|
|
34
|
-
return R.set(
|
|
35
|
-
R.lensProp('values'),
|
|
36
|
-
R.flatten(getChildren([]))
|
|
37
|
-
)(dimension);
|
|
38
|
-
};
|