@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.
@@ -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 _hierarchiseDimension = require('../../../../rules2/src/hierarchiseDimension');
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 simpleHierarchies = (0, _getDimensionsSimpleHierarchies.getDimensionsSimpleHierarchies)(dimensions);
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
- return (0, _hierarchiseDimension.hierarchiseDimension)(dim, R.propOr({}, dim.id, hierarchies));
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;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.hierarchiseDimension = undefined;
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 hierarchiseDimension = exports.hierarchiseDimension = function hierarchiseDimension(dimension, hierarchy) {
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.last(parents) || '#ROOT', _hierarchy));
35
+ }))(R.propOr([], R.isEmpty(parents) ? '#ROOT' : R.join('.', parents), hierarchy));
44
36
  };
45
37
 
46
- return R.set(R.lensProp('values'), R.flatten(getChildren([])))(dimension);
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
- return R.pipe(R.propOr([], 'hierarchicalCodes'), R.reduce(function (acc, parentCode) {
19
- var children = R.pluck('id', parentCode.hierarchicalCodes || []);
20
- return R.assoc(parentCode.id, children, acc);
21
- }, {}))(hierarchy);
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sis-cc/dotstatsuite-components",
3
3
  "description": "Set components based on React.",
4
- "version": "14.1.1",
4
+ "version": "14.2.0",
5
5
  "main": "lib/index.js",
6
6
  "author": "OECD",
7
7
  "license": "MIT",
@@ -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 { hierarchiseDimension } from '../../../../rules2/src/hierarchiseDimension';
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 simpleHierarchies = getDimensionsSimpleHierarchies(dimensions);
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
- dim => hierarchiseDimension(dim, R.propOr({}, dim.id, hierarchies))
171
- )(manyValuesDimensions);
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
- R.reduce((acc, parentCode) => {
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('basic case', () => {
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', text: 'C2:A:HCL2(1.0).HIER1' },
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
 
@@ -1,7 +1,7 @@
1
1
  import { expect } from 'chai';
2
- import { hierarchiseDimension } from '../src/rules2/src/hierarchiseDimension';
2
+ import { hierarchiseDimensionWithAdvancedHierarchy } from '../src/rules2/src/hierarchiseDimensionWithAdvancedHierarchy';
3
3
 
4
- describe('hierarchiseDimension tests', () => {
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(hierarchiseDimension(dimension, hierarchy)).to.deep.equal(hierarchised);
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(hierarchiseDimension(dimension, hierarchy)).to.deep.equal(hierarchised);
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
- };