From 9b840618f52c0de8f40b9a2e318233239df600db Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Fri, 1 Aug 2025 09:45:13 +0300 Subject: [PATCH 1/6] Revert "remove optional type attribute for StreamCompactDataWriterEngine" This reverts commit 191651cbe4aa0dd25aa6149a6bbb24ab577a1d5a. --- .../engine/writer/streaming/StreamCompactDataWriterEngine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/streaming/StreamCompactDataWriterEngine.java b/SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/streaming/StreamCompactDataWriterEngine.java index eeb6438..3bf5b8d 100644 --- a/SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/streaming/StreamCompactDataWriterEngine.java +++ b/SdmxDataParser/src/main/java/org/sdmxsource/sdmx/dataparser/engine/writer/streaming/StreamCompactDataWriterEngine.java @@ -128,6 +128,7 @@ public void startGroup(String groupId, AnnotationBean... annotations) { if (isTwoPointOne()) { writer.writeStartElement("Group"); //WRITE THE START GROUP + writer.writeAttribute(XSI_NS, "type", COMPACT_NS.namespacePrefix + ":" + groupId); writeAnnotations(writer, annotations); } else { groupAnnotations = annotations; From 66db0aa181ffb632e37f046e9e687b2269a49d4e Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Thu, 21 Aug 2025 11:00:34 +0300 Subject: [PATCH 2/6] Fix performance of CodeBean instantiation with large number of child codes --- .../beans/codelist/CodelistBeanImpl.java | 44 +++++++++++-------- .../sdmxbeans/test/CodeListSuperBeanTest.java | 17 +++---- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java b/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java index 18c8729..56bbdb1 100644 --- a/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java +++ b/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java @@ -54,12 +54,14 @@ public class CodelistBeanImpl extends ItemSchemeBeanImpl implements CodelistBean { private static final long serialVersionUID = 1L; + private final Map codeMap; /////////////////////////////////////////////////////////////////////////////////////////////////// ////////////BUILD FROM ITSELF, CREATES STUB BEAN ////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// private CodelistBeanImpl(CodelistBean bean, URL actualLocation, boolean isServiceUrl) { super(bean, actualLocation, isServiceUrl); + this.codeMap = new HashMap<>(); } /** @@ -72,10 +74,13 @@ private CodelistBeanImpl(CodelistBean bean, URL actualLocation, boolean isServic /////////////////////////////////////////////////////////////////////////////////////////////////// public CodelistBeanImpl(CodelistMutableBean codelist) { super(codelist); + codeMap = new HashMap<>(); try { if (codelist.getItems() != null) { - for (CodeMutableBean code : codelist.getItems()) { - this.items.add(new CodeBeanImpl(this, code)); + for (CodeMutableBean mutableCode : codelist.getItems()) { + final var code = new CodeBeanImpl(this, mutableCode); + this.items.add(code); + this.codeMap.put(code.getId(), code); } } } catch (SdmxSemmanticException ex) { @@ -134,10 +139,13 @@ public CodelistBeanImpl(org.sdmx.resources.sdmxml.schemas.v10.xmlbeans.structure bean.getNameList(), createTertiary(bean.isSetIsExternalReference(), bean.getIsExternalReference()), bean.getAnnotations()); + this.codeMap = new HashMap<>(); try { for (org.sdmx.resources.sdmxml.schemas.v10.xmlbeans.structure.CodeType currentCode : bean.getCodeList()) { - items.add(new CodeBeanImpl(this, currentCode)); + var code = new CodeBeanImpl(this, currentCode); + items.add(code); + codeMap.put(code.getId(), code); } } catch (SdmxSemmanticException ex) { throw new SdmxSemmanticException(ex, ExceptionCode.BEAN_STRUCTURE_CONSTRUCTION_ERROR, this.getUrn()); @@ -176,10 +184,13 @@ public CodelistBeanImpl(CodeListType bean) { createTertiary(bean.isSetIsExternalReference(), bean.getIsExternalReference()), bean.getAnnotations()); + this.codeMap = new HashMap<>(); try { for (CodeType currentCode : bean.getCodeList()) { - items.add(new CodeBeanImpl(this, currentCode)); + CodeBeanImpl code = new CodeBeanImpl(this, currentCode); + items.add(code); + codeMap.put(code.getId(), code); } } catch (SdmxSemmanticException ex) { throw new SdmxSemmanticException(ex, ExceptionCode.BEAN_STRUCTURE_CONSTRUCTION_ERROR, this.getUrn()); @@ -205,10 +216,13 @@ public CodelistBeanImpl(CodeListType bean) { /////////////////////////////////////////////////////////////////////////////////////////////////// public CodelistBeanImpl(CodelistType bean) { super(bean, SDMX_STRUCTURE_TYPE.CODE_LIST); + this.codeMap = new HashMap<>(); try { for (org.sdmx.resources.sdmxml.schemas.v21.structure.CodeType currentCode : bean.getCodeList()) { - items.add(new CodeBeanImpl(this, currentCode)); + CodeBeanImpl code = new CodeBeanImpl(this, currentCode); + items.add(code); + codeMap.put(code.getId(), code); } } catch (SdmxSemmanticException ex) { throw new SdmxSemmanticException(ex, ExceptionCode.BEAN_STRUCTURE_CONSTRUCTION_ERROR, this.getUrn()); @@ -255,7 +269,7 @@ private void validate() throws ValidationException { urns.add(code.getUrn()); if (ObjectUtil.validString(code.getParentCode())) { - CodeBean parentCode = getCode(items, code.getParentCode()); + CodeBean parentCode = getCode(code.getParentCode()); Set children; if (parentChildMap.containsKey(parentCode)) { children = parentChildMap.get(parentCode); @@ -296,13 +310,12 @@ private void recurseParentMap(Set children, CodeBean parentCode, Map codes, String id) { - for (CodeBean currentCode : codes) { - if (currentCode.getId().equals(id)) { - return currentCode; - } + private CodeBean getCode(String id) { + CodeBean code = getCodeById(id); + if (code == null) { + throw new SdmxSemmanticException(ExceptionCode.CAN_NOT_RESOLVE_PARENT, id); } - throw new SdmxSemmanticException(ExceptionCode.CAN_NOT_RESOLVE_PARENT, id); + return code; } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -321,11 +334,6 @@ public CodelistMutableBean getMutableInstance() { @Override public CodeBean getCodeById(String id) { - for (CodeBean currentCode : items) { - if (currentCode.getId().equals(id)) { - return currentCode; - } - } - return null; + return codeMap.get(id); } } diff --git a/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java b/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java index d051bc2..846a6d0 100644 --- a/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java +++ b/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java @@ -1,5 +1,12 @@ package org.sdmxsource.sdmx.sdmxbeans.test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.sdmxsource.sdmx.sdmxbeans.data.DataHelper.buildCodelist; + +import java.util.List; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.sdmxsource.sdmx.api.model.beans.codelist.CodeBean; @@ -9,12 +16,6 @@ import org.sdmxsource.sdmx.sdmxbeans.model.mutablesuperbeans.codelist.CodelistMutableSuperBeanImpl; import org.sdmxsource.sdmx.sdmxbeans.model.superbeans.codelist.CodelistSuperBeanImpl; -import java.util.List; - -import static java.util.stream.Collectors.toList; -import static org.junit.jupiter.api.Assertions.*; -import static org.sdmxsource.sdmx.sdmxbeans.data.DataHelper.buildCodelist; - public class CodeListSuperBeanTest { private CodelistBean codelistBean; @@ -22,7 +23,7 @@ public class CodeListSuperBeanTest { @BeforeEach public void setup() { - codelistBean = buildCodelist(10).getImmutableInstance(); + codelistBean = buildCodelist(50_000).getImmutableInstance(); codelistSuperBean = new CodelistSuperBeanImpl(codelistBean); } @@ -40,7 +41,7 @@ public void shouldCheckExceptionForInvalidCodeId() { public void shouldCheckNumberOfCodes() { List codesWithoutParent = codelistBean.getItems().stream() .filter(code -> code.getParentCode() == null) - .collect(toList()); + .toList(); assertEquals(codesWithoutParent.size(), codelistSuperBean.getCodes().size()); } From 37ad66df752bcb42674a75006891c3283e06b955 Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Thu, 21 Aug 2025 11:27:30 +0300 Subject: [PATCH 3/6] Fix performance of CodeBean instantiation with large number of child codes --- .../sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java b/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java index 846a6d0..646be89 100644 --- a/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java +++ b/SdmxBeans/src/test/java/org/sdmxsource/sdmx/sdmxbeans/test/CodeListSuperBeanTest.java @@ -23,7 +23,7 @@ public class CodeListSuperBeanTest { @BeforeEach public void setup() { - codelistBean = buildCodelist(50_000).getImmutableInstance(); + codelistBean = buildCodelist(5_000).getImmutableInstance(); codelistSuperBean = new CodelistSuperBeanImpl(codelistBean); } From af875cdaadcd92e8b27883ecd6926381a11cfe0c Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Thu, 21 Aug 2025 11:38:20 +0300 Subject: [PATCH 4/6] fix codestyle --- .../sdmxbeans/model/beans/codelist/CodelistBeanImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java b/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java index 56bbdb1..6e5f276 100644 --- a/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java +++ b/SdmxBeans/src/main/java/org/sdmxsource/sdmx/sdmxbeans/model/beans/codelist/CodelistBeanImpl.java @@ -78,7 +78,7 @@ public CodelistBeanImpl(CodelistMutableBean codelist) { try { if (codelist.getItems() != null) { for (CodeMutableBean mutableCode : codelist.getItems()) { - final var code = new CodeBeanImpl(this, mutableCode); + var code = new CodeBeanImpl(this, mutableCode); this.items.add(code); this.codeMap.put(code.getId(), code); } @@ -188,7 +188,7 @@ public CodelistBeanImpl(CodeListType bean) { try { for (CodeType currentCode : bean.getCodeList()) { - CodeBeanImpl code = new CodeBeanImpl(this, currentCode); + var code = new CodeBeanImpl(this, currentCode); items.add(code); codeMap.put(code.getId(), code); } @@ -220,7 +220,7 @@ public CodelistBeanImpl(CodelistType bean) { try { for (org.sdmx.resources.sdmxml.schemas.v21.structure.CodeType currentCode : bean.getCodeList()) { - CodeBeanImpl code = new CodeBeanImpl(this, currentCode); + var code = new CodeBeanImpl(this, currentCode); items.add(code); codeMap.put(code.getId(), code); } From d559f6264788dec286e93d1a206b7403364bea81 Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Wed, 8 Oct 2025 15:59:47 +0300 Subject: [PATCH 5/6] Fix NPE when dsd instance is created with group descriptor * initialize collection * add unit test covering the case --- .../impl/SdmxObjectsJsonV1Builder.java | 4 +- .../test/SdmxObjectsJsonV1BuilderTest.java | 17 +++ .../test/resources/json/datastructure.json | 118 ++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 SdmxStructureParser/src/test/resources/json/datastructure.json diff --git a/SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/sdmxbeans/impl/SdmxObjectsJsonV1Builder.java b/SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/sdmxbeans/impl/SdmxObjectsJsonV1Builder.java index eb9923e..47e0ef1 100644 --- a/SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/sdmxbeans/impl/SdmxObjectsJsonV1Builder.java +++ b/SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/sdmxbeans/impl/SdmxObjectsJsonV1Builder.java @@ -306,9 +306,11 @@ private void processDatastructures(JsonNode dataStructures, SdmxBeansImpl beans) for (DataStructureDTO.Group groupDto : dataStructureDto.dataStructureComponents.groups) { GroupMutableBean group = new GroupMutableBeanImpl(); group.setId(groupDto.id); + group.setDimensionRef(new ArrayList<>(groupDto.groupDimensions.length)); - for (String groupDimension : groupDto.groupDimensions) + for (String groupDimension : groupDto.groupDimensions) { group.getDimensionRef().add(groupDimension); + } structureMutableObject.addGroup(group); } } diff --git a/SdmxStructureParser/src/test/java/org/sdmxsource/sdmx/structureparser/test/SdmxObjectsJsonV1BuilderTest.java b/SdmxStructureParser/src/test/java/org/sdmxsource/sdmx/structureparser/test/SdmxObjectsJsonV1BuilderTest.java index 9ab3d1a..14580cc 100644 --- a/SdmxStructureParser/src/test/java/org/sdmxsource/sdmx/structureparser/test/SdmxObjectsJsonV1BuilderTest.java +++ b/SdmxStructureParser/src/test/java/org/sdmxsource/sdmx/structureparser/test/SdmxObjectsJsonV1BuilderTest.java @@ -39,4 +39,21 @@ public void shouldBuildSdmxBeans() { assertThat(contentConstraint.getAnnotations().size()).isEqualTo(1); } + @Test + public void shouldBuildSdmxBeans_dataStructure() { + ReadableDataLocation fileReadableDataLocation = new ReadableDataLocationTmp("src/test/resources/json/datastructure.json"); + SdmxBeans beans; + + try (InputStream stream = fileReadableDataLocation.getInputStream()) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree(stream); + beans = sdmxObjectsJsonV1Builder.build(node); + beans.getDataflows(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + assertThat(beans.getDataStructures()).isNotEmpty(); + assertThat(beans.getDataStructures().size()).isEqualTo(1); + } } diff --git a/SdmxStructureParser/src/test/resources/json/datastructure.json b/SdmxStructureParser/src/test/resources/json/datastructure.json new file mode 100644 index 0000000..15be85e --- /dev/null +++ b/SdmxStructureParser/src/test/resources/json/datastructure.json @@ -0,0 +1,118 @@ +{ + "meta": {}, + "data": { + "dataStructures": [ + { + "annotations": [ + { + "texts": { + "en": "text" + }, + "id": "1", + "text": "text", + "type": "type1" + } + ], + "description": "Some artefact", + "agencyID": "IMF", + "descriptions": { + "en": "Some artefact" + }, + "version": "1.2", + "names": { + "en": "Maintanable artefact", + "fr-CA": "artefact" + }, + "dataStructureComponents": { + "groups": [ + { + "id": "GROUP1", + "groupDimensions": [ + "DIM1" + ] + } + ], + "attributeList": { + "attributes": [ + { + "assignmentStatus": "Conditional", + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS_COLLECTION_SCHEME(1.5.1).DATE_VALUE", + "attributeRelationship": { + "dimensions": [ + "DIM1" + ], + "attachmentGroups": [ + "GROUP1" + ] + }, + "localRepresentation": { + "textFormat": { + "textType": "AlphaNumeric" + } + }, + "conceptRoles": [ + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE", + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS(1.5.2).DATE_VALUE" + ], + "id": "DA1" + } + ], + "id": "AttributeDescriptor" + }, + "dimensionList": { + "timeDimensions": [ + { + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:TIME_DIMENSION(1.6.1).DATE_VALUE", + "localRepresentation": { + "textFormat": { + "textType": "BasicTimePeriod" + } + }, + "id": "TIME_PERIOD", + "position": 2, + "type": "TimeDimension" + } + ], + "id": "DimensionDescriptor", + "dimensions": [ + { + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:DIMENSION(1.6.1).DATE_VALUE", + "localRepresentation": { + "enumeration": "urn:sdmx:org.sdmx.infomodel.codelist.Codelist=IMF:CODELIST(1.0)" + }, + "conceptRoles": [ + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE" + ], + "id": "DIM1", + "position": 1, + "type": "Dimension" + } + ] + }, + "measureList": { + "primaryMeasure": { + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:MEASURE(1.5.2).DATE_VALUE", + "localRepresentation": { + "textFormat": { + "textType": "BasicTimePeriod" + } + }, + "id": "MES1" + }, + "id": "MeasureDescriptor" + } + }, + "name": "Maintanable artefact", + "links": [ + { + "urn": "urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=IMF:ARTEFACT(1.2)", + "rel": "self", + "type": "datastructure" + } + ], + "id": "ARTEFACT", + "isFinal": true + } + ] + } +} \ No newline at end of file From 98b349b7155ad2ab67666316f630901fef99e97c Mon Sep 17 00:00:00 2001 From: Oleksandr Buhaiov Date: Wed, 8 Oct 2025 15:59:47 +0300 Subject: [PATCH 6/6] Fix NPE when dsd instance is created with group descriptor * initialize collection * add unit test covering the case --- .../test/resources/json/datastructure.json | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/SdmxStructureParser/src/test/resources/json/datastructure.json b/SdmxStructureParser/src/test/resources/json/datastructure.json index 15be85e..fd03b33 100644 --- a/SdmxStructureParser/src/test/resources/json/datastructure.json +++ b/SdmxStructureParser/src/test/resources/json/datastructure.json @@ -14,7 +14,7 @@ } ], "description": "Some artefact", - "agencyID": "IMF", + "agencyID": "QH", "descriptions": { "en": "Some artefact" }, @@ -36,7 +36,7 @@ "attributes": [ { "assignmentStatus": "Conditional", - "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS_COLLECTION_SCHEME(1.5.1).DATE_VALUE", + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS_COLLECTION_SCHEME(1.5.1).DATE_VALUE", "attributeRelationship": { "dimensions": [ "DIM1" @@ -51,8 +51,8 @@ } }, "conceptRoles": [ - "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE", - "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS(1.5.2).DATE_VALUE" + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE", + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:ADVANCED_RELEASE_CALANDER_DIAGNOSTICS(1.5.2).DATE_VALUE" ], "id": "DA1" } @@ -62,7 +62,7 @@ "dimensionList": { "timeDimensions": [ { - "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:TIME_DIMENSION(1.6.1).DATE_VALUE", + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:TIME_DIMENSION(1.6.1).DATE_VALUE", "localRepresentation": { "textFormat": { "textType": "BasicTimePeriod" @@ -76,12 +76,12 @@ "id": "DimensionDescriptor", "dimensions": [ { - "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:DIMENSION(1.6.1).DATE_VALUE", + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:DIMENSION(1.6.1).DATE_VALUE", "localRepresentation": { - "enumeration": "urn:sdmx:org.sdmx.infomodel.codelist.Codelist=IMF:CODELIST(1.0)" + "enumeration": "urn:sdmx:org.sdmx.infomodel.codelist.Codelist=QH:CODELIST(1.0)" }, "conceptRoles": [ - "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE" + "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:ADVANCED_RELEASE_CALANDER(1.5.1).DATE_VALUE" ], "id": "DIM1", "position": 1, @@ -91,7 +91,7 @@ }, "measureList": { "primaryMeasure": { - "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=IMF:MEASURE(1.5.2).DATE_VALUE", + "conceptIdentity": "urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept=QH:MEASURE(1.5.2).DATE_VALUE", "localRepresentation": { "textFormat": { "textType": "BasicTimePeriod" @@ -105,7 +105,7 @@ "name": "Maintanable artefact", "links": [ { - "urn": "urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=IMF:ARTEFACT(1.2)", + "urn": "urn:sdmx:org.sdmx.infomodel.datastructure.DataStructure=QH:ARTEFACT(1.2)", "rel": "self", "type": "datastructure" }