Skip to content
40 changes: 40 additions & 0 deletions PCAxis.Serializers/JsonStat2/Model/JsonStat2Dataset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,46 @@ public static void AddDimensionLink(DimensionValue dimensionValue, Dictionary<st
};
}

//On Dimension
public static void AddRelatedLink(DimensionValue dimensionValue, RelatedLink theLink)
{
InitializeRelated(dimensionValue);
dimensionValue.Link.Related.Add(theLink);
}

//On root
public void AddRelatedLink(RelatedLink theLink)
{
InitiallizeRelated();
this.Link.Related.Add(theLink);
}


//On Dimension
private static void InitializeRelated(DimensionValue dimensionValue)
{
if (dimensionValue.Link == null)
{
dimensionValue.Link = new JsonstatExtensionLink();
}
if (dimensionValue.Link.Related == null)
{
dimensionValue.Link.Related = new List<RelatedLink>();
}
}



//On root
private void InitiallizeRelated()
{
if (this.Link == null)
{
this.Link = new JsonstatExtensionLink();
this.Link.Related = new List<RelatedLink>();
}
}

public static void AddMeasuringType(DimensionValue dimensionValue, string valueCode, MeasuringType measuringType)
{
if (dimensionValue.Extension.MeasuringType == null)
Expand Down
79 changes: 78 additions & 1 deletion PCAxis.Serializers/JsonStat2Serializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using PCAxis.Paxiom;
using PCAxis.Paxiom.Extensions;
using PCAxis.Serializers.JsonStat2.Model;
using PCAxis.Serializers.Util.MetaId;

using PxWeb.Api2.Server.Models;

Expand Down Expand Up @@ -41,6 +42,7 @@ private static Dictionary<double, string> BuildDataSymbolMap(PXMeta meta)
public string BuildJsonStructure(PXModel model)
{
var dataset = new JsonStat2Dataset();
string language = model.Meta.CurrentLanguage;

//Updated
AddUpdated(model, dataset);
Expand All @@ -51,6 +53,10 @@ public string BuildJsonStructure(PXModel model)
//Label
dataset.AddLabel(model.Meta.Title);

//Metaid handeling and output comes in OldWay and NewWay
//OldWay will hopfully end in 3.0. On root there is just the NewWay
AddMetaid(dataset, model.Meta.MetaId, language);

//Extension PX
AddPxToExtension(model, dataset);

Expand All @@ -64,7 +70,7 @@ public string BuildJsonStructure(PXModel model)

foreach (var variable in model.Meta.Variables)
{
//temporary collector storage
//temporary collector storage (For Old Way)
var metaIdsHelper = new Dictionary<string, string>();

dataset.AddDimensionValue(variable.Code, variable.Name, out var dimensionValue);
Expand All @@ -79,8 +85,11 @@ public string BuildJsonStructure(PXModel model)
dimensionValue.Category.Index.Add(variableValue.Code, indexCounter++);
}


CollectMetaIdsForValue(variableValue, ref metaIdsHelper);

AddMetaidOnValue(dimensionValue, variable, variableValue, language);

// ValueNote
AddValueNotes(variableValue, dimensionValue);

Expand Down Expand Up @@ -133,12 +142,17 @@ public string BuildJsonStructure(PXModel model)
AddVariableNotes(variable, dimensionValue);

//MetaID

//OldWay
CollectMetaIdsForVariable(variable, ref metaIdsHelper);

if (metaIdsHelper.Count > 0)
{
JsonStat2Dataset.AddDimensionLink(dimensionValue, metaIdsHelper);
}
//NewWay
AddMetaidOnVariable(dimensionValue, variable, language);


dataset.Size.Add(variable.Values.Count);
dataset.Id.Add(variable.Code);
Expand All @@ -164,6 +178,69 @@ public string BuildJsonStructure(PXModel model)
return result;
}

private static void AddMetaidOnVariable(DimensionValue dimensionValue, Variable variable, string language)
{
if (String.IsNullOrEmpty(variable.MetaId))
{
return;
}

foreach (var metalink in MetaIdResolverStatic.GetVariableLinks(variable.MetaId, language, variable.Name))
{
JsonStat2Dataset.AddRelatedLink(dimensionValue, ToRelatedLink(metalink, null));
}
}

private static void AddMetaidOnValue(DimensionValue dimensionValue, Variable variable, Value variableValue, string language)
{
if (String.IsNullOrEmpty(variableValue.MetaId))
{
return;
}

// There are 3 props on a "Variable Value": Code + Value + Text (combo of Code and Value)
//
foreach (var metalink in MetaIdResolverStatic.GetValueLinks(variableValue.MetaId, language, variable.Name, variableValue.Text))
{
JsonStat2Dataset.AddRelatedLink(dimensionValue, ToRelatedLink(metalink, variableValue.Code));
}
}

private static void AddMetaid(JsonStat2Dataset dataset, string metaIdRaw, string language)
{
if (String.IsNullOrEmpty(metaIdRaw))
{
return;
}

foreach (Util.MetaId.Link metalink in MetaIdResolverStatic.GetTableLinks(metaIdRaw, language))
{
dataset.AddRelatedLink(ToRelatedLink(metalink, null));
}

}


private static RelatedLink ToRelatedLink(Util.MetaId.Link metalink, string category)
{
RelatedLink myOut = new RelatedLink();
myOut.Extension = new RelatedLinkExtension();
myOut.Extension.Relation = metalink.Relation;
if (!String.IsNullOrEmpty(category))
{
myOut.Extension.Category = category;
}
myOut.Extension.Metaid = metalink.MetaId;

myOut.Href = metalink.Url;
myOut.Label = metalink.Label;
myOut.Type = metalink.Type;

return myOut;
}



private static PriceType GetPriceType(string cfprices)
{
string cfp = cfprices != null ? cfprices.ToUpper() : "";
Expand Down
2 changes: 1 addition & 1 deletion PCAxis.Serializers/PCAxis.Serializers.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<PackageReference Include="PCAxis.Metadata" Version="1.0.5" />
<PackageReference Include="PCAxis.Query" Version="1.0.10" />
<PackageReference Include="ClosedXML" Version="0.97.0" />
<PackageReference Include="PxWeb.Api2.Server.Models" Version="2.2.0" />
<PackageReference Include="PxWeb.Api2.Server.Models" Version="2.3.2" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />

</ItemGroup>
Expand Down
91 changes: 91 additions & 0 deletions UnitTests/JsonStat2/MetaIdTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
using System.Globalization;
using System.Linq;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using Newtonsoft.Json.Linq;

using PCAxis.Paxiom;

namespace UnitTests.JsonStat2
{
[TestClass]
[DeploymentItem("TestFiles/metaid.config")]
[DeploymentItem("TestFiles/tab_12909_metaid.px")]

public class MetaIdTest
{
private JObject jsonstat2AsJObject;

[TestInitialize]
public void TestSetup()
{
var helper = new JsonStat2Helper();
CultureInfo ci = new CultureInfo("sv-SE");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;

PXModel myModel = helper.GetSelectAllModel("tab_12909_metaid.px");

var actual = helper.GetActual(myModel);

jsonstat2AsJObject = JObject.Parse(actual);
}

[TestMethod]
[Description("Testing output links from metaid")]
public void TestTableHomepageLink()
{
string expected_relation = "statistics-homepage";
//string expected_catagory = null;
string expected_metaid = "STATISTICS:sykefratot";
string expected_href = "https://www.ssb.no/sykefratot";
string expected_label = "Statistikkens hjemmeside";
string expected_type = "text/html";

var links = jsonstat2AsJObject["link"]["related"];
Assert.IsGreaterThan(1, links.Count(), "link.related has count < 2.");

var homepage = links.Where(i => (string)i["extension"]?["metaid"].ToString() == expected_metaid).FirstOrDefault();
Assert.IsNotNull(homepage, "Can find metaid " + expected_metaid);


Assert.AreEqual(expected_relation, homepage["extension"]?["relation"].ToString());

Assert.AreEqual(expected_href, homepage["href"].ToString());
Assert.AreEqual(expected_label, homepage["label"].ToString());
Assert.AreEqual(expected_type, homepage["type"].ToString());
}


[TestMethod]
[Description("Testing output links from metaid")]
public void TestDimLink()
{
string expected_relation = "definitions";
//string expected_catagory = null;
string expected_metaid = "urn:ssb:classification:klass:7";
string expected_href = "https://www.ssb.no/klass/klassifikasjoner/7";
string expected_label = "Klassifikasjon for yrke.";
string expected_type = "text/html";

var links = jsonstat2AsJObject["dimension"]["Yrke"]["link"]["related"];
Assert.IsGreaterThan(1, links.Count(), "link.related has count < 2.");

var aLink = links.Where(i => (string)i["extension"]?["metaid"].ToString() == expected_metaid).FirstOrDefault();
Assert.IsNotNull(aLink, "Can find metaid " + expected_metaid);

//var lala = aLink.ToString();


Assert.AreEqual(expected_relation, aLink["extension"]?["relation"].ToString());

Assert.AreEqual(expected_href, aLink["href"].ToString());
Assert.AreEqual(expected_label, aLink["label"].ToString());
Assert.AreEqual(expected_type, aLink["type"].ToString());
}



}
}
77 changes: 77 additions & 0 deletions UnitTests/TestFiles/tab_12909_metaid.px
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
CHARSET="ANSI";
AXIS-VERSION="2010";
CODEPAGE="iso-8859-1";
LANGUAGE="no";
CREATION-DATE="20260316 15:09";
DECIMALS=1;
SHOWDECIMALS=1;
MATRIX="12909";
AGGREGALLOWED=NO;
COPYRIGHT=NO;
SUBJECT-CODE="al";
SUBJECT-AREA="Arbeid og lønn";
TITLE="12909: Legemeldt sykefravær (prosent) blant innvandrere (lønnstakere, 16-69 år), etter yrke, landbakgrunn, statistikkvariabel og kvartal";
CONTENTS="12909: Legemeldt sykefravær (prosent) blant innvandrere (lønnstakere, 16-69 år),";
STUB="yrke","landbakgrunn";
HEADING="statistikkvariabel","kvartal";
CONTVARIABLE="statistikkvariabel";
VARIABLECODE("yrke")="Yrke";
VALUES("yrke")="Alle yrker","Ledere";
VARIABLECODE("landbakgrunn")="LandBakgr";
VALUES("landbakgrunn")="Alle land","Norden utenom Norge","Nye EU-land etter 2004";
VARIABLECODE("statistikkvariabel")="ContentsCode";
VALUES("statistikkvariabel")="Sykefraværsprosent (legemeldt)","Sykefraværsprosent (legemeldt), prosentvis endring fra året før";
VARIABLECODE("kvartal")="Tid";
VALUES("kvartal")="2025K4";
TIMEVAL("kvartal")=TLIST(Q1),"2025K4";
CODES("yrke")="0-9","1";
CODES("landbakgrunn")="999","00","015a";
CODES("statistikkvariabel")="Sykefraversprosent","SykefraversprosEndr";
CODES("kvartal")="2025K4";
PRESTEXT("yrke")=2;
PRESTEXT("kvartal")=0;
ELIMINATION("yrke")="Alle yrker";
ELIMINATION("landbakgrunn")="Alle land";
UNITS="prosent";
LAST-UPDATED("Sykefraværsprosent (legemeldt)")="20260226 08:00";
STOCKFA("Sykefraværsprosent (legemeldt)")="A";
DAYADJ("Sykefraværsprosent (legemeldt)")=NO;
SEASADJ("Sykefraværsprosent (legemeldt)")=NO;
REFPERIOD("Sykefraværsprosent (legemeldt)")="Kvartal";
UNITS("Sykefraværsprosent (legemeldt)")="prosent";
CONTACT("Sykefraværsprosent (legemeldt)")="Unn H. Høydahl, Statistisk sentralbyrå# +47 40 90 23 77#uhh@ssb.no## Arbeidsmarked, Statistisk sentralbyrå# +47 62 88 50 00#arbeidsmarked@ssb.no##Stine Bakke, Statistisk sentralbyrå# +47 91 52 62 51#eba@ssb.no##";
LAST-UPDATED("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="20260226 08:00";
STOCKFA("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="A";
DAYADJ("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")=NO;
SEASADJ("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")=NO;
REFPERIOD("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="Kvartal";
UNITS("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="prosent";
CONTACT("Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="Unn H. Høydahl, Statistisk sentralbyrå# +47 40 90 23 77#uhh@ssb.no## Arbeidsmarked, Statistisk sentralbyrå# +47 62 88 50 00#arbeidsmarked@ssb.no##Stine Bakke, Statistisk sentralbyrå# +47 91 52 62 51#eba@ssb.no##";
DATABASE="Ekstern PROD database O_STATMETA_24 som 2.4";
SOURCE="Statistisk sentralbyrå";
INFOFILE="None";
NOTE="Store endringer i sykefraværsprosenten fra et år til et annet bør tolkes med forsiktighet. Årsaken kan være at det er få personer i det aktuelle yrket, slik at selv små endringer i sykefraværet kan gi store utslag i statistikken.##Tabellen inkluderer ikk"
"e statsløse lønnstakere eller lønnstakere med ukjent landbakgrunn.";
META-ID="STATISTICS:sykefratot";
META-ID("yrke")="urn:ssb:classification:klass:7,urn:ssb:conceptvariable:vardok:1118";
META-ID("landbakgrunn")="urn:ssb:classification:klass:545";
META-ID("statistikkvariabel","Sykefraværsprosent (legemeldt)")="urn:ssb:conceptvariable:vardok:2236";
META-ID("statistikkvariabel","Sykefraværsprosent (legemeldt), prosentvis endring fra året før")="urn:ssb:conceptvariable:vardok:2236";
DATASYMBOL1="..";
DATASYMBOL2="...";
DATASYMBOL3=":";
DATASYMBOLSUM=".";
DATASYMBOLNIL="-";
DATANOTESUM=".";
TABLEID="12909";
VARIABLE-TYPE("yrke")="V";
VARIABLE-TYPE("landbakgrunn")="V";
VARIABLE-TYPE("kvartal")="T";
DATA=
6.4 1.2
5.5 -4.2
7.3 5.0
4.9 0.1
3.8 -8.9
6.0 6.0
;
Loading