From f8c4ba1a3331c79766b8b38f58d7451d8a820ec9 Mon Sep 17 00:00:00 2001 From: likp Date: Fri, 21 Mar 2025 19:46:56 +0100 Subject: [PATCH 1/5] firest commit --- PxWeb/Code/Api2/DataSelection/Bjarte3.cs | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs index c37bbf9d..f8758230 100644 --- a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs +++ b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs @@ -261,6 +261,9 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) { foreach (var variable in meta.Variables) { + var variableNotes = variable.Notes; + var valueNotes = GetNotes(variable); + if (variable.HasValuesets() && variable.CurrentGrouping is null && variable.CurrentValueSet is null) { builder.ApplyValueSet(variable.Code, variable.ValueSets[0]); @@ -273,6 +276,49 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) { builder.ApplyValueSet(variable.Code, variable.CurrentValueSet); } + var newVariable = builder.Model.Meta.Variables.FirstOrDefault(v => v.Code == variable.Code); + if (newVariable is not null) + { + ReapplyNotes(newVariable, valueNotes, variableNotes); + } + } + } + + // GetNotes(variable) + private static Dictionary GetNotes(Variable variable) + { + var valueNotes = new Dictionary(); + foreach (var value in variable.Values) + { + if (value.HasNotes()) + { + valueNotes.Add(value.Code, value.Notes); + } + } + return valueNotes; + } + + // ReapplyNotes(variable, notes) + private static void ReapplyNotes(Variable variable, Dictionary valueNotes, Notes variableNotes) + { + //if (variableNotes is not null) + //{ + // foreach (var note in variableNotes) + // { + // variable.Notes.Add(note); + // } + //} + + foreach (var valueCode in valueNotes.Keys) + { + var value = variable.Values.FirstOrDefault(v => v.Code == valueCode); + if (value is not null) + { + foreach (var note in valueNotes[valueCode]) + { + value.AddNote(note); + } + } } } } From a78a4260b600d04b899c5c6d4419fd2b3ba8a646 Mon Sep 17 00:00:00 2001 From: likp Date: Mon, 24 Mar 2025 12:25:02 +0100 Subject: [PATCH 2/5] Added check if it is a contents variable --- PxWeb/Code/Api2/DataSelection/Bjarte3.cs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs index f8758230..e1199b3f 100644 --- a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs +++ b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs @@ -284,10 +284,15 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) } } - // GetNotes(variable) private static Dictionary GetNotes(Variable variable) { var valueNotes = new Dictionary(); + //Skip Content variables since they have not other valueset or grouping + if (variable.IsContentVariable) + { + return valueNotes; + } + foreach (var value in variable.Values) { if (value.HasNotes()) @@ -298,21 +303,13 @@ private static Dictionary GetNotes(Variable variable) return valueNotes; } - // ReapplyNotes(variable, notes) private static void ReapplyNotes(Variable variable, Dictionary valueNotes, Notes variableNotes) { - //if (variableNotes is not null) - //{ - // foreach (var note in variableNotes) - // { - // variable.Notes.Add(note); - // } - //} foreach (var valueCode in valueNotes.Keys) { var value = variable.Values.FirstOrDefault(v => v.Code == valueCode); - if (value is not null) + if (value is not null && !value.HasNotes()) { foreach (var note in valueNotes[valueCode]) { From fac6b4c482b826ddd8cf799974e2ff5d18500e49 Mon Sep 17 00:00:00 2001 From: likp Date: Mon, 24 Mar 2025 15:12:28 +0100 Subject: [PATCH 3/5] Fixed method signature --- PxWeb/Code/Api2/DataSelection/Bjarte3.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs index e1199b3f..5cf91aa5 100644 --- a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs +++ b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs @@ -261,7 +261,7 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) { foreach (var variable in meta.Variables) { - var variableNotes = variable.Notes; + var valueNotes = GetNotes(variable); if (variable.HasValuesets() && variable.CurrentGrouping is null && variable.CurrentValueSet is null) @@ -279,7 +279,7 @@ private static void ReapplyCodelist(IPXModelBuilder builder, PXMeta meta) var newVariable = builder.Model.Meta.Variables.FirstOrDefault(v => v.Code == variable.Code); if (newVariable is not null) { - ReapplyNotes(newVariable, valueNotes, variableNotes); + ReapplyNotes(newVariable, valueNotes); } } } @@ -303,7 +303,7 @@ private static Dictionary GetNotes(Variable variable) return valueNotes; } - private static void ReapplyNotes(Variable variable, Dictionary valueNotes, Notes variableNotes) + private static void ReapplyNotes(Variable variable, Dictionary valueNotes) { foreach (var valueCode in valueNotes.Keys) From 5da8bf18253f3b1f68b5d757ee210c8658369d7d Mon Sep 17 00:00:00 2001 From: likp Date: Mon, 24 Mar 2025 15:12:45 +0100 Subject: [PATCH 4/5] Added unit tests --- PxWeb.UnitTests/Helpers/NotesFixTests.cs | 67 ++++++++++++++++++++++++ PxWeb.UnitTests/ModelStore.cs | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 PxWeb.UnitTests/Helpers/NotesFixTests.cs diff --git a/PxWeb.UnitTests/Helpers/NotesFixTests.cs b/PxWeb.UnitTests/Helpers/NotesFixTests.cs new file mode 100644 index 00000000..29a4b9d0 --- /dev/null +++ b/PxWeb.UnitTests/Helpers/NotesFixTests.cs @@ -0,0 +1,67 @@ +using System.Reflection; + +namespace PxWeb.UnitTests.Helpers +{ + [TestClass] + public class NotesFixTests + { + [TestMethod] + public void GetNotes_WhenContent_ShouldReturnEmptyDictonary() + { + // Arrange + var variable = ModelStore.CreateContentVariable("", PlacementType.Stub, 2); + + // Act + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo?.Invoke(null, new object[] { variable }); + + // Assert + Assert.IsNotNull(result); + Assert.IsInstanceOfType(result, typeof(Dictionary)); + Assert.AreEqual(0, ((Dictionary)result).Count); + } + + [TestMethod] + public void GetNotes_WhenOneNoteOnFirstValue_ShouldReturDictonaryWithOneKey() + { + // Arrange + var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + variable.Values[0].AddNote(new PCAxis.Paxiom.Note("A note!", NoteType.Value, false)); + var valueCode = variable.Values[0].Code; + + // Act + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo?.Invoke(null, new object[] { variable }); + + // Assert + Assert.IsNotNull(result); + Assert.IsInstanceOfType(result, typeof(Dictionary)); + Assert.AreEqual(1, ((Dictionary)result).Count); + Assert.IsTrue(((Dictionary)result).ContainsKey(valueCode)); + } + + + [TestMethod] + public void GetReapply_WhenOneNoteOnFirstValue_ShouldHaveANotOnFirstValue() + { + // Arrange + const string noteText = "A note!"; + var variable = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + variable.Values[0].AddNote(new PCAxis.Paxiom.Note(noteText, NoteType.Value, false)); + var valueCode = variable.Values[0].Code; + var variable2 = ModelStore.CreateTimeVariable("", PlacementType.Stub, 10); + var methodInfo = typeof(Bjarte3).GetMethod("GetNotes", BindingFlags.NonPublic | BindingFlags.Static); + var notes = methodInfo?.Invoke(null, new object[] { variable }) as Dictionary ?? new Dictionary(); + + // Act + var methodInfo2 = typeof(Bjarte3).GetMethod("ReapplyNotes", BindingFlags.NonPublic | BindingFlags.Static); + var result = methodInfo2?.Invoke(null, new object[] { variable2, notes }); + + // Assert + Assert.IsTrue(variable2.Values[0].HasNotes()); + Assert.AreEqual(noteText, variable2.Values[0].Notes[0].Text); + Assert.AreEqual(1, variable2.Values[0].Notes.Count); + + } + } +} diff --git a/PxWeb.UnitTests/ModelStore.cs b/PxWeb.UnitTests/ModelStore.cs index 8c1206a5..b8f4ccb0 100644 --- a/PxWeb.UnitTests/ModelStore.cs +++ b/PxWeb.UnitTests/ModelStore.cs @@ -234,7 +234,7 @@ public static PCAxis.Paxiom.Variable CreateClassificationVariable(string suffix, return variable; } - private static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues) + public static PCAxis.Paxiom.Variable CreateContentVariable(string suffix, PlacementType placementType, int numberOfValues) { var name = $"cont_{suffix}"; Variable variable = new Variable(name, placementType); From ffbcba58529fc2bae006853bb2ff7c599571da27 Mon Sep 17 00:00:00 2001 From: likp Date: Mon, 24 Mar 2025 15:20:51 +0100 Subject: [PATCH 5/5] Simplified foreach loop --- PxWeb/Code/Api2/DataSelection/Bjarte3.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs index 5cf91aa5..96e15988 100644 --- a/PxWeb/Code/Api2/DataSelection/Bjarte3.cs +++ b/PxWeb/Code/Api2/DataSelection/Bjarte3.cs @@ -293,12 +293,9 @@ private static Dictionary GetNotes(Variable variable) return valueNotes; } - foreach (var value in variable.Values) + foreach (var value in variable.Values.Where(v => v.HasNotes())) { - if (value.HasNotes()) - { - valueNotes.Add(value.Code, value.Notes); - } + valueNotes.Add(value.Code, value.Notes); } return valueNotes; }