From 5acefc83382b81598dea5d9f15e51f199d18e5db Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?D=C3=B3ra=20Kocsis?= <dora@dynare.org>
Date: Mon, 30 Mar 2020 17:59:11 +0200
Subject: [PATCH] remove double quotes and string arrays for backward
 compatibility, closes #8

---
 README.md                                     | 30 ++++++++---------
 src/subroutines/fetch_series.m                | 17 ++++++----
 src/subroutines/fetch_series_by_api_link.m    | 22 ++++++-------
 src/subroutines/flatten_editor_series.m       |  2 +-
 src/subroutines/iter_filtered_series.m        |  4 +--
 src/subroutines/iter_series_info.m            |  2 +-
 src/subroutines/normalize_period.m            |  2 +-
 template.m                                    | 33 +++++++++----------
 tests/test_fetch_series_by_api_link.m         |  6 ++--
 tests/test_fetch_series_by_code.m             |  8 ++---
 tests/test_fetch_series_by_code_mask.m        |  6 ++--
 ...test_fetch_series_by_code_mask_with_plus.m |  6 ++--
 tests/test_fetch_series_by_dimension.m        |  6 ++--
 tests/test_fetch_series_by_id.m               |  8 ++---
 ...etch_series_by_ids_in_different_datasets.m | 14 ++++----
 ...test_fetch_series_by_ids_in_same_dataset.m | 12 +++----
 tests/test_fetch_series_of_dataset.m          |  6 ++--
 ...t_fetch_series_with_filter_on_one_series.m | 12 +++----
 tests/test_fetch_series_with_max_nb_series.m  |  6 ++--
 tests/test_fetch_series_with_na_values.m      |  8 ++---
 20 files changed, 107 insertions(+), 103 deletions(-)

diff --git a/README.md b/README.md
index d42dd8c..1443471 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ belonging to the [AMECO provider](https://db.nomics.world/AMECO).
 
 Example:
 
-    >> df_id = fetch_series('series_ids',"AMECO/ZUTN/EA19.1.0.0.0.ZUTN");
+    >> df_id = fetch_series('series_ids', 'AMECO/ZUTN/EA19.1.0.0.0.ZUTN');
 
 The returned data is stored in the `df_id` variable. Its type is a cell array. To display the first 3 rows of the array 
 (including the column headers), type:
@@ -81,7 +81,7 @@ In such cell array, you will always find at least those columns:
 * `series_name`
 * `original_period`: the `period` as returned by DBnomics
 * `period`: the first day of `original_period`
-* `original_value` (`str` or `float`): the observation value as returned by DBnomics, where not available values are represented by `"NA"`
+* `original_value` (`str` or `float`): the observation value as returned by DBnomics, where not available values are represented by `'NA'`
 * `value` (`float` or `NaN`): the observation value as returned by DBnomics, where not available values are represented by `NaN`
 
 Followed by dimensions columns, corresponding to the dimensions of the dataset:
@@ -97,7 +97,7 @@ belonging to the [AMECO provider](https://db.nomics.world/AMECO).
 
 Example:
 
-    >> df_ids = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "AMECO/ZUTN/DNK.1.0.0.0.ZUTN"]);
+    >> df_ids = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN'});
 
 ### Fetch time series by code mask
 The code mask notation is a very concise way to select one or many time series at once. 
@@ -112,16 +112,16 @@ It is not compatible with all the providers. In particular, only the providers f
 * OECD 
 * WTO
 
-Given 3 dimensions "frequency", "country" and "indicator", the user can select:
-* one time series by giving its code: `"M.FR.PCPIEC_IX"`
-* many series by enumerating dimensions codes: `"M.FR+DE.PCPIEC_IX"` is equivalent to `["M.FR.PCPIEC_IX", "M.DE.PCPIEC_IX"]`
-* many series by skipping a dimension, repeating "." in the code mask: `"M..PCPIEC_IX"` is equivalent to `["M.country1.PCPIEC_IX", "M.country2.PCPIEC_IX", ..., "M.countryN.PCPIEC_IX"]`
+Given 3 dimensions 'frequency', 'country' and 'indicator', the user can select:
+* one time series by giving its code: `'M.FR.PCPIEC_IX'`
+* many series by enumerating dimensions codes: `'M.FR+DE.PCPIEC_IX'` is equivalent to `{'M.FR.PCPIEC_IX', 'M.DE.PCPIEC_IX'}`
+* many series by skipping a dimension, repeating '.' in the code mask: `'M..PCPIEC_IX'` is equivalent to `{'M.country1.PCPIEC_IX', 'M.country2.PCPIEC_IX', ..., 'M.countryN.PCPIEC_IX'}`
 
 Examples:
 
-    >> df_code_mask1 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M.FR+DE.PCPIEC_IX+PCPIA_IX");
-    >> df_code_mask2 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', ".FR.PCPIEC_WT");
-    >> df_code_mask3 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M..PCPIEC_IX+PCPIA_IX", 'max_nb_series', 400);
+    >> df_code_mask1 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M.FR+DE.PCPIEC_IX+PCPIA_IX');
+    >> df_code_mask2 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', '.FR.PCPIEC_WT');
+    >> df_code_mask3 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M..PCPIEC_IX+PCPIA_IX', 'max_nb_series', 400);
 
 ### Fetch time series by dimension
 Searching by dimension is a less concise way to select time series than using the code mask, but it's universal: 
@@ -131,7 +131,7 @@ and the indicator "Procedures required to start a business - Women (number)" (`i
 
 Example:
 
-    >> df_dims = fetch_series('provider_code',"WB",'dataset_code',"DB", 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
+    >> df_dims = fetch_series('provider_code', 'WB', 'dataset_code', 'DB', 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
 
 ### Fetch time series by API link
 When the dimensions, provider, dataset or series codes are unknown, the user can: 
@@ -156,9 +156,9 @@ Example:
 
 Example:
 
-    >> df_multi_freq = fetch_series('series_ids', ["BEA/NIUnderlyingDetail-U001BC/S315-A",...
-                                                   "BEA/NIUnderlyingDetail-U001BC/S315-Q",...
-                                                   "BEA/NIUnderlyingDetail-U001BC/S315-M"]);
+    >> df_multi_freq = fetch_series('series_ids', {'BEA/NIUnderlyingDetail-U001BC/S315-A',...
+                                                   'BEA/NIUnderlyingDetail-U001BC/S315-Q',...
+                                                   'BEA/NIUnderlyingDetail-U001BC/S315-M'});
 
 ### Transform time series
 The routines can interact with the [Time Series Editor](https://editor.nomics.world/) to transform time series by applying filters to them. 
@@ -170,7 +170,7 @@ Here is an example of how to interpolate two annual time series with a monthly f
 Example:
 
     >> filters_ = '[{"code": "interpolate", "parameters": {"frequency": "monthly", "method": "spline"}}]';
-    >> df_filter = fetch_series('series_ids', "AMECO/ZUTN/EA19.1.0.0.0.ZUTN",'dbnomics_filters', filters_);
+    >> df_filter = fetch_series('series_ids', 'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'dbnomics_filters', filters_);
 
 The first row of the final cell array changes when filters are used:
 * `period_middle_day`: the middle day of `original_period` (can be useful when you compare graphically interpolated series and original ones)
diff --git a/src/subroutines/fetch_series.m b/src/subroutines/fetch_series.m
index 5ac05e9..2cc9a03 100644
--- a/src/subroutines/fetch_series.m
+++ b/src/subroutines/fetch_series.m
@@ -5,17 +5,17 @@ function df = fetch_series(varargin)
 %
 % Examples:
 % Fetch one series:
-% fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M.FR+DE.PCPIEC_IX+PCPIA_IX");
-% fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', ".FR.PCPIEC_WT");
+% fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M.FR+DE.PCPIEC_IX+PCPIA_IX');
+% fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', '.FR.PCPIEC_WT');
 % 
 % Fetch all the series of a dataset:
-% fetch_series('provider_code', "AMECO", 'dataset_code', "UVGD", 'max_nb_series', 500);
+% fetch_series('provider_code', 'AMECO', 'dataset_code', 'UVGD', 'max_nb_series', 500);
 % 
 % Fetch many series from different datasets:
-% fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "AMECO/ZUTN/DNK.1.0.0.0.ZUTN", "IMF/CPI/A.AT.PCPIT_IX"]);
+% fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN', 'IMF/CPI/A.AT.PCPIT_IX'});
 % 
 % Fetch many series from the same dataset, searching by dimension:
-% fetch_series('provider_code',"AMECO", 'dataset_code', "ZUTN", 'dimensions', '{"geo":["dnk"]}');
+% fetch_series('provider_code','AMECO', 'dataset_code', 'ZUTN', 'dimensions', '{"geo":["dnk"]}');
 % 
 % POSSIBLE PARAMETERS
 %   provider_code           [string]     the code of the dataset provider.  
@@ -109,7 +109,12 @@ if ~isempty(p.Results.series_ids)
     if ~isempty(p.Results.provider_code) || ~isempty(p.Results.dataset_code)
         error('When you use series_ids, you must not specifiy provider_code nor dataset_code.');
     end
-    api_link = sprintf('%s?observations=1&series_ids=%s', series_base_url, strjoin(p.Results.series_ids,','));
+    if iscellstr(p.Results.series_ids)
+        series_ids = strjoin(p.Results.series_ids,',');
+    else
+        series_ids = p.Results.series_ids;
+    end
+    api_link = sprintf('%s?observations=1&series_ids=%s', series_base_url, series_ids);
 end
 df = fetch_series_by_api_link(api_link, p.Results.dbnomics_filters, p.Results.max_nb_series, default_editor_base_url);
 end
diff --git a/src/subroutines/fetch_series_by_api_link.m b/src/subroutines/fetch_series_by_api_link.m
index eeb3587..4b71228 100644
--- a/src/subroutines/fetch_series_by_api_link.m
+++ b/src/subroutines/fetch_series_by_api_link.m
@@ -5,7 +5,7 @@ function df = fetch_series_by_api_link(api_link, varargin)
 % Returns a cell array.
 %
 % Example:
-% fetch_series_by_api_link("https://api.db.nomics.world/v22/series?series_ids=AMECO%2FZUTN%2FEA19.1.0.0.0.ZUTN&observations=1");
+% fetch_series_by_api_link('https://api.db.nomics.world/v22/series?series_ids=AMECO%2FZUTN%2FEA19.1.0.0.0.ZUTN&observations=1');
 % 
 % REQUIRED PARAMETERS
 %   api_link                [string]     the URL used for the API request.
@@ -54,15 +54,15 @@ p.parse(api_link, varargin{:});
 if isempty(series_list)
     df = {};
 else
-    common_columns = ["x_frequency", "provider_code", "dataset_code", "dataset_name", "series_code", "series_name","original_period", "period", "original_value", "value"];
+    common_columns = {'x_frequency', 'provider_code', 'dataset_code', 'dataset_name', 'series_code', 'series_name','original_period', 'period', 'original_value', 'value'};
     % Compute dimensions_labels_columns_names and dimensions_codes_columns_names
-    dimensions_labels_columns_names = [];
-    dimensions_codes_columns_names = [];
+    dimensions_labels_columns_names = {};
+    dimensions_codes_columns_names = {};
     
     dataset_codes = fieldnames(datasets_dimensions);
     for ii = 1:length(fieldnames(datasets_dimensions))
         dataset_dimensions = datasets_dimensions.(dataset_codes{ii});
-        dimensions_codes_columns_names = [dimensions_codes_columns_names, string(dataset_dimensions.dimensions_codes_order')];
+        dimensions_codes_columns_names = dataset_dimensions.dimensions_codes_order';
         for jj = 1:length(dataset_dimensions.dimensions_codes_order)
             if isfield(dataset_dimensions, 'dimensions_labels') && isfield(dataset_dimensions, 'dimensions_values_labels')
                 dimensions_labels_columns_names_dataset{jj} = dataset_dimensions.dimensions_labels.(dataset_dimensions.dimensions_codes_order{jj});
@@ -72,16 +72,16 @@ else
                 end
             end
         end
-        dimensions_labels_columns_names = [dimensions_labels_columns_names, string(dimensions_labels_columns_names_dataset)];
+        dimensions_labels_columns_names = dimensions_labels_columns_names_dataset;
     end
     ordered_columns_names = [common_columns, dimensions_codes_columns_names, dimensions_labels_columns_names];
     
     if ~isempty(p.Results.dbnomics_filters)
         filtered_series_list = filter_series(series_list, p.Results.dbnomics_filters,p.Results.editor_api_base_url);
         % Append common column names with period_middle_day and filtered columns for the final DataFrame
-        idx_period = find(strcmp(ordered_columns_names, "period"));
-        idx_value = find(strcmp(ordered_columns_names, "value"));
-        ordered_columns_names = [ordered_columns_names{1:idx_period}, "period_middle_day", ordered_columns_names{idx_period+1:idx_value}, "filtered", ordered_columns_names{idx_value+1:end}];
+        idx_period = find(strcmp(ordered_columns_names, 'period'));
+        idx_value = find(strcmp(ordered_columns_names, 'value'));
+        ordered_columns_names = {ordered_columns_names{1:idx_period}, 'period_middle_day', ordered_columns_names{idx_period+1:idx_value}, 'filtered', ordered_columns_names{idx_value+1:end}};
         % Append series_list with the filtered series
         series_list = [series_list, filtered_series_list];
     end
@@ -110,7 +110,7 @@ else
             end
             % Add dimensions values labels to current series
             if isfield(dataset_dimensions, 'dimensions_values_labels')
-                dimension_codes  = intersect(dimensions_codes_columns_names, string(fieldnames(dataset_dimensions_labels)')); %string(fieldnames(dataset_dimensions_labels)');
+                dimension_codes  = intersect(dimensions_codes_columns_names, fieldnames(dataset_dimensions_labels)');
                 for jj = 1:length(dimension_codes)
                     series_code = regexprep(flat_series.series_code,'[^a-zA-Z0-9]','_');
                     dimension_label = dataset_dimensions_labels.(dimension_codes{jj});
@@ -155,7 +155,7 @@ else
                     else
                         df{series_length+jj+1,col} = NaN;
                     end
-                elseif any(strcmp(col_, dimensions_codes_columns_names)) && ~any(strcmp(col_,string(fieldnames(flat_series)')))
+                elseif any(strcmp(col_, dimensions_codes_columns_names)) && ~any(strcmp(col_,fieldnames(flat_series)'))
                     df{series_length+jj+1,col} = NaN;
                 elseif strcmp(col_, 'period_middle_day')
                     if isfield(flat_series, 'period_middle_day')
diff --git a/src/subroutines/flatten_editor_series.m b/src/subroutines/flatten_editor_series.m
index c048982..687b3f2 100644
--- a/src/subroutines/flatten_editor_series.m
+++ b/src/subroutines/flatten_editor_series.m
@@ -34,7 +34,7 @@ series = normalize_value(series);
 
 series.x_frequency = series.frequency;
 series = rmfield(series, 'frequency');
-orig_fields = ["provider_code", "dataset_code", "dataset_name"];
+orig_fields = {'provider_code', 'dataset_code', 'dataset_name'};
 for ii = 1:length(orig_fields)
     series.(orig_fields{ii}) = dbnomics_series.(orig_fields{ii});
 end
diff --git a/src/subroutines/iter_filtered_series.m b/src/subroutines/iter_filtered_series.m
index 38d412d..2a2c818 100644
--- a/src/subroutines/iter_filtered_series.m
+++ b/src/subroutines/iter_filtered_series.m
@@ -42,8 +42,8 @@ end
 for gg = 1:size(grouped_series, 2)
     series_list = grouped_series{gg};
     posted_series_list = cell(1,size(series_list,2));
-    series_fields = ["x_frequency", "period_start_day", "value"];
-    posted_series_fields = ["frequency", "period_start_day", "value"];
+    series_fields = {'x_frequency', 'period_start_day', 'value'};
+    posted_series_fields = {'frequency', 'period_start_day', 'value'};
     for series = 1:size(series_list, 2)
         for ii = 1:length(posted_series_fields)
             posted_series.(posted_series_fields{ii}) = series_list{series}.(series_fields{ii});
diff --git a/src/subroutines/iter_series_info.m b/src/subroutines/iter_series_info.m
index d716ad4..83a72ac 100644
--- a/src/subroutines/iter_series_info.m
+++ b/src/subroutines/iter_series_info.m
@@ -44,7 +44,7 @@ while (true)
     num_found = series_page.num_found;
     
     if isnan(max_nb_series) && num_found > default_max_nb_series
-        error("DBnomics Web API found %i series matching your request, %i, but you did not pass any value for the 'max_nb_series' argument, so a default value of %i was used. Please give a higher value (at least max_nb_series=%i), and try again.", ...
+        error('DBnomics Web API found %i series matching your request, %i, but you did not pass any value for the "max_nb_series" argument, so a default value of %i was used. Please give a higher value (at least max_nb_series=%i), and try again.', ...
                num_found, default_max_nb_series, num_found);
     end
     
diff --git a/src/subroutines/normalize_period.m b/src/subroutines/normalize_period.m
index b556913..7768335 100644
--- a/src/subroutines/normalize_period.m
+++ b/src/subroutines/normalize_period.m
@@ -31,7 +31,7 @@ function series = normalize_period(series)
 
 period = series.period;
 period_start_day = series.period_start_day;
-series = rmfield(series, "period_start_day");
+series = rmfield(series, 'period_start_day');
 
 series.original_period = period;
 for ii = 1:length(period_start_day)
diff --git a/template.m b/template.m
index f3e862a..183ab9c 100644
--- a/template.m
+++ b/template.m
@@ -1,36 +1,35 @@
 % fetch series by provider code and dataset code
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "UVGD", 'max_nb_series', 500);
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'UVGD', 'max_nb_series', 500);
 % fetch one series by ID
-df_id = fetch_series('series_ids',"AMECO/ZUTN/EA19.1.0.0.0.ZUTN");
+df_id = fetch_series('series_ids','AMECO/ZUTN/EA19.1.0.0.0.ZUTN');
 % fetch multiple series by ID
-df_ids = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "AMECO/ZUTN/DNK.1.0.0.0.ZUTN"]);
+df_ids = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN'});
 % fetch many series by ID from different datasets
-df_ids_sets = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "AMECO/ZUTN/DNK.1.0.0.0.ZUTN", "IMF/CPI/A.AT.PCPIT_IX"]);
+df_ids_sets = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN', 'IMF/CPI/A.AT.PCPIT_IX'});
 
 % fetch time series by code mask 
-df_code_mask1 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M.FR+DE.PCPIEC_IX+PCPIA_IX");
-df_code_mask2 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', ".FR.PCPIEC_WT");
-% df_code_mask3 = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M..PCPIEC_IX+PCPIA_IX", 'max_nb_series', 400);
+df_code_mask1 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M.FR+DE.PCPIEC_IX+PCPIA_IX');
+df_code_mask2 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', '.FR.PCPIEC_WT');
+% df_code_mask3 = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M..PCPIEC_IX+PCPIA_IX', 'max_nb_series', 400);
 % fetch series by dimensions
-% dimensions=struct("geo", "dnk");
-df_dim = fetch_series('provider_code',"AMECO", 'dataset_code', "ZUTN", 'dimensions', '{"geo":["dnk"]}');
-df_dims = fetch_series('provider_code',"WB",'dataset_code',"DB", 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
+df_dim = fetch_series('provider_code','AMECO', 'dataset_code', 'ZUTN', 'dimensions', '{"geo":["dnk"]}');
+df_dims = fetch_series('provider_code','WB','dataset_code','DB', 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
 % fetch series by api link
-df_link = fetch_series_by_api_link("https://api.db.nomics.world/v22/series/WB/DB?observations=1&dimensions=%7B%22country%22%3A%5B%22FR%22%2C%22IT%22%2C%22ES%22%5D%2C%22indicator%22%3A%5B%22IC.REG.COST.PC.FE.ZS.DRFN%22%5D%7D");
+df_link = fetch_series_by_api_link('https://api.db.nomics.world/v22/series/WB/DB?observations=1&dimensions=%7B%22country%22%3A%5B%22FR%22%2C%22IT%22%2C%22ES%22%5D%2C%22indicator%22%3A%5B%22IC.REG.COST.PC.FE.ZS.DRFN%22%5D%7D');
 % fetch series from the cart
-df_cart = fetch_series_by_api_link("https://api.db.nomics.world/v22/series?series_ids=AMECO%2FZUTN%2FEA19.1.0.0.0.ZUTN&observations=1");
+df_cart = fetch_series_by_api_link('https://api.db.nomics.world/v22/series?series_ids=AMECO%2FZUTN%2FEA19.1.0.0.0.ZUTN&observations=1');
 % fetch multi frequency series
-df_multi_freq = fetch_series('series_ids', ["BEA/NIUnderlyingDetail-U001BC/S315-A",...
-                                            "BEA/NIUnderlyingDetail-U001BC/S315-Q",...
-                                            "BEA/NIUnderlyingDetail-U001BC/S315-M"]);
+df_multi_freq = fetch_series('series_ids', {'BEA/NIUnderlyingDetail-U001BC/S315-A',...
+                                            'BEA/NIUnderlyingDetail-U001BC/S315-Q',...
+                                            'BEA/NIUnderlyingDetail-U001BC/S315-M'});
                     
 % fetch one series and apply interpolation filter
 filters_ = '[{"code": "interpolate", "parameters": {"frequency": "monthly", "method": "spline"}}]';
-df_filter = fetch_series('series_ids', "AMECO/ZUTN/EA19.1.0.0.0.ZUTN",...
+df_filter = fetch_series('series_ids', 'AMECO/ZUTN/EA19.1.0.0.0.ZUTN',...
                          'dbnomics_filters', filters_);
 
 % fetch multiple series and apply interpolation filter
-df_filters = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "AMECO/ZUTN/DNK.1.0.0.0.ZUTN"],...
+df_filters = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN'},...
                          'dbnomics_filters', filters_);
                      
                      
\ No newline at end of file
diff --git a/tests/test_fetch_series_by_api_link.m b/tests/test_fetch_series_by_api_link.m
index 9ba7ccc..6205d38 100644
--- a/tests/test_fetch_series_by_api_link.m
+++ b/tests/test_fetch_series_by_api_link.m
@@ -1,15 +1,15 @@
 function test_fetch_series_by_api_link() % --*-- Unitary tests --*--
-df = fetch_series_by_api_link("https://api.db.nomics.world/v22/series/BIS/long_pp?limit=1000&offset=0&q=&observations=1&align_periods=1&dimensions=%7B%7D");
+df = fetch_series_by_api_link('https://api.db.nomics.world/v22/series/BIS/long_pp?limit=1000&offset=0&q=&observations=1&align_periods=1&dimensions=%7B%7D');
     
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "BIS");
+assert(strcmp(provider_codes{1},'BIS'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "long_pp");
+assert(strcmp(dataset_codes{1},'long_pp'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_by_code.m b/tests/test_fetch_series_by_code.m
index cd91908..4303118 100644
--- a/tests/test_fetch_series_by_code.m
+++ b/tests/test_fetch_series_by_code.m
@@ -1,20 +1,20 @@
 function test_fetch_series_by_code() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "ZUTN", 'series_code',"EA19.1.0.0.0.ZUTN");
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'ZUTN', 'series_code', 'EA19.1.0.0.0.ZUTN');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
 assert(length(series_codes) == 1);
-assert(series_codes{1} == "EA19.1.0.0.0.ZUTN");
+assert(strcmp(series_codes{1},'EA19.1.0.0.0.ZUTN'));
 end
 
 %@test:1
diff --git a/tests/test_fetch_series_by_code_mask.m b/tests/test_fetch_series_by_code_mask.m
index 55f59e8..6f1d4a6 100644
--- a/tests/test_fetch_series_by_code_mask.m
+++ b/tests/test_fetch_series_by_code_mask.m
@@ -1,15 +1,15 @@
 function test_fetch_series_by_code_mask() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "IMF", 'dataset_code', "CPI", 'series_code', "M.FR+DE.PCPIEC_IX+PCPIA_IX");
+df = fetch_series('provider_code', 'IMF', 'dataset_code', 'CPI', 'series_code', 'M.FR+DE.PCPIEC_IX+PCPIA_IX');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "IMF");
+assert(strcmp(provider_codes{1},'IMF'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "CPI");
+assert(strcmp(dataset_codes{1},'CPI'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_by_code_mask_with_plus.m b/tests/test_fetch_series_by_code_mask_with_plus.m
index f426f8b..b38bd73 100644
--- a/tests/test_fetch_series_by_code_mask_with_plus.m
+++ b/tests/test_fetch_series_by_code_mask_with_plus.m
@@ -1,15 +1,15 @@
 function test_fetch_series_by_code_mask_with_plus() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "SCB", 'dataset_code', "AKIAM", 'series_code', '"J+K"+"G+H".AM0301C1');
+df = fetch_series('provider_code', 'SCB', 'dataset_code', 'AKIAM', 'series_code', '"J+K"+"G+H".AM0301C1');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "SCB");
+assert(strcmp(provider_codes{1},'SCB'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "AKIAM");
+assert(strcmp(dataset_codes{1},'AKIAM'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_by_dimension.m b/tests/test_fetch_series_by_dimension.m
index a1afd9e..3508404 100644
--- a/tests/test_fetch_series_by_dimension.m
+++ b/tests/test_fetch_series_by_dimension.m
@@ -1,15 +1,15 @@
 function test_fetch_series_by_dimension() % --*-- Unitary tests --*--
-df = fetch_series('provider_code',"WB",'dataset_code',"DB", 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
+df = fetch_series('provider_code','WB','dataset_code','DB', 'dimensions', '{"country":["ES","FR","IT"],"indicator":["IC.REG.COST.PC.FE.ZS.DRFN"]}');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "WB");
+assert(strcmp(provider_codes{1},'WB'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "DB");
+assert(strcmp(dataset_codes{1},'DB'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_by_id.m b/tests/test_fetch_series_by_id.m
index b74b42a..e87b494 100644
--- a/tests/test_fetch_series_by_id.m
+++ b/tests/test_fetch_series_by_id.m
@@ -1,20 +1,20 @@
 function test_fetch_series_by_id() % --*-- Unitary tests --*--
-df = fetch_series('series_ids',"AMECO/ZUTN/EA19.1.0.0.0.ZUTN");
+df = fetch_series('series_ids','AMECO/ZUTN/EA19.1.0.0.0.ZUTN');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
 assert(length(series_codes) == 1);
-assert(series_codes{1} == "EA19.1.0.0.0.ZUTN");
+assert(strcmp(series_codes{1},'EA19.1.0.0.0.ZUTN'));
 end
 
 %@test:1
diff --git a/tests/test_fetch_series_by_ids_in_different_datasets.m b/tests/test_fetch_series_by_ids_in_different_datasets.m
index 1f25d82..d71df24 100644
--- a/tests/test_fetch_series_by_ids_in_different_datasets.m
+++ b/tests/test_fetch_series_by_ids_in_different_datasets.m
@@ -1,23 +1,23 @@
 function test_fetch_series_by_ids_in_different_datasets() % --*-- Unitary tests --*--
-df = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN", "BIS/cbs/Q.S.5A.4B.F.B.A.A.LC1.A.1C"]);
+df = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN', 'BIS/cbs/Q.S.5A.4B.F.B.A.A.LC1.A.1C'});
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==2);
-assert(provider_codes{1} == "AMECO");
-assert(provider_codes{2} == "BIS");
+assert(strcmp(provider_codes{1},'AMECO'));
+assert(strcmp(provider_codes{2},'BIS'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 2);
-assert(dataset_codes{1} == "ZUTN");
-assert(dataset_codes{2} == "cbs");
+assert(strcmp(dataset_codes{1},'ZUTN'));
+assert(strcmp(dataset_codes{2},'cbs'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
 assert(length(series_codes) == 2);
-assert(series_codes{1} == "EA19.1.0.0.0.ZUTN");
-assert(series_codes{2} == "Q.S.5A.4B.F.B.A.A.LC1.A.1C");
+assert(strcmp(series_codes{1},'EA19.1.0.0.0.ZUTN'));
+assert(strcmp(series_codes{2},'Q.S.5A.4B.F.B.A.A.LC1.A.1C'));
 end
 
 %@test:1
diff --git a/tests/test_fetch_series_by_ids_in_same_dataset.m b/tests/test_fetch_series_by_ids_in_same_dataset.m
index 9be930a..c44b6bc 100644
--- a/tests/test_fetch_series_by_ids_in_same_dataset.m
+++ b/tests/test_fetch_series_by_ids_in_same_dataset.m
@@ -1,22 +1,22 @@
 function test_fetch_series_by_ids_in_same_dataset() % --*-- Unitary tests --*--
-df = fetch_series('series_ids', ["AMECO/ZUTN/EA19.1.0.0.0.ZUTN",...
-                                 "AMECO/ZUTN/DNK.1.0.0.0.ZUTN"]);
+df = fetch_series('series_ids', {'AMECO/ZUTN/EA19.1.0.0.0.ZUTN',...
+                                 'AMECO/ZUTN/DNK.1.0.0.0.ZUTN'});
     
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
 assert(length(series_codes) == 2);
-assert(series_codes{1} == "DNK.1.0.0.0.ZUTN");
-assert(series_codes{2} == "EA19.1.0.0.0.ZUTN");
+assert(strcmp(series_codes{1},'DNK.1.0.0.0.ZUTN'));
+assert(strcmp(series_codes{2},'EA19.1.0.0.0.ZUTN'));
 end
 
 %@test:1
diff --git a/tests/test_fetch_series_of_dataset.m b/tests/test_fetch_series_of_dataset.m
index 4f86268..0b644a8 100644
--- a/tests/test_fetch_series_of_dataset.m
+++ b/tests/test_fetch_series_of_dataset.m
@@ -1,15 +1,15 @@
 function test_fetch_series_of_dataset() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "ZUTN");
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'ZUTN');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_with_filter_on_one_series.m b/tests/test_fetch_series_with_filter_on_one_series.m
index 596c24d..4fb85b5 100644
--- a/tests/test_fetch_series_with_filter_on_one_series.m
+++ b/tests/test_fetch_series_with_filter_on_one_series.m
@@ -1,26 +1,26 @@
 function test_fetch_series_with_filter_on_one_series() % --*-- Unitary tests --*--
 filters_ = '[{"code": "interpolate", "parameters": {"frequency": "monthly", "method": "spline"}}]';
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "ZUTN", 'series_code', "DEU.1.0.0.0.ZUTN", 'dbnomics_filters', filters_);
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'ZUTN', 'series_code', 'DEU.1.0.0.0.ZUTN', 'dbnomics_filters', filters_);
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
-assert(series_codes{1} == "DEU.1.0.0.0.ZUTN");
+assert(strcmp(series_codes{1},'DEU.1.0.0.0.ZUTN'));
 
 assert(any(find(strcmp('filtered',df(1,:)))));
 idx_freq = find(strcmp('x_frequency',df(1,:)));
 frequencies = unique(df(2:end, idx_freq));
-assert(any(strcmp(frequencies, "monthly")));
-assert(any(contains(series_codes, "_filtered")));
+assert(any(strcmp(frequencies, 'monthly')));
+assert(any(contains(series_codes, '_filtered')));
 end
 
 %@test:1
diff --git a/tests/test_fetch_series_with_max_nb_series.m b/tests/test_fetch_series_with_max_nb_series.m
index 5bae432..77b4d7d 100644
--- a/tests/test_fetch_series_with_max_nb_series.m
+++ b/tests/test_fetch_series_with_max_nb_series.m
@@ -1,15 +1,15 @@
 function test_fetch_series_with_max_nb_series() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "ZUTN", 'max_nb_series',20);
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'ZUTN', 'max_nb_series',20);
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
diff --git a/tests/test_fetch_series_with_na_values.m b/tests/test_fetch_series_with_na_values.m
index ae3b873..8dd7ef0 100644
--- a/tests/test_fetch_series_with_na_values.m
+++ b/tests/test_fetch_series_with_na_values.m
@@ -1,19 +1,19 @@
 function test_fetch_series_with_na_values() % --*-- Unitary tests --*--
-df = fetch_series('provider_code', "AMECO", 'dataset_code', "ZUTN", 'series_code', "DEU.1.0.0.0.ZUTN");
+df = fetch_series('provider_code', 'AMECO', 'dataset_code', 'ZUTN', 'series_code', 'DEU.1.0.0.0.ZUTN');
 
 idx = find(strcmp('provider_code',df(1,:)));
 provider_codes = unique(df(2:end,idx));
 assert(length(provider_codes)==1);
-assert(provider_codes{1} == "AMECO");
+assert(strcmp(provider_codes{1},'AMECO'));
 
 idx = find(strcmp('dataset_code',df(1,:)));
 dataset_codes = unique(df(2:end,idx));
 assert(length(dataset_codes) == 1);
-assert(dataset_codes{1} == "ZUTN");
+assert(strcmp(dataset_codes{1},'ZUTN'));
 
 idx = find(strcmp('series_code',df(1,:)));
 series_codes = unique(df(2:end,idx));
-assert(series_codes{1} == "DEU.1.0.0.0.ZUTN");
+assert(strcmp(series_codes{1},'DEU.1.0.0.0.ZUTN'));
 
 idx = find(strcmp('original_value',df(1,:)));
 assert(any(strcmp('NA', df(2:end,idx))) == true);
-- 
GitLab