SDMX stands for Statistical Data and Metadata Exchange. As a format for sharing statistical data, it is used by governments, NGOs and other institutions. This package makes working with SDMX servers and records easier.

Features

Fetch from a server

final server = SDMXServer(
    'https://releaseeuaestat.fcsc.gov.ae/rest/data',
    locales: ['en', 'ar'],
);
final model = await server.fetchRecord(
    'FCSA,DF_POP,2.6.0/...A...?startPeriod=2017&dimensionAtObservation=AllDimensions',
);

Fetch records from an SDMX server. The method abstracts

  • the headers needed to be passed
  • parsing JSON to a Dart readable object of type SDMXModel.

Access model dimensions neatly

model.extractDimensionOptionsAsIds();
// {"MEASURE":["POPGWTH","POP"],"UNIT_MEASURE":["RATE","PS"],"REF_AREA":["AE"],"FREQ":["A"],"GENDER":["F","_T","M"],"POP_IND":["_Z"],"SOURCE_DETAIL":["FCSC"],"TIME_PERIOD":["2017","2018","2019","2020"]};

model.extractDimensionOptionsAsNames();
// {{en: Measure, ar: القياس}: [{en: Population Growth Rate, ar: معدل النمو السكاني}, {en: Population Estimate, ar: تقديرات السكان}], {en: Unit of measure, ar: وحدة القياس}: [{en: Rate, ar: معدل}, {en: Persons, ar: الأفراد}], {en: Reference area, ar: النطاق الجغرافي}: [{en: UAE, ar: الإمارات العربية المتحدة}], {en: Frequency, ar: الدورية}: [{en: Annual, ar: سنوي}], {en: Gender, ar: النوع}: [{en: Female, ar: أنثى}, {en: Total, ar: الإجمالي}, {en: Male, ar: ذكر}], {en: Population Indicators, ar: المؤشرات السكانية}: [{en: Not Applicable, ar: لا ينطبق}], {en: Source, ar: المصدر}: [{en: Federal Competitiveness and Statistics Centre, ar: المركز الاتحادي للتنافسية والإحصاء}], {en: Time period, ar: الفترة الزمنية}: [{en: 2017}, {en: 2018}, {en: 2019}, {en: 2020}]};

View all possible dimensions in the model records as IDs, or in their full names in the given locales.

SDMXRecordEntry as a helper class

The SDMXRecordEntry class is designed to make filtering records and accessing translations easier. It is not part of the SDMX standard.

Filtering records

model.toEntries().where(
    (entry) => entry.anyPropertyInIdFormMatches({
    'TIME_PERIOD': ['2018', '2019', '2020', '2021'],
    }),
);
model.toEntries().where(
      (entry) {
        final tp = int.parse(
            entry.propertiesAsIds['TIME_PERIOD']!
        );
        return tp >= 2018 && tp < 2022;
      },
    );

Accessing translations

final entryPropertiesInArabic = entry.propertiesAsNames.map(
    (key, value) => MapEntry(
      key.forLanguage('ar'),
      value.forLanguage('ar'),
    ),
  );

Insert support for CSV decoding, cache or logging layers etc.

abstract class SDMXDecoder {
  SDMXModel<T> decode<T extends Object>(
    String response,
  );

  Map<String, String> get headerAddition;
}

Implement the above class to insert a cache or logging layer, or to implement decoders which support beyond the JSON format, such as CSV. The decoder can be inserted in the SDMXServer constructor as an optional parameter. The default decoder is SDMXJsonDecoder.

Additional information

Contributions are welcome!

Here is a curated list of how you can help:

  • Report bugs and scenarios that are difficult to implement
  • Report parts of the documentation that are unclear
  • Fix typos/grammar mistakes
  • Update the documentation or add examples
  • Implement new features by making a pull-request

Libraries

sdmx