Skip to content

Commit e858f99

Browse files
authored
Merge pull request #15 from daniel-fernandez-edosoft/master
Fix URL and datetime issues
2 parents c2f4700 + 6ffa669 commit e858f99

File tree

3 files changed

+203
-6
lines changed

3 files changed

+203
-6
lines changed

src/DataHelper.js

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,85 @@ function DataHelper(services) {
6363

6464
return processedRows;
6565
}
66+
67+
const _processQuerystring = function(url) {
68+
const urlQuerystring = url.indexOf('?') > 0 ? url.substring(url.indexOf('?')) : '';
69+
let urlQuerystringVarMap = new Map();
70+
71+
if(urlQuerystring && urlQuerystring.length > 1) {
72+
const urlQuerystringVars = urlQuerystring.substring(1).split("&");
73+
for(let urlQuerystringVar of urlQuerystringVars) {
74+
const urlQuerystringVarValueIndex = urlQuerystringVar.indexOf("=");
75+
const urlQuerystringVarKeyRaw = urlQuerystringVar.substring(0, urlQuerystringVarValueIndex >= 0 ? urlQuerystringVarValueIndex : urlQuerystringVar.length);
76+
const urlQuerystringVarValueRaw = urlQuerystringVarValueIndex >= 0 ? urlQuerystringVar.substring(urlQuerystringVarValueIndex+1) : '';
77+
let urlQuerystringVarKey = "";
78+
let urlQuerystringVarValue = "";
79+
try {
80+
urlQuerystringVarKey = decodeURIComponent(urlQuerystringVarKeyRaw);
81+
} catch(e) {
82+
urlQuerystringVarKey = urlQuerystringVarKeyRaw;
83+
}
84+
try {
85+
urlQuerystringVarValue = decodeURIComponent(urlQuerystringVarValueRaw);
86+
} catch(e) {
87+
urlQuerystringVarValue = urlQuerystringVarValueRaw;
88+
}
89+
urlQuerystringVarMap.set(urlQuerystringVarKey, urlQuerystringVarValue);
90+
}
91+
}
92+
93+
let dimFiltersRaw = [];
94+
let dimFiltersFixed = [];
95+
96+
if(urlQuerystringVarMap.has("dim")) {
97+
const dim = urlQuerystringVarMap.get("dim");
98+
const dimFilters = dim.split(",");
99+
dimFiltersRaw.push.apply(dimFiltersRaw, dimFilters);
100+
urlQuerystringVarMap.delete("dim");
101+
}
102+
103+
if(urlQuerystringVarMap.has("representation")) {
104+
const dim = urlQuerystringVarMap.get("representation");
105+
const dimFilters = dim.split(",");
106+
dimFiltersRaw.push.apply(dimFiltersRaw, dimFilters);
107+
urlQuerystringVarMap.delete("representation");
108+
}
109+
110+
if(dimFiltersRaw.length > 0) {
111+
for(let dimFilter of dimFiltersRaw) {
112+
if(dimFilter.indexOf(":") >= 0) {
113+
const dimName = dimFilter.substring(0, dimFilter.indexOf(":"));
114+
const dimValue = dimFilter.substring(dimFilter.indexOf(":")+1);
115+
dimFiltersFixed.push(dimName + "[" + dimValue + "]");
116+
} else {
117+
dimFiltersFixed.push(dimFilter);
118+
}
119+
}
120+
}
121+
122+
const dimFiltersString = dimFiltersFixed.map(i => encodeURIComponent(i)).join(",");
123+
124+
let querystringFixed = [];
125+
126+
if(dimFiltersString) {
127+
urlQuerystringVarMap.forEach((value, key) => querystringFixed.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)));
128+
querystringFixed.push("representation=" + dimFiltersString);
129+
querystringFixed = "?" + querystringFixed.join("&");
130+
} else {
131+
querystringFixed = urlQuerystring;
132+
}
133+
134+
return querystringFixed;
135+
}
136+
137+
const _getUrlData = function(childLinkHref, querystringFixed) {
138+
return (querystringFixed && querystringFixed.length > 1) ?
139+
(childLinkHref.indexOf('?') > 0 ?
140+
(childLinkHref + '&' + querystringFixed.substring(1)) :
141+
(childLinkHref + querystringFixed)
142+
) :
143+
childLinkHref;
144+
}
66145

67146
this._processData = function(configParams, requestedFields) {
68147
//const requestedFieldsArray = requestedFields.asArray().map(i => i.getId());
@@ -71,7 +150,9 @@ function DataHelper(services) {
71150
const url = utils.getUrl(configParams);
72151
const indicatorsResponse = cacheHelper.fetchJsonUrl(url);
73152

74-
const urlData = indicatorsResponse.childLink.href;
153+
const querystringFixed = _processQuerystring(url);
154+
155+
const urlData = _getUrlData(indicatorsResponse.childLink.href, querystringFixed);
75156
//const urlData = url + "/data";
76157

77158
const indicatorsDataResponse = cacheHelper.fetchJsonUrl(urlData);

src/RecodeDatesHelper.js

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@ function RecodeDatesHelper() {
3030
const GPE_DAILY_PATTERN = GROUP_LEFT + GPE_YEAR_PATTERN + GROUP_RIGHT + "\\-?" + GROUP_LEFT + GPE_MONTH_PATTERN + GROUP_RIGHT + GROUP_LEFT
3131
+ "0[1-9]|[1-2][0-9]|3[0-1]" + GROUP_RIGHT;
3232

33+
const GPE_REPORTING_TIME_PERIOD_TYPE =
34+
GROUP_LEFT + GPE_YEARLY_PATTERN + GROUP_RIGHT + "|" +
35+
GROUP_LEFT + GPE_BIYEARLY_PATTERN + GROUP_RIGHT + "|" +
36+
GROUP_LEFT + GPE_QUARTERLY_PATTERN + GROUP_RIGHT + "|" +
37+
GROUP_LEFT + GPE_MONTH_PATTERN + GROUP_RIGHT + "|" +
38+
GROUP_LEFT + GPE_MONTHLY_PATTERN + GROUP_RIGHT + "|" +
39+
GROUP_LEFT + GPE_WEEKLY_PATTERN + GROUP_RIGHT + "|" +
40+
GROUP_LEFT + GPE_DAILY_PATTERN + GROUP_RIGHT;
41+
42+
const GPE_REPORTING_TIME_PERIOD = START + GPE_REPORTING_TIME_PERIOD_TYPE + END;
43+
const GPE_REPORTING_YEARLY_TYPE = START + GPE_YEARLY_PATTERN + END;
44+
const GPE_REPORTING_BIYEARLY_TYPE = START + GPE_BIYEARLY_PATTERN + END;
45+
const GPE_REPORTING_QUARTERLY_TYPE = START + GPE_QUARTERLY_PATTERN + END;
46+
const GPE_REPORTING_MONTH_TYPE = START + GPE_MONTH_PATTERN + END;
47+
const GPE_REPORTING_MONTHLY_TYPE = START + GPE_MONTHLY_PATTERN + END;
48+
const GPE_REPORTING_WEEKLY_TYPE = START + GPE_WEEKLY_PATTERN + END;
49+
const GPE_REPORTING_DAILY_TYPE = START + GPE_DAILY_PATTERN + END;
50+
3351
// SDMX
3452
const REPORTING_YEAR_PERIOD_INDICATOR = "A";
3553
const REPORTING_SEMESTER_PERIOD_INDICATOR = "S";
@@ -85,6 +103,10 @@ function RecodeDatesHelper() {
85103
return time.match(new RegExp(PATTERN_REPORTING_TIME_PERIOD));
86104
}
87105

106+
const _isGpeReportingTimePeriod = function (time) {
107+
return time.match(new RegExp(GPE_REPORTING_TIME_PERIOD_TYPE));
108+
}
109+
88110
const _isDateTime = function (time) {
89111
return time.match(new RegExp(PATTERN_DATE_TIME));
90112
}
@@ -184,6 +206,80 @@ function RecodeDatesHelper() {
184206
return "";
185207
}
186208

209+
const _calculateGpeReportingPeriod = function (time) {
210+
if (time.match(new RegExp(START + GPE_YEARLY_PATTERN + END))) {
211+
//return date + "0101";
212+
return time;
213+
}
214+
if (time.match(new RegExp(START + GPE_BIYEARLY_PATTERN + END))) {
215+
const year = time.match(new RegExp(START + GPE_BIYEARLY_PATTERN + END))[1];
216+
const month = (time.match(new RegExp(START + GPE_BIYEARLY_PATTERN + END))[2] - 1) * 6;
217+
//return year + strPad("" + (month + 1), 2, "0") + "01";
218+
return year + strPad("" + (month + 1), 2, "0");
219+
}
220+
if (time.match(new RegExp(START + GPE_QUARTERLY_PATTERN + END))) {
221+
const year = time.match(new RegExp(START + GPE_QUARTERLY_PATTERN + END))[1];
222+
// const month = (date.match(new RegExp(START + GPE_QUARTERLY_PATTERN + END))[2] - 1) * 3;
223+
// return year + strPad("" + (month + 1), 2, "0") + "01";
224+
const quarter = time.match(new RegExp(START + GPE_QUARTERLY_PATTERN + END))[2];
225+
return year + quarter;
226+
}
227+
if (time.match(new RegExp(START + GPE_MONTHLY_PATTERN + END))) {
228+
const year = time.match(new RegExp(START + GPE_MONTHLY_PATTERN + END))[1];
229+
const month = parseInt(time.match(new RegExp(START + GPE_MONTHLY_PATTERN + END))[2]);
230+
//return year + strPad("" + (month), 2, "0") + "01";
231+
return year + strPad("" + month, 2, "0");
232+
}
233+
if (time.match(new RegExp(START + GPE_MONTHLY_PATTERN_WITHOUT_CHARACTER + END))) {
234+
const year = time.match(new RegExp(START + GPE_MONTHLY_PATTERN_WITHOUT_CHARACTER + END))[1];
235+
const month = parseInt(time.match(new RegExp(START + GPE_MONTHLY_PATTERN_WITHOUT_CHARACTER + END))[2]);
236+
//return year + strPad("" + (month), 2, "0") + "01";
237+
return year + strPad("" + month, 2, "0");
238+
}
239+
if (time.match(new RegExp(START + GPE_WEEKLY_PATTERN + END))) {
240+
// const year = date.match(new RegExp(START + GPE_WEEKLY_PATTERN + END))[1];
241+
// const day =
242+
// (date.match(new RegExp(START + GPE_WEEKLY_PATTERN + END))[2] - 1) * 7;
243+
// date = new Date(year, "", day + 1);
244+
// return year + strPad("" + (date.getMonth()), 2, "0") + date.getDate();
245+
const year = time.match(new RegExp(START + GPE_WEEKLY_PATTERN + END))[1];
246+
const week = parseInt(time.match(new RegExp(START + GPE_WEEKLY_PATTERN + END))[2]);
247+
return year + strPad("" + week, 2, "0");
248+
}
249+
if (time.match(new RegExp(START + GPE_DAILY_PATTERN + END))) {
250+
const year = time.match(new RegExp(START + GPE_DAILY_PATTERN + END))[1];
251+
const month = time.match(new RegExp(START + GPE_DAILY_PATTERN + END))[2];
252+
const day = time.match(new RegExp(START + GPE_DAILY_PATTERN + END))[3];
253+
return year + strPad("" + (month), 2, "0") + strPad("" + (day), 2, "0");
254+
}
255+
return time;
256+
}
257+
258+
const _calculateGpeReportingPeriodGranularity = function (time) {
259+
if (time.match(new RegExp(GPE_REPORTING_YEARLY_TYPE))) {
260+
return "YEARLY";
261+
}
262+
if (time.match(new RegExp(GPE_REPORTING_BIYEARLY_TYPE))) {
263+
return "BIYEARLY";
264+
}
265+
if (time.match(new RegExp(GPE_REPORTING_QUARTERLY_TYPE))) {
266+
return "QUARTERLY";
267+
}
268+
if (time.match(new RegExp(GPE_REPORTING_MONTH_TYPE))) {
269+
return "MONTHLY";
270+
}
271+
if (time.match(new RegExp(GPE_REPORTING_MONTHLY_TYPE))) {
272+
return "MONTHLY";
273+
}
274+
if (time.match(new RegExp(GPE_REPORTING_WEEKLY_TYPE))) {
275+
return "WEEKLY";
276+
}
277+
if (time.match(new RegExp(GPE_REPORTING_DAILY_TYPE))) {
278+
return "DAILY";
279+
}
280+
return "";
281+
}
282+
187283
// DATETIME
188284
// 2013-07-24T13:21:52.519+01:00
189285
// 2013-07-24
@@ -219,9 +315,12 @@ function RecodeDatesHelper() {
219315
date = _calculateReportingPeriod(time);
220316
} else if (_isDateTime(time)) {
221317
date = _calculateDateTime(time);
318+
} else if (_isGpeReportingTimePeriod(time)) {
319+
date = _calculateGpeReportingPeriod(time);
222320
} else if (_isGregorianTimePeriod(time)) {
223321
date = _calculateGregorianTimePeriod(time);
224322
}
323+
225324
return date === null ? time : date;
226325
}
227326

@@ -232,6 +331,8 @@ function RecodeDatesHelper() {
232331
return _calculateReportingPeriodGranularity(time);
233332
} else if (_isDateTime(time)) {
234333
return "";
334+
} else if (_isGpeReportingTimePeriod(time)) {
335+
return _calculateGpeReportingPeriodGranularity(time);
235336
} else if (_isGregorianTimePeriod(time)) {
236337
return "";
237338
}
@@ -294,6 +395,7 @@ function RecodeDatesHelper() {
294395
//return year + strPad("" + (month), 2, "0") + "01";
295396
return year + strPad("" + month, 2, "0");
296397
}
398+
297399
break;
298400
}
299401
// semanal

src/Utils.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
function Utils() {
22

33
this.getUrl = function(configParams) {
4+
let url;
45
switch(configParams.indicatorType){
56
case "indicatorSelector":
6-
return configParams.indicator;
7+
url = configParams.indicator;
8+
break;
79
case "indicatorInstanceSelector":
8-
return configParams.indicatorInstance;
10+
url = configParams.indicatorInstance;
11+
break;
912
case "inputUrlSelector":
10-
return encodeURI(configParams.inputUrl);
11-
default:
12-
return;
13+
url = configParams.inputUrl;
14+
let urlPath = url.indexOf('?') > 0 ? url.substring(0, url.indexOf('?')) : url;
15+
let urlQuerystring = url.indexOf('?') > 0 ? url.substring(url.indexOf('?')) : '';
16+
if(urlPath.match(/\/data\/*$/)) {
17+
urlPath = urlPath.replace(/\/data\/*$/, "");
18+
}
19+
decodedUrl = urlPath + urlQuerystring;
20+
do {
21+
url = decodedUrl;
22+
decodedUrl = decodeURI(url);
23+
} while(url != decodedUrl);
24+
url = encodeURI(decodedUrl);
25+
break;
1326
}
27+
return url;
1428
}
1529

1630
this.getColNameAndId = function(response, configParams) {

0 commit comments

Comments
 (0)